ClangASTContext.cpp revision a83f8779ac614263d92959d2338e6e9f08d8f9fb
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... 12090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (class_interface_decl) 121b01000fd063629facd45044f137446fb748ee179Greg Clayton { 122886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata bool is_forward_decl = class_interface_decl->isForwardDecl(); 123886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage()) 124b01000fd063629facd45044f137446fb748ee179Greg Clayton { 125886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (ast) 12682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 127886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata ExternalASTSource *external_ast_source = ast->getExternalSource(); 128886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (external_ast_source) 129886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 130886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata external_ast_source->CompleteType (class_interface_decl); 131886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata is_forward_decl = class_interface_decl->isForwardDecl(); 132886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 13382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 134886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return is_forward_decl == false; 135b01000fd063629facd45044f137446fb748ee179Greg Clayton } 136886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return true; 137b01000fd063629facd45044f137446fb748ee179Greg Clayton } 138886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata else 139886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return false; 140b01000fd063629facd45044f137446fb748ee179Greg Clayton } 141b01000fd063629facd45044f137446fb748ee179Greg Clayton } 142b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 143b01000fd063629facd45044f137446fb748ee179Greg Clayton 144b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Typedef: 145b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()); 146b01000fd063629facd45044f137446fb748ee179Greg Clayton 147b01000fd063629facd45044f137446fb748ee179Greg Clayton default: 148b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 149b01000fd063629facd45044f137446fb748ee179Greg Clayton } 150b01000fd063629facd45044f137446fb748ee179Greg Clayton 151b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 152b01000fd063629facd45044f137446fb748ee179Greg Clayton} 153b01000fd063629facd45044f137446fb748ee179Greg Clayton 154b01000fd063629facd45044f137446fb748ee179Greg Clayton 15584f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier 156585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access) 15784f8075072eef306234f8109573067647735c111Greg Clayton{ 15884f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 15984f8075072eef306234f8109573067647735c111Greg Clayton { 160585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 161585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return AS_none; 162585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return AS_public; 163585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return AS_private; 164585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return AS_protected; 16584f8075072eef306234f8109573067647735c111Greg Clayton } 16684f8075072eef306234f8109573067647735c111Greg Clayton return AS_none; 16784f8075072eef306234f8109573067647735c111Greg Clayton} 16884f8075072eef306234f8109573067647735c111Greg Clayton 16984f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl 170585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access) 17184f8075072eef306234f8109573067647735c111Greg Clayton{ 17284f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 17384f8075072eef306234f8109573067647735c111Greg Clayton { 174585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 175585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return ObjCIvarDecl::None; 176585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return ObjCIvarDecl::Public; 177585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return ObjCIvarDecl::Private; 178585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return ObjCIvarDecl::Protected; 179585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPackage: return ObjCIvarDecl::Package; 18084f8075072eef306234f8109573067647735c111Greg Clayton } 18184f8075072eef306234f8109573067647735c111Greg Clayton return ObjCIvarDecl::None; 18284f8075072eef306234f8109573067647735c111Greg Clayton} 18384f8075072eef306234f8109573067647735c111Greg Clayton 18484f8075072eef306234f8109573067647735c111Greg Clayton 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangOptions &Opts, 189e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton InputKind IK 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Cleanup per-file based stuff. 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set some properties which depend soley on the input kind; it would be nice 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to move these to the language standard, and have the driver resolve the 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // input kind + language standard. 197e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton if (IK == IK_Asm) { 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AsmPreprocessor = 1; 199e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton } else if (IK == IK_ObjC || 200e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_ObjCXX || 201e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjC || 202e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjCXX) { 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ObjC1 = Opts.ObjC2 = 1; 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStandard::Kind LangStd = LangStandard::lang_unspecified; 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_unspecified) { 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Based on the base language, pick one. 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (IK) { 211e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_None: 212e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_AST: 213279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case IK_LLVM_IR: 214b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (!"Invalid input kind!"); 215e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_OpenCL: 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_opencl; 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 218279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case IK_CUDA: 219279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan LangStd = LangStandard::lang_cuda; 220279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 221e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_Asm: 222e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_C: 223e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedC: 224e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjC: 225e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjC: 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnu99; 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 228e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_CXX: 229e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedCXX: 230e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjCXX: 231e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjCXX: 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnucxx98; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.BCPLComment = Std.hasBCPLComments(); 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.C99 = Std.isC99(); 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus = Std.isCPlusPlus(); 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Digraphs = Std.hasDigraphs(); 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUMode = Std.isGNUMode(); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUInline = !Std.isC99(); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.HexFloats = Std.hasHexFloats(); 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ImplicitInt = Std.hasImplicitInt(); 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL has some additional defaults. 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_opencl) { 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OpenCL = 1; 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AltiVec = 1; 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CXXOperatorNames = 1; 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.LaxVectorConversions = 1; 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL and C++ both have bool, true, false keywords. 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Opts.CPlusPlus) 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fobjc_gc_only)) 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::GCOnly); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Args.hasArg(OPT_fobjc_gc)) 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::HybridGC); 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_print_ivar_layout)) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCGCBitmapPrint = 1; 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_faltivec)) 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AltiVec = 1; 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_pthread)) 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.POSIXThreads = 1; 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "default"); 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Vis == "default") 2798950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan Opts.setVisibilityMode(DefaultVisibility); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "hidden") 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Hidden); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "protected") 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Protected); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is specified, or -std is set to a conforming mode. 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Trigraphs = !Opts.GNUMode; 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_trigraphs)) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Trigraphs = 1; 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fno_dollars_in_identifiers, 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// !Opts.AsmPreprocessor); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.LaxVectorConversions = 0; 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Blocks = Args.hasArg(OPT_fblocks); 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCConstantStringClass = getLastArgValue(Args, 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fconstant_string_class); 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Static = Args.hasArg(OPT_static_define); 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OptimizeSize = 0; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Eliminate this dependency. 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned Opt = 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Optimize = Opt != 0; 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned Opt = 0; 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is the __NO_INLINE__ define, which just depends on things like the 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // optimization level and -fno-inline, not actually whether the backend has 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // inlining enabled. 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This is affected by other options (-fno-inline). 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.NoInline = !Opt; 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// switch (SSP) { 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// default: 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 353e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 354b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) : 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple(), 356b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap(), 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap(), 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap(), 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap(), 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap(), 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap(), 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap(), 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap(), 364b01000fd063629facd45044f137446fb748ee179Greg Clayton m_builtins_ap(), 365b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_tag_decl (NULL), 366b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_objc_decl (NULL), 367b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_baton (NULL) 368b01000fd063629facd45044f137446fb748ee179Greg Clayton 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_triple && target_triple[0]) 371dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton SetTargetTriple (target_triple); 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext() 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 387b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(); 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear() 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 394b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(); 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple () 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_triple.c_str(); 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign(target_triple); 416dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton if (m_target_triple.find("armv7s") == 0) 417dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton m_target_triple.erase(5,1); 418dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton else if (m_target_triple.find("armv7f") == 0) 419dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton m_target_triple.erase(5,1); 420dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton else if (m_target_triple.find("armv7k") == 0) 421dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton m_target_triple.erase(5,1); 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 424395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonvoid 425395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonClangASTContext::SetArchitecture (const ArchSpec &arch) 426395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{ 427dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton SetTargetTriple(arch.GetTriple().str().c_str()); 428395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton} 429395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 430b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 431b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource () 432b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 433b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 434b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 435b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getExternalSource () != NULL; 436b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 437b01000fd063629facd45044f137446fb748ee179Greg Clayton} 438b01000fd063629facd45044f137446fb748ee179Greg Clayton 439b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 440b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap) 441b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 442b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 443b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 444b01000fd063629facd45044f137446fb748ee179Greg Clayton { 445b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->setExternalSource (ast_source_ap); 446b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true); 447b01000fd063629facd45044f137446fb748ee179Greg Clayton //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true); 448b01000fd063629facd45044f137446fb748ee179Greg Clayton } 449b01000fd063629facd45044f137446fb748ee179Greg Clayton} 450b01000fd063629facd45044f137446fb748ee179Greg Clayton 451b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 452b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource () 453b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 454b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 455b01000fd063629facd45044f137446fb748ee179Greg Clayton 456b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 457b01000fd063629facd45044f137446fb748ee179Greg Clayton { 458b01000fd063629facd45044f137446fb748ee179Greg Clayton llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap; 459b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->setExternalSource (empty_ast_source_ap); 460b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false); 461b01000fd063629facd45044f137446fb748ee179Greg Clayton //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false); 462b01000fd063629facd45044f137446fb748ee179Greg Clayton } 463b01000fd063629facd45044f137446fb748ee179Greg Clayton} 464b01000fd063629facd45044f137446fb748ee179Greg Clayton 465b01000fd063629facd45044f137446fb748ee179Greg Clayton 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext * 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext() 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 470b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get() == NULL) 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 472b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(new ASTContext (*getLanguageOptions(), 473b01000fd063629facd45044f137446fb748ee179Greg Clayton *getSourceManager(), 474b01000fd063629facd45044f137446fb748ee179Greg Clayton *getTargetInfo(), 475b01000fd063629facd45044f137446fb748ee179Greg Clayton *getIdentifierTable(), 476b01000fd063629facd45044f137446fb748ee179Greg Clayton *getSelectorTable(), 477b01000fd063629facd45044f137446fb748ee179Greg Clayton *getBuiltinContext(), 478b01000fd063629facd45044f137446fb748ee179Greg Clayton 0)); 479887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 480b01000fd063629facd45044f137446fb748ee179Greg Clayton if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton) 481b01000fd063629facd45044f137446fb748ee179Greg Clayton { 482b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage(); 483b01000fd063629facd45044f137446fb748ee179Greg Clayton //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage(); 484b01000fd063629facd45044f137446fb748ee179Greg Clayton } 485b01000fd063629facd45044f137446fb748ee179Greg Clayton 486b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false); 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 488b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap.get(); 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 513e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 514e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5278a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager * 5288a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager() 5298a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{ 5308a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan if (m_file_manager_ap.get() == NULL) 53122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton { 53222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton clang::FileSystemOptions file_system_options; 53322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_file_manager_ap.reset(new clang::FileManager(file_system_options)); 53422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton } 5358a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan return m_file_manager_ap.get(); 5368a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan} 5378a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan 5381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 54222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager())); 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 550eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton { 551eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs()); 552eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton m_diagnostic_ap.reset(new Diagnostic(diag_id_sp)); 553eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton } 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 557887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient 558887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 559887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic: 560887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan NullDiagnosticClient () 561887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 562887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 563887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 564887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 565887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info) 566887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 567887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_log) 568887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 569887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan llvm::SmallVectorImpl<char> diag_str(10); 570887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan info.FormatDiagnostic(diag_str); 571887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan diag_str.push_back('\0'); 572887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log->Printf("Compiler diagnostic: %s\n", diag_str.data()); 573887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 574887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 575887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate: 576887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan LogSP m_log; 577887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}; 578887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 579887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient * 580887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient() 581887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 582887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_diagnostic_client_ap.get() == NULL) 583887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_diagnostic_client_ap.reset(new NullDiagnosticClient); 584887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 585887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan return m_diagnostic_client_ap.get(); 586887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan} 587887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 613b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type) 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 615b01000fd063629facd45044f137446fb748ee179Greg Clayton uint64_t qual_type_bit_size = ast->getTypeSize(qual_type); 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 621462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 622585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 624b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 626b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 628b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size); 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 631462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 632b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size) 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 634b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 639585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingInvalid: 640b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 641b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidPtrTy.getAsOpaquePtr(); 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 644585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingUint: 645b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 646b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 647b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 648b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 649b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 650b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 651b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 652b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 653b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 654b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 655b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 656b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 659585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingSint: 660b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 661b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 662b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 663b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 664b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 665b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 666b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 667b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 668b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 669b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 670b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 671b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 674585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingIEEE754: 675b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 676b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatTy.getAsOpaquePtr(); 677b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 678b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleTy.getAsOpaquePtr(); 679b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 680b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleTy.getAsOpaquePtr(); 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 683585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingVector: 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 691462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 694b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 697b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 698b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 706b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 707b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidPtrTy.getAsOpaquePtr(); 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 711b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy)) 712b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->BoolTy.getAsOpaquePtr(); 713b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 714b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 715b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 716b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 717b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 718b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 721e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case DW_ATE_lo_user: 722e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton // This has been seen to mean DW_AT_complex_integer 7239353338e34d711856c80754721fe425bc765c6f3Greg Clayton if (::strstr(type_name, "complex")) 724e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 725e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2); 726b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr(); 727e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 728e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton break; 729e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 731b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy)) 732b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatComplexTy.getAsOpaquePtr(); 733b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy)) 734b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleComplexTy.getAsOpaquePtr(); 735b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy)) 736b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleComplexTy.getAsOpaquePtr(); 737e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton else 738e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 739e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2); 740b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr(); 741e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 745b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 746b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatTy.getAsOpaquePtr(); 747b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 748b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleTy.getAsOpaquePtr(); 749b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 750b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleTy.getAsOpaquePtr(); 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7568ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 758b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 759b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7618ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 763b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 764b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7668ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 768b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 769b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7718ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 773b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 774b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 775b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 776b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7788ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 7798ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 780b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 781b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 782b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 783b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 7848ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 7858ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (streq(type_name, "wchar_t")) 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 787b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy)) 788b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->WCharTy.getAsOpaquePtr(); 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7907bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton else if (streq(type_name, "void")) 7917bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton { 7927bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy)) 7937bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton return ast->VoidTy.getAsOpaquePtr(); 7947bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton } 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 797b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 798b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 799b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 800b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 801b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 802b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 803b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 804b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 805b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 806b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 807b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 808b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 816b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 817b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 820b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 821b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 822b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 823b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 831b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 832b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8348ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 836b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 837b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8398ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 841b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 842b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8448ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 846b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 847b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8498ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 8508ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 851b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 852b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 853b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 854b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 8558ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 858b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 859b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 860b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 861b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 862b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 863b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 864b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 865b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 866b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 867b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 868b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 869b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 873b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 874b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 8757bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 8767bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 8855a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton if (type_name) 8865a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton { 8875a570908d7c5c7cfd342e5b100ca596780f5b958Greg 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); 8885a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton } 8895a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton else 8905a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton { 8915a570908d7c5c7cfd342e5b100ca596780f5b958Greg 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); 8925a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton } 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 896462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 897b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast) 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 899b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidTy.getAsOpaquePtr(); 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 902462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 903a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool() 904a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{ 905a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan return getASTContext()->BoolTy.getAsOpaquePtr(); 906a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan} 907a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan 908a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t 909960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 910960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 911c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr(); 912960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 913960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 914462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 915960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 916960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 91704325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr(); 918960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 919960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 920462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 921960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 922960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 923c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr(); 924960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 925960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 926462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 927fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangASTContext::GetUnknownAnyType(clang::ASTContext *ast) 928fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 929fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return ast->UnknownAnyTy.getAsOpaquePtr(); 930fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 931fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 932fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananclang_type_t 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 943462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 949462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 950b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const) 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 952b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType void_ptr_type(ast->VoidPtrTy); 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 960462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 96122defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast, 96222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 963462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type) 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9658a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 96622defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 96722defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 968ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan *src_ast, file_manager, 969ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan false); 970cf18faaf72090a68480145ca206955d792633559Sean Callanan 97122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType src (QualType::getFromOpaquePtr(clang_type)); 97222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType dst (importer.Import(src)); 973cf18faaf72090a68480145ca206955d792633559Sean Callanan 974cf18faaf72090a68480145ca206955d792633559Sean Callanan return dst.getAsOpaquePtr(); 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9776916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9786916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl * 97922defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast, 98022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 9816916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *source_decl) 982887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 9838a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 98422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 98522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 986ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan *src_ast, file_manager, 987ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan false); 9886916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return importer.Import(source_decl); 9906916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 9916916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9928d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 993b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::AreTypesSame(ASTContext *ast, 994462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type1, 995462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type2) 9965510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 99704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton return ast->hasSameType (QualType::getFromOpaquePtr(type1), 99804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton QualType::getFromOpaquePtr(type2)); 9995510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 10005510dddc33260a991284ef81ca343594f23262e8Sean Callanan 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1003462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1004462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type) 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1015462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1016462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type) 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1027462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1028462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type) 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1039b01000fd063629facd45044f137446fb748ee179Greg Clayton 1040b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t 1041b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl) 1042b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1043b01000fd063629facd45044f137446fb748ee179Greg Clayton // No need to call the getASTContext() accessor (which can create the AST 1044b01000fd063629facd45044f137446fb748ee179Greg Clayton // if it isn't created yet, because we can't have created a decl in this 1045b01000fd063629facd45044f137446fb748ee179Greg Clayton // AST if our AST didn't already exist... 1046b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get()) 1047b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr(); 1048b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 1049b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1050b01000fd063629facd45044f137446fb748ee179Greg Clayton 1051b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t 1052b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl) 1053b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1054b01000fd063629facd45044f137446fb748ee179Greg Clayton // No need to call the getASTContext() accessor (which can create the AST 1055b01000fd063629facd45044f137446fb748ee179Greg Clayton // if it isn't created yet, because we can't have created a decl in this 1056b01000fd063629facd45044f137446fb748ee179Greg Clayton // AST if our AST didn't already exist... 1057b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get()) 1058b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr(); 1059b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 1060b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1061b01000fd063629facd45044f137446fb748ee179Greg Clayton 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1064462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1065585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1067b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 1068b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 106904325065a00f646527db85e9bc751da29ac53b23Sean Callanan 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 1071b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1074585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton if (language == eLanguageTypeObjC) 10759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1076306edcaab871503192162272c147aef89d0ee719Greg Clayton bool isForwardDecl = true; 10779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 10789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 10799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 10809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 1086b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *decl = CXXRecordDecl::Create(*ast, 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 1090279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1091b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL); 1092b01000fd063629facd45044f137446fb748ee179Greg Clayton 1093b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTagDeclType(decl).getAsOpaquePtr(); 1094b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1095b01000fd063629facd45044f137446fb748ee179Greg Clayton 1096b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 1097b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern) 1098b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1099b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 1100b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 1101b01000fd063629facd45044f137446fb748ee179Greg Clayton 1102b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1103b01000fd063629facd45044f137446fb748ee179Greg Clayton 1104b01000fd063629facd45044f137446fb748ee179Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1105b01000fd063629facd45044f137446fb748ee179Greg Clayton switch (type_class) 1106b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1107b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Record: 1108b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1109b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 1110b01000fd063629facd45044f137446fb748ee179Greg Clayton if (cxx_record_decl) 1111b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1112b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_record_decl->setHasExternalLexicalStorage (has_extern); 11137a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton cxx_record_decl->setHasExternalVisibleStorage (has_extern); 1114b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1115b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1116b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1117b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1118b01000fd063629facd45044f137446fb748ee179Greg Clayton 1119b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Enum: 1120b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1121b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl(); 1122b01000fd063629facd45044f137446fb748ee179Greg Clayton if (enum_decl) 1123b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1124b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_decl->setHasExternalLexicalStorage (has_extern); 11257a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton enum_decl->setHasExternalVisibleStorage (has_extern); 1126b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1127b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1128b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1129b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1130b01000fd063629facd45044f137446fb748ee179Greg Clayton 1131b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCObject: 1132b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCInterface: 1133b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1134d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 1135b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (objc_class_type); 1136b01000fd063629facd45044f137446fb748ee179Greg Clayton if (objc_class_type) 1137b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1138b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 1139b01000fd063629facd45044f137446fb748ee179Greg Clayton 1140b01000fd063629facd45044f137446fb748ee179Greg Clayton if (class_interface_decl) 1141b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1142b01000fd063629facd45044f137446fb748ee179Greg Clayton class_interface_decl->setHasExternalLexicalStorage (has_extern); 11437a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton class_interface_decl->setHasExternalVisibleStorage (has_extern); 1144b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1145b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1146b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1147b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1148b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1150b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Typedef: 1151b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern); 1152b01000fd063629facd45044f137446fb748ee179Greg Clayton 1153b01000fd063629facd45044f137446fb748ee179Greg Clayton default: 1154b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1155b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1156b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1159dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool 1160dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 1161dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{ 1162dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (name == NULL || name[0] == '\0') 1163dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 1164dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1165494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator" 1166427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1) 1167c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1168c2c9a149f127736550d7430653f4c1a51731442eSean Callanan const char *post_op_name = NULL; 1169c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1170494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan bool no_space = true; 1171c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1172427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) 1173494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan return false; 1174494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan 1175427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton post_op_name = name + OPERATOR_PREFIX_LENGTH; 1176427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1177494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan if (post_op_name[0] == ' ') 1178c2c9a149f127736550d7430653f4c1a51731442eSean Callanan { 1179494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan post_op_name++; 1180494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan no_space = false; 1181c2c9a149f127736550d7430653f4c1a51731442eSean Callanan } 1182c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1183494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX 1184427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH 1185dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1186dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // This is an operator, set the overloaded operator kind to invalid 1187dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // in case this is a conversion operator... 1188dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1190dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[0]) 1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1192c2c9a149f127736550d7430653f4c1a51731442eSean Callanan default: 1193c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1194c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1195c2c9a149f127736550d7430653f4c1a51731442eSean Callanan break; 1196dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'n': 1197c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1198c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "new") == 0) 1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_New; 1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "new[]") == 0) 1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_New; 1203dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'd': 1206c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1207c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "delete") == 0) 1209dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Delete; 1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_Delete; 1212dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1213dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1214dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '+': 1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1216dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Plus; 1217dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1218dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1219dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '=') 1220dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusEqual; 1221dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '+') 1222dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusPlus; 1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1224dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1225dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1226dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': 1227dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1228dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Minus; 1229dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1230dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1231dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1232dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1233dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_MinusEqual; break; 1234dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': op_kind = OO_MinusMinus; break; 1235dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_Arrow; break; 1236dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1237dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1238dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1239dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1240dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '*') 1241dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ArrowStar; break; 1242dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1243dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1244dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1245dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '*': 1246dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1247dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Star; 1248dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1249dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_StarEqual; 1250dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1251dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1252dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '/': 1253dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1254dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Slash; 1255dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1256dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_SlashEqual; 1257dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1258dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1259dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '%': 1260dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1261dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Percent; 1262dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1263dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PercentEqual; 1264dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1265dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1266dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1267dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '^': 1268dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1269dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Caret; 1270dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1271dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_CaretEqual; 1272dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1273dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1274dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': 1275dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1276dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Amp; 1277dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1278dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1279dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1280dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1281dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_AmpEqual; break; 1282dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': op_kind = OO_AmpAmp; break; 1283dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1284dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1285dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1286dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1287dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': 1288dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1289dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Pipe; 1290dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1291dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1292dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1293dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1294dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_PipeEqual; break; 1295dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': op_kind = OO_PipePipe; break; 1296dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1297dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1298dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1299dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1300dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '~': 1301dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1302dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Tilde; 1303dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1304dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1305dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '!': 1306dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1307dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Exclaim; 1308dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1309dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ExclaimEqual; 1310dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1311dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1312dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': 1313dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1314dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Equal; 1315dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1316dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_EqualEqual; 1317dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1318dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1319dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': 1320dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1321dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Less; 1322dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1323dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1324dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1325dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1326dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': op_kind = OO_LessLess; break; 1327dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_LessEqual; break; 1328dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1329dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1330dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1331dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1332dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '=') 1333dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_LessLessEqual; 1334dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1335dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1336dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1337dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': 1338dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1339dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Greater; 1340dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1341dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1342dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1343dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1344dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_GreaterGreater; break; 1345dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_GreaterEqual; break; 1346dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1347dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1348dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '>' && 1349dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[2] == '=' && 1350dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[3] == '\0') 1351dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1352dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_GreaterGreaterEqual; 1353dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1354dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1355dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1356dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case ',': 1357dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1358dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Comma; 1359dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1360dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1361dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '(': 1362dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 1363dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Call; 1364dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1365dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1366dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '[': 1367dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 1368dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Subscript; 1369dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1370dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1371dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1372dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return true; 1373dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton} 1374b01000fd063629facd45044f137446fb748ee179Greg Clayton 13758c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonstatic inline bool 13768c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytoncheck_op_param (bool unary, bool binary, uint32_t num_params) 13778c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{ 13788c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // The parameter count doens't include "this" 13798c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton if (num_params == 0) 13808c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return unary; 13818c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton if (num_params == 1) 13828c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return binary; 13838c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return false; 13848c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton} 13858c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton 13868c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonbool 13878c6907c4daa74a8ebc418ec6eed151b68bda6321Greg ClaytonClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params) 13888c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{ 13898c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (Unary, Binary, num_params); 13908c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton switch (op_kind) 13918c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton { 13928c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#include "clang/Basic/OperatorKinds.def" 13938c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton default: break; 13948c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton } 13958c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return false; 13968c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton} 13978c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton 1398412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 1399795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 1400795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 1401b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1402462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_opaque_type, 1403412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 1404462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 1405412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 14061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 14071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 140830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_inline, 140930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit 1410412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 1411795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 14123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 1413974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 1414795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1415b01000fd063629facd45044f137446fb748ee179Greg Clayton assert(ast); 1416795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1417b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 1418795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1419795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 1420795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 14213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 14221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1423b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl(); 1424795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 14251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 1426412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1427795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 14281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 14291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 143030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton CXXMethodDecl *cxx_method_decl = NULL; 14313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 143230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton DeclarationName decl_name (&identifier_table->get(name)); 143390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 143490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton const bool is_implicitly_declared = false; 143590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 1436d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 143790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 14385325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton if (function_Type == NULL) 143990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 144090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 1441d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 144230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 144390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (!method_function_prototype) 144490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 144590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 144690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 144790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 144890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (name[0] == '~') 144990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1450b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXDestructorDecl::Create (*ast, 145190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1452279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1453b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 145490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 14558950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan NULL, 145690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline, 145790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_implicitly_declared); 145890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1459b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (decl_name == cxx_record_decl->getDeclName()) 146030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton { 1461b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXConstructorDecl::Create (*ast, 146230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_record_decl, 1463279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1464b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 146530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton method_qual_type, 146630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton NULL, // TypeSourceInfo * 146730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit, 146830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 146930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_implicitly_declared); 147030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 147130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton else 147290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1473dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1474dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 1475dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (IsOperator (name, op_kind)) 147690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1477dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 1478dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 14798c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // Check the number of operator parameters. Sometimes we have 14808c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // seen bad DWARF that doesn't correctly describe operators and 14818c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // if we try to create a methed and add it to the class, clang 14828c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // will assert and crash, so we need to make sure things are 14838c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // acceptable. 14848c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params)) 14858c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return NULL; 1486b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast, 148790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1488279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1489b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 149090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 149190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 1492dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_static, 1493dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton SC_None, 1494279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_inline, 1495279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 1496dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1497dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (num_params == 0) 1498dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1499dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // Conversion operators don't take params... 1500b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXConversionDecl::Create (*ast, 1501dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_record_decl, 1502279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1503b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()), 1504dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton method_qual_type, 1505dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton NULL, // TypeSourceInfo * 1506dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline, 1507279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_explicit, 1508279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 1509dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 151090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1511dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1512dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (cxx_method_decl == NULL) 151390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1514b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast, 151590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1516279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1517dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 151890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 151990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 152090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_static, 152190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton SC_None, 1522279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_inline, 1523279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 152490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 152530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 1526dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1527462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 152847a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 15291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 15301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 153147a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 15323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 15333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1534a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis llvm::SmallVector<ParmVarDecl *, 12> params; 15353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 15363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 15373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 15383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 15393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1540a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis params.push_back (ParmVarDecl::Create (*ast, 1541a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis cxx_method_decl, 1542a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis SourceLocation(), 1543a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis SourceLocation(), 1544a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis NULL, // anonymous 1545a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis method_function_prototype->getArgType(param_index), 1546a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis NULL, 1547a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis SC_None, 1548a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis SC_None, 1549a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis NULL)); 15503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 15513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1552a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis cxx_method_decl->setParams (params.data(), num_params); 15533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 15541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 15557a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton 15567a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic()); 15577a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate()); 15587a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD()); 15597a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty()); 15607a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract()); 15617a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor()); 15627a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor()); 15637a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment()); 15647a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor()); 1565412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 1566795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 1567795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1568795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 156984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 157084f8075072eef306234f8109573067647735c111Greg Clayton( 1571b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1572462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_clang_type, 157384f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1574462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t field_type, 157584f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 157684f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 157784f8075072eef306234f8109573067647735c111Greg Clayton) 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1582b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1584b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1589d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = record_qual_type.getTypePtr(); 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1601b01000fd063629facd45044f137446fb748ee179Greg Clayton APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1602b01000fd063629facd45044f137446fb748ee179Greg Clayton bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1604b01000fd063629facd45044f137446fb748ee179Greg Clayton FieldDecl *field = FieldDecl::Create (*ast, 160584f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 160684f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 1607279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 160884f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 160984f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 16109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan NULL, // TInfo * 161184f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 16129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan false, // Mutable 16139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan false); // HasInit 161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161584f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 16239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1624d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 16259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 16269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 16271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 1628b01000fd063629facd45044f137446fb748ee179Greg Clayton ClangASTContext::AddObjCClassIVar (ast, 162960a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 16309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 16319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 16329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 16339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 16341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 16359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 16369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 1650b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1655b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast == NULL || field == NULL) 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 1664b01000fd063629facd45044f137446fb748ee179Greg Clayton if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast)) 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1701b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1703b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1705b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 1706b01000fd063629facd45044f137446fb748ee179Greg Clayton 1707d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr()); 1708b01000fd063629facd45044f137446fb748ee179Greg Clayton if (record_type) 170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1710b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordDecl *record_decl = record_type->getDecl(); 1711b01000fd063629facd45044f137446fb748ee179Greg Clayton if (record_decl) 171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1713b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t field_idx; 1714b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordDecl::field_iterator field, field_end; 1715b01000fd063629facd45044f137446fb748ee179Greg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 1716b01000fd063629facd45044f137446fb748ee179Greg Clayton field != field_end; 1717b01000fd063629facd45044f137446fb748ee179Greg Clayton ++field, ++field_idx) 171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1719b01000fd063629facd45044f137446fb748ee179Greg Clayton // If no accessibility was assigned, assign the correct one 1720b01000fd063629facd45044f137446fb748ee179Greg Clayton if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 1721b01000fd063629facd45044f137446fb748ee179Greg Clayton field->setAccess ((AccessSpecifier)default_accessibility); 172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 1731462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 17346e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 17356e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 17366e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 17376e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 1738ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)), 1739ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan SourceLocation()); 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1743e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1744e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1745e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1746e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1747e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1748e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1749e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1750e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1751e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1752e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1754462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1758b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl(); 1759b01000fd063629facd45044f137446fb748ee179Greg Clayton if (cxx_record_decl) 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1761b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_record_decl->setBases(base_classes, num_base_classes); 1762b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 176784f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 176884f8075072eef306234f8109573067647735c111Greg Clayton 1769462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 177084f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 177184f8075072eef306234f8109573067647735c111Greg Clayton( 177284f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 177384f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 177484f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 177584f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 177684f8075072eef306234f8109573067647735c111Greg Clayton) 177784f8075072eef306234f8109573067647735c111Greg Clayton{ 1778b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 1779b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 178084f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 178184f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 1782b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 178384f8075072eef306234f8109573067647735c111Greg Clayton 178484f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 178584f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 178684f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 178784f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 178884f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 1789b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast, 179084f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 179184f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 1792b01000fd063629facd45044f137446fb748ee179Greg Clayton &ast->Idents.get(name), 179384f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 179484f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 179584f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 17969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1797b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getObjCInterfaceType(decl).getAsOpaquePtr(); 179884f8075072eef306234f8109573067647735c111Greg Clayton} 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180084f8075072eef306234f8109573067647735c111Greg Claytonbool 1801462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 180284f8075072eef306234f8109573067647735c111Greg Clayton{ 180384f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 180484f8075072eef306234f8109573067647735c111Greg Clayton { 180584f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 180684f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 1807d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 1808d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *super_type = super_qual_type.getTypePtr(); 180984f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 181084f8075072eef306234f8109573067647735c111Greg Clayton { 1811d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 1812d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 181384f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 181484f8075072eef306234f8109573067647735c111Greg Clayton { 181584f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 181684f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 181784f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 181884f8075072eef306234f8109573067647735c111Greg Clayton { 181984f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 182084f8075072eef306234f8109573067647735c111Greg Clayton return true; 182184f8075072eef306234f8109573067647735c111Greg Clayton } 182284f8075072eef306234f8109573067647735c111Greg Clayton } 182384f8075072eef306234f8109573067647735c111Greg Clayton } 182484f8075072eef306234f8109573067647735c111Greg Clayton } 182584f8075072eef306234f8109573067647735c111Greg Clayton return false; 182684f8075072eef306234f8109573067647735c111Greg Clayton} 182784f8075072eef306234f8109573067647735c111Greg Clayton 182884f8075072eef306234f8109573067647735c111Greg Clayton 182984f8075072eef306234f8109573067647735c111Greg Claytonbool 183084f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 183184f8075072eef306234f8109573067647735c111Greg Clayton( 1832b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1833462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 183484f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1835462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t ivar_opaque_type, 183684f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 183784f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 18381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 183984f8075072eef306234f8109573067647735c111Greg Clayton) 184084f8075072eef306234f8109573067647735c111Greg Clayton{ 184184f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 184284f8075072eef306234f8109573067647735c111Greg Clayton return false; 184384f8075072eef306234f8109573067647735c111Greg Clayton 1844b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 184584f8075072eef306234f8109573067647735c111Greg Clayton 1846b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 184784f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 184884f8075072eef306234f8109573067647735c111Greg Clayton 184984f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 185084f8075072eef306234f8109573067647735c111Greg Clayton 1851d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 185284f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 185384f8075072eef306234f8109573067647735c111Greg Clayton { 1854d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 185584f8075072eef306234f8109573067647735c111Greg Clayton 185684f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 185784f8075072eef306234f8109573067647735c111Greg Clayton { 185884f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 185984f8075072eef306234f8109573067647735c111Greg Clayton 186084f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 186184f8075072eef306234f8109573067647735c111Greg Clayton { 186284f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 186384f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 186484f8075072eef306234f8109573067647735c111Greg Clayton { 1865b01000fd063629facd45044f137446fb748ee179Greg Clayton APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1866b01000fd063629facd45044f137446fb748ee179Greg Clayton bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 186784f8075072eef306234f8109573067647735c111Greg Clayton } 186884f8075072eef306234f8109573067647735c111Greg Clayton 1869b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast, 18709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 18719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 1872279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 18739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 18749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 18759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 18769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 18779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 18781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 18799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 18819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 18839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 18849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 188584f8075072eef306234f8109573067647735c111Greg Clayton } 188684f8075072eef306234f8109573067647735c111Greg Clayton } 188784f8075072eef306234f8109573067647735c111Greg Clayton } 188884f8075072eef306234f8109573067647735c111Greg Clayton return false; 188984f8075072eef306234f8109573067647735c111Greg Clayton} 189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18929488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 1893462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 18949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 18959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 18969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1897d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 18989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 18999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1900d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 19019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 19069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 19079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19089488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 19099488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 19109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 19119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 19129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 19149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 19159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 19179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 19189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 19199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 19209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 19229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 19231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1924462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl * 19251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 19261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 1927b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1928462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1930462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 19311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 19321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 19331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 19341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 19351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1937b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 19381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1939b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 19401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 19411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 19431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1944d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 19451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 19461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1948d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 19491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 19511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 19541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 19561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 19591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 19601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 19631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 19641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 19661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1967ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton size_t len = 0; 19681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 1969ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("name = '%s'\n", name); 1970ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1971ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton unsigned num_selectors_with_args = 0; 1972ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (start = selector_start; 19731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 1974ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton start += len) 19751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1976ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len = ::strcspn(start, ":]"); 19776bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton bool has_arg = (start[len] == ':'); 19786bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 1979ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ++num_selectors_with_args; 19801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 19816bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 19826bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton len += 1; 19831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 19841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 19871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 19881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1989b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 19901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 19911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 19931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 1995d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *method_type(method_qual_type.getTypePtr()); 19961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 19981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 2000d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 20011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 20031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 20041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 20071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 20081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 20091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 20101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 20121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 2013b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast, 20141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 20151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 20161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 20171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 20181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 20191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 20201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 20211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 20221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 20231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 20241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 20251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 20261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 20291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 20301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 20321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 20331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 20341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 20361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 2037b01000fd063629facd45044f137446fb748ee179Greg Clayton params.push_back (ParmVarDecl::Create (*ast, 20381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 20391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 2040279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 20411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 20421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 20431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 20441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 20451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 20461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 20471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 20481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 2049b01000fd063629facd45044f137446fb748ee179Greg Clayton objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args); 20501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 20519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 20531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 20561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 20571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 2059bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t 2060f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo 2061f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton( 2062f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type, 2063b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ASTContext *ast, 2064f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t *pointee_or_element_clang_type 2065f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton) 2066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 2067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type == NULL) 2068f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 2069f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2070f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2071f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = NULL; 2072bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2073bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 2074bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2075bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2076bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton switch (type_class) 2077bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 207804325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 207904325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 208004325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 208104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 208204325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 2083b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast && pointee_or_element_clang_type) 2084b01000fd063629facd45044f137446fb748ee179Greg Clayton *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 208504325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue; 20861a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 20871a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Bool: 20881a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Char_U: 20891a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::UChar: 20901a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::WChar_U: 20911a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Char16: 20921a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Char32: 20931a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::UShort: 20941a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::UInt: 20951a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::ULong: 20961a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::ULongLong: 20971a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::UInt128: 20981a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Char_S: 20991a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::SChar: 21001a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::WChar_S: 21011a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Short: 21021a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Int: 21031a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Long: 21041a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::LongLong: 21051a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Int128: 21061a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Float: 21071a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::Double: 21081a102087f54079c25c8827afac6153a44ca535daEnrico Granata case clang::BuiltinType::LongDouble: 21091a102087f54079c25c8827afac6153a44ca535daEnrico Granata return eTypeIsBuiltIn | eTypeHasValue | eTypeIsScalar; 2110f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton default: 2111f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 211204325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 211304325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeHasValue; 2114f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2115f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::BlockPointer: 2116f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2117f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2118f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 2119f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2120e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue; 2121f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2122f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ConstantArray: 2123f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::DependentSizedArray: 2124f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::IncompleteArray: 2125f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::VariableArray: 2126f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2127f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 2128f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsArray; 2129f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2130bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentName: return 0; 2131bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 2132bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 2133bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Decltype: return 0; 2134f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Enum: 2136f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2137f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr(); 2138f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsEnumeration | eTypeHasValue; 2139f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2140bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Elaborated: return 0; 2141bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector; 2142bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 2143bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 2144bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::InjectedClassName: return 0; 2145f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2148f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2149f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(); 2150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 2151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2152bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 2153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2154f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ObjCObjectPointer: 2155f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2156f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2157f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 2158f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2159bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2160bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2162f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Pointer: 2163f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2164f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2165f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 2166f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2167bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Record: 2168bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (qual_type->getAsCXXRecordDecl()) 2169bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 2170bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2171bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsStructUnion; 2172bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton break; 2173bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 2174bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 2175bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 2176f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2177f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Typedef: 21789e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2179b01000fd063629facd45044f137446fb748ee179Greg Clayton ast, 2180f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_or_element_clang_type); 2181f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2182bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOfExpr: return 0; 2183bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOf: return 0; 2184bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2185bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector; 2186bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton default: return 0; 2187bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2188bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return 0; 2189bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 2190bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 21919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 2195462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type) 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 220203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 220303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 22061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 22071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 22081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 22091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 22101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 22119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 22129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 22169e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 2226b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes) 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2228b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 2232b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 22339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 22349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2236960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2237960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 2238960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2239f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::BuiltinType::ObjCId: // child is Class 2240960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 2241960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2242f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2243960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2244960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2245960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2246960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2247960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2248c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2249e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 0; 2250c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 22511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 22527a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 22949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 22957a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 22969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2297d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 22989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 22999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 23009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 23029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 23049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 23079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 23089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 23109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 23129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 23139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 23159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 23169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 23199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 23239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 2325960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2326d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 2327960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2328b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2329b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 2330960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 2331960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 2332960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 2333960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2334960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2335960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 2336960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2337960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 23389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 234024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 234124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 234224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2345d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 2346c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType pointee_type (pointer_type->getPointeeType()); 2347b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2348b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 23499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 2351c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2352c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We have a pointer to a pointee type that claims it has no children. 2353c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We will want to look at 2354c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr()); 2355c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2361f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2362f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2363f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2364d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 2365f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type = reference_type->getPointeeType(); 2366b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2367b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 2368f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes); 2369f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this type points to a simple type, then it has 1 child 2370f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (num_pointee_children == 0) 2371f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = 1; 2372f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2373f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = num_pointee_children; 2374f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2375f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2376f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2377f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 23781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 2379b01000fd063629facd45044f137446fb748ee179Greg Clayton num_children = ClangASTContext::GetNumChildren (ast, 2380b01000fd063629facd45044f137446fb748ee179Greg Clayton cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2381b01000fd063629facd45044f137446fb748ee179Greg Clayton omit_empty_base_classes); 238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2390c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no 2391c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a 2392c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer, 2393c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type 2394c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show. 2395c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t 2396c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type) 2397c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{ 2398c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (clang_type == NULL) 2399c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2400c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2401c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 2402c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2403c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton switch (type_class) 2404c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 24059db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::Type::Builtin: 24069db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 24079db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton { 2408abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton case clang::BuiltinType::UnknownAny: 24099db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Void: 24109db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::NullPtr: 24119db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 0; 24129db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Bool: 24139db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_U: 24149db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UChar: 2415ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan case clang::BuiltinType::WChar_U: 24169db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char16: 24179db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char32: 24189db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UShort: 24199db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt: 24209db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULong: 24219db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULongLong: 24229db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt128: 24239db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_S: 24249db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::SChar: 2425ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan case clang::BuiltinType::WChar_S: 24269db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Short: 24279db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int: 24289db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Long: 24299db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongLong: 24309db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int128: 24319db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Float: 24329db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Double: 24339db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongDouble: 24349db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Dependent: 24359db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Overload: 24369db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCId: 24379db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCClass: 24389db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCSel: 24390de254aaec7d6766379191e5397ec2294042c5d7Sean Callanan case clang::BuiltinType::BoundMember: 24409db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 1; 24419db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton } 24429db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton break; 24439db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 2444e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 1; 2445c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Pointer: return 1; 2446c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them 2447c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::LValueReference: return 1; 2448c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::RValueReference: return 1; 2449c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::MemberPointer: return 0; 2450c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ConstantArray: return 0; 2451c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::IncompleteArray: return 0; 2452c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::VariableArray: return 0; 2453c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedArray: return 0; 2454c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedExtVector: return 0; 2455c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Vector: return 0; 2456c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ExtVector: return 0; 2457c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children... 2458c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children... 2459c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2460c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Paren: return 0; 2461c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 2462c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOfExpr: return 0; 2463c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOf: return 0; 2464c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Decltype: return 0; 2465c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Record: return 0; 2466c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Enum: return 1; 2467c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Elaborated: return 1; 2468c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateTypeParm: return 1; 2469c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::SubstTemplateTypeParm: return 1; 2470c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateSpecialization: return 1; 2471c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::InjectedClassName: return 0; 2472c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentName: return 1; 2473c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentTemplateSpecialization: return 1; 2474c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObject: return 0; 2475c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCInterface: return 0; 2476c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObjectPointer: return 1; 2477c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 2478c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton break; 2479c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2480c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2481c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton} 248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2483462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 248658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ExecutionContext *exe_ctx, 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2488462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 249224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds, 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2497bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 249800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_base_class, 249900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_deref_of_parent 250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 250558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham getASTContext(), 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 251124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2516bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 251700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 251800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2522462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 252558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ExecutionContext *exe_ctx, 2526b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2528462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 253224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds, 253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2537bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 253800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_base_class, 253900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_deref_of_parent 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2545b01000fd063629facd45044f137446fb748ee179Greg Clayton if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes)) 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 2550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = false; 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 255203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 255303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2555960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2556960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 2557960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2558960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 2559960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 256004325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_name = "isa"; 2561b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT; 2562b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 2563960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2564960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2565960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2566960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2567960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2568960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 25691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 25707a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, parent_qual_type)) 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 2575b01000fd063629facd45044f137446fb748ee179Greg Clayton const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl); 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 2604a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 2606a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; 260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 2611b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton 2612b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton child_name = ClangASTType::GetTypeNameForQualType(base_class->getType()); 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2614b01000fd063629facd45044f137446fb748ee179Greg Clayton uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType()); 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26169994a0bcfe1790b320f6a9cf51c8d5ac9c4efdbdJim Ingham // Base classes bit sizes should be a multiple of 8 bits in size 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 2619bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 2640b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType()); 264154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 2648b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size)) 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 26589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 26597a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, parent_qual_type)) 26609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2661d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 26629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 26639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 26649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 26669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 26679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 26699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2671b01000fd063629facd45044f137446fb748ee179Greg Clayton const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl); 26729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 26739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 26749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 26769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2677b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 26789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 26809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2681b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl)); 26829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 26859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2686b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 26879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 2689960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2690bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 26919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 26939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 26969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 26999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 27009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 2701960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2702960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 27039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 27059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 27159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2718b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 27219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 272358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since 272458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham // that doesn't account for the space taken up by unbacked properties, or from 272558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham // the changing size of base classes that are newer than this class. 272658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham // So if we have a process around that we can ask about this object, do so. 272758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_byte_offset = LLDB_INVALID_IVAR_OFFSET; 272858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 272958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham if (exe_ctx && exe_ctx->process) 273058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham { 273158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ObjCLanguageRuntime *objc_runtime = exe_ctx->process->GetObjCLanguageRuntime(); 273258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham if (objc_runtime != NULL) 273358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham { 2734979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr()); 273558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str()); 273658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham } 273758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham } 273858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 273958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET) 274058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham { 274158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 274258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_byte_offset = bit_offset / 8; 274358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham } 27449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 27469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 27489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 27569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2757d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2758960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2759960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2760960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2761960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 276200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 276300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 276458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 276558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ast, 2766960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 2767960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 2768960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 2769960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 2770960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 277124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 2772960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 2773960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 2774960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 2775960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 2776bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 277700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 277800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 2779960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2780960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2781960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 278200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = true; 2783960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 2784960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2785960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 2786960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 2787960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2788960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2789960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 2790960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 2791960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2792b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2793960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 2794960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 2795960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2796960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 2797960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2798960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 27999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 28009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 28019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 28021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (ignore_array_bounds || idx < element_count) 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2809b01000fd063629facd45044f137446fb748ee179Greg Clayton if (GetCompleteQualType (ast, array->getElementType())) 2810b01000fd063629facd45044f137446fb748ee179Greg Clayton { 2811b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2813b01000fd063629facd45044f137446fb748ee179Greg Clayton char element_name[64]; 2814b01000fd063629facd45044f137446fb748ee179Greg Clayton ::snprintf (element_name, sizeof (element_name), "[%u]", idx); 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2816b01000fd063629facd45044f137446fb748ee179Greg Clayton child_name.assign(element_name); 2817b01000fd063629facd45044f137446fb748ee179Greg Clayton assert(field_type_info.first % 8 == 0); 2818b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_size = field_type_info.first / 8; 281924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton child_byte_offset = (int32_t)idx * (int32_t)child_byte_size; 2820b01000fd063629facd45044f137446fb748ee179Greg Clayton return array->getElementType().getAsOpaquePtr(); 2821b01000fd063629facd45044f137446fb748ee179Greg Clayton } 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2828d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 28309db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 28319db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton // Don't dereference "void *" pointers 28329db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton if (pointee_type->isVoidType()) 28339db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return NULL; 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 283700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 283800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 283958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 284058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ast, 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 284624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2851bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 285200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 285300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = true; 285800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2868b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2878f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2879f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2880f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2881d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 2882f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type(reference_type->getPointeeType()); 2883f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr(); 2884f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type)) 2885f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 288600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 288700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 288858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 288958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ast, 2890f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton parent_name, 2891f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_clang_type, 2892f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton idx, 2893f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton transparent_pointers, 2894f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes, 289524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 2896f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name, 2897f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size, 2898f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset, 2899f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_size, 2900f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_offset, 290100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 290200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 2903f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2904f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2905f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2906f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (parent_name) 2907f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2908f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name.assign(1, '&'); 2909f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name += parent_name; 2910f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2911f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2912f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer to an simple type 2913f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (idx == 0) 2914f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2915b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2916f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton assert(clang_type_info.first % 8 == 0); 2917f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size = clang_type_info.first / 8; 2918f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset = 0; 2919f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return pointee_type.getAsOpaquePtr(); 2920f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2921f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2922f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2923f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2924f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 29251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 292658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 292758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ast, 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 29299e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 293324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2938bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 293900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 294000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2947f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2953b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false; 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 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", super_name, base_name, 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3127b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 3128462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 313703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 313803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 31417a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 31749b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan IdentifierInfo & ident_ref = ast->Idents.get(name_sref); 317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 320624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 32299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 32307a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 32319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 3233d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 32349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 32359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 32369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 32389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 32399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 32419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 32439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 32449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 3245823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 32469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 32489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 32509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 32529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 32539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 32549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 32569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 32579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 32619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 32639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 32649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 32659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 32669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 3267b01000fd063629facd45044f137446fb748ee179Greg Clayton if (GetIndexOfChildMemberWithName (ast, 3268b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 32699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 32709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 32719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 32729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 32749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 32759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 32769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 32799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 32809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 32819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 32829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 32879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 32899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 3290b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 32919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 32929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 32939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 32949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 32959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 32979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3306b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3327b01000fd063629facd45044f137446fb748ee179Greg Clayton// return GetIndexOfChildWithName (ast, 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 33341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 33351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3337d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3342b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3353d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3358b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3375b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 3386b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 33879e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3407b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 3408462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 34169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 341703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 34189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 341903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 34227a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3444b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType())); 3445b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton if (base_class_type_name.compare (name) == 0) 344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 346224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 34669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 34677a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 34689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 3470d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 34719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 34729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 34739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 34759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 34769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 34789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 34809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 34819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 34839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 34859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 34879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 34899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 34909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 34919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 34939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 34979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 34999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 35009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 35019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 35029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 35039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 35049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 35059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 35069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 35079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 3508b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 35099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 35109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 35119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 35129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 35139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 35149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 35151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3522b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3543b01000fd063629facd45044f137446fb748ee179Greg Clayton// return GetIndexOfChildWithName (ast, 354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 35501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 35511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3553d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3558b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 355924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3568d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3573b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3589b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 359324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 3600b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 36019e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 361024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 361424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3615462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 361624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 361824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 3620d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = tag_qual_type.getTypePtr(); 362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 362224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3623d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const TagType *tag_type = dyn_cast<TagType>(clang_type); 362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 3642462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type) 364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 364524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 364624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 364803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 364903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36519b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan case clang::Type::UnaryTransform: break; 36529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 36539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 36549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 36559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 36569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 3657279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentSizedArray: break; 36589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 3659279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentSizedExtVector: break; 36609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 36619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 36629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 36639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 36649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 36659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 36669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 36679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 36689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 36699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 36709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 36719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 36729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 36739e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 36749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 36759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 36769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 36779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 36789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 36799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 3680279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentTemplateSpecialization: break; 3681279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::TemplateTypeParm: break; 3682279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::SubstTemplateTypeParm: break; 3683279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::SubstTemplateTypeParmPack:break; 3684279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::PackExpansion: break; 3685279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::UnresolvedUsing: break; 3686279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Paren: break; 3687279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Elaborated: break; 3688279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Attributed: break; 3689279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Auto: break; 3690279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::InjectedClassName: break; 3691279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentName: break; 369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 369424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 369524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 369624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 369724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 369824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 369924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 370024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 370124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 370224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 370324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3706b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 3708b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 3709279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &ast->Idents.get(name)); 371024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 371324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 371424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 371524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 371624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 371724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 3718462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 371924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3722b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3723b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3727b01000fd063629facd45044f137446fb748ee179Greg Clayton return FunctionDecl::Create(*ast, 3728b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 372924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3730279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 3731b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationName (&ast->Idents.get(name)), 373224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 373424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 373524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 373624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3740b01000fd063629facd45044f137446fb748ee179Greg Clayton return FunctionDecl::Create(*ast, 3741b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3743279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 374424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 374624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 374724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 374824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 374924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 375024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 375124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 375224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 375324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 375424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3755462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3756b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast, 3757462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t result_type, 3758462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t *args, 37592ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 37602ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 37612ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 376224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3763b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 376424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 376524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 376624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 376724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 376824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 3769ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan FunctionProtoType::ExtProtoInfo proto_info; 3770ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.Variadic = is_variadic; 3771279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan proto_info.ExceptionSpecType = EST_None; 3772ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.TypeQuals = type_quals; 3773279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan proto_info.RefQualifier = RQ_None; 3774ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.NumExceptions = 0; 3775ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.Exceptions = NULL; 3776ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan 3777b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getFunctionType(QualType::getFromOpaquePtr(result_type), 377853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 377924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 3780ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info).getAsOpaquePtr(); // NoReturn); 378124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 378324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 3784462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3786b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3787b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 3788b01000fd063629facd45044f137446fb748ee179Greg Clayton return ParmVarDecl::Create(*ast, 3789b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 379024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3791279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 3792b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL, 37932ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 379424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 379624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 380924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3810462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3811462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3815b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3816b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 3818b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 382024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 382324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 382524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 382624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 382724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 382824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 382924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3830462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 383224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 383324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 383424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3835d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *t = qual_type.getTypePtr(); 383624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 383724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3838d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const TagType *tag_type = dyn_cast<TagType>(t); 383924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 384024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 384124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 384224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 384324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 384424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 384724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 385124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 385224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 385324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3854462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 385524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 385624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 385724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 385824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 385955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 386055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 386155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 386255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (cxx_record_decl) 386324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 386455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton cxx_record_decl->completeDefinition(); 386555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 386655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 386755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton } 386855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 3869d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 387004325065a00f646527db85e9bc751da29ac53b23Sean Callanan 387104325065a00f646527db85e9bc751da29ac53b23Sean Callanan if (objc_class_type) 387204325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 387304325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 387404325065a00f646527db85e9bc751da29ac53b23Sean Callanan 387504325065a00f646527db85e9bc751da29ac53b23Sean Callanan class_interface_decl->setForwardDecl(false); 387604325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 387704325065a00f646527db85e9bc751da29ac53b23Sean Callanan 387855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 387955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 388055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_type) 388155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton { 388255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 388355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 388455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_decl) 388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 388655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton /// TODO This really needs to be fixed. 388755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 388855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumPositiveBits = 1; 388955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumNegativeBits = 0; 389055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 3891b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 389248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 389348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton QualType promotion_qual_type; 389448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // If the enum integer type is less than an integer in bit width, 389548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // then we must promote it to an integer size. 3896b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy)) 389748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton { 389848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (enum_decl->getIntegerType()->isSignedIntegerType()) 3899b01000fd063629facd45044f137446fb748ee179Greg Clayton promotion_qual_type = ast->IntTy; 390048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 3901b01000fd063629facd45044f137446fb748ee179Greg Clayton promotion_qual_type = ast->UnsignedIntTy; 390248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton } 390348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 390448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = enum_decl->getIntegerType(); 390548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 390648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 390755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 391524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 391624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3917462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 39180d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType 39190d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton( 39200d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const char *name, 39210d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton DeclContext *decl_ctx, 39220d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const Declaration &decl, 39230d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton clang_type_t integer_qual_type 39240d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton) 392524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 392624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 392724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 3928b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3929b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 393048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 393148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // TODO: ask about these... 393248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsScoped = false; 393348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsFixed = false; 393448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 3935b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumDecl *enum_decl = EnumDecl::Create (*ast, 39360d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton decl_ctx, 393748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 393848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 3939279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan name && name[0] ? &ast->Idents.get(name) : NULL, 39409e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan NULL, 39419e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScoped 39429e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScopedUsingClassTag 39439e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false); // IsFixed 3944864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3945864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 394624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 3947e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 3948e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 3949e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 3950864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3951864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan enum_decl->setAccess(AS_public); // TODO respect what's in the debug info 3952864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3953b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTagDeclType(enum_decl).getAsOpaquePtr(); 3954e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3958462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3959462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3960462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 3961462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3962462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 3963d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = enum_qual_type.getTypePtr(); 3964462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (clang_type) 3965462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3966462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3967462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_type) 3968462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3969462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 3970462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_decl) 3971462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return enum_decl->getIntegerType().getAsOpaquePtr(); 3972462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3973462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3974462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 3975462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 397624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3979462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enum_clang_type, 3980462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enumerator_clang_type, 398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 398224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 398324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 398524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 398724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 398824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 399024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 3991b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 399224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 399324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3994b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 399524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 399624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 399724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3998d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = enum_qual_type.getTypePtr(); 399924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 400024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 400124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 400224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 400324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 400424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 400524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 400624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 400724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 4008b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumConstantDecl::Create (*ast, 4009b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_type->getDecl(), 4010b01000fd063629facd45044f137446fb748ee179Greg Clayton SourceLocation(), 4011b01000fd063629facd45044f137446fb748ee179Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 4012b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType::getFromOpaquePtr(enumerator_clang_type), 4013b01000fd063629facd45044f137446fb748ee179Greg Clayton NULL, 4014b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_llvm_apsint); 4015b01000fd063629facd45044f137446fb748ee179Greg Clayton 401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 401924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 402024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 402224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 402324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 402424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 402524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 402624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 402724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 402824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4029462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 4030462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type) 403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4032427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return CreatePointerType (getASTContext(), clang_type); 4033427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 4034427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 4035427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t 4036427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type) 4037427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 4038427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 40397b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 40407b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 40417b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 404203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 404303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 40447b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 40457b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 40467b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 4047427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 40487b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 40497b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 4050427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getPointerType(qual_type).getAsOpaquePtr(); 40517b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 40527b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 405324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 405424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 405524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4056462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 40576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast, 40586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 405924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 406024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 40616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 406224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 406324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 406424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4065462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 40666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast, 40676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 40706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4074462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 4075462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 4076fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 4077fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 4078fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 4079fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 4080fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 4081fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 4082fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 4083bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonuint32_t 408424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 408524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4086b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 4087b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTypeSize(ast->VoidPtrTy); 408824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 408924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 409024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4091917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type) 4092917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 4093917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton QualType pointee_qual_type; 4094917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (clang_type) 4095917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4096917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4097917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 4098917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool success = false; 4099917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton switch (type_class) 4100917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4101917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Builtin: 4102917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId) 4103917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4104917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4105917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = clang_type; 4106917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4107917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4108917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4109917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4110917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::ObjCObjectPointer: 4111917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4112917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 4113917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4114917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4115917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Pointer: 4116917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType(); 4117917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton success = true; 4118917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4119917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4120917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::LValueReference: 4121917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::RValueReference: 4122917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType(); 4123917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton success = true; 4124917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4125917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4126917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Typedef: 412719c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton return ClangASTContext::IsPossibleDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type); 4128917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4129917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton default: 4130917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4131917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4132917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4133917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (success) 4134917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4135917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check to make sure what we are pointing too is a possible dynamic C++ type 4136917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We currently accept any "void *" (in case we have a class that has been 4137917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // watered down to an opaque pointer) and virtual C++ classes. 4138917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass(); 4139917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton switch (pointee_type_class) 4140917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4141917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Builtin: 4142917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind()) 4143917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4144917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UnknownAny: 4145917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Void: 4146917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4147917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 4148917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4149917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4150917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::NullPtr: 4151917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Bool: 4152917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Char_U: 4153917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UChar: 4154917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::WChar_U: 4155917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Char16: 4156917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Char32: 4157917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UShort: 4158917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UInt: 4159917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ULong: 4160917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ULongLong: 4161917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UInt128: 4162917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Char_S: 4163917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::SChar: 4164917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::WChar_S: 4165917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Short: 4166917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Int: 4167917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Long: 4168917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::LongLong: 4169917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Int128: 4170917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Float: 4171917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Double: 4172917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::LongDouble: 4173917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Dependent: 4174917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Overload: 4175917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ObjCId: 4176917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ObjCClass: 4177917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ObjCSel: 4178917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::BoundMember: 4179917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4180917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4181917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4182917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4183917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Record: 4184917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4185917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl(); 4186917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (cxx_record_decl) 4187917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4188917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (GetCompleteQualType (ast, pointee_qual_type)) 4189917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4190917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton success = cxx_record_decl->isDynamicClass(); 4191917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4192917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 4193917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4194917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We failed to get the complete type, so we have to 4195917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // treat this as a void * which we might possibly be 4196917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // able to complete 4197917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton success = true; 4198917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4199917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (success) 4200917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4201917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4202917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 4203917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4204917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4205917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4206917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4207917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4208917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4209917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::ObjCObject: 4210917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::ObjCInterface: 4211917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4212917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const clang::ObjCObjectType *objc_class_type = pointee_qual_type->getAsObjCQualifiedInterfaceType(); 4213917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (objc_class_type) 4214917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4215917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetCompleteQualType (ast, pointee_qual_type); 4216917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4217917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 4218917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4219917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4220917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4221917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4222917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4223917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton default: 4224917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4225917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4226917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4227917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4228917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4229917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = NULL; 4230917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return false; 4231917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 4232917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4233917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4234917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool 423582f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type) 423682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{ 423782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton QualType pointee_qual_type; 423882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (clang_type) 423982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 424082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 424182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 424282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton bool success = false; 424382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton switch (type_class) 424482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 424582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::Pointer: 424682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType(); 424782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton success = true; 424882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 424982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 425082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::LValueReference: 425182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::RValueReference: 425282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType(); 425382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton success = true; 425482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 425582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 425682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::Typedef: 425782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type); 425882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 425982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton default: 426082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 426182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 426282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 426382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (success) 426482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 426582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // Check to make sure what we are pointing too is a possible dynamic C++ type 426682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // We currently accept any "void *" (in case we have a class that has been 426782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // watered down to an opaque pointer) and virtual C++ classes. 426882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass(); 426982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton switch (pointee_type_class) 427082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 427182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::Builtin: 427282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind()) 427382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 427482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UnknownAny: 427582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Void: 427682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (dynamic_pointee_type) 427782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 427882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return true; 427982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 428082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::NullPtr: 428182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Bool: 428282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Char_U: 428382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UChar: 428482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::WChar_U: 428582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Char16: 428682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Char32: 428782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UShort: 428882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UInt: 428982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ULong: 429082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ULongLong: 429182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UInt128: 429282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Char_S: 429382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::SChar: 429482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::WChar_S: 429582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Short: 429682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Int: 429782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Long: 429882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::LongLong: 429982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Int128: 430082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Float: 430182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Double: 430282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::LongDouble: 430382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Dependent: 430482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Overload: 430582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ObjCId: 430682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ObjCClass: 430782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ObjCSel: 430882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::BoundMember: 430982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 431082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 431182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 431282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::Record: 431382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 431482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl(); 431582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (cxx_record_decl) 431682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 431782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (GetCompleteQualType (ast, pointee_qual_type)) 431882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 43190f5e6f1a01b340d463fbdc692f3af492774a5ec4Greg Clayton success = cxx_record_decl->isDynamicClass(); 432082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 432182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton else 432282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 432382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // We failed to get the complete type, so we have to 432482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // treat this as a void * which we might possibly be 432582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // able to complete 432682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton success = true; 432782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 432882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (success) 432982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 433082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (dynamic_pointee_type) 433182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 433282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return true; 433382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 433482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 433582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 433682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 433782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 433882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton default: 433982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 434082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 434182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 434282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 434382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (dynamic_pointee_type) 434482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton *dynamic_pointee_type = NULL; 434582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return false; 434682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 434782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 434882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 434982f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 4350462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 435124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 435224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 435324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 435424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 435603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 435703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 435904325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 436004325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 436104325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 436204325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 436304325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 436404325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 436504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 436604325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 436704325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 436804325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 43691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 437024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 437124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 437224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 437424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 437524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 437624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 437824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 437924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 438024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 438224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 438324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 438424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 438624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 438724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 438824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 439024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 439124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 439224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 43949e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 439524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 439624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 439724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 439824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 439924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 440024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 440124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4402462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 440324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 440424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 440524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 440624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 440724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 440824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 440924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 441024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 441124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 441224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 441324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 441424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 441524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 441624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 441724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 441824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 441924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 442024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 442124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 442219c0d58b8d2c168b835477e6a681e971ac32ece5Greg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type) 442324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 442419c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton if (target_type) 442519c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton *target_type = NULL; 442619c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton 442724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 442824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 442924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 443003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 443103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 443224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 443304325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 443404325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 443504325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 443604325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 443704325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 443804325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 443904325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 444004325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 444104325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 444204325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 44431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 444424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 444524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 444624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 444824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 444924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 445024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 445224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 445324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 445424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 445624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 445724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 445824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 446019c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type); 446124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 446224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 446324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 446424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 446524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 446624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 446724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 446824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4469462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 447024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 447124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 447224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 447324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 447424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 447524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 447624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 447724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 447824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 447924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 448024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 448124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 448224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 448324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 448424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 448524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 448624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 448724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 448824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 448924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 449024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 449124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 449224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 449324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 449424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 449524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 449624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 449724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 449824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 449924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 450024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 450124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 450224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 450324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 450424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 450524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 450624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 45089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataClangASTContext::IsScalarType (lldb::clang_type_t clang_type) 45099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 45109762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata bool is_signed; 45119762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (ClangASTContext::IsIntegerType(clang_type, is_signed)) 45129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 45139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 45149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata uint32_t count; 45159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata bool is_complex; 45169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex; 45179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 45189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 45199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 45209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type) 45219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 45229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!IsPointerType(clang_type)) 45239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return false; 45249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 45259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 45269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr(); 45279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return IsScalarType(pointee_type); 45289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 45299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 45309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 45319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type) 45329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 45339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!IsArrayType(clang_type)) 45349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return false; 45359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 45369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 45379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 45389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return IsScalarType(item_type); 45399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 45409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 4541bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool 4543bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name) 4544bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 4545bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type) 4546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 4547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4548bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 4550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (cxx_record_decl) 4551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 4552bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 4553bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return true; 4554bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 4555bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 4556bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.clear(); 4557bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return false; 4558bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 4559bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4560bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 45611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 4562462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type) 45631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 45641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 45651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 45661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 45671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 45681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 45691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 45701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 45711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 45721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 45731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 4574462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type) 45751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 45761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 45771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 45781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 45791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 45801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 45811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 45821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 45831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 45841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 45851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 4586f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool 4587f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type) 4588f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 4589f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 4590f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return QualType::getFromOpaquePtr(clang_type)->isCharType(); 4591f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 4592f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 459324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 459424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4595462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 459624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4597f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_or_element_clang_type = NULL; 4598f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type)); 4599f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4600f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type == NULL) 4601f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 4602f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4603f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 460424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4605f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type)); 4606f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4607f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType()) 460824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4609f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4610f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (eTypeIsArray)) 461124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4612f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We know the size of the array and it could be a C string 4613f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // since it is an array of characters 4614f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 4615f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 461624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4617f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 461824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4619f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = 0; 4620f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 462124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 462224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 462324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 462424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 462524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 462624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 462724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 462824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4629462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 463003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 463103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 463203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 463303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 463403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 463503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 463603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 463703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 463803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 463903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 464003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 4641279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan default: 4642279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 464303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 46449e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 464503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 464603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 464703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 464803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 4649d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 465003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 465103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 465203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 465303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 465403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 465503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 465603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 465703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 465803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 4659f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t 4660f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type) 4661f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 4662f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 4663f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 466459e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 466559e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 466659e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton switch (type_class) 466759e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton { 466859e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton case clang::Type::ConstantArray: 466959e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton { 467059e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr()); 467159e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton if (array) 467259e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton return array->getSize().getLimitedValue(); 467359e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton } 467459e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton break; 467559e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton 467659e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton case clang::Type::Typedef: 467759e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 46781a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 46791a102087f54079c25c8827afac6153a44ca535daEnrico Granata 46801a102087f54079c25c8827afac6153a44ca535daEnrico Granata default: 46811a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 468259e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton } 4683f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 4684f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 4685f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 468603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 468703e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 4688462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 468924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 469024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 469124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 469224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 469324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 469424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 469503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 469603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 469724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4698279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan default: 4699279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 470059e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton 47011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 470224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 470324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 470424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 4705381f968161e2274c55706ead0baed444a26b5092Greg Clayton *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX); 470624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 470759e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton 47081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 470924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 471024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 471124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 471224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 471324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 471459e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton 47151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 471624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 471724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 471824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 471924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 47205aad3f5581aec9ee62277d92b11cba7abf837dbdGreg Clayton return true; 472159e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton 47221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 472324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 472424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 472524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 472624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 472724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 472859e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton 472959e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton case clang::Type::Typedef: 473059e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton return ClangASTContext::IsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 473159e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton member_type, 473259e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton size); 473324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 473424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 473524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 473624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 473724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 473824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 473924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4740462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 4741462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 474224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 474324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 474424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 474524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4746b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 474724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 4748b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 474924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 475024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 4751b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 4752b01000fd063629facd45044f137446fb748ee179Greg Clayton TypedefDecl *decl = TypedefDecl::Create (*ast, 4753b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx, 4754b01000fd063629facd45044f137446fb748ee179Greg Clayton SourceLocation(), 4755279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 4756b01000fd063629facd45044f137446fb748ee179Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 4757b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->CreateTypeSourceInfo(qual_type)); 4758864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 4759864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan decl->setAccess(AS_public); // TODO respect proper access specifier 476024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 476124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 4762b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTypedefType (decl).getAsOpaquePtr(); 476324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 476424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 476524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 476624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 476724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 476824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 476924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 477024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 477124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 477224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 477324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 4774b01000fd063629facd45044f137446fb748ee179Greg 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) 477524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 477624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 477724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 477824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 477924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 478024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 478124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 478224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 478324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 478424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 478524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 478624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 478724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 478824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 478924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 479024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 479124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 479224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 479324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 479424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 479524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 479624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 479724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 479824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 479924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 480024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 480124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 480224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 480324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 480424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 480524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 480624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 480724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 480824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 4809b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 481024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 481124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 481224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 481324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 481424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 481524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 481624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 481724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 481824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 481924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 482024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 482124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 482224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 4823b01000fd063629facd45044f137446fb748ee179Greg Clayton APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref); 482424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4825b01000fd063629facd45044f137446fb748ee179Greg Clayton const uint64_t bit_size = ast->getTypeSize (qual_type); 482624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 482724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 482824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 482924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 483024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 483124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 483224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 483324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 483424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 483524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 483624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 483724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 483824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 483924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 484024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 484124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 484224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 484324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 484424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 484524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4846a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4847a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 4848462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 4849a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 4850a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 4851a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4852a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4853a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4854a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 4855a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 4856b01000fd063629facd45044f137446fb748ee179Greg Clayton 4857b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 4858b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type) 4859b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 4860b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 4861b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 4862b01000fd063629facd45044f137446fb748ee179Greg Clayton 48637a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type)); 4864b01000fd063629facd45044f137446fb748ee179Greg Clayton} 4865b01000fd063629facd45044f137446fb748ee179Greg Clayton 4866b01000fd063629facd45044f137446fb748ee179Greg Clayton 4867b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 4868b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang_type_t clang_type) 4869b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 4870b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::GetCompleteType (getASTContext(), clang_type); 4871b01000fd063629facd45044f137446fb748ee179Greg Clayton} 4872b01000fd063629facd45044f137446fb748ee179Greg Clayton 4873e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Claytonbool 4874e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg ClaytonClangASTContext::GetCompleteDecl (clang::ASTContext *ast, 4875e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton clang::Decl *decl) 4876e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{ 4877e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!decl) 4878e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4879e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4880e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton ExternalASTSource *ast_source = ast->getExternalSource(); 4881e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4882e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!ast_source) 4883e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4884e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4885e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl)) 4886e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 4887e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (tag_decl->getDefinition()) 4888e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return true; 4889e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4890e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!tag_decl->hasExternalLexicalStorage()) 4891e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4892e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4893e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton ast_source->CompleteType(tag_decl); 4894e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4895e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return !tag_decl->getTypeForDecl()->isIncompleteType(); 4896e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 4897e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl)) 4898e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 4899e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!objc_interface_decl->isForwardDecl()) 4900e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return true; 4901e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4902e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!objc_interface_decl->hasExternalLexicalStorage()) 4903e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4904e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4905e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton ast_source->CompleteType(objc_interface_decl); 4906e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4907e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return !objc_interface_decl->isForwardDecl(); 4908e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 4909e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton else 4910e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 4911e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4912e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 4913e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton} 4914e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4915a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Claytonclang::DeclContext * 4916a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg ClaytonClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl) 4917a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton{ 4918a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton return clang::dyn_cast<clang::DeclContext>(cxx_method_decl); 4919a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton} 4920a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton 4921a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Claytonclang::DeclContext * 4922a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg ClaytonClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl) 4923a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton{ 4924a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton return clang::dyn_cast<clang::DeclContext>(objc_method_decl); 4925a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton} 4926a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton 4927