From: Fariborz Jahanian Date: Wed, 8 Feb 2012 19:53:58 +0000 (+0000) Subject: More rewriting of objective-c moderin abi metadata. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=da9624a77352bc61b9713c31edd671c02a3ff260;p=clang More rewriting of objective-c moderin abi metadata. All protocol related metadata is close to completion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150084 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp index f8367157f2..e572b96e13 100644 --- a/lib/Rewrite/RewriteModernObjC.cpp +++ b/lib/Rewrite/RewriteModernObjC.cpp @@ -360,10 +360,8 @@ namespace { StringRef prefix, StringRef ClassName, std::string &Result); - virtual void RewriteObjCProtocolMetaData(ObjCProtocolDecl *Protocol, - StringRef prefix, - StringRef ClassName, - std::string &Result); + void RewriteObjCProtocolMetaData(ObjCProtocolDecl *Protocol, + std::string &Result); virtual void RewriteObjCProtocolListMetaData( const ObjCList &Prots, StringRef prefix, StringRef ClassName, std::string &Result); @@ -5009,7 +5007,7 @@ void RewriteModernObjC::HandleTranslationUnit(ASTContext &C) { // Write out meta data for each @protocol(). for (llvm::SmallPtrSet::iterator I = ProtocolExprDecls.begin(), E = ProtocolExprDecls.end(); I != E; ++I) - RewriteObjCProtocolMetaData(*I, "", "", Preamble); + RewriteObjCProtocolMetaData(*I, Preamble); InsertText(SM->getLocForStartOfFile(MainFileID), Preamble, false); if (ClassImplementation.size() || CategoryImplementation.size()) @@ -5227,11 +5225,6 @@ static void WriteModernMetadataDeclarations(std::string &Result) { Result += "\nstruct _protocol_t;\n"; - Result += "\nstruct _protocol_list_t {\n"; - Result += "\tlong protocol_count; // Note, this is 32/64 bit\n"; - Result += "\tstruct _protocol_t *protocol_list[/*protocol_count*/];\n"; - Result += "};\n"; - Result += "\nstruct _objc_method {\n"; Result += "\tstruct objc_selector * _cmd;\n"; Result += "\tconst char *method_type;\n"; @@ -5255,6 +5248,15 @@ static void WriteModernMetadataDeclarations(std::string &Result) { meta_data_declared = true; } +static void Write_protocol_list_t_TypeDecl(std::string &Result, + long super_protocol_count) { + Result += "struct /*_protocol_list_t*/"; Result += " {\n"; + Result += "\tlong protocol_count; // Note, this is 32/64 bit\n"; + Result += "\tstruct _protocol_t *super_protocols["; + Result += utostr(super_protocol_count); Result += "];\n"; + Result += "}"; +} + static void Write_method_list_t_TypeDecl(std::string &Result, unsigned int method_count) { Result += "struct /*_method_list_t*/"; Result += " {\n"; @@ -5275,6 +5277,29 @@ static void Write__prop_list_t_TypeDecl(std::string &Result, Result += "}"; } +static void Write_protocol_list_initializer(ASTContext *Context, std::string &Result, + ArrayRef SuperProtocols, + StringRef VarName, + StringRef ProtocolName) { + if (SuperProtocols.size() > 0) { + Result += "\nstatic "; + Write_protocol_list_t_TypeDecl(Result, SuperProtocols.size()); + Result += " "; Result += VarName; + Result += ProtocolName; + Result += " __attribute__ ((used, section (\"__DATA,__objc_const\"))) = {\n"; + Result += "\t"; Result += utostr(SuperProtocols.size()); Result += ",\n"; + for (unsigned i = 0, e = SuperProtocols.size(); i < e; i++) { + ObjCProtocolDecl *SuperPD = SuperProtocols[i]; + Result += "\t&"; Result += "_OBJC_PROTOCOL_"; + Result += SuperPD->getNameAsString(); + if (i == e-1) + Result += "\n};\n"; + else + Result += ",\n"; + } + } +} + static void Write_method_list_t_initializer(ASTContext *Context, std::string &Result, ArrayRef Methods, StringRef VarName, @@ -5344,9 +5369,8 @@ static void Write__prop_list_t_initializer(RewriteModernObjC &RewriteObj, } /// RewriteObjCProtocolMetaData - Rewrite protocols meta-data. -void RewriteModernObjC::RewriteObjCProtocolMetaData( - ObjCProtocolDecl *PDecl, StringRef prefix, - StringRef ClassName, std::string &Result) { +void RewriteModernObjC::RewriteObjCProtocolMetaData(ObjCProtocolDecl *PDecl, + std::string &Result) { // Do not synthesize the protocol more than once. if (ObjCSynthesizedProtocols.count(PDecl->getCanonicalDecl())) @@ -5355,6 +5379,11 @@ void RewriteModernObjC::RewriteObjCProtocolMetaData( if (ObjCProtocolDecl *Def = PDecl->getDefinition()) PDecl = Def; + // Must write out all protocol definitions in current qualifier list, + // and in their nested qualifiers before writing out current definition. + for (ObjCProtocolDecl::protocol_iterator I = PDecl->protocol_begin(), + E = PDecl->protocol_end(); I != E; ++I) + RewriteObjCProtocolMetaData(*I, Result); // Construct method lists. std::vector InstanceMethods, ClassMethods; @@ -5380,6 +5409,17 @@ void RewriteModernObjC::RewriteObjCProtocolMetaData( ClassMethods.push_back(MD); } } + + // Protocol's super protocol list + std::vector SuperProtocols; + for (ObjCProtocolDecl::protocol_iterator I = PDecl->protocol_begin(), + E = PDecl->protocol_end(); I != E; ++I) + SuperProtocols.push_back(*I); + + Write_protocol_list_initializer(Context, Result, SuperProtocols, + "_OBJC_PROTOCOL_REFS_", + PDecl->getNameAsString()); + Write_method_list_t_initializer(Context, Result, InstanceMethods, "_OBJC_PROTOCOL_INSTANCE_METHODS_", PDecl->getNameAsString()); @@ -5413,9 +5453,12 @@ void RewriteModernObjC::RewriteObjCProtocolMetaData( Result += " __attribute__ ((used, section (\"__DATA,__datacoal_nt,coalesced\"))) = {\n"; Result += "\t0,\n"; // id is; is null Result += "\t\""; Result += PDecl->getNameAsString(); Result += "\",\n"; - - // FIXME. const struct _protocol_list_t * protocol_list; // super protocols - Result += "\t0,\n"; + if (SuperProtocols.size() > 0) { + Result += "\t(const struct _protocol_list_t *)&"; Result += "_OBJC_PROTOCOL_REFS_"; + Result += PDecl->getNameAsString(); Result += ",\n"; + } + else + Result += "\t0,\n"; if (InstanceMethods.size() > 0) { Result += "\t(const struct method_list_t *)&_OBJC_PROTOCOL_INSTANCE_METHODS_"; Result += PDecl->getNameAsString(); Result += ",\n"; @@ -5470,7 +5513,7 @@ void RewriteModernObjC::RewriteObjCProtocolListMetaData( if (Protocols.empty()) return; for (unsigned i = 0; i != Protocols.size(); i++) - RewriteObjCProtocolMetaData(Protocols[i], prefix, ClassName, Result); + RewriteObjCProtocolMetaData(Protocols[i], Result); // Output the top lovel protocol meta-data for the class. /* struct _objc_protocol_list {