]> granicus.if.org Git - clang/commitdiff
Add CGObjCRuntime::GetConcreteClassStruct to encapsulate access to the
authorDaniel Dunbar <daniel@zuster.org>
Wed, 22 Apr 2009 09:39:34 +0000 (09:39 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 22 Apr 2009 09:39:34 +0000 (09:39 +0000)
underlying llvm::StructType for an interface.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69796 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjCGNU.cpp
lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CGObjCRuntime.h

index 9c3449f500848329ad42b2182b2d963a84bcc8ac..2cf73b64832ba6190b93557583ecc54c6419935b 100644 (file)
@@ -735,12 +735,7 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) {
   // 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;
-
-  if (ClassDecl->isForwardDecl())
-    ObjTy = llvm::StructType::get(NULL, NULL);
-  else
-    ObjTy = CGM.getTypes().ConvertType(Context.getObjCInterfaceType(ClassDecl));
+  const llvm::Type *ObjTy = GetConcreteClassStruct(CGM, ClassDecl);
   int instanceSize = CGM.getTargetData().getTypePaddedSize(ObjTy);
 
   // Collect information about instance variables.
@@ -1085,9 +1080,7 @@ llvm::Value *CGObjCGNU::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
                          const ObjCInterfaceDecl *Interface,
                          const ObjCIvarDecl *Ivar) {
   uint64_t Offset = ComputeIvarBaseOffset(CGF.CGM, Interface, Ivar);
-  return llvm::ConstantInt::get(
-                            CGM.getTypes().ConvertType(CGM.getContext().LongTy),
-                            Offset);
+  return llvm::ConstantInt::get(LongTy, Offset);
 }
 
 CodeGen::CGObjCRuntime *CodeGen::CreateGNUObjCRuntime(CodeGen::CodeGenModule &CGM){
index dc66fa46b139d0db64a464ad2dcd79b21d7d4621..7b7c2fbd0516a873011ad8b9d52b6deece53feb9 100644 (file)
@@ -33,15 +33,22 @@ 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) {
+  assert(!OID->isForwardDecl() && "Invalid interface decl!");
+  QualType T = CGM.getContext().getObjCInterfaceType(OID);
+  return cast<llvm::StructType>(CGM.getTypes().ConvertType(T));
+}
+
 uint64_t CGObjCRuntime::ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM,
                                               const ObjCInterfaceDecl *OID,
                                               const ObjCIvarDecl *Ivar) {
   assert(!OID->isForwardDecl() && "Invalid interface decl!");
   QualType T = CGM.getContext().getObjCInterfaceType(OID);
-  const llvm::StructType *InterfaceTy = 
-    cast<llvm::StructType>(CGM.getTypes().ConvertType(T));
+  const llvm::StructType *STy = GetConcreteClassStruct(CGM, OID);
   const llvm::StructLayout *Layout = 
-    CGM.getTargetData().getStructLayout(InterfaceTy);
+    CGM.getTargetData().getStructLayout(STy);
   const FieldDecl *Field = 
     OID->lookupFieldDeclForIvar(CGM.getContext(), Ivar);
   if (!Field->isBitField())
@@ -768,11 +775,6 @@ protected:
   /// name. The return value has type char *.
   llvm::Constant *GetClassName(IdentifierInfo *Ident);
   
-  /// GetInterfaceDeclStructLayout - Get layout for ivars of given
-  /// interface declaration.
-  const llvm::StructLayout *GetInterfaceDeclStructLayout(
-                                          const ObjCInterfaceDecl *ID) const;
-  
   /// BuildIvarLayout - Builds ivar layout bitmap for the class
   /// implementation for the __strong or __weak case.
   ///
@@ -1820,12 +1822,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
     EmitProtocolList("\01L_OBJC_CLASS_PROTOCOLS_" + ID->getNameAsString(),
                      Interface->protocol_begin(),
                      Interface->protocol_end());
-  const llvm::Type *InterfaceTy;
-  if (Interface->isForwardDecl())
-    InterfaceTy = llvm::StructType::get(NULL, NULL);
-  else
-    InterfaceTy =
-   CGM.getTypes().ConvertType(CGM.getContext().getObjCInterfaceType(Interface));
+  const llvm::Type *InterfaceTy = GetConcreteClassStruct(CGM, Interface);
   unsigned Flags = eClassFlags_Factory;
   unsigned Size = CGM.getTargetData().getTypePaddedSize(InterfaceTy);
 
@@ -2857,17 +2854,6 @@ llvm::Constant *CGObjCCommonMac::GetClassName(IdentifierInfo *Ident) {
   return getConstantGEP(Entry, 0, 0);
 }
 
-/// GetInterfaceDeclStructLayout - Get layout for ivars of given
-/// interface declaration.
-const llvm::StructLayout *CGObjCCommonMac::GetInterfaceDeclStructLayout(
-                                        const ObjCInterfaceDecl *OID) const {
-  assert(!OID->isForwardDecl() && "Invalid interface decl!");
-  QualType T = CGM.getContext().getObjCInterfaceType(OID);
-  const llvm::StructType *InterfaceTy = 
-    cast<llvm::StructType>(CGM.getTypes().ConvertType(T));
-  return CGM.getTargetData().getStructLayout(InterfaceTy);
-}
-
 /// GetIvarLayoutName - Returns a unique constant for the given
 /// ivar layout bitmap.
 llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident,
@@ -3133,7 +3119,8 @@ llvm::Constant *CGObjCCommonMac::BuildIvarLayout(
   SkipIvars.clear(); 
   IvarsInfo.clear();
   
-  const llvm::StructLayout *Layout = GetInterfaceDeclStructLayout(OI);
+  const llvm::StructLayout *Layout = 
+    CGM.getTargetData().getStructLayout(GetConcreteClassStruct(CGM, OI));
   BuildAggrIvarLayout(OI, Layout, 0, RecFields, 0, ForStrongLayout, 
                       Index, SkIndex, hasUnion);
   if (Index == -1)
index 28ee0f4e9f377320fbc581be1d2c2e51120813f0..c275a4d72019b280131360e75fc9ba124c06d0ac 100644 (file)
@@ -28,6 +28,7 @@ namespace llvm {
   class Function;
   class Module;
   class StructLayout;
+  class StructType;
   class Type;
   class Value;
 }
@@ -65,9 +66,14 @@ protected:
   // eventually be folded into other places (the structure layout
   // code).
 
-  // Compute an offset to the given ivar, suitable for passing to
-  // EmitValueForIvarAtOffset.  Note that the correct handling of
-  // bit-fields is carefully coordinated by these two, use caution!
+  /// Return the (fixed) LLVM struct type for the interface. This is
+  /// only very meaningful for runtimes which use a non-fragile ABI.
+  const llvm::StructType * GetConcreteClassStruct(CodeGen::CodeGenModule &CGM,
+                                                  const ObjCInterfaceDecl *OID);
+
+  /// Compute an offset to the given ivar, suitable for passing to
+  /// EmitValueForIvarAtOffset.  Note that the correct handling of
+  /// bit-fields is carefully coordinated by these two, use caution!
   uint64_t ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM,
                                  const ObjCInterfaceDecl *OID,
                                  const ObjCIvarDecl *Ivar);