[cfe-commits] r69796 - in /cfe/trunk/lib/CodeGen: CGObjCGNU.cpp CGObjCMac.cpp CGObjCRuntime.h
Daniel Dunbar
daniel at zuster.org
Wed Apr 22 02:39:50 PDT 2009
Author: ddunbar
Date: Wed Apr 22 04:39:34 2009
New Revision: 69796
URL: http://llvm.org/viewvc/llvm-project?rev=69796&view=rev
Log:
Add CGObjCRuntime::GetConcreteClassStruct to encapsulate access to the
underlying llvm::StructType for an interface.
Modified:
cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
cfe/trunk/lib/CodeGen/CGObjCMac.cpp
cfe/trunk/lib/CodeGen/CGObjCRuntime.h
Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=69796&r1=69795&r2=69796&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Wed Apr 22 04:39:34 2009
@@ -735,12 +735,7 @@
// 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 @@
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){
Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=69796&r1=69795&r2=69796&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Wed Apr 22 04:39:34 2009
@@ -33,15 +33,22 @@
// 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 @@
/// 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 @@
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 @@
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 @@
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)
Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=69796&r1=69795&r2=69796&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCRuntime.h (original)
+++ cfe/trunk/lib/CodeGen/CGObjCRuntime.h Wed Apr 22 04:39:34 2009
@@ -28,6 +28,7 @@
class Function;
class Module;
class StructLayout;
+ class StructType;
class Type;
class Value;
}
@@ -65,9 +66,14 @@
// 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);
More information about the cfe-commits
mailing list