[cfe-commits] r52765 - in /cfe/trunk/lib/CodeGen: CGObjCGNU.cpp CGObjCRuntime.h CodeGenModule.cpp

Chris Lattner sabre at nondot.org
Wed Jun 25 22:08:00 PDT 2008


Author: lattner
Date: Thu Jun 26 00:08:00 2008
New Revision: 52765

URL: http://llvm.org/viewvc/llvm-project?rev=52765&view=rev
Log:
refactor more objc codegen interfaces to pass around selectors so
we don't push strings into LLVM IR and then have to read them back out.

Modified:
    cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
    cfe/trunk/lib/CodeGen/CGObjCRuntime.h
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Thu Jun 26 00:08:00 2008
@@ -24,16 +24,6 @@
 #include "llvm/ADT/StringMap.h"
 #include <map>
 using namespace clang;
-
-// FIXME: Remove THIS!
-#include "llvm/Analysis/ValueTracking.h"
-std::string getStringValue(llvm::Constant *C) {
-  std::string R;
-  bool V = GetConstantStringInfo(C, R);
-  assert(V && "Couldn't convert string");
-  return R;
-}
-
 using llvm::dyn_cast;
 
 // The version of the runtime that this class targets.  Must match the version
@@ -73,7 +63,7 @@
       const llvm::SmallVectorImpl<llvm::Constant *>  &IvarOffsets);
   llvm::Constant *GenerateMethodList(const std::string &ClassName,
       const std::string &CategoryName,
-      const llvm::SmallVectorImpl<llvm::Constant *>  &MethodNames, 
+      const llvm::SmallVectorImpl<Selector>  &MethodSels, 
       const llvm::SmallVectorImpl<llvm::Constant *>  &MethodTypes, 
       bool isClassMethodList);
   llvm::Constant *GenerateProtocolList(
@@ -131,9 +121,9 @@
                                          bool isClassMethod,
                                          bool isVarArg);
   virtual void GenerateCategory(const char *ClassName, const char *CategoryName,
-           const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodNames,
+           const llvm::SmallVectorImpl<Selector>  &InstanceMethodSels,
            const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodTypes,
-           const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodNames,
+           const llvm::SmallVectorImpl<Selector>  &ClassMethodSels,
            const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodTypes,
            const llvm::SmallVectorImpl<std::string> &Protocols);
   virtual void GenerateClass(
@@ -143,9 +133,9 @@
            const llvm::SmallVectorImpl<llvm::Constant *>  &IvarNames,
            const llvm::SmallVectorImpl<llvm::Constant *>  &IvarTypes,
            const llvm::SmallVectorImpl<llvm::Constant *>  &IvarOffsets,
-           const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodNames,
+           const llvm::SmallVectorImpl<Selector>  &InstanceMethodSels,
            const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodTypes,
-           const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodNames,
+           const llvm::SmallVectorImpl<Selector>  &ClassMethodSels,
            const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodTypes,
            const llvm::SmallVectorImpl<std::string> &Protocols);
   virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder &Builder, const char
@@ -376,8 +366,8 @@
 /// Generates a MethodList.  Used in construction of a objc_class and 
 /// objc_category structures.
 llvm::Constant *CGObjCGNU::GenerateMethodList(const std::string &ClassName,
-    const std::string &CategoryName, 
-    const llvm::SmallVectorImpl<llvm::Constant *> &MethodNames, 
+                                              const std::string &CategoryName, 
+    const llvm::SmallVectorImpl<Selector> &MethodSels, 
     const llvm::SmallVectorImpl<llvm::Constant *> &MethodTypes, 
     bool isClassMethodList) {
   // Get the method structure type.  
@@ -390,13 +380,13 @@
   std::vector<llvm::Constant*> Elements;
   for (unsigned int i = 0, e = MethodTypes.size(); i < e; ++i) {
     Elements.clear();
-    Elements.push_back(llvm::ConstantExpr::getGetElementPtr(MethodNames[i],
-                                                            Zeros, 2));
+    llvm::Constant *C = CGM.GetAddrOfConstantString(MethodSels[i].getName());
+    Elements.push_back(llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2));
     Elements.push_back(
           llvm::ConstantExpr::getGetElementPtr(MethodTypes[i], Zeros, 2));
     llvm::Constant *Method =
       TheModule.getFunction(SymbolNameForMethod(ClassName, CategoryName,
-                                                getStringValue(MethodNames[i]),
+                                                MethodSels[i].getName(),
                                                 isClassMethodList));
     Method = llvm::ConstantExpr::getBitCast(Method,
         llvm::PointerType::getUnqual(IMPTy));
@@ -406,7 +396,7 @@
 
   // Array of method structures
   llvm::ArrayType *ObjCMethodArrayTy = llvm::ArrayType::get(ObjCMethodTy,
-                                                            MethodNames.size());
+                                                            MethodSels.size());
   llvm::Constant *MethodArray = llvm::ConstantArray::get(ObjCMethodArrayTy,
                                                          Methods);
 
