summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2012-03-12 16:46:58 +0000
committerFariborz Jahanian <fjahanian@apple.com>2012-03-12 16:46:58 +0000
commite47bf2b99187031f9a6b7133cca5b413954b309e (patch)
treee47e7ad1871cf41d91ceb498e2794abbe3ba7f44
parent9933a5abab28ee6be4c796e62e563039f39a3e57 (diff)
downloadbcm5719-llvm-e47bf2b99187031f9a6b7133cca5b413954b309e.tar.gz
bcm5719-llvm-e47bf2b99187031f9a6b7133cca5b413954b309e.zip
objective-c modern translator: ivar offset symbols
will reside in .objc_ivar$B sections. // rdar://11023490 llvm-svn: 152563
-rw-r--r--clang/lib/Rewrite/RewriteModernObjC.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/clang/lib/Rewrite/RewriteModernObjC.cpp b/clang/lib/Rewrite/RewriteModernObjC.cpp
index a22f8fad728..5d118a1516a 100644
--- a/clang/lib/Rewrite/RewriteModernObjC.cpp
+++ b/clang/lib/Rewrite/RewriteModernObjC.cpp
@@ -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());
OpenPOWER on IntegriCloud