aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2012-02-13 21:34:45 +0000
committerFariborz Jahanian <fjahanian@apple.com>2012-02-13 21:34:45 +0000
commit07e5288c6532c8a61278fab4e0ae058ec81a0f5c (patch)
treee060134f8013d3c50836d3f7a6a53c8d80870e67
parentdb64923b255daeb58c2168eb890e480c93a6c41c (diff)
modern objc translator. More ivar rewrite work.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150415 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Rewrite/RewriteModernObjC.cpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp
index 96caaf4148..190c745d3d 100644
--- a/lib/Rewrite/RewriteModernObjC.cpp
+++ b/lib/Rewrite/RewriteModernObjC.cpp
@@ -5473,8 +5473,7 @@ static void Write__extendedMethodTypes_initializer(RewriteModernObjC &RewriteObj
}
}
-static void Write_IvarOffsetVar(RewriteModernObjC &RewriteObj,
- ASTContext *Context, std::string &Result,
+static void Write_IvarOffsetVar(std::string &Result,
ArrayRef<ObjCIvarDecl *> Ivars,
StringRef VarName,
StringRef ClassName) {
@@ -5489,15 +5488,20 @@ static void Write_IvarOffsetVar(RewriteModernObjC &RewriteObj,
Visibility shoud be: DefaultVisibility;
*/
- if (Ivars.size() > 0) {
- Result += "\n";
- for (unsigned i =0, e = Ivars.size(); i < e; i++) {
- ObjCIvarDecl *IvarDecl = Ivars[i];
- Result += "unsigned long int "; Result += VarName;
- Result += ClassName; Result += "_";
- Result += IvarDecl->getName();
- Result += " __attribute__ ((used, section (\"__DATA,__objc_ivar\")))";
- Result += " = ";
+ Result += "\n";
+ for (unsigned i =0, e = Ivars.size(); i < e; i++) {
+ ObjCIvarDecl *IvarDecl = Ivars[i];
+ Result += "unsigned long int "; Result += VarName;
+ Result += ClassName; Result += "_";
+ Result += IvarDecl->getName();
+ 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 += ClassName;
Result += "_IMPL, ";
@@ -5512,6 +5516,8 @@ static void Write__ivar_list_t_initializer(RewriteModernObjC &RewriteObj,
StringRef VarName,
StringRef ClassName) {
if (Ivars.size() > 0) {
+ Write_IvarOffsetVar(Result, Ivars, "OBJC_IVAR_$_", ClassName);
+
Result += "\nstatic ";
Write__ivar_list_t_TypeDecl(Result, Ivars.size());
Result += " "; Result += VarName;
@@ -5771,9 +5777,6 @@ void RewriteModernObjC::RewriteObjCClassMetaData(ObjCImplementationDecl *IDecl,
IVars.push_back(IVD);
}
- Write_IvarOffsetVar(*this, Context, Result, IVars, "OBJC_IVAR_$_",
- CDecl->getNameAsString());
-
Write__ivar_list_t_initializer(*this, Context, Result, IVars,
"_OBJC_INSTANCE_VARIABLES_",
CDecl->getNameAsString());