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

Fariborz Jahanian fjahanian at apple.com
Tue Feb 10 12:21:06 PST 2009


Author: fjahanian
Date: Tue Feb 10 14:21:06 2009
New Revision: 64233

URL: http://llvm.org/viewvc/llvm-project?rev=64233&view=rev
Log:
Generate ir for ivar offset. This will pass
type-nsobject-attribute.m in the dejagnu test suite
in the nonfragile abi mode.

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=64233&r1=64232&r2=64233&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue Feb 10 14:21:06 2009
@@ -633,7 +633,7 @@
   /// IvarListnfABIPtrTy.
   llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID);
   
-  llvm::Constant *EmitIvarOffsetVar(const ObjCImplementationDecl *ID,
+  llvm::Constant *EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
                                     const ObjCIvarDecl *Ivar,
                                     unsigned long int offset);
   
@@ -673,6 +673,12 @@
   llvm::Value *EmitMetaClassRef(CGBuilderTy &Builder, 
                                 const ObjCInterfaceDecl *ID);
 
+  /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
+  /// the given ivar.
+  ///
+  llvm::GlobalVariable * ObjCIvarOffsetVariable(std::string &Name, 
+                              const NamedDecl *IDName,
+                              const ObjCIvarDecl *Ivar);
   
 public:
   CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm);
@@ -746,7 +752,6 @@
   virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
                                       ObjCInterfaceDecl *Interface,
                                       const ObjCIvarDecl *Ivar);
-  virtual bool LateBoundIVars() const { return true; }
 };
   
 } // end anonymous namespace
@@ -3907,11 +3912,34 @@
                                         ObjCTypes.MethodListnfABIPtrTy);
 }
 
+/// ObjCIvarOffsetVariable - Returns the ivar offset variable for
+/// the given ivar.
+///
+llvm::GlobalVariable * CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(
+                              std::string &Name, 
+                              const NamedDecl *IDName,
+                              const ObjCIvarDecl *Ivar) {
+  Name += "\01_OBJC_IVAR_$_" + IDName->getNameAsString() + '.'
+          + Ivar->getNameAsString();
+  llvm::GlobalVariable *IvarOffsetGV = 
+    CGM.getModule().getGlobalVariable(Name);
+  if (!IvarOffsetGV)
+    IvarOffsetGV = 
+      new llvm::GlobalVariable(ObjCTypes.LongTy,
+                               false,
+                               llvm::GlobalValue::ExternalLinkage,
+                               0,
+                               Name,
+                               &CGM.getModule());
+  return IvarOffsetGV;
+}
+
 llvm::Constant * CGObjCNonFragileABIMac::EmitIvarOffsetVar(
-                                              const ObjCImplementationDecl *ID,
+                                              const ObjCInterfaceDecl *ID,
                                               const ObjCIvarDecl *Ivar,
                                               unsigned long int Offset) {
   
+  assert(ID && "EmitIvarOffsetVar - null interface decl.");
   std::string ExternalName("\01_OBJC_IVAR_$_" + ID->getNameAsString() + '.' 
                            + Ivar->getNameAsString());
   llvm::Constant *Init = llvm::ConstantInt::get(ObjCTypes.LongTy, Offset);
@@ -3943,9 +3971,8 @@
   if (!globalVisibility)
     IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
   else 
-    if (const ObjCInterfaceDecl *OID = ID->getClassInterface()) 
-      if (IsClassHidden(OID))
-       IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+    if (IsClassHidden(ID))
+      IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
 
   IvarOffsetGV->setSection("__DATA, __objc_const");
   UsedGlobals.push_back(IvarOffsetGV);
@@ -3994,7 +4021,7 @@
     unsigned long offset = Layout->getElementOffset(CGM.getTypes().
                                                     getLLVMFieldNo(Field));
     const ObjCIvarDecl *ivarDecl = *I++;
-    Ivar[0] = EmitIvarOffsetVar(ID, ivarDecl, offset);
+    Ivar[0] = EmitIvarOffsetVar(ID->getClassInterface(), ivarDecl, offset);
     if (Field->getIdentifier())
       Ivar[1] = GetMethodVarName(Field->getIdentifier());
     else
@@ -4268,21 +4295,9 @@
   assert(ObjectTy->isObjCInterfaceType() && 
          "CGObjCNonFragileABIMac::EmitObjCValueForIvar");
   NamedDecl *ID = ObjectTy->getAsObjCInterfaceType()->getDecl();
-  // NOTE. This name must match one in EmitIvarOffsetVar.
-  // FIXME. Consolidate into one naming routine.
-  std::string ExternalName("\01_OBJC_IVAR_$_" + ID->getNameAsString() + '.' 
-                           + Ivar->getNameAsString());
-  
-  llvm::GlobalVariable *IvarOffsetGV = 
-    CGM.getModule().getGlobalVariable(ExternalName);
-  if (!IvarOffsetGV)
-    IvarOffsetGV = 
-      new llvm::GlobalVariable(ObjCTypes.LongTy,
-                               false,
-                               llvm::GlobalValue::ExternalLinkage,
-                               0,
-                               ExternalName,
-                               &CGM.getModule());
+  std::string ExternalName;
+  llvm::GlobalVariable *IvarOffsetGV =
+    ObjCIvarOffsetVariable(ExternalName, ID, Ivar);
   
   // (char *) BaseValue
   llvm::Value *V =  CGF.Builder.CreateBitCast(BaseValue,
@@ -4310,7 +4325,11 @@
                                        CodeGen::CodeGenFunction &CGF,
                                        ObjCInterfaceDecl *Interface,
                                        const ObjCIvarDecl *Ivar) {
-  return 0;
+  std::string ExternalName;
+  llvm::GlobalVariable *IvarOffsetGV =  
+    ObjCIvarOffsetVariable(ExternalName, Interface, Ivar);
+  
+  return CGF.Builder.CreateLoad(IvarOffsetGV, false, "ivar");
 }
 
 CodeGen::RValue CGObjCNonFragileABIMac::EmitMessageSend(





More information about the cfe-commits mailing list