[llvm-commits] [llvm] r44457 - in /llvm/trunk: include/llvm/ParameterAttributes.h lib/AsmParser/llvmAsmParser.y lib/VMCore/Function.cpp tools/llvm-upgrade/UpgradeParser.y

Duncan Sands baldrick at free.fr
Fri Nov 30 10:19:18 PST 2007


Author: baldrick
Date: Fri Nov 30 12:19:18 2007
New Revision: 44457

URL: http://llvm.org/viewvc/llvm-project?rev=44457&view=rev
Log:
Add a convenience method for modifying parameter
attributes.  While there, I noticed that not all
attribute methods returned a pointer-to-constant,
so I fixed that.

Modified:
    llvm/trunk/include/llvm/ParameterAttributes.h
    llvm/trunk/lib/AsmParser/llvmAsmParser.y
    llvm/trunk/lib/VMCore/Function.cpp
    llvm/trunk/tools/llvm-upgrade/UpgradeParser.y

Modified: llvm/trunk/include/llvm/ParameterAttributes.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ParameterAttributes.h?rev=44457&r1=44456&r2=44457&view=diff

==============================================================================
--- llvm/trunk/include/llvm/ParameterAttributes.h (original)
+++ llvm/trunk/include/llvm/ParameterAttributes.h Fri Nov 30 12:19:18 2007
@@ -130,13 +130,24 @@
       : attrs(attrVec), refCount(0) {}
 
   public:
-    /// This method ensures the uniqueness of ParamAttrsList instances. The
+    /// This method ensures the uniqueness of ParamAttrsList instances.  The
     /// argument is a vector of attribute/index pairs as represented by the
-    /// ParamAttrsWithIndex structure. The vector is used in the construction of
-    /// the ParamAttrsList instance. If an instance with identical vector pairs
-    /// exists, it will be returned instead of creating a new instance.
+    /// ParamAttrsWithIndex structure.  The index values must be in strictly
+    /// increasing order and ParamAttr::None is not allowed.  The vector is
+    /// used to construct the ParamAttrsList instance.  If an instance with
+    /// identical vector pairs exists, it will be returned instead of creating
+    /// a new instance.
     /// @brief Get a ParamAttrsList instance.
-    static ParamAttrsList *get(const ParamAttrsVector &attrVec);
+    static const ParamAttrsList *get(const ParamAttrsVector &attrVec);
+
+    /// Returns the ParamAttrsList obtained by modifying PAL using the supplied
+    /// list of attribute/index pairs.  Any existing attributes for the given
+    /// index are replaced by the given attributes.  If there were no attributes
+    /// then the new ones are inserted.  Attributes can be deleted by replacing
+    /// them with ParamAttr::None.  Index values must be strictly increasing.
+    /// @brief Get a new ParamAttrsList instance by modifying an existing one.
+    static const ParamAttrsList *getModified(const ParamAttrsList *PAL,
+                                             const ParamAttrsVector &modVec);
 
     /// Returns whether each of the specified lists of attributes can be safely
     /// replaced with the other in a function or a function call.

Modified: llvm/trunk/lib/AsmParser/llvmAsmParser.y
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/llvmAsmParser.y?rev=44457&r1=44456&r2=44457&view=diff

==============================================================================
--- llvm/trunk/lib/AsmParser/llvmAsmParser.y (original)
+++ llvm/trunk/lib/AsmParser/llvmAsmParser.y Fri Nov 30 12:19:18 2007
@@ -2243,7 +2243,7 @@
   bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy;
   if (isVarArg) ParamTypeList.pop_back();
 
-  ParamAttrsList *PAL = 0;
+  const ParamAttrsList *PAL = 0;
   if (!Attrs.empty())
     PAL = ParamAttrsList::get(Attrs);
 
@@ -2645,7 +2645,7 @@
         GEN_ERROR("Invalid number of parameters detected");
     }
 
-    ParamAttrsList *PAL = 0;
+    const ParamAttrsList *PAL = 0;
     if (!Attrs.empty())
       PAL = ParamAttrsList::get(Attrs);
 
