]> granicus.if.org Git - clang/commitdiff
Implemented code gen for sizeof(objc class interface).
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 16 Jan 2009 00:57:08 +0000 (00:57 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 16 Jan 2009 00:57:08 +0000 (00:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62289 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprScalar.cpp

index 4bb5fd1a4ffbee2d0866c230615ca95d9d04e3aa..628bfb07885ec70d6614f1fd681de7301c02981c 100644 (file)
@@ -686,7 +686,14 @@ ScalarExprEmitter::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
     Align /= 8;  // Return alignment in bytes, not bits.
     return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Align));
   }
-  
+  if (TypeToSize->isObjCInterfaceType()) {
+    ObjCInterfaceDecl *OI = TypeToSize->getAsObjCInterfaceType()->getDecl();
+    const RecordDecl *RD = CGF.getContext().addRecordToClass(OI);
+    const Type *Key =
+      CGF.getContext().getTagDeclType(
+                    const_cast<TagDecl*>(dyn_cast<TagDecl>(RD))).getTypePtr();
+    TypeToSize = Key->getDesugaredType();
+  }  
   std::pair<uint64_t, unsigned> Info = CGF.getContext().getTypeInfo(TypeToSize);
   
   uint64_t Val = E->isSizeOf() ? Info.first : Info.second;