summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2012-04-11 21:12:36 +0000
committerFariborz Jahanian <fjahanian@apple.com>2012-04-11 21:12:36 +0000
commitacee1c9dbe180c6493d1bcda6a0a7ee4018ed7b1 (patch)
tree0396ab34e823543102b76a3fe67161a6d8b0040e /lib
parent994d73f8473cb2cd3ce2f69c9575c95015be788a (diff)
modern objective-c translator. Fixes a translation bug when
first ivar in the list is a bitfield. // rdar://11229770 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154534 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Rewrite/RewriteModernObjC.cpp24
1 files changed, 6 insertions, 18 deletions
diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp
index 4be7eb806f..fd433f88c2 100644
--- a/lib/Rewrite/RewriteModernObjC.cpp
+++ b/lib/Rewrite/RewriteModernObjC.cpp
@@ -6416,7 +6416,8 @@ static void Write__extendedMethodTypes_initializer(RewriteModernObjC &RewriteObj
}
}
-static void Write_IvarOffsetVar(ASTContext *Context,
+static void Write_IvarOffsetVar(RewriteModernObjC &RewriteObj,
+ ASTContext *Context,
std::string &Result,
ArrayRef<ObjCIvarDecl *> Ivars,
ObjCInterfaceDecl *CDecl) {
@@ -6446,17 +6447,8 @@ static void Write_IvarOffsetVar(ASTContext *Context,
WriteInternalIvarName(CDecl, IvarDecl, Result);
Result += " __attribute__ ((used, section (\"__DATA,__objc_ivar\")))";
Result += " = ";
- if (IvarDecl->isBitField()) {
- // FIXME: The hack below doesn't work for bitfields. For now, we simply
- // place all bitfields at offset 0.
- Result += "0;\n";
- }
- else {
- Result += "__OFFSETOFIVAR__(struct ";
- Result += CDecl->getNameAsString();
- Result += "_IMPL, ";
- Result += IvarDecl->getName(); Result += ");\n";
- }
+ RewriteObj.RewriteIvarOffsetComputation(IvarDecl, Result);
+ Result += ";\n";
}
}
@@ -6466,7 +6458,7 @@ static void Write__ivar_list_t_initializer(RewriteModernObjC &RewriteObj,
StringRef VarName,
ObjCInterfaceDecl *CDecl) {
if (Ivars.size() > 0) {
- Write_IvarOffsetVar(Context, Result, Ivars, CDecl);
+ Write_IvarOffsetVar(RewriteObj, Context, Result, Ivars, CDecl);
Result += "\nstatic ";
Write__ivar_list_t_TypeDecl(Result, Ivars.size());
@@ -6875,11 +6867,7 @@ void RewriteModernObjC::RewriteObjCClassMetaData(ObjCImplementationDecl *IDecl,
ObjCIvarDecl *IVD = CDecl->all_declared_ivar_begin();
if (IVD) {
- InstanceStart += "__OFFSETOFIVAR__(struct ";
- InstanceStart += CDecl->getNameAsString();
- InstanceStart += "_IMPL, ";
- InstanceStart += IVD->getNameAsString();
- InstanceStart += ")";
+ RewriteIvarOffsetComputation(IVD, InstanceStart);
}
else
InstanceStart = InstanceSize;