From: Fariborz Jahanian Date: Thu, 18 Oct 2007 19:23:00 +0000 (+0000) Subject: First patch toward rewriting of objective-c's meta data. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=545b9ae381158761d387d2b5b071f28b1f489ed6;p=clang First patch toward rewriting of objective-c's meta data. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43143 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index 508f799608..8954a19819 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -26,6 +26,9 @@ namespace { SourceManager *SM; unsigned MainFileID; SourceLocation LastIncLoc; + llvm::SmallVector ClassImplementation; + llvm::SmallVector CategoryImplementation; + static const int OBJC_ABI_VERSION =7 ; public: void Initialize(ASTContext &context, unsigned mainFileID) { Context = &context; @@ -42,6 +45,8 @@ namespace { void RewriteFunctionBody(Stmt *S); void RewriteAtEncode(ObjCEncodeExpr *Exp); + void WriteObjcMetaData(); + ~RewriteTest(); }; } @@ -94,6 +99,11 @@ void RewriteTest::HandleDeclInMainFile(Decl *D) { if (FunctionDecl *FD = dyn_cast(D)) if (Stmt *Body = FD->getBody()) RewriteFunctionBody(Body); + + if (ObjcImplementationDecl *CI = dyn_cast(D)) + ClassImplementation.push_back(CI); + else if (ObjcCategoryImplDecl *CI = dyn_cast(D)) + CategoryImplementation.push_back(CI); // Nothing yet. } @@ -119,6 +129,66 @@ void RewriteTest::RewriteAtEncode(ObjCEncodeExpr *Exp) { delete Replacement; } +void RewriteTest::WriteObjcMetaData() { + int ClsDefCount = ClassImplementation.size(); + int CatDefCount = CategoryImplementation.size(); + if (ClsDefCount == 0 && CatDefCount == 0) + return; + // Write objc_symtab metadata + /* + struct _objc_symtab + { + long sel_ref_cnt; + SEL *refs; + short cls_def_cnt; + short cat_def_cnt; + void *defs[cls_def_cnt + cat_def_cnt]; + }; + */ + + printf("\nstruct _objc_symtab {\n"); + printf("\tlong sel_ref_cnt;\n"); + printf("\tSEL *refs;\n"); + printf("\tshort cls_def_cnt;\n"); + printf("\tshort cat_def_cnt;\n"); + printf("\tvoid *defs[%d];\n", ClsDefCount + CatDefCount); + printf("};\n\n"); + + printf("static struct _objc_symtab " + "_OBJC_SYMBOLS __attribute__ ((section (\"__OBJC, __symbols\")))= {\n"); + printf("\t0, 0, %d, %d\n", ClsDefCount, CatDefCount); + for (int i = 0; i < ClsDefCount; i++) + printf("\t,_OBJC_CLASS_%s\n", ClassImplementation[i]->getName()); + + for (int i = 0; i < CatDefCount; i++) + printf("\t,_OBJC_CATEGORY_%s_%s\n", + CategoryImplementation[i]->getClassInterface()->getName(), + CategoryImplementation[i]->getName()); + + printf("};\n\n"); + + // Write objc_module metadata + + /* + struct _objc_module { + long version; + long size; + const char *name; + struct _objc_symtab *symtab; + } + */ + + printf("\nstruct _objc_module {\n"); + printf("\tlong version;\n"); + printf("\tlong size;\n"); + printf("\tconst char *name;\n"); + printf("\tstruct _objc_symtab *symtab;"); + printf("};\n\n"); + printf("static struct _objc_module " + "_OBJC_MODULES __attribute__ ((section (\"__OBJC, __module_info\")))= {\n"); + printf("\t%d, %d, \"\", &_OBJC_SYMBOLS\n", OBJC_ABI_VERSION, 16); + printf("};\n\n"); +} RewriteTest::~RewriteTest() { // Get the top-level buffer that this corresponds to. @@ -160,4 +230,6 @@ RewriteTest::~RewriteTest() { } else { printf("No changes\n"); } + // Rewrite Objective-c meta data* + WriteObjcMetaData(); }