@@ -2977,7 +2977,7 @@
     }
 
     // Finish off the ParamAttrs and check them
-    ParamAttrsList *PAL = 0;
+    const ParamAttrsList *PAL = 0;
     if (!Attrs.empty())
       PAL = ParamAttrsList::get(Attrs);
 

Modified: llvm/trunk/lib/VMCore/Function.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Function.cpp?rev=44457&r1=44456&r2=44457&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Function.cpp (original)
+++ llvm/trunk/lib/VMCore/Function.cpp Fri Nov 30 12:19:18 2007
@@ -167,7 +167,7 @@
 
 static ManagedStatic<FoldingSet<ParamAttrsList> > ParamAttrsLists;
 
-ParamAttrsList *
+const ParamAttrsList *
 ParamAttrsList::get(const ParamAttrsVector &attrVec) {
   // If there are no attributes then return a null ParamAttrsList pointer.
   if (attrVec.empty())
@@ -200,6 +200,64 @@
   return PAL;
 }
 
+const ParamAttrsList *
+ParamAttrsList::getModified(const ParamAttrsList *PAL,
+                            const ParamAttrsVector &modVec) {
+  if (modVec.empty())
+    return PAL;
+
+#ifndef NDEBUG
+  for (unsigned i = 0, e = modVec.size(); i < e; ++i)
+    assert((!i || modVec[i-1].index < modVec[i].index)
+           && "Misordered ParamAttrsList!");
+#endif
+
+  if (!PAL) {
+    // Strip any instances of ParamAttr::None from modVec before calling 'get'.
+    ParamAttrsVector newVec;
+    for (unsigned i = 0, e = modVec.size(); i < e; ++i)
+      if (modVec[i].attrs != ParamAttr::None)
+        newVec.push_back(modVec[i]);
+    return get(newVec);
+  }
+
+  const ParamAttrsVector &oldVec = PAL->attrs;
+
+  ParamAttrsVector newVec;
+  unsigned oldI = 0;
+  unsigned modI = 0;
+  unsigned oldE = oldVec.size();
+  unsigned modE = modVec.size();
+
+  while (oldI < oldE && modI < modE) {
+    uint16_t oldIndex = oldVec[oldI].index;
+    uint16_t modIndex = modVec[modI].index;
+
+    if (oldIndex < modIndex) {
+      newVec.push_back(oldVec[oldI]);
+      ++oldI;
+    } else if (modIndex < oldIndex) {
+      if (modVec[modI].attrs != ParamAttr::None)
+        newVec.push_back(modVec[modI]);
+      ++modI;
+    } else {
+      // Same index - overwrite or delete existing attributes.
+      if (modVec[modI].attrs != ParamAttr::None)
+        newVec.push_back(modVec[modI]);
+      ++oldI;
+      ++modI;
+    }
+  }
+
+  for (; oldI < oldE; ++oldI)
+    newVec.push_back(oldVec[oldI]);
+  for (; modI < modE; ++modI)
+    if (modVec[modI].attrs != ParamAttr::None)
+      newVec.push_back(modVec[modI]);
+
+  return get(newVec);
+}
+
 ParamAttrsList::~ParamAttrsList() {
   ParamAttrsLists->RemoveNode(this);
 }

Modified: llvm/trunk/tools/llvm-upgrade/UpgradeParser.y
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-upgrade/UpgradeParser.y?rev=44457&r1=44456&r2=44457&view=diff

==============================================================================
--- llvm/trunk/tools/llvm-upgrade/UpgradeParser.y (original)
+++ llvm/trunk/tools/llvm-upgrade/UpgradeParser.y Fri Nov 30 12:19:18 2007
@@ -2055,7 +2055,7 @@
     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
     if (isVarArg) Params.pop_back();
 
-    ParamAttrsList *PAL = 0;
+    const ParamAttrsList *PAL = 0;
     if (lastCallingConv == OldCallingConv::CSRet) {
       ParamAttrsVector Attrs;
       ParamAttrsWithIndex PAWI;





More information about the llvm-commits mailing list