From 12119b959bd8c13df8f5da28bd4ebf7d45eded99 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sun, 3 May 2009 10:46:44 +0000 Subject: [PATCH] Compute Objective-C metadata size information from the record layout, not the shadow structure. llvm-svn: 70691 --- clang/lib/CodeGen/CGObjCGNU.cpp | 10 +++------- clang/lib/CodeGen/CGObjCMac.cpp | 16 ++++++++-------- clang/lib/CodeGen/CGObjCRuntime.h | 6 ------ 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp index 218365e316fe..04b688f01227 100644 --- a/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/clang/lib/CodeGen/CGObjCGNU.cpp @@ -20,6 +20,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclObjC.h" +#include "clang/AST/RecordLayout.h" #include "clang/AST/StmtObjC.h" #include "llvm/Module.h" #include "llvm/ADT/SmallVector.h" @@ -742,18 +743,13 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) { const_cast(OID->getClassInterface()); std::string ClassName = ClassDecl->getNameAsString(); - // Get the size of instances. For runtimes that support late-bound instances - // this should probably be something different (size just of instance - // varaibles in this class, not superclasses?). - const llvm::Type *ObjTy = - CGObjCRuntime::GetConcreteClassStruct(CGM, ClassDecl); - int instanceSize = CGM.getTargetData().getTypePaddedSize(ObjTy); + // Get the size of instances. + int instanceSize = Context.getASTObjCImplementationLayout(OID).getSize() / 8; // Collect information about instance variables. llvm::SmallVector IvarNames; llvm::SmallVector IvarTypes; llvm::SmallVector IvarOffsets; - ObjTy = llvm::PointerType::getUnqual(ObjTy); for (ObjCInterfaceDecl::ivar_iterator iter = ClassDecl->ivar_begin(), endIter = ClassDecl->ivar_end() ; iter != endIter ; iter++) { // Store the name diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index a7fc87c24c59..830b19f57e7c 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -18,6 +18,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclObjC.h" +#include "clang/AST/RecordLayout.h" #include "clang/AST/StmtObjC.h" #include "clang/Basic/LangOptions.h" @@ -34,9 +35,9 @@ using namespace CodeGen; // don't belong in CGObjCRuntime either so we will live with it for // now. -const llvm::StructType * -CGObjCRuntime::GetConcreteClassStruct(CodeGen::CodeGenModule &CGM, - const ObjCInterfaceDecl *OID) { +static const llvm::StructType * +GetConcreteClassStruct(CodeGen::CodeGenModule &CGM, + const ObjCInterfaceDecl *OID) { assert(!OID->isForwardDecl() && "Invalid interface decl!"); const RecordDecl *RD = CGM.getContext().addRecordToClass(OID); return cast(CGM.getTypes().ConvertTagDeclType(RD)); @@ -65,7 +66,7 @@ static const FieldDecl *LookupFieldDeclForIvar(ASTContext &Context, // // FIXME: This is slow, we shouldn't need to do this. const ObjCInterfaceDecl *Super = OID->getSuperClass(); - assert(OID && "field decl not found!"); + assert(Super && "field decl not found!"); return LookupFieldDeclForIvar(Context, Super, OIVD, Found); } @@ -77,7 +78,7 @@ static uint64_t LookupFieldBitOffset(CodeGen::CodeGenModule &CGM, const FieldDecl *Field = LookupFieldDeclForIvar(CGM.getContext(), OID, Ivar, Container); const llvm::StructType *STy = - CGObjCRuntime::GetConcreteClassStruct(CGM, Container); + GetConcreteClassStruct(CGM, Container); const llvm::StructLayout *Layout = CGM.getTargetData().getStructLayout(STy); if (!Field->isBitField()) @@ -1855,10 +1856,9 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) { EmitProtocolList("\01L_OBJC_CLASS_PROTOCOLS_" + ID->getNameAsString(), Interface->protocol_begin(), Interface->protocol_end()); - const llvm::Type *InterfaceTy = - CGObjCRuntime::GetConcreteClassStruct(CGM, Interface); unsigned Flags = eClassFlags_Factory; - unsigned Size = CGM.getTargetData().getTypePaddedSize(InterfaceTy); + unsigned Size = + CGM.getContext().getASTObjCImplementationLayout(ID).getSize() / 8; // FIXME: Set CXX-structors flag. if (CGM.getDeclVisibilityMode(ID->getClassInterface()) == LangOptions::Hidden) diff --git a/clang/lib/CodeGen/CGObjCRuntime.h b/clang/lib/CodeGen/CGObjCRuntime.h index 19a1d8c16d03..fe514111b5f8 100644 --- a/clang/lib/CodeGen/CGObjCRuntime.h +++ b/clang/lib/CodeGen/CGObjCRuntime.h @@ -66,12 +66,6 @@ public: // eventually be folded into other places (the structure layout // code). - /// Return the (fixed) LLVM struct type for the interface. This is - /// only very meaningful for runtimes which use a non-fragile ABI. - static - const llvm::StructType * GetConcreteClassStruct(CodeGen::CodeGenModule &CGM, - const ObjCInterfaceDecl *OID); - protected: /// Compute an offset to the given ivar, suitable for passing to /// EmitValueForIvarAtOffset. Note that the correct handling of