Patch to rewrite ivar tables metadata for classes defined.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43151 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index 8954a19..883482c 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -45,6 +45,7 @@
void RewriteFunctionBody(Stmt *S);
void RewriteAtEncode(ObjCEncodeExpr *Exp);
+ void WriteObjcClassMetaData(ObjcImplementationDecl *IDecl);
void WriteObjcMetaData();
~RewriteTest();
@@ -119,7 +120,7 @@
if (*CI)
RewriteFunctionBody(*CI);
}
-
+
void RewriteTest::RewriteAtEncode(ObjCEncodeExpr *Exp) {
// Create a new string expression.
QualType StrType = Context->getPointerType(Context->CharTy);
@@ -129,11 +130,66 @@
delete Replacement;
}
+void RewriteTest::WriteObjcClassMetaData(ObjcImplementationDecl *IDecl) {
+ ObjcInterfaceDecl *CDecl = IDecl->getClassInterface();
+
+ if (IDecl->getImplDeclNumIvars() > 0 ||
+ CDecl&& CDecl->getIntfDeclNumIvars() > 0) {
+ static bool objc_ivar = false;
+
+ int NumIvars = IDecl->getImplDeclNumIvars() > 0
+ ? IDecl->getImplDeclNumIvars()
+ : CDecl->getIntfDeclNumIvars();
+
+ if (!objc_ivar) {
+ /* struct _objc_ivar {
+ char *ivar_name;
+ char *ivar_type;
+ int ivar_offset;
+ };
+ */
+ printf("\nstruct _objc_ivar {\n");
+ printf("\tchar *ivar_name;\n");
+ printf("\tchar *ivar_type;\n");
+ printf("\tint ivar_offset;\n");
+ printf("};\n");
+ objc_ivar = true;
+ }
+
+ /* struct _objc_ivar_list {
+ int ivar_count;
+ struct _objc_ivar ivar_list[ivar_count];
+ };
+ */
+ printf("\nstatic struct {\n");
+ printf("\tint ivar_count;\n");
+ printf("\tstruct _objc_ivar ivar_list[%d];\n", NumIvars);
+ printf("} _OBJC_INSTANCE_VARIABLES_%s "
+ "__attribute__ ((section (\"__OBJC, __instance_vars\")))= "
+ "{\n\t%d\n",IDecl->getName(),
+ NumIvars);
+ ObjcIvarDecl **Ivars = IDecl->getImplDeclIVars()
+ ? IDecl->getImplDeclIVars()
+ : CDecl->getIntfDeclIvars();
+ for (int i = 0; i < NumIvars; i++)
+ // TODO: 1) ivar names may have to go to another section. 2) encode
+ // ivar_type type of each ivar . 3) compute and add ivar offset.
+ printf("\t,\"%s\", \"\", 0\n", Ivars[i]->getName());
+ printf("};\n");
+ }
+
+}
+
void RewriteTest::WriteObjcMetaData() {
int ClsDefCount = ClassImplementation.size();
int CatDefCount = CategoryImplementation.size();
if (ClsDefCount == 0 && CatDefCount == 0)
return;
+
+ // For each defined class, write out all its meta data.
+ for (int i = 0; i < ClsDefCount; i++)
+ WriteObjcClassMetaData(ClassImplementation[i]);
+
// Write objc_symtab metadata
/*
struct _objc_symtab