forked from OSchip/llvm-project
Objective-C runtime class descriptors can now
populate Clang ObjCInterfaceDecls with their ivars, methods, and properties. The default implementation does nothing. I have also made sure that AppleObjCRuntimeV2 creates ObjCInterfaceDecls that actually get queried appropriately. llvm-svn: 164164
This commit is contained in:
parent
947148aa45
commit
27c658bd18
|
@ -113,6 +113,13 @@ public:
|
||||||
virtual ObjCISA
|
virtual ObjCISA
|
||||||
GetISA () = 0;
|
GetISA () = 0;
|
||||||
|
|
||||||
|
// This should return true iff the interface could be completed
|
||||||
|
virtual bool
|
||||||
|
CompleteInterface (clang::ObjCInterfaceDecl *interface_decl)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual
|
virtual
|
||||||
~ClassDescriptor ()
|
~ClassDescriptor ()
|
||||||
{}
|
{}
|
||||||
|
|
|
@ -1029,6 +1029,12 @@ public:
|
||||||
return m_isa;
|
return m_isa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool
|
||||||
|
CompleteInterface (clang::ObjCInterfaceDecl *interface_decl)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool
|
virtual bool
|
||||||
IsRealized ()
|
IsRealized ()
|
||||||
{
|
{
|
||||||
|
@ -1510,7 +1516,7 @@ AppleObjCRuntimeV2::UpdateISAToDescriptorMap_Impl()
|
||||||
|
|
||||||
ClassDescriptorSP descriptor_sp = ClassDescriptorSP(new ClassDescriptorV2(elt.second, process_sp));
|
ClassDescriptorSP descriptor_sp = ClassDescriptorSP(new ClassDescriptorV2(elt.second, process_sp));
|
||||||
|
|
||||||
if (log)
|
if (log && log->GetVerbose())
|
||||||
log->Printf("AppleObjCRuntimeV2 added (ObjCISA)0x%llx (%s) from dynamic table to isa->descriptor cache", elt.second, elt.first.AsCString());
|
log->Printf("AppleObjCRuntimeV2 added (ObjCISA)0x%llx (%s) from dynamic table to isa->descriptor cache", elt.second, elt.first.AsCString());
|
||||||
|
|
||||||
m_isa_to_descriptor_cache[elt.second] = descriptor_sp;
|
m_isa_to_descriptor_cache[elt.second] = descriptor_sp;
|
||||||
|
@ -1556,7 +1562,7 @@ AppleObjCRuntimeV2::UpdateISAToDescriptorMap_Impl()
|
||||||
|
|
||||||
ClassDescriptorSP descriptor_sp = ClassDescriptorSP(new ClassDescriptorV2(objc_isa, process_sp));
|
ClassDescriptorSP descriptor_sp = ClassDescriptorSP(new ClassDescriptorV2(objc_isa, process_sp));
|
||||||
|
|
||||||
if (log)
|
if (log && log->GetVerbose())
|
||||||
log->Printf("AppleObjCRuntimeV2 added (ObjCISA)0x%llx (%s) from static table to isa->descriptor cache", objc_isa, descriptor_sp->GetClassName().AsCString());
|
log->Printf("AppleObjCRuntimeV2 added (ObjCISA)0x%llx (%s) from static table to isa->descriptor cache", objc_isa, descriptor_sp->GetClassName().AsCString());
|
||||||
|
|
||||||
m_isa_to_descriptor_cache[objc_isa] = descriptor_sp;
|
m_isa_to_descriptor_cache[objc_isa] = descriptor_sp;
|
||||||
|
|
|
@ -31,9 +31,56 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
clang::DeclContextLookupResult
|
clang::DeclContextLookupResult
|
||||||
FindExternalVisibleDeclsByName (const clang::DeclContext *DC,
|
FindExternalVisibleDeclsByName (const clang::DeclContext *decl_ctx,
|
||||||
clang::DeclarationName Name)
|
clang::DeclarationName name)
|
||||||
{
|
{
|
||||||
|
static unsigned int invocation_id = 0;
|
||||||
|
unsigned int current_id = invocation_id++;
|
||||||
|
|
||||||
|
lldb::LogSP log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); // FIXME - a more appropriate log channel?
|
||||||
|
|
||||||
|
if (log)
|
||||||
|
{
|
||||||
|
log->Printf("AppleObjCExternalASTSource::FindExternalVisibleDeclsByName[%u] on (ASTContext*)%p Looking for %s in (%sDecl*)%p",
|
||||||
|
current_id,
|
||||||
|
&decl_ctx->getParentASTContext(),
|
||||||
|
name.getAsString().c_str(),
|
||||||
|
decl_ctx->getDeclKindName(),
|
||||||
|
decl_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
const clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
|
||||||
|
|
||||||
|
if (!interface_decl)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ObjCLanguageRuntime::ObjCISA objc_isa = (ObjCLanguageRuntime::ObjCISA)GetMetadata((uintptr_t)interface_decl);
|
||||||
|
|
||||||
|
if (!objc_isa)
|
||||||
|
break;
|
||||||
|
|
||||||
|
clang::ObjCInterfaceDecl *non_const_interface_decl = const_cast<clang::ObjCInterfaceDecl*>(interface_decl);
|
||||||
|
|
||||||
|
if (non_const_interface_decl->hasExternalVisibleStorage())
|
||||||
|
{
|
||||||
|
ObjCLanguageRuntime::ClassDescriptorSP descriptor = m_type_vendor.m_runtime.GetClassDescriptor(objc_isa);
|
||||||
|
|
||||||
|
if (!descriptor)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (descriptor->CompleteInterface(non_const_interface_decl))
|
||||||
|
non_const_interface_decl->setHasExternalLexicalStorage(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (non_const_interface_decl->hasExternalLexicalStorage()) // hasExternalLexicalStorage() is cleared during completion
|
||||||
|
break;
|
||||||
|
|
||||||
|
return non_const_interface_decl->lookup(name);
|
||||||
|
}
|
||||||
|
while(0);
|
||||||
|
|
||||||
return clang::DeclContextLookupResult();
|
return clang::DeclContextLookupResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,14 +93,62 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CompleteType (clang::TagDecl *Tag)
|
CompleteType (clang::TagDecl *tag_decl)
|
||||||
{
|
{
|
||||||
|
static unsigned int invocation_id = 0;
|
||||||
|
unsigned int current_id = invocation_id++;
|
||||||
|
|
||||||
|
lldb::LogSP log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); // FIXME - a more appropriate log channel?
|
||||||
|
|
||||||
|
if (log)
|
||||||
|
{
|
||||||
|
log->Printf("AppleObjCExternalASTSource::CompleteType[%u] on (ASTContext*)%p Completing (TagDecl*)%p named %s",
|
||||||
|
current_id,
|
||||||
|
&tag_decl->getASTContext(),
|
||||||
|
tag_decl,
|
||||||
|
tag_decl->getName().str().c_str());
|
||||||
|
|
||||||
|
log->Printf(" AOEAS::CT[%u] Before:", current_id);
|
||||||
|
ASTDumper dumper((clang::Decl*)tag_decl);
|
||||||
|
dumper.ToLog(log, " [CT] ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log)
|
||||||
|
{
|
||||||
|
log->Printf(" AOEAS::CT[%u] After:", current_id);
|
||||||
|
ASTDumper dumper((clang::Decl*)tag_decl);
|
||||||
|
dumper.ToLog(log, " [CT] ");
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CompleteType (clang::ObjCInterfaceDecl *Class)
|
CompleteType (clang::ObjCInterfaceDecl *interface_decl)
|
||||||
{
|
{
|
||||||
|
static unsigned int invocation_id = 0;
|
||||||
|
unsigned int current_id = invocation_id++;
|
||||||
|
|
||||||
|
lldb::LogSP log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); // FIXME - a more appropriate log channel?
|
||||||
|
|
||||||
|
if (log)
|
||||||
|
{
|
||||||
|
log->Printf("AppleObjCExternalASTSource::CompleteType[%u] on (ASTContext*)%p Completing (ObjCInterfaceDecl*)%p named %s",
|
||||||
|
current_id,
|
||||||
|
&interface_decl->getASTContext(),
|
||||||
|
interface_decl,
|
||||||
|
interface_decl->getName().str().c_str());
|
||||||
|
|
||||||
|
log->Printf(" AOEAS::CT[%u] Before:", current_id);
|
||||||
|
ASTDumper dumper((clang::Decl*)interface_decl);
|
||||||
|
dumper.ToLog(log, " [CT] ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log)
|
||||||
|
{
|
||||||
|
log->Printf(" [CT] After:");
|
||||||
|
ASTDumper dumper((clang::Decl*)interface_decl);
|
||||||
|
dumper.ToLog(log, " [CT] ");
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +170,7 @@ public:
|
||||||
translation_unit_decl->setHasExternalLexicalStorage();
|
translation_unit_decl->setHasExternalLexicalStorage();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
AppleObjCTypeVendor &m_type_vendor;
|
AppleObjCTypeVendor &m_type_vendor;
|
||||||
};
|
};
|
||||||
|
|
||||||
AppleObjCTypeVendor::AppleObjCTypeVendor(ObjCLanguageRuntime &runtime) :
|
AppleObjCTypeVendor::AppleObjCTypeVendor(ObjCLanguageRuntime &runtime) :
|
||||||
|
@ -179,8 +274,8 @@ AppleObjCTypeVendor::FindTypes (const ConstString &name,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
m_external_source->SetMetadata((uintptr_t)new_iface_decl, (uint64_t)isa);
|
m_external_source->SetMetadata((uintptr_t)new_iface_decl, (uint64_t)isa);
|
||||||
|
|
||||||
new_iface_decl->setHasExternalVisibleStorage();
|
new_iface_decl->setHasExternalVisibleStorage();
|
||||||
|
ast_ctx->getTranslationUnitDecl()->addDecl(new_iface_decl);
|
||||||
|
|
||||||
clang::QualType new_iface_type = ast_ctx->getObjCInterfaceType(new_iface_decl);
|
clang::QualType new_iface_type = ast_ctx->getObjCInterfaceType(new_iface_decl);
|
||||||
|
|
||||||
|
@ -192,6 +287,10 @@ AppleObjCTypeVendor::FindTypes (const ConstString &name,
|
||||||
dumper.GetCString(),
|
dumper.GetCString(),
|
||||||
(uint64_t)isa);
|
(uint64_t)isa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
types.push_back(ClangASTType(ast_ctx, new_iface_type.getAsOpaquePtr()));
|
||||||
|
ret++;
|
||||||
|
break;
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue