diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-05-03 10:46:44 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-05-03 10:46:44 +0000 |
commit | 2bebbf0acee55404de4b8846713b64429e744e8f (patch) | |
tree | e89aab78b5f5928eab0486ddc87130dda25f6b31 /lib/CodeGen | |
parent | b2dbbb99e12806eaaf53b7ccabc32f42b5719443 (diff) |
Compute Objective-C metadata size information from the record layout,
not the shadow structure.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70691 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGObjCGNU.cpp | 10 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 16 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCRuntime.h | 6 |
3 files changed, 11 insertions, 21 deletions
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index 218365e316..04b688f012 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/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<ObjCInterfaceDecl *>(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<llvm::Constant*, 16> IvarNames; llvm::SmallVector<llvm::Constant*, 16> IvarTypes; llvm::SmallVector<llvm::Constant*, 16> 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/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index a7fc87c24c..830b19f57e 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/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<llvm::StructType>(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/lib/CodeGen/CGObjCRuntime.h b/lib/CodeGen/CGObjCRuntime.h index 19a1d8c16d..fe514111b5 100644 --- a/lib/CodeGen/CGObjCRuntime.h +++ b/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 |