diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-01-24 23:43:01 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-01-24 23:43:01 +0000 |
commit | f6a077edbbfc88d63b43d43f22db93017685c130 (patch) | |
tree | 6e128377e0d67d394b13c26613f0d45d10492e4f /lib/CodeGen/CGObjCMac.cpp | |
parent | 8edef7c31d27fc9d5d163660702a8a7730a0d19f (diff) |
Compute instaceStart/instanceSize fields of the class_ro_t meta-data
for objc2's non-fragile abi.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62945 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index be3a0bdd00..f677782ec3 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -3294,9 +3294,48 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { } + InstanceStart = InstanceSize = 0; + if (ObjCInterfaceDecl *OID = + const_cast<ObjCInterfaceDecl*>(ID->getClassInterface())) { + // FIXME. Share this with the one in EmitIvarList. + int countSuperClassIvars = countInheritedIvars(OID->getSuperClass()); + const RecordDecl *RD = CGM.getContext().addRecordToClass(OID); + RecordDecl::field_iterator firstField = RD->field_begin(); + RecordDecl::field_iterator lastField = RD->field_end(); + + while (countSuperClassIvars-- > 0) { + lastField = firstField; + ++firstField; + } + + for (RecordDecl::field_iterator e = RD->field_end(), + ifield = firstField; ifield != e; ++ifield) + lastField = ifield; + + const llvm::Type *InterfaceTy = + CGM.getTypes().ConvertType(CGM.getContext().getObjCInterfaceType(OID)); + const llvm::StructLayout *Layout = + CGM.getTargetData().getStructLayout(cast<llvm::StructType>(InterfaceTy)); + + if (lastField != RD->field_end()) { + FieldDecl *Field = *lastField; + const llvm::Type *FieldTy = + CGM.getTypes().ConvertTypeForMem(Field->getType()); + unsigned Size = CGM.getTargetData().getTypePaddedSize(FieldTy); + InstanceSize = Layout->getElementOffset( + CGM.getTypes().getLLVMFieldNo(Field)) + + Size; + if (firstField == RD->field_end()) + InstanceStart = InstanceSize; + else + InstanceStart = Layout->getElementOffset(CGM.getTypes(). + getLLVMFieldNo(*firstField)); + } + } CLASS_RO_GV = BuildClassRoTInitializer(flags, - 0, - 0,ID); + InstanceStart, + InstanceSize, + ID); TClassName = ObjCClassName + ClassName; BuildClassMetaData(TClassName, MetaTClass, SuperClassGV, CLASS_RO_GV); |