[cfe-commits] r153663 - in /cfe/trunk: lib/Rewrite/RewriteModernObjC.cpp test/Rewriter/objc-modern-metadata-visibility.mm
Fariborz Jahanian
fjahanian at apple.com
Thu Mar 29 10:51:09 PDT 2012
Author: fjahanian
Date: Thu Mar 29 12:51:09 2012
New Revision: 153663
URL: http://llvm.org/viewvc/llvm-project?rev=153663&view=rev
Log:
modern objective-c translator: fix up assortment of
visibility directives for a variety of exported
meta-data symbols. // rdar://11144048
Added:
cfe/trunk/test/Rewriter/objc-modern-metadata-visibility.mm
Modified:
cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
Modified: cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp?rev=153663&r1=153662&r2=153663&view=diff
==============================================================================
--- cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp (original)
+++ cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp Thu Mar 29 12:51:09 2012
@@ -3217,16 +3217,14 @@
e = Ivars.end(); i != e; i++) {
ObjCIvarDecl *IvarDecl = (*i);
Result += "\n";
- Result += "extern \"C\" ";
if (LangOpts.MicrosoftExt)
Result += "__declspec(allocate(\".objc_ivar$B\")) ";
+ Result += "extern \"C\" ";
if (LangOpts.MicrosoftExt &&
IvarDecl->getAccessControl() != ObjCIvarDecl::Private &&
- IvarDecl->getAccessControl() != ObjCIvarDecl::Package) {
- const ObjCInterfaceDecl *CDecl = IvarDecl->getContainingInterface();
- if (CDecl->getImplementation())
- Result += "__declspec(dllexport) ";
- }
+ IvarDecl->getAccessControl() != ObjCIvarDecl::Package)
+ Result += "__declspec(dllimport) ";
+
Result += "unsigned long ";
WriteInternalIvarName(CDecl, IvarDecl, Result);
Result += ";";
@@ -5440,7 +5438,7 @@
Result += "};\n";
Result += "extern \"C\" __declspec(dllimport) struct objc_cache _objc_empty_cache;\n";
-
+ Result += "#pragma warning(disable:4273)\n";
meta_data_declared = true;
}
@@ -5682,6 +5680,9 @@
Result += "extern \"C\" ";
if (CDecl->getImplementation())
Result += "__declspec(dllexport) ";
+ else
+ Result += "__declspec(dllimport) ";
+
Result += "struct _class_t OBJC_CLASS_$_";
Result += CDecl->getNameAsString();
Result += ";\n";
@@ -5692,6 +5693,9 @@
Result += "extern \"C\" ";
if (CDecl->getSuperClass()->getImplementation())
Result += "__declspec(dllexport) ";
+ else
+ Result += "__declspec(dllimport) ";
+
Result += "struct _class_t ";
Result += VarName;
Result += CDecl->getSuperClass()->getNameAsString();
@@ -5701,6 +5705,9 @@
Result += "extern \"C\" ";
if (RootClass->getImplementation())
Result += "__declspec(dllexport) ";
+ else
+ Result += "__declspec(dllimport) ";
+
Result += "struct _class_t ";
Result += VarName;
Result += RootClass->getNameAsString();
@@ -5708,7 +5715,8 @@
}
}
- Result += "\n__declspec(dllexport) struct _class_t "; Result += VarName; Result += CDecl->getNameAsString();
+ Result += "\nextern \"C\" __declspec(dllexport) struct _class_t ";
+ Result += VarName; Result += CDecl->getNameAsString();
Result += " __attribute__ ((used, section (\"__DATA,__objc_data\"))) = {\n";
Result += "\t";
if (metaclass) {
@@ -5807,6 +5815,8 @@
Result += "extern \"C\" ";
if (ClassDecl->getImplementation())
Result += "__declspec(dllexport) ";
+ else
+ Result += "__declspec(dllimport) ";
Result += "struct _class_t ";
Result += "OBJC_CLASS_$_"; Result += ClassName;
@@ -5921,9 +5931,9 @@
if (!Context->getLangOpts().MicrosoftExt ||
IvarDecl->getAccessControl() == ObjCIvarDecl::Private ||
IvarDecl->getAccessControl() == ObjCIvarDecl::Package)
- Result += "unsigned long int ";
+ Result += "extern \"C\" unsigned long int ";
else
- Result += "__declspec(dllexport) unsigned long int ";
+ Result += "extern \"C\" __declspec(dllexport) unsigned long int ";
WriteInternalIvarName(CDecl, IvarDecl, Result);
Result += " __attribute__ ((used, section (\"__DATA,__objc_ivar\")))";
Result += " = ";
Added: cfe/trunk/test/Rewriter/objc-modern-metadata-visibility.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/objc-modern-metadata-visibility.mm?rev=153663&view=auto
==============================================================================
--- cfe/trunk/test/Rewriter/objc-modern-metadata-visibility.mm (added)
+++ cfe/trunk/test/Rewriter/objc-modern-metadata-visibility.mm Thu Mar 29 12:51:09 2012
@@ -0,0 +1,34 @@
+// RUN: %clang_cc1 -E %s -o %t.mm
+// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -o - | FileCheck %s
+// rdar://11144048
+
+ at class NSString;
+
+ at interface NSObject {
+ Class isa;
+}
+ at end
+
+ at interface Sub : NSObject {
+ int subIvar;
+ NSString *nsstring;
+ at private
+ id PrivateIvar;
+}
+ at end
+
+ at implementation Sub
+- (id) MyNSString { return subIvar ? PrivateIvar : nsstring; }
+ at end
+
+// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllimport) unsigned long OBJC_IVAR_$_Sub$subIvar;
+// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" unsigned long OBJC_IVAR_$_Sub$PrivateIvar;
+// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllimport) unsigned long OBJC_IVAR_$_Sub$nsstring;
+// CHECK: #pragma warning(disable:4273)
+// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllexport) unsigned long int OBJC_IVAR_$_Sub$subIvar
+// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllexport) unsigned long int OBJC_IVAR_$_Sub$nsstring
+// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" unsigned long int OBJC_IVAR_$_Sub$PrivateIvar
+// CHECK: extern "C" __declspec(dllimport) struct _class_t OBJC_METACLASS_$_NSObject;
+// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_METACLASS_$_Sub
+// CHECK: extern "C" __declspec(dllimport) struct _class_t OBJC_CLASS_$_NSObject;
+// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_CLASS_$_Sub
More information about the cfe-commits
mailing list