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

Daniel Dunbar daniel at zuster.org
Tue Aug 26 18:03:11 CDT 2008


Author: ddunbar
Date: Tue Aug 26 18:03:11 2008
New Revision: 55395

URL: http://llvm.org/viewvc/llvm-project?rev=55395&view=rev
Log:
NeXT: Emit correct properties for category.
 - Was emitting duplicates of class properties instead of the category
   properties.

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=55395&r1=55394&r2=55395&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue Aug 26 18:03:11 2008
@@ -787,7 +787,14 @@
 void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
   unsigned Size = CGM.getTargetData().getABITypeSize(ObjCTypes.CategoryTy);
 
+  // FIXME: This is poor design, the OCD should have a pointer to the
+  // category decl. Additionally, note that Category can be null for
+  // the @implementation w/o an @interface case. Sema should just
+  // create one for us as it does for @implementation so everyone else
+  // can live life under a clear blue sky.
   const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
+  const ObjCCategoryDecl *Category = 
+    Interface->FindCategoryDeclaration(OCD->getIdentifier());
   std::string ExtName(std::string(Interface->getName()) +
                       "_" +
                       OCD->getName());
@@ -821,9 +828,15 @@
                      Interface->protocol_begin(),
                      Interface->protocol_end());
   Values[5] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
-  Values[6] = EmitPropertyList(std::string("\01L_OBJC_$_PROP_LIST_") + ExtName,
-                               Interface->classprop_begin(),
-                               Interface->classprop_end());
+
+  // If there is no category @interface then there can be no properties.
+  if (Category) {
+    Values[6] = EmitPropertyList(std::string("\01L_OBJC_$_PROP_LIST_") + ExtName,
+                                 Category->classprop_begin(),
+                                 Category->classprop_end());
+  } else {
+    Values[6] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
+  }
   
   llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.CategoryTy,
                                                    Values);




More information about the cfe-commits mailing list