diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-03-31 18:11:23 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-03-31 18:11:23 +0000 |
commit | 18191886554407b4260c40165bc294c3ea732033 (patch) | |
tree | a7cef0a0b4f17adbc7e2f600d7b80e6f4fba1707 /lib/CodeGen/CGObjCMac.cpp | |
parent | 68a31d406c6dc4382c700d1199b062de2aa7e1da (diff) |
ir-gen support for nonfragile abi's synthesized ivars.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68122 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 1354c4cf9e..75cf4e76ab 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -1673,6 +1673,12 @@ static int countInheritedIvars(const ObjCInterfaceDecl *OI) { for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(), E = OI->ivar_end(); I != E; ++I) ++count; + // look into properties. + for (ObjCInterfaceDecl::prop_iterator I = OI->prop_begin(), + E = OI->prop_end(); I != E; ++I) { + if ((*I)->getPropertyIvarDecl()) + ++count; + } return count; } @@ -4559,13 +4565,20 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList( RecordDecl::field_iterator i,p; const RecordDecl *RD = GetFirstIvarInRecord(OID, i,p); - ObjCInterfaceDecl::ivar_iterator I = OID->ivar_begin(); - + // collect declared and synthesized ivars in a small vector. + llvm::SmallVector<ObjCIvarDecl*, 16> OIvars; + for (ObjCInterfaceDecl::ivar_iterator I = OID->ivar_begin(), + E = OID->ivar_end(); I != E; ++I) + OIvars.push_back(*I); + for (ObjCInterfaceDecl::prop_iterator I = OID->prop_begin(), + E = OID->prop_end(); I != E; ++I) + if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl()) + OIvars.push_back(IV); + unsigned iv = 0; for (RecordDecl::field_iterator e = RD->field_end(); i != e; ++i) { FieldDecl *Field = *i; uint64_t offset = GetIvarBaseOffset(Layout, Field); - const ObjCIvarDecl *ivarDecl = *I++; - Ivar[0] = EmitIvarOffsetVar(ID->getClassInterface(), ivarDecl, offset); + Ivar[0] = EmitIvarOffsetVar(ID->getClassInterface(), OIvars[iv++], offset); if (Field->getIdentifier()) Ivar[1] = GetMethodVarName(Field->getIdentifier()); else |