From: Fariborz Jahanian Date: Mon, 13 Feb 2012 21:34:45 +0000 (+0000) Subject: modern objc translator. More ivar rewrite work. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=07e5288c6532c8a61278fab4e0ae058ec81a0f5c;p=clang modern objc translator. More ivar rewrite work. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150415 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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 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());