]> granicus.if.org Git - clang/commitdiff
objective-c modern translator: ivar offset symbols
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 12 Mar 2012 16:46:58 +0000 (16:46 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 12 Mar 2012 16:46:58 +0000 (16:46 +0000)
will reside in .objc_ivar$B sections. // rdar://11023490

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

lib/Rewrite/RewriteModernObjC.cpp

index a22f8fad7286ccfa2dca284fac35ea525368f904..5d118a1516a6a2fdb5dafb25fa982382e79865e8 100644 (file)
@@ -3330,7 +3330,17 @@ void RewriteModernObjC::RewriteIvarOffsetSymbols(ObjCInterfaceDecl *CDecl,
   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 += "\n";
+    if (LangOpts.MicrosoftExt)
+      Result += "__declspec(allocate(\".objc_ivar$B\")) ";
+    if (LangOpts.MicrosoftExt && 
+        IvarDecl->getAccessControl() != ObjCIvarDecl::Private &&
+        IvarDecl->getAccessControl() != ObjCIvarDecl::Package) {
+      const ObjCInterfaceDecl *CDecl = IvarDecl->getContainingInterface();
+      if (CDecl->getImplementation())
+        Result += "__declspec(dllexport) ";
+    }
+    Result += "extern unsigned long OBJC_IVAR_$_";
     Result += CDecl->getName(); Result += "_";
     Result += IvarDecl->getName(); Result += ";";
   }
@@ -5165,6 +5175,7 @@ void RewriteModernObjC::Initialize(ASTContext &context) {
     Preamble += "#pragma section(\".objc_catlist$B\", long, read, write)\n";
     Preamble += "#pragma section(\".inst_meth$B\", long, read, write)\n";
     Preamble += "#pragma section(\".cls_meth$B\", long, read, write)\n";
+    Preamble += "#pragma section(\".objc_ivar$B\", long, read, write)\n";
 
     // Add a constructor for creating temporary objects.
     Preamble += "__rw_objc_super(struct objc_object *o, struct objc_object *s) "
@@ -5836,7 +5847,8 @@ static void Write__extendedMethodTypes_initializer(RewriteModernObjC &RewriteObj
   }
 }
 
-static void Write_IvarOffsetVar(std::string &Result, 
+static void Write_IvarOffsetVar(ASTContext *Context,
+                                std::string &Result, 
                                 ArrayRef<ObjCIvarDecl *> Ivars, 
                                 StringRef VarName, 
                                 StringRef ClassName) {
@@ -5854,7 +5866,11 @@ static void Write_IvarOffsetVar(std::string &Result,
   Result += "\n";
   for (unsigned i =0, e = Ivars.size(); i < e; i++) {
     ObjCIvarDecl *IvarDecl = Ivars[i];
-    if (IvarDecl->getAccessControl() == ObjCIvarDecl::Private ||
+    if (Context->getLangOpts().MicrosoftExt)
+      Result += "__declspec(allocate(\".objc_ivar$B\")) ";
+    
+    if (!Context->getLangOpts().MicrosoftExt ||
+        IvarDecl->getAccessControl() == ObjCIvarDecl::Private ||
         IvarDecl->getAccessControl() == ObjCIvarDecl::Package)
       Result += "unsigned long int "; 
     else
@@ -5885,7 +5901,7 @@ static void Write__ivar_list_t_initializer(RewriteModernObjC &RewriteObj,
                                            StringRef VarName,
                                            StringRef ClassName) {
   if (Ivars.size() > 0) {
-    Write_IvarOffsetVar(Result, Ivars, "OBJC_IVAR_$_", ClassName);
+    Write_IvarOffsetVar(Context, Result, Ivars, "OBJC_IVAR_$_", ClassName);
     
     Result += "\nstatic ";
     Write__ivar_list_t_TypeDecl(Result, Ivars.size());