]> granicus.if.org Git - clang/commitdiff
Build method-description-list for category meta-data
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 26 Jan 2009 22:58:07 +0000 (22:58 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 26 Jan 2009 22:58:07 +0000 (22:58 +0000)
as well (for nonfragile-abi).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63062 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjCMac.cpp

index b70ef5e7c32583a5988d7f1889aa072d8160cb2b..f1460bd0193537209da9ba563fd8b19cb69c3c81 100644 (file)
@@ -3171,6 +3171,7 @@ llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
   CLASS_RO_GV->setSection(".section __DATA,__data,regular,no_dead_strip");
   UsedGlobals.push_back(CLASS_RO_GV);
   return CLASS_RO_GV;
+
 }
 
 /// BuildClassMetaData - This routine defines that to-level meta-data
@@ -3381,7 +3382,8 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
 void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) 
 {
   const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
-  std::string ExtCatName("\01l_OBJC_$_CATEGORY_" + Interface->getNameAsString()+ 
+  const char *Prefix = "\01l_OBJC_$_CATEGORY_";
+  std::string ExtCatName(Prefix + Interface->getNameAsString()+ 
                       "_$_" + OCD->getNameAsString());
   std::string ExtClassName("\01_OBJC_CLASS_$_" + Interface->getNameAsString());
   
@@ -3399,8 +3401,34 @@ void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD)
                              &CGM.getModule());
   UsedGlobals.push_back(ClassGV);
   Values[1] = ClassGV;
-  Values[2] = llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
-  Values[3] = llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
+  std::vector<llvm::Constant*> Methods;
+  std::string MethodListName(Prefix);
+  MethodListName += "INSTANCE_METHODS_" + Interface->getNameAsString() + 
+    "_$_" + OCD->getNameAsString();
+   
+  for (ObjCCategoryImplDecl::instmeth_iterator i = OCD->instmeth_begin(),
+       e = OCD->instmeth_end(); i != e; ++i) {
+    // Instance methods should always be defined.
+    Methods.push_back(GetMethodConstant(*i));
+  }
+  
+  Values[2] = EmitMethodList(MethodListName, 
+                             ".section __DATA,__data,regular,no_dead_strip", 
+                             Methods);
+
+  MethodListName = Prefix;
+  MethodListName += "CLASS_METHODS_" + Interface->getNameAsString() + "_$_" +
+    OCD->getNameAsString();
+  Methods.clear();
+  for (ObjCCategoryImplDecl::classmeth_iterator i = OCD->classmeth_begin(),
+       e = OCD->classmeth_end(); i != e; ++i) {
+    // Class methods should always be defined.
+    Methods.push_back(GetMethodConstant(*i));
+  }
+  
+  Values[3] = EmitMethodList(MethodListName, 
+                             ".section __DATA,__data,regular,no_dead_strip", 
+                             Methods);
   Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
   Values[5] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);