[cfe-commits] r63163 - /cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Fariborz Jahanian fjahanian at apple.com
Tue Jan 27 17:05:23 PST 2009


Author: fjahanian
Date: Tue Jan 27 19:05:23 2009
New Revision: 63163

URL: http://llvm.org/viewvc/llvm-project?rev=63163&view=rev
Log:
Generation of ivar-offset symbols in objc2's non-fragile abi.
Changed section names for meta-data (to match current gcc).

Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=63163&r1=63162&r2=63163&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue Jan 27 19:05:23 2009
@@ -570,6 +570,10 @@
   /// IvarListnfABIPtrTy.
   llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID);
   
+  llvm::Constant *EmitIvarOffsetVar(const ObjCImplementationDecl *ID,
+                                    const FieldDecl *Field,
+                                    unsigned long int offset);
+  
 public:
   CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm);
   // FIXME. All stubs for now!
@@ -3161,7 +3165,7 @@
   }
   // FIXME. Section may always be .data
   Values[ 5] = EmitMethodList(MethodListName, 
-               ".section __DATA,__data,regular,no_dead_strip", Methods);
+               "__DATA, __objc_const", Methods);
   Values[ 6] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
   if (flags & CLS_META)
     Values[ 7] = llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
@@ -3179,7 +3183,7 @@
                            std::string("\01l_OBJC_METACLASS_RO_$_")+ClassName :
                            std::string("\01l_OBJC_CLASS_RO_$_")+ClassName,
                            &CGM.getModule());
-  CLASS_RO_GV->setSection(".section __DATA,__data,regular,no_dead_strip");
+  CLASS_RO_GV->setSection("__DATA, __objc_const");
   UsedGlobals.push_back(CLASS_RO_GV);
   return CLASS_RO_GV;
 
@@ -3220,7 +3224,7 @@
                              Init,
                              ClassName,
                              &CGM.getModule());
-  GV->setSection(".section __DATA,__data,regular,no_dead_strip");
+  GV->setSection("__DATA, __objc_const");
   UsedGlobals.push_back(GV);
   // FIXME! why?
   GV->setAlignment(32);
@@ -3424,7 +3428,7 @@
   }
   
   Values[2] = EmitMethodList(MethodListName, 
-                             ".section __DATA,__data,regular,no_dead_strip", 
+                             "__DATA, __objc_const", 
                              Methods);
 
   MethodListName = Prefix;
@@ -3438,7 +3442,7 @@
   }
   
   Values[3] = EmitMethodList(MethodListName, 
-                             ".section __DATA,__data,regular,no_dead_strip", 
+                             "__DATA, __objc_const", 
                              Methods);
   Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
   Values[5] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
@@ -3453,7 +3457,7 @@
                                Init,
                                ExtCatName,
                                &CGM.getModule());
-  GCATV->setSection(".section __DATA,__data,regular,no_dead_strip");
+  GCATV->setSection("__DATA, __objc_const");
   UsedGlobals.push_back(GCATV);
   DefinedCategories.push_back(GCATV);
 }
@@ -3515,6 +3519,38 @@
                                         ObjCTypes.MethodListnfABIPtrTy);
 }
 
+llvm::Constant * CGObjCNonFragileABIMac::EmitIvarOffsetVar(
+                                              const ObjCImplementationDecl *ID,
+                                              const FieldDecl *Field,
+                                              unsigned long int Offset) {
+  
+  std::string ExternalName("\01_OBJC_IVAR_$_" + ID->getNameAsString() + '.' 
+                           + Field->getNameAsString());
+  llvm::Constant *Init = llvm::ConstantInt::get(ObjCTypes.IntTy, Offset);
+  
+  llvm::GlobalVariable *IvarOffsetGV = 
+    CGM.getModule().getGlobalVariable(ExternalName);
+  if (IvarOffsetGV) {
+    // ivar offset symbol already built due to user code referencing it.
+    IvarOffsetGV->setInitializer(Init);
+    return IvarOffsetGV;
+  }
+  
+  IvarOffsetGV = 
+    new llvm::GlobalVariable(Init->getType(),
+                             false,
+                             llvm::GlobalValue::ExternalLinkage,
+                             Init,
+                             ExternalName,
+                             &CGM.getModule());
+  IvarOffsetGV->setSection("__DATA, __objc_const");
+  UsedGlobals.push_back(IvarOffsetGV);
+  
+  return llvm::ConstantExpr::getBitCast(
+                IvarOffsetGV,
+                llvm::PointerType::getUnqual(ObjCTypes.LongTy));
+}
+
 /// EmitIvarList - Emit the ivar list for the given
 /// implementation. If ForClass is true the list of class ivars
 /// (i.e. metaclass ivars) is emitted, otherwise the list of
@@ -3541,13 +3577,23 @@
   const ObjCInterfaceDecl *OID = ID->getClassInterface();
   assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface");
   
-  for(ObjCInterfaceDecl::ivar_iterator i = OID->ivar_begin(),
-      e = OID->ivar_end(); i != e; ++i) {
+  // FIXME. Consolidate this with similar code in GenerateClass.
+  const llvm::Type *InterfaceTy =
+    CGM.getTypes().ConvertType(CGM.getContext().getObjCInterfaceType(
+                                        const_cast<ObjCInterfaceDecl*>(OID)));
+  
+  const llvm::StructLayout *Layout =
+    CGM.getTargetData().getStructLayout(cast<llvm::StructType>(InterfaceTy));
+  int countSuperClassIvars = countInheritedIvars(OID->getSuperClass());
+  const RecordDecl *RD = CGM.getContext().addRecordToClass(OID);
+  RecordDecl::field_iterator i = RD->field_begin();
+  while (countSuperClassIvars-- > 0)
+    ++i;
+  for (RecordDecl::field_iterator e = RD->field_end(); i != e; ++i) {
     FieldDecl *Field = *i;
-    // FIXME. Put the offset symbol address after code gen. 
-    // for non-fragile ivar access is in.
-    Ivar[0] = llvm::Constant::getNullValue(
-                llvm::PointerType::getUnqual(ObjCTypes.LongTy));
+    unsigned long offset = Layout->getElementOffset(CGM.getTypes().
+                                                    getLLVMFieldNo(Field));
+    Ivar[0] = EmitIvarOffsetVar(ID, Field, offset);
     if (Field->getIdentifier())
       Ivar[1] = GetMethodVarName(Field->getIdentifier());
     else
@@ -3589,7 +3635,7 @@
                              Prefix + OID->getNameAsString(),
                              &CGM.getModule());
   
-  GV->setSection(".section __DATA,__data,regular,no_dead_strip");
+  GV->setSection("__DATA, __objc_const");
                  
   UsedGlobals.push_back(GV);
   return llvm::ConstantExpr::getBitCast(GV,





More information about the cfe-commits mailing list