@@ -625,9 +615,9 @@
 void CGObjCGNU::GenerateCategory(
            const char *ClassName,
            const char *CategoryName,
-           const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodNames,
+           const llvm::SmallVectorImpl<Selector>  &InstanceMethodSels,
            const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodTypes,
-           const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodNames,
+           const llvm::SmallVectorImpl<Selector>  &ClassMethodSels,
            const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodTypes,
            const llvm::SmallVectorImpl<std::string> &Protocols) {
   std::vector<llvm::Constant*> Elements;
@@ -635,11 +625,11 @@
   Elements.push_back(MakeConstantString(ClassName));
   // Instance method list 
   Elements.push_back(llvm::ConstantExpr::getBitCast(GenerateMethodList(
-          ClassName, CategoryName, InstanceMethodNames, InstanceMethodTypes,
+          ClassName, CategoryName, InstanceMethodSels, InstanceMethodTypes,
           false), PtrTy));
   // Class method list
   Elements.push_back(llvm::ConstantExpr::getBitCast(GenerateMethodList(
-          ClassName, CategoryName, ClassMethodNames, ClassMethodTypes, true),
+          ClassName, CategoryName, ClassMethodSels, ClassMethodTypes, true),
         PtrTy));
   // Protocol list
   Elements.push_back(llvm::ConstantExpr::getBitCast(
@@ -655,9 +645,9 @@
            const llvm::SmallVectorImpl<llvm::Constant *>  &IvarNames,
            const llvm::SmallVectorImpl<llvm::Constant *>  &IvarTypes,
            const llvm::SmallVectorImpl<llvm::Constant *>  &IvarOffsets,
-           const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodNames,
+           const llvm::SmallVectorImpl<Selector>  &InstanceMethodSels,
            const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodTypes,
-           const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodNames,
+           const llvm::SmallVectorImpl<Selector>  &ClassMethodSels,
            const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodTypes,
            const llvm::SmallVectorImpl<std::string> &Protocols) {
   // Get the superclass pointer.
@@ -672,9 +662,9 @@
   llvm::SmallVector<llvm::Constant*, 1>  empty;
   // Generate the method and instance variable lists
   llvm::Constant *MethodList = GenerateMethodList(ClassName, "",
-      InstanceMethodNames, InstanceMethodTypes, false);
+      InstanceMethodSels, InstanceMethodTypes, false);
   llvm::Constant *ClassMethodList = GenerateMethodList(ClassName, "",
-      ClassMethodNames, ClassMethodTypes, true);
+      ClassMethodSels, ClassMethodTypes, true);
   llvm::Constant *IvarList = GenerateIvarList(IvarNames, IvarTypes,
       IvarOffsets);
   //Generate metaclass for class methods

Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=52765&r1=52764&r2=52765&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCRuntime.h (original)
+++ cfe/trunk/lib/CodeGen/CGObjCRuntime.h Thu Jun 26 00:08:00 2008
@@ -60,9 +60,9 @@
   /// Generate a category.  A category contains a list of methods (and
   /// accompanying metadata) and a list of protocols.
   virtual void GenerateCategory(const char *ClassName, const char *CategoryName,
-             const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodNames,
+             const llvm::SmallVectorImpl<Selector>  &InstanceMethodSels,
              const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodTypes,
-             const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodNames,
+             const llvm::SmallVectorImpl<Selector>  &ClassMethodSels,
              const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodTypes,
              const llvm::SmallVectorImpl<std::string> &Protocols) =0;
   /// Generate a class stucture for this class.
@@ -73,9 +73,9 @@
              const llvm::SmallVectorImpl<llvm::Constant *>  &IvarNames,
              const llvm::SmallVectorImpl<llvm::Constant *>  &IvarTypes,
              const llvm::SmallVectorImpl<llvm::Constant *>  &IvarOffsets,
-             const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodNames,
+             const llvm::SmallVectorImpl<Selector>  &InstanceMethodSels,
              const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodTypes,
-             const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodNames,
+             const llvm::SmallVectorImpl<Selector>  &ClassMethodSels,
              const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodTypes,
              const llvm::SmallVectorImpl<std::string> &Protocols) =0;
   /// Generate a reference to the named protocol.

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Jun 26 00:08:00 2008
@@ -229,9 +229,11 @@
       unsigned ParamAttrs = 0;
       if (ParamType->isRecordType())
         ParamAttrs |= llvm::ParamAttr::ByVal;
-      if (ParamType->isSignedIntegerType() && ParamType->isPromotableIntegerType())
+      if (ParamType->isSignedIntegerType() &&
+          ParamType->isPromotableIntegerType())
         ParamAttrs |= llvm::ParamAttr::SExt;
