enumerate parameter attr lists.
authorChris Lattner <sabre@nondot.org>
Thu, 3 May 2007 22:46:43 +0000 (22:46 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 3 May 2007 22:46:43 +0000 (22:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36709 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bitcode/Writer/ValueEnumerator.cpp
lib/Bitcode/Writer/ValueEnumerator.h

index 4d3f0fd792a2a9c565a22f7991be95871e336826..ba091b564f0a47c30d32b337e7fe3800b897cc8a 100644 (file)
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "ValueEnumerator.h"
+#include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
 #include "llvm/TypeSymbolTable.h"
 #include "llvm/ValueSymbolTable.h"
@@ -143,8 +144,24 @@ void ValueEnumerator::EnumerateType(const Type *Ty) {
   for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
        I != E; ++I)
     EnumerateType(*I);
+  
+  // If this is a function type, enumerate the param attrs.
+  if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty))
+    EnumerateParamAttrs(FTy->getParamAttrs());
 }
 
+void ValueEnumerator::EnumerateParamAttrs(const ParamAttrsList *PAL) {
+  if (PAL == 0) return;  // null is always 0.
+  // Do a lookup.
+  unsigned &Entry = ParamAttrMap[PAL];
+  if (Entry == 0) {
+    // Never saw this before, add it.
+    ParamAttrs.push_back(PAL);
+    Entry = ParamAttrs.size();
+  }
+}
+
+
 /// PurgeAggregateValues - If there are any aggregate values at the end of the
 /// value list, remove them and return the count of the remaining values.  If
 /// there are none, return -1.
index 77f27dad68bc146d044ecac4841f43f4debb1b25..d78fdb8af956c4e6582e073efdebc54f40b7b342 100644 (file)
@@ -24,6 +24,7 @@ class Value;
 class BasicBlock;
 class Function;
 class Module;
+class ParamAttrsList;
 class TypeSymbolTable;
 class ValueSymbolTable;
 
@@ -43,6 +44,10 @@ private:
   ValueMapType ValueMap;
   ValueList Values;
   
+  typedef DenseMap<const ParamAttrsList*, unsigned> ParamAttrMapType;
+  ParamAttrMapType ParamAttrMap;
+  std::vector<const ParamAttrsList*> ParamAttrs;
+  
   /// BasicBlocks - This contains all the basic blocks for the currently
   /// incorporated function.  Their reverse mapping is stored in ValueMap.
   std::vector<const BasicBlock*> BasicBlocks;
@@ -69,6 +74,13 @@ public:
     assert(I != TypeMap.end() && "Type not in ValueEnumerator!");
     return I->second-1;
   }
+  
+  unsigned getParamAttrID(const ParamAttrsList *PAL) const {
+    if (PAL == 0) return 0;  // Null maps to zero.
+    ParamAttrMapType::const_iterator I = ParamAttrMap.find(PAL);
+    assert(I != ParamAttrMap.end() && "ParamAttr not in ValueEnumerator!");
+    return I->second;
+  }
 
   /// getFunctionConstantRange - Return the range of values that corresponds to
   /// function-local constants.
@@ -82,6 +94,9 @@ public:
   const std::vector<const BasicBlock*> &getBasicBlocks() const {
     return BasicBlocks; 
   }
+  const std::vector<const ParamAttrsList*> getParamAttrs() const {
+    return ParamAttrs;
+  }
 
   /// PurgeAggregateValues - If there are any aggregate values at the end of the
   /// value list, remove them and return the count of the remaining values.  If
@@ -97,6 +112,7 @@ public:
 private:
   void EnumerateValue(const Value *V);
   void EnumerateType(const Type *T);
+  void EnumerateParamAttrs(const ParamAttrsList *PAL);
   
   void EnumerateTypeSymbolTable(const TypeSymbolTable &ST);
   void EnumerateValueSymbolTable(const ValueSymbolTable &ST);