1c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan//===-- AppleObjCSymbolVendor.cpp -------------------------------*- C++ -*-===// 2c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan// 3c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan// The LLVM Compiler Infrastructure 4c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan// 5c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan// This file is distributed under the University of Illinois Open Source 6c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan// License. See LICENSE.TXT for details. 7c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan// 8c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan//===----------------------------------------------------------------------===// 9c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 10c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "AppleObjCTypeVendor.h" 11c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 12c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "lldb/Core/Log.h" 13c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "lldb/Core/Module.h" 14c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "lldb/Expression/ASTDumper.h" 15c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "lldb/Symbol/ClangExternalASTSourceCommon.h" 16c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "lldb/Target/ObjCLanguageRuntime.h" 17c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "lldb/Target/Process.h" 18c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "lldb/Target/Target.h" 19c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 20c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "clang/AST/ASTContext.h" 21c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan#include "clang/AST/DeclObjC.h" 22c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 23c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callananusing namespace lldb_private; 24c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 25c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callananclass lldb_private::AppleObjCExternalASTSource : public ClangExternalASTSourceCommon 26c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan{ 27c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callananpublic: 28c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan AppleObjCExternalASTSource (AppleObjCTypeVendor &type_vendor) : 29c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan m_type_vendor(type_vendor) 30c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 31c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 32c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 3379e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan bool 3481a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan FindExternalVisibleDeclsByName (const clang::DeclContext *decl_ctx, 3581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan clang::DeclarationName name) 36c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 3781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan static unsigned int invocation_id = 0; 3881a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan unsigned int current_id = invocation_id++; 3981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 40952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); // FIXME - a more appropriate log channel? 4181a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 4281a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan if (log) 4381a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan { 4481a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan log->Printf("AppleObjCExternalASTSource::FindExternalVisibleDeclsByName[%u] on (ASTContext*)%p Looking for %s in (%sDecl*)%p", 4581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan current_id, 4681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan &decl_ctx->getParentASTContext(), 4781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan name.getAsString().c_str(), 4881a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan decl_ctx->getDeclKindName(), 4981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan decl_ctx); 5081a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan } 5181a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 5281a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan do 5381a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan { 5481a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan const clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx); 5581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 5681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan if (!interface_decl) 5781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan break; 5881a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 5981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan clang::ObjCInterfaceDecl *non_const_interface_decl = const_cast<clang::ObjCInterfaceDecl*>(interface_decl); 6081a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 61d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (!m_type_vendor.FinishDecl(non_const_interface_decl)) 6281a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan break; 6379e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan 6479e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan clang::DeclContext::lookup_const_result result = non_const_interface_decl->lookup(name); 6579e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan 6679e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan return (result.size() != 0); 6781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan } 6881a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan while(0); 6981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 7079e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan SetNoExternalVisibleDeclsForName(decl_ctx, name); 7179e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan return false; 72c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 73c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 74c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan clang::ExternalLoadResult 75c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan FindExternalLexicalDecls (const clang::DeclContext *DC, 76c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan bool (*isKindWeWant)(clang::Decl::Kind), 77c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan llvm::SmallVectorImpl<clang::Decl*> &Decls) 78c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 79c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan return clang::ELR_Success; 80c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 81c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 82c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan void 8381a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan CompleteType (clang::TagDecl *tag_decl) 84c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 8581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan static unsigned int invocation_id = 0; 8681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan unsigned int current_id = invocation_id++; 8781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 88952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); // FIXME - a more appropriate log channel? 8981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 9081a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan if (log) 9181a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan { 9281a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan log->Printf("AppleObjCExternalASTSource::CompleteType[%u] on (ASTContext*)%p Completing (TagDecl*)%p named %s", 9381a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan current_id, 9481a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan &tag_decl->getASTContext(), 9581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan tag_decl, 9681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan tag_decl->getName().str().c_str()); 9781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 9881a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan log->Printf(" AOEAS::CT[%u] Before:", current_id); 9981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan ASTDumper dumper((clang::Decl*)tag_decl); 10081a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan dumper.ToLog(log, " [CT] "); 10181a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan } 10281a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 10381a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan if (log) 10481a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan { 10581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan log->Printf(" AOEAS::CT[%u] After:", current_id); 10681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan ASTDumper dumper((clang::Decl*)tag_decl); 10781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan dumper.ToLog(log, " [CT] "); 10881a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan } 109c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan return; 110c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 111c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 112c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan void 11381a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan CompleteType (clang::ObjCInterfaceDecl *interface_decl) 114c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 11581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan static unsigned int invocation_id = 0; 11681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan unsigned int current_id = invocation_id++; 11781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 118952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); // FIXME - a more appropriate log channel? 11981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 12081a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan if (log) 12181a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan { 12281a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan log->Printf("AppleObjCExternalASTSource::CompleteType[%u] on (ASTContext*)%p Completing (ObjCInterfaceDecl*)%p named %s", 12381a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan current_id, 12481a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan &interface_decl->getASTContext(), 12581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan interface_decl, 12681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan interface_decl->getName().str().c_str()); 12781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 12881a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan log->Printf(" AOEAS::CT[%u] Before:", current_id); 12981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan ASTDumper dumper((clang::Decl*)interface_decl); 13081a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan dumper.ToLog(log, " [CT] "); 13181a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan } 132282c22c6a6b6e54324b0d474b90d918bbfd3a10eSean Callanan 133282c22c6a6b6e54324b0d474b90d918bbfd3a10eSean Callanan m_type_vendor.FinishDecl(interface_decl); 13481a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 13581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan if (log) 13681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan { 13781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan log->Printf(" [CT] After:"); 13881a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan ASTDumper dumper((clang::Decl*)interface_decl); 13981a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan dumper.ToLog(log, " [CT] "); 14081a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan } 141c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan return; 142c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 143c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 144c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan bool 145c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan layoutRecordType(const clang::RecordDecl *Record, 146c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan uint64_t &Size, 147c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan uint64_t &Alignment, 148c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets, 149c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets, 150c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets) 151c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 152c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan return false; 153c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 154c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 155c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan void StartTranslationUnit (clang::ASTConsumer *Consumer) 156c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 157c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan clang::TranslationUnitDecl *translation_unit_decl = m_type_vendor.m_ast_ctx.getASTContext()->getTranslationUnitDecl(); 158c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan translation_unit_decl->setHasExternalVisibleStorage(); 159c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan translation_unit_decl->setHasExternalLexicalStorage(); 160c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 161c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callananprivate: 16281a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan AppleObjCTypeVendor &m_type_vendor; 163c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan}; 164c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 165c718b9652bb1a7aea5d133123fcc8bc87277002cSean CallananAppleObjCTypeVendor::AppleObjCTypeVendor(ObjCLanguageRuntime &runtime) : 166c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan TypeVendor(), 167c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan m_runtime(runtime), 168c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan m_ast_ctx(runtime.GetProcess()->GetTarget().GetArchitecture().GetTriple().getTriple().c_str()) 169c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan{ 170c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan m_external_source = new AppleObjCExternalASTSource (*this); 171c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan llvm::OwningPtr<clang::ExternalASTSource> external_source_owning_ptr (m_external_source); 172c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan m_ast_ctx.getASTContext()->setExternalSource(external_source_owning_ptr); 173c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan} 174c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 175d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callananclang::ObjCInterfaceDecl* 176d83ecab0aeb229504737e34b2f03c07fcb967480Sean CallananAppleObjCTypeVendor::GetDeclForISA(ObjCLanguageRuntime::ObjCISA isa) 177d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan{ 178d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan ISAToInterfaceMap::const_iterator iter = m_isa_to_interface.find(isa); 179d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 180d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (iter != m_isa_to_interface.end()) 181d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return iter->second; 182d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 183d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan clang::ASTContext *ast_ctx = m_ast_ctx.getASTContext(); 184d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 185d387b462eecb908af265ecc7006781b4532073adGreg Clayton ObjCLanguageRuntime::ClassDescriptorSP descriptor = m_runtime.GetClassDescriptorFromISA(isa); 186d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 187d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (!descriptor) 188d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return NULL; 189d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 190d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan const ConstString &name(descriptor->GetClassName()); 191d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 192d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan clang::IdentifierInfo &identifier_info = ast_ctx->Idents.get(name.GetStringRef()); 193d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 194d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan clang::ObjCInterfaceDecl *new_iface_decl = clang::ObjCInterfaceDecl::Create(*ast_ctx, 195d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan ast_ctx->getTranslationUnitDecl(), 196d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan clang::SourceLocation(), 197d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan &identifier_info, 198d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan NULL); 199d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 200a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham ClangASTMetadata meta_data; 201017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton meta_data.SetISAPtr(isa); 202017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton m_external_source->SetMetadata(new_iface_decl, meta_data); 2032a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 204d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan new_iface_decl->setHasExternalVisibleStorage(); 205282c22c6a6b6e54324b0d474b90d918bbfd3a10eSean Callanan new_iface_decl->setHasExternalLexicalStorage(); 2062a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 207d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan ast_ctx->getTranslationUnitDecl()->addDecl(new_iface_decl); 208d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 209d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan m_isa_to_interface[isa] = new_iface_decl; 210d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 211d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return new_iface_decl; 212d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan} 213d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 2142a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callananclass ObjCRuntimeMethodType 2152a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan{ 2162a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callananpublic: 2172a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ObjCRuntimeMethodType (const char *types) : m_is_valid(false) 2182a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2192a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const char *cursor = types; 2202a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan enum ParserState { 2212a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan Start = 0, 2222a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan InType, 2232a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan InPos 2242a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } state = Start; 2252a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const char *type = NULL; 2262a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan int brace_depth = 0; 2272a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 2282a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan uint32_t stepsLeft = 256; 2292a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 2302a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan while (1) 2312a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2322a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (--stepsLeft == 0) 2332a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2342a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan m_is_valid = false; 2352a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return; 2362a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 2372a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 2382a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan switch (state) 2392a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2402a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case Start: 2412a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2422a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan switch (*cursor) 2432a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2442a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan default: 2452a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan state = InType; 2462a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan type = cursor; 2472a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 2482a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '\0': 2492a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan m_is_valid = true; 2502a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return; 2512a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '0': case '1': case '2': case '3': case '4': 2522a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '5': case '6': case '7': case '8': case '9': 2532a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan m_is_valid = false; 2542a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return; 2552a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 2562a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 2572a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 2582a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case InType: 2592a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2602a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan switch (*cursor) 2612a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2622a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan default: 2632a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ++cursor; 2642a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 2652a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '0': case '1': case '2': case '3': case '4': 2662a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '5': case '6': case '7': case '8': case '9': 2672a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (!brace_depth) 2682a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2692a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan state = InPos; 2702a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (type) 2712a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2722a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan m_type_vector.push_back(std::string(type, (cursor - type))); 2732a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 2742a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan else 2752a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2762a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan m_is_valid = false; 2772a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return; 2782a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 2792a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan type = NULL; 2802a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 2812a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan else 2822a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2832a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ++cursor; 2842a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 2852a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 2862a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '[': case '{': case '(': 2872a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ++brace_depth; 2882a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ++cursor; 2892a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 2902a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case ']': case '}': case ')': 2912a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (!brace_depth) 2922a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 2932a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan m_is_valid = false; 2942a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return; 2952a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 2962a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan --brace_depth; 2972a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ++cursor; 2982a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 2992a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '\0': 3002a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan m_is_valid = false; 3012a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return; 3022a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3032a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3042a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 3052a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case InPos: 3062a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 3072a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan switch (*cursor) 3082a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 3092a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan default: 3102a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan state = InType; 3112a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan type = cursor; 3122a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 3132a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '0': case '1': case '2': case '3': case '4': 3142a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '5': case '6': case '7': case '8': case '9': 3152a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ++cursor; 3162a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 3172a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '\0': 3182a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan m_is_valid = true; 3192a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return; 3202a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3212a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3222a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 3232a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3242a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3252a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3262a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 327d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan clang::ObjCMethodDecl *BuildMethod (clang::ObjCInterfaceDecl *interface_decl, const char *name, bool instance) 3282a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 3292a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (!m_is_valid || m_type_vector.size() < 3) 3302a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return NULL; 3312a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3322a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::ASTContext &ast_ctx(interface_decl->getASTContext()); 3332a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3342a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::QualType return_qual_type; 3352a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 336d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan const bool isInstance = instance; 3372a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const bool isVariadic = false; 3382a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const bool isSynthesized = false; 3392a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const bool isImplicitlyDeclared = true; 3402a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const bool isDefined = false; 3412a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None; 3422a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const bool HasRelatedResultType = false; 3432a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3442a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan std::vector <clang::IdentifierInfo *> selector_components; 3452a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3462a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan const char *name_cursor = name; 3472a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan bool is_zero_argument = true; 3482a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3492a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan while (*name_cursor != '\0') 3502a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 35125b2109486963038a436bdb82fd327a6e5bb8d6dDaniel Malea const char *colon_loc = strchr(name_cursor, ':'); 3522a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (!colon_loc) 3532a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 3542a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan selector_components.push_back(&ast_ctx.Idents.get(llvm::StringRef(name_cursor))); 3552a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan break; 3562a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3572a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan else 3582a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 3594702d432baf10b143adf0256469f8c77b1c19067Sean Callanan is_zero_argument = false; 3602a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan selector_components.push_back(&ast_ctx.Idents.get(llvm::StringRef(name_cursor, colon_loc - name_cursor))); 3612a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan name_cursor = colon_loc + 1; 3622a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3632a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 3642a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3652a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::Selector sel = ast_ctx.Selectors.getSelector(is_zero_argument ? 0 : selector_components.size(), selector_components.data()); 3662a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3672a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::QualType ret_type = BuildType(ast_ctx, m_type_vector[0].c_str()); 3682a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3692a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (ret_type.isNull()) 3702a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return NULL; 3712a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3722a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::ObjCMethodDecl *ret = clang::ObjCMethodDecl::Create(ast_ctx, 3732a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::SourceLocation(), 3742a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::SourceLocation(), 3752a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan sel, 3762a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ret_type, 3772a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan NULL, 3782a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan interface_decl, 3792a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan isInstance, 3802a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan isVariadic, 3812a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan isSynthesized, 3822a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan isImplicitlyDeclared, 3832a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan isDefined, 3842a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan impControl, 3852a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan HasRelatedResultType); 3862a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3872a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan std::vector <clang::ParmVarDecl*> parm_vars; 3882a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3892a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan for (size_t ai = 3, ae = m_type_vector.size(); 3902a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ai != ae; 3912a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ++ai) 3922a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 3932a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::QualType arg_type = BuildType(ast_ctx, m_type_vector[ai].c_str()); 3942a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3952a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (arg_type.isNull()) 3962a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return NULL; // well, we just wasted a bunch of time. Wish we could delete the stuff we'd just made! 3972a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 3982a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan parm_vars.push_back(clang::ParmVarDecl::Create(ast_ctx, 3992a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ret, 4002a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::SourceLocation(), 4012a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::SourceLocation(), 4022a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan NULL, 4032a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan arg_type, 4042a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan NULL, 4052a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::SC_None, 4062a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan NULL)); 4072a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 4082a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 4092a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ret->setMethodParams(ast_ctx, llvm::ArrayRef<clang::ParmVarDecl*>(parm_vars), llvm::ArrayRef<clang::SourceLocation>()); 4102a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 4112a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ret; 4122a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 4132a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callananprivate: 4142a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::QualType BuildType (clang::ASTContext &ast_ctx, const char *type) 4152a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 4162a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (!type) 4172a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return clang::QualType(); 4182a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 4192a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan switch (*type) 4202a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 4212a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan default: 4222a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.UnknownAnyTy; 4232a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'r': 4242a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 4252a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::QualType target_type = BuildType(ast_ctx, type+1); 4262a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (target_type.isNull()) 4272a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return clang::QualType(); 4286ecafc737e5c2b61e3e4ce34ac81609569a4d083Sean Callanan else if (target_type == ast_ctx.UnknownAnyTy) 4296ecafc737e5c2b61e3e4ce34ac81609569a4d083Sean Callanan return ast_ctx.UnknownAnyTy; 4302a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan else 4312a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.getConstType(target_type); 4322a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 4332a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '^': 4342a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 4352a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan clang::QualType target_type = BuildType(ast_ctx, type+1); 4362a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (target_type.isNull()) 4372a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return clang::QualType(); 4386ecafc737e5c2b61e3e4ce34ac81609569a4d083Sean Callanan else if (target_type == ast_ctx.UnknownAnyTy) 4396ecafc737e5c2b61e3e4ce34ac81609569a4d083Sean Callanan return ast_ctx.UnknownAnyTy; 4402a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan else 4412a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.getPointerType(target_type); 4422a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 4432a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'c': 4442a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.CharTy; 4452a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'i': 4462a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.IntTy; 4472a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 's': 4482a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.ShortTy; 4492a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'l': 4502a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (ast_ctx.getTypeSize(ast_ctx.VoidTy) == 64) 4512a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.IntTy; 4522a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan else 4532a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.LongTy; 4542a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'q': 4552a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.LongLongTy; 4562a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'C': 4572a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.UnsignedCharTy; 4582a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'I': 4592a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.UnsignedIntTy; 4602a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'S': 4612a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.UnsignedShortTy; 4622a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'L': 4632a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (ast_ctx.getTypeSize(ast_ctx.VoidTy) == 64) 4642a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.UnsignedIntTy; 4652a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan else 4662a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.UnsignedLongTy; 4672a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'Q': 4682a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.UnsignedLongLongTy; 4692a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'f': 4702a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.FloatTy; 4712a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'd': 4722a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.DoubleTy; 4732a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'B': 4742a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.BoolTy; 4752a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case 'v': 4762a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.VoidTy; 4772a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '*': 4782a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.getPointerType(ast_ctx.CharTy); 4792a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '@': 4802a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.getObjCIdType(); 4812a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case '#': 4822a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.getObjCClassType(); 4832a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan case ':': 4842a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return ast_ctx.getObjCSelType(); 4852a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 4862a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan return clang::QualType(); 4872a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 4882a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 4892a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan typedef std::vector <std::string> TypeVector; 4902a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 4912a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan TypeVector m_type_vector; 4922a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan bool m_is_valid; 4932a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan}; 4942a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 495d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callananbool 496d83ecab0aeb229504737e34b2f03c07fcb967480Sean CallananAppleObjCTypeVendor::FinishDecl(clang::ObjCInterfaceDecl *interface_decl) 497d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan{ 498952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); // FIXME - a more appropriate log channel? 4992a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 500017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton ClangASTMetadata *metadata = m_external_source->GetMetadata(interface_decl); 501a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham ObjCLanguageRuntime::ObjCISA objc_isa = 0; 502a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham if (metadata) 503a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham objc_isa = metadata->GetISAPtr(); 504d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 505d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (!objc_isa) 506d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return false; 507d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 508d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (!interface_decl->hasExternalVisibleStorage()) 509d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return true; 510d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 511d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan interface_decl->startDefinition(); 512d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 5132a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan interface_decl->setHasExternalVisibleStorage(false); 514282c22c6a6b6e54324b0d474b90d918bbfd3a10eSean Callanan interface_decl->setHasExternalLexicalStorage(false); 5152a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 516d387b462eecb908af265ecc7006781b4532073adGreg Clayton ObjCLanguageRuntime::ClassDescriptorSP descriptor = m_runtime.GetClassDescriptorFromISA(objc_isa); 517d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 518d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (!descriptor) 519d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return false; 520d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 521d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan auto superclass_func = [interface_decl, this](ObjCLanguageRuntime::ObjCISA isa) 522d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan { 523d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan clang::ObjCInterfaceDecl *superclass_decl = GetDeclForISA(isa); 524d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (!superclass_decl) 525d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return; 526d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan interface_decl->setSuperClass(superclass_decl); 527d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan }; 528d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 529b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea auto instance_method_func = [log, interface_decl, this](const char *name, const char *types) -> bool 5302a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 5312a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ObjCRuntimeMethodType method_type(types); 532d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 533d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan clang::ObjCMethodDecl *method_decl = method_type.BuildMethod (interface_decl, name, true); 534d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan 535499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan if (log) 536499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan log->Printf("[ AOTV::FD] Instance method [%s] [%s]", name, types); 537499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan 538d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan if (method_decl) 539d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan interface_decl->addDecl(method_decl); 540d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan 541d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan return false; 542d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan }; 543d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan 544b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea auto class_method_func = [log, interface_decl, this](const char *name, const char *types) -> bool 545d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan { 546d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan ObjCRuntimeMethodType method_type(types); 547d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan 548d123b989d453c70244b04d4c9ef7792214e9010aSean Callanan clang::ObjCMethodDecl *method_decl = method_type.BuildMethod (interface_decl, name, false); 5492a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 550499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan if (log) 551499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan log->Printf("[ AOTV::FD] Class method [%s] [%s]", name, types); 552499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan 5532a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (method_decl) 5542a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan interface_decl->addDecl(method_decl); 555d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan 556d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan return false; 557d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan }; 558d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 559499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan if (log) 560499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan { 561499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan ASTDumper method_dumper ((clang::Decl*)interface_decl); 562499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan 563499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan log->Printf("[AppleObjCTypeVendor::FinishDecl] Finishing Objective-C interface for %s", descriptor->GetClassName().AsCString()); 564499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan } 565499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan 566499222ad8bced17ad5ec72224d313b30224767a9Sean Callanan 567d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan if (!descriptor->Describe(superclass_func, 568d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan instance_method_func, 569d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan class_method_func, 570d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan std::function <bool (const char *, const char *, lldb::addr_t, uint64_t)> (nullptr))) 571d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return false; 5722a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 5732a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan if (log) 5742a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan { 5752a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan ASTDumper method_dumper ((clang::Decl*)interface_decl); 5762a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 5772a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan log->Printf("[AppleObjCTypeVendor::FinishDecl] Finished Objective-C interface"); 5782a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 5792a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan method_dumper.ToLog(log, " [AOTV::FD] "); 5802a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan } 5812a5ca48974884c1344e3eff4a60ae63e05fa8ea7Sean Callanan 582d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan return true; 583d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan} 584d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 585c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callananuint32_t 586c718b9652bb1a7aea5d133123fcc8bc87277002cSean CallananAppleObjCTypeVendor::FindTypes (const ConstString &name, 587c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan bool append, 588c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan uint32_t max_matches, 589c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan std::vector <ClangASTType> &types) 590c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan{ 591c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan static unsigned int invocation_id = 0; 592c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan unsigned int current_id = invocation_id++; 593c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 594952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); // FIXME - a more appropriate log channel? 595c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 596c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan if (log) 597c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan log->Printf("AppleObjCTypeVendor::FindTypes [%u] ('%s', %s, %u, )", 598c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan current_id, 599c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan (const char*)name.AsCString(), 600c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan append ? "true" : "false", 601c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan max_matches); 602c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 603c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan if (!append) 604c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan types.clear(); 605c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 606c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan uint32_t ret = 0; 607c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 608c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan do 609c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 610c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan // See if the type is already in our ASTContext. 611c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 612c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan clang::ASTContext *ast_ctx = m_ast_ctx.getASTContext(); 613c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 614c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan clang::IdentifierInfo &identifier_info = ast_ctx->Idents.get(name.GetStringRef()); 615c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan clang::DeclarationName decl_name = ast_ctx->DeclarationNames.getIdentifier(&identifier_info); 616c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 617c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan clang::DeclContext::lookup_const_result lookup_result = ast_ctx->getTranslationUnitDecl()->lookup(decl_name); 618c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 619ca8fb173fa66d9c93e02c4abfd4627c143795653Sean Callanan if (!lookup_result.empty()) 620c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 621ca8fb173fa66d9c93e02c4abfd4627c143795653Sean Callanan if (const clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(lookup_result[0])) 622c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 623c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan clang::QualType result_iface_type = ast_ctx->getObjCInterfaceType(result_iface_decl); 624c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 625c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan if (log) 626c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 627c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan ASTDumper dumper(result_iface_type); 628a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham 629a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham uint64_t isa_value = LLDB_INVALID_ADDRESS; 630017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton ClangASTMetadata *metadata = m_external_source->GetMetadata(result_iface_decl); 631a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham if (metadata) 632a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham isa_value = metadata->GetISAPtr(); 633a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham 6345f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("AOCTV::FT [%u] Found %s (isa 0x%" PRIx64 ") in the ASTContext", 635c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan current_id, 636c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan dumper.GetCString(), 637a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham isa_value); 638c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 639c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 640c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan types.push_back(ClangASTType(ast_ctx, result_iface_type.getAsOpaquePtr())); 641c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan ret++; 642c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan break; 643c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 644c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan else 645c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 646c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan if (log) 647c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan log->Printf("AOCTV::FT [%u] There's something in the ASTContext, but it's not something we know about", 648c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan current_id); 649c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan break; 650c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 651c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 652c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan else if(log) 653c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 654c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan log->Printf("AOCTV::FT [%u] Couldn't find %s in the ASTContext", 655c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan current_id, 656c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan name.AsCString()); 657c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 658c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 659c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan // It's not. If it exists, we have to put it into our ASTContext. 660d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan 661c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan ObjCLanguageRuntime::ObjCISA isa = m_runtime.GetISA(name); 662c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 663c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan if (!isa) 664c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 665c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan if (log) 666c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan log->Printf("AOCTV::FT [%u] Couldn't find the isa", 667c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan current_id); 668c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 669c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan break; 670c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 671c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 672d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan clang::ObjCInterfaceDecl *iface_decl = GetDeclForISA(isa); 673c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 674d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (!iface_decl) 675d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan { 676d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan if (log) 6775f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("AOCTV::FT [%u] Couldn't get the Objective-C interface for isa 0x%" PRIx64, 678d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan current_id, 679d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan (uint64_t)isa); 680d7a2da512b706278ab99a47b5939ee4cd64abcd8Sean Callanan 681d7a2da512b706278ab99a47b5939ee4cd64abcd8Sean Callanan break; 682d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan } 683c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 684d83ecab0aeb229504737e34b2f03c07fcb967480Sean Callanan clang::QualType new_iface_type = ast_ctx->getObjCInterfaceType(iface_decl); 685c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 686c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan if (log) 687c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan { 688c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan ASTDumper dumper(new_iface_type); 6895f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("AOCTV::FT [%u] Created %s (isa 0x%" PRIx64 ")", 690c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan current_id, 691c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan dumper.GetCString(), 692c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan (uint64_t)isa); 693c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } 69481a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan 69581a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan types.push_back(ClangASTType(ast_ctx, new_iface_type.getAsOpaquePtr())); 69681a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan ret++; 69781a5a09e76cfc1f110c0416e372f9f6cc27d79cfSean Callanan break; 698c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan } while (0); 699c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan 700c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan return ret; 701c718b9652bb1a7aea5d133123fcc8bc87277002cSean Callanan} 702