[cfe-commits] r150726 - /cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
Fariborz Jahanian
fjahanian at apple.com
Thu Feb 16 13:37:05 PST 2012
Author: fjahanian
Date: Thu Feb 16 15:37:05 2012
New Revision: 150726
URL: http://llvm.org/viewvc/llvm-project?rev=150726&view=rev
Log:
modern objective-c translator: write the root class meta-data.
Modified:
cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
Modified: cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp?rev=150726&r1=150725&r2=150726&view=diff
==============================================================================
--- cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp (original)
+++ cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp Thu Feb 16 15:37:05 2012
@@ -5218,7 +5218,7 @@
/// struct _class_t * const superclass;
/// void *cache;
/// IMP *vtable;
-/// struct class_ro_t *ro;
+/// struct _class_ro_t *ro;
/// }
/// struct _category_t {
@@ -5301,7 +5301,7 @@
Result += "\tstruct _class_t *const superclass;\n";
Result += "\tvoid *cache;\n";
Result += "\tvoid *vtable;\n";
- Result += "\tstruct class_ro_t *ro;\n";
+ Result += "\tstruct _class_ro_t *ro;\n";
Result += "};\n";
Result += "\nstruct _category_t {\n";
@@ -5313,6 +5313,9 @@
Result += "\tconst struct _prop_list_t *const properties;\n";
Result += "};\n";
+ Result += "extern void *_objc_empty_cache;\n";
+ Result += "extern void *_objc_empty_vtable;\n";
+
meta_data_declared = true;
}
@@ -5534,6 +5537,66 @@
Result += "};\n";
}
+static void Write_class_t(ASTContext *Context, std::string &Result,
+ StringRef VarName,
+ const ObjCInterfaceDecl *CDecl, bool metadata) {
+ WriteModernMetadataDeclarations(Result);
+
+ if (metadata && !CDecl->getSuperClass()) {
+ // Need to handle a case of use of forward declaration.
+ Result += "\nextern struct _class_t OBJC_CLASS_$_";
+ Result += CDecl->getNameAsString();
+ Result += ";\n";
+ }
+ // Also, for possibility of 'super' metadata class not having been defined yet.
+ if (CDecl->getSuperClass()) {
+ Result += "\nextern struct _class_t "; Result += VarName;
+ Result += CDecl->getSuperClass()->getNameAsString();
+ Result += ";\n";
+ }
+
+ Result += "\nstruct _class_t "; Result += VarName; Result += CDecl->getNameAsString();
+ Result += " __attribute__ ((used, section (\"__DATA,__objc_data\"))) = {\n";
+ Result += "\t";
+ if (metadata) {
+ if (CDecl->getSuperClass()) {
+ Result += "&"; Result += VarName;
+ Result += CDecl->getSuperClass()->getNameAsString();
+ Result += ",\n\t";
+ Result += "&"; Result += VarName;
+ Result += CDecl->getSuperClass()->getNameAsString();
+ Result += ",\n\t";
+ }
+ else {
+ Result += "&"; Result += VarName;
+ Result += CDecl->getNameAsString();
+ Result += ",\n\t";
+ Result += "&OBJC_CLASS_$_"; Result += CDecl->getNameAsString();
+ Result += ",\n\t";
+ }
+ }
+ else {
+ Result += "&OBJC_METACLASS_$_";
+ Result += CDecl->getNameAsString();
+ Result += ",\n\t";
+ if (CDecl->getSuperClass()) {
+ Result += "&"; Result += VarName;
+ Result += CDecl->getSuperClass()->getNameAsString();
+ Result += ",\n\t";
+ }
+ else
+ Result += "0,\n\t";
+ }
+ Result += "(void *)&_objc_empty_cache,\n\t";
+ Result += "(void *)&_objc_empty_vtable,\n\t";
+ if (metadata)
+ Result += "&_OBJC_METACLASS_RO_$_";
+ else
+ Result += "&_OBJC_CLASS_RO_$_";
+ Result += CDecl->getNameAsString();
+ Result += ",\n};\n";
+}
+
static void Write__extendedMethodTypes_initializer(RewriteModernObjC &RewriteObj,
ASTContext *Context, std::string &Result,
ArrayRef<ObjCMethodDecl *> Methods,
@@ -6014,6 +6077,15 @@
ClassProperties,
"_OBJC_CLASS_RO_$_",
CDecl->getNameAsString());
+
+ Write_class_t(Context, Result,
+ "OBJC_METACLASS_$_",
+ CDecl, /*metaclass*/true);
+
+ Write_class_t(Context, Result,
+ "OBJC_CLASS_$_",
+ CDecl, /*metaclass*/false);
+
}
void RewriteModernObjC::RewriteMetaDataIntoBuffer(std::string &Result) {
More information about the cfe-commits
mailing list