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 | a887e63434ed3567a9bf146aa3cf0e96061b4201 (patch) | |
| tree | ed12b48ed0de06d43f6db9b211a7ea85944486d5 /clang/lib/CodeGen/CGObjCMac.cpp | |
| parent | c6d52f5dfb2b6c309dcb33f560e300c4e8eb42e2 (diff) | |
| download | bcm5719-llvm-a887e63434ed3567a9bf146aa3cf0e96061b4201.tar.gz bcm5719-llvm-a887e63434ed3567a9bf146aa3cf0e96061b4201.zip | |
Compute instaceStart/instanceSize fields of the class_ro_t meta-data
for objc2's non-fragile abi.
llvm-svn: 62945
Diffstat (limited to 'clang/lib/CodeGen/CGObjCMac.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index be3a0bdd009..f677782ec3e 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/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); |

