]> granicus.if.org Git - clang/commitdiff
modern objc translator. more writing of modern ivar access
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 22 Feb 2012 18:13:25 +0000 (18:13 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 22 Feb 2012 18:13:25 +0000 (18:13 +0000)
abi.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151176 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Rewrite/RewriteModernObjC.cpp
test/Rewriter/rewrite-modern-class.mm
test/Rewriter/rewrite-nested-ivar.mm

index 9c9526109b2eeba2e4f1eea4828119731bd4d092..63dfa561d3afb4b946354f197dd6ef2aa05d2450 100644 (file)
@@ -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),
index 964ef00eb6e42dfe6c1e16f9828b36c9a9fe8fd1..b6be98a51d024f5dd56f36180d2fa6b736cc101c 100644 (file)
@@ -56,8 +56,7 @@
 
 @implementation INTF  
 - (SUPER *) Meth : (SUPER *)arg { 
-// NYI -  return arg->p_super; 
-  return (SUPER *)0;
+  return arg->p_super; 
 }
 @end
 
index cd83a4a90d492abd68cc5ab18b04cc86720ebb33..bab221d33f3504c5f6103dd417b2adf4102d3302 100644 (file)
@@ -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