-      if (ParamType->isUnsignedIntegerType() && ParamType->isPromotableIntegerType())
+      if (ParamType->isUnsignedIntegerType() &&
+          ParamType->isPromotableIntegerType())
         ParamAttrs |= llvm::ParamAttr::ZExt;
       if (ParamAttrs)
         ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(i + increment,
@@ -273,7 +275,7 @@
       const std::string& aliaseeName = D->getAttr<AliasAttr>()->getAliasee();
       llvm::Function *aliasee = getModule().getFunction(aliaseeName);
       llvm::GlobalValue *alias = new llvm::GlobalAlias(aliasee->getType(),
-                                                       llvm::Function::ExternalLinkage,
+                                               llvm::Function::ExternalLinkage,
                                                        D->getName(),
                                                        aliasee,
                                                        &getModule());
@@ -390,26 +392,24 @@
 void CodeGenModule::EmitObjCCategoryImpl(const ObjCCategoryImplDecl *OCD) {
 
   // Collect information about instance methods
-  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodNames;
+  llvm::SmallVector<Selector, 16> InstanceMethodSels;
   llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes;
   for (ObjCCategoryDecl::instmeth_iterator iter = OCD->instmeth_begin(),
       endIter = OCD->instmeth_end() ; iter != endIter ; iter++) {
+    InstanceMethodSels.push_back((*iter)->getSelector());
     std::string TypeStr;
     Context.getObjCEncodingForMethodDecl(*iter,TypeStr);
-    InstanceMethodNames.push_back(
-        GetAddrOfConstantString((*iter)->getSelector().getName()));
     InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
   }
 
   // Collect information about class methods
-  llvm::SmallVector<llvm::Constant*, 16> ClassMethodNames;
+  llvm::SmallVector<Selector, 16> ClassMethodSels;
   llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes;
   for (ObjCCategoryDecl::classmeth_iterator iter = OCD->classmeth_begin(),
       endIter = OCD->classmeth_end() ; iter != endIter ; iter++) {
+    ClassMethodSels.push_back((*iter)->getSelector());
     std::string TypeStr;
     Context.getObjCEncodingForMethodDecl(*iter,TypeStr);
-    ClassMethodNames.push_back(
-        GetAddrOfConstantString((*iter)->getSelector().getName()));
     ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
   }
 
@@ -421,8 +421,8 @@
 
   // Generate the category
   Runtime->GenerateCategory(OCD->getClassInterface()->getName(),
-      OCD->getName(), InstanceMethodNames, InstanceMethodTypes,
-      ClassMethodNames, ClassMethodTypes, Protocols);
+      OCD->getName(), InstanceMethodSels, InstanceMethodTypes,
+      ClassMethodSels, ClassMethodTypes, Protocols);
 }
 
 void CodeGenModule::EmitObjCClassImplementation(
@@ -473,26 +473,24 @@
   }
 
   // Collect information about instance methods
-  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodNames;
+  llvm::SmallVector<Selector, 16> InstanceMethodSels;
   llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes;
   for (ObjCImplementationDecl::instmeth_iterator iter = OID->instmeth_begin(),
       endIter = OID->instmeth_end() ; iter != endIter ; iter++) {
+    InstanceMethodSels.push_back((*iter)->getSelector());
     std::string TypeStr;
     Context.getObjCEncodingForMethodDecl((*iter),TypeStr);
-    InstanceMethodNames.push_back(
-        GetAddrOfConstantString((*iter)->getSelector().getName()));
     InstanceMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
   }
 
   // Collect information about class methods
-  llvm::SmallVector<llvm::Constant*, 16> ClassMethodNames;
+  llvm::SmallVector<Selector, 16> ClassMethodSels;
   llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes;
   for (ObjCImplementationDecl::classmeth_iterator iter = OID->classmeth_begin(),
       endIter = OID->classmeth_end() ; iter != endIter ; iter++) {
+    ClassMethodSels.push_back((*iter)->getSelector());
     std::string TypeStr;
     Context.getObjCEncodingForMethodDecl((*iter),TypeStr);
-    ClassMethodNames.push_back(
-        GetAddrOfConstantString((*iter)->getSelector().getName()));
     ClassMethodTypes.push_back(GetAddrOfConstantString(TypeStr));
   }
   // Collect the names of referenced protocols
@@ -502,8 +500,8 @@
 
   // Generate the category
   Runtime->GenerateClass(ClassName, SCName, instanceSize, IvarNames, IvarTypes,
-      IvarOffsets, InstanceMethodNames, InstanceMethodTypes, ClassMethodNames,
-      ClassMethodTypes, Protocols);
+                         IvarOffsets, InstanceMethodSels, InstanceMethodTypes,
+                         ClassMethodSels, ClassMethodTypes, Protocols);
 }
 
 





More information about the cfe-commits mailing list