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

Fariborz Jahanian fjahanian at apple.com
Mon Jan 26 10:32:24 PST 2009


Author: fjahanian
Date: Mon Jan 26 12:32:24 2009
New Revision: 63020

URL: http://llvm.org/viewvc/llvm-project?rev=63020&view=rev
Log:
Meta-data for nonfragile-abi's categories

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=63020&r1=63019&r2=63020&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Mon Jan 26 12:32:24 2009
@@ -590,8 +590,7 @@
                                          const ObjCContainerDecl *CD=0)
     { return 0; }
   
-  virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD)
-  { return; }
+  virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD);
   
   virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl);
   
@@ -3341,6 +3340,56 @@
   BuildClassMetaData(TClassName, MetaTClass, SuperClassGV, CLASS_RO_GV);
 }
 
+/// GenerateCategory - Build metadata for a category implementation.
+/// struct _category_t {
+///   const char * const name;
+///   struct _class_t *const cls;
+///   const struct _method_list_t * const instance_methods;
+///   const struct _method_list_t * const class_methods;
+///   const struct _protocol_list_t * const protocols;
+///   const struct _prop_list_t * const properties;
+/// }
+///
+void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) 
+{
+  const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
+  std::string ExtCatName("\01l_OBJC_$_CATEGORY_" + Interface->getNameAsString()+ 
+                      "_$_" + OCD->getNameAsString());
+  std::string ExtClassName("\01_OBJC_CLASS_$_" + Interface->getNameAsString());
+  
+  std::vector<llvm::Constant*> Values(6);
+  Values[0] = GetClassName(OCD->getIdentifier());
+  // meta-class entry symbol
+  llvm::GlobalVariable *ClassGV = 
+    CGM.getModule().getGlobalVariable(ExtClassName);
+  if (!ClassGV)
+    ClassGV =
+    new llvm::GlobalVariable(ObjCTypes.ClassnfABITy, false,
+                             llvm::GlobalValue::ExternalLinkage,
+                             0,
+                             ExtClassName,
+                             &CGM.getModule());
+  UsedGlobals.push_back(ClassGV);
+  Values[1] = ClassGV;
+  Values[2] = llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
+  Values[3] = llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
+  Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
+  Values[5] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
+  
+  llvm::Constant *Init = 
+    llvm::ConstantStruct::get(ObjCTypes.CategorynfABITy, 
+                              Values);
+  llvm::GlobalVariable *GCATV
+    = new llvm::GlobalVariable(ObjCTypes.CategorynfABITy, 
+                               false,
+                               llvm::GlobalValue::InternalLinkage,
+                               Init,
+                               ExtCatName,
+                               &CGM.getModule());
+  GCATV->setSection(".section __DATA,__data,regular,no_dead_strip");
+  UsedGlobals.push_back(GCATV);
+  DefinedCategories.push_back(GCATV);
+}
 /* *** */
 
 CodeGen::CGObjCRuntime *





More information about the cfe-commits mailing list