diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-02-22 18:13:25 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-02-22 18:13:25 +0000 |
commit | 72c88f13f79e2012b8a5f84cf48c6af779dfd1ba (patch) | |
tree | e600c748ceb3da6f0cffd19d102a1f5f04763f82 | |
parent | 2dd17a15ddc0184790d790b6128d79ffddae4964 (diff) |
modern objc translator. more writing of modern ivar access
abi.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151176 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Rewrite/RewriteModernObjC.cpp | 32 | ||||
-rw-r--r-- | test/Rewriter/rewrite-modern-class.mm | 3 | ||||
-rw-r--r-- | test/Rewriter/rewrite-nested-ivar.mm | 2 |
3 files changed, 33 insertions, 4 deletions
diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp index 9c9526109b..63dfa561d3 100644 --- a/lib/Rewrite/RewriteModernObjC.cpp +++ b/lib/Rewrite/RewriteModernObjC.cpp @@ -133,7 +133,9 @@ namespace { llvm::SmallPtrSet<VarDecl *, 8> ImportedLocalExternalDecls; llvm::DenseMap<BlockExpr *, std::string> RewrittenBlockExprs; - + llvm::DenseMap<ObjCInterfaceDecl *, + llvm::SmallPtrSet<ObjCIvarDecl *, 8> > ReferencedIvars; + // This maps an original source AST to it's rewritten form. This allows // us to avoid rewriting the same node twice (which is very uncommon). // This is needed to support some of the exotic property rewriting. @@ -331,6 +333,9 @@ namespace { void RewriteObjCInternalStruct(ObjCInterfaceDecl *CDecl, std::string &Result); + void RewriteIvarOffsetSymbols(ObjCInterfaceDecl *CDecl, + std::string &Result); + virtual void Initialize(ASTContext &context); // Misc. AST transformation routines. Somtimes they end up calling @@ -1231,6 +1236,9 @@ void RewriteModernObjC::RewriteInterfaceDecl(ObjCInterfaceDecl *ClassDecl) { ResultStr += "typedef struct objc_object "; ResultStr += ClassDecl->getNameAsString(); ResultStr += ";\n#endif\n"; + + RewriteIvarOffsetSymbols(ClassDecl, ResultStr); + RewriteObjCInternalStruct(ClassDecl, ResultStr); // Mark this typedef as having been written into its c++ equivalent. ObjCWrittenInterfaces.insert(ClassDecl->getCanonicalDecl()); @@ -3221,6 +3229,24 @@ void RewriteModernObjC::RewriteObjCInternalStruct(ObjCInterfaceDecl *CDecl, llvm_unreachable("struct already synthesize- RewriteObjCInternalStruct"); } +/// RewriteIvarOffsetSymbols - Rewrite ivar offset symbols of those ivars which +/// have been referenced in an ivar access expression. +void RewriteModernObjC::RewriteIvarOffsetSymbols(ObjCInterfaceDecl *CDecl, + std::string &Result) { + // write out ivar offset symbols which have been referenced in an ivar + // access expression. + llvm::SmallPtrSet<ObjCIvarDecl *, 8> Ivars = ReferencedIvars[CDecl]; + if (Ivars.empty()) + return; + for (llvm::SmallPtrSet<ObjCIvarDecl *, 8>::iterator i = Ivars.begin(), + e = Ivars.end(); i != e; i++) { + ObjCIvarDecl *IvarDecl = (*i); + Result += "\nextern unsigned long OBJC_IVAR_$_"; + Result += CDecl->getName(); Result += "_"; + Result += IvarDecl->getName(); Result += ";"; + } +} + //===----------------------------------------------------------------------===// // Meta Data Emission //===----------------------------------------------------------------------===// @@ -5020,7 +5046,7 @@ void RewriteModernObjC::HandleTranslationUnit(ASTContext &C) { // private ivars. RewriteInterfaceDecl(CDecl); } - + if (ClassImplementation.size() || CategoryImplementation.size()) RewriteImplementations(); @@ -6423,6 +6449,8 @@ Stmt *RewriteModernObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) { IvarOffsetName += clsDeclared->getIdentifier()->getName(); IvarOffsetName += "_"; IvarOffsetName += D->getName(); + ReferencedIvars[clsDeclared].insert(D); + // cast offset to "char *". CastExpr *castExpr = NoTypeInfoCStyleCastExpr(Context, Context->getPointerType(Context->CharTy), diff --git a/test/Rewriter/rewrite-modern-class.mm b/test/Rewriter/rewrite-modern-class.mm index 964ef00eb6..b6be98a51d 100644 --- a/test/Rewriter/rewrite-modern-class.mm +++ b/test/Rewriter/rewrite-modern-class.mm @@ -56,8 +56,7 @@ @implementation INTF - (SUPER *) Meth : (SUPER *)arg { -// NYI - return arg->p_super; - return (SUPER *)0; + return arg->p_super; } @end diff --git a/test/Rewriter/rewrite-nested-ivar.mm b/test/Rewriter/rewrite-nested-ivar.mm index cd83a4a90d..bab221d33f 100644 --- a/test/Rewriter/rewrite-nested-ivar.mm +++ b/test/Rewriter/rewrite-nested-ivar.mm @@ -1,5 +1,7 @@ // RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc -fobjc-fragile-abi %s -o %t-rw.cpp // RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp +// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw-modern.cpp +// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw-modern.cpp // radar 7583971 |