aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode/Writer/ValueEnumerator.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2009-08-04 06:00:18 +0000
committerDevang Patel <dpatel@apple.com>2009-08-04 06:00:18 +0000
commitd5ac40457b62f37f0abfb1d61064f7c7300e91ee (patch)
treead521560772e5ebc19d6c8d2e45202ff9c31b661 /lib/Bitcode/Writer/ValueEnumerator.cpp
parent3b24c0172069a2546cd095e4b91f8b88c1ea0722 (diff)
Use separate ValueList for metadata.
This fixes PR4666. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78056 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode/Writer/ValueEnumerator.cpp')
-rw-r--r--lib/Bitcode/Writer/ValueEnumerator.cpp81
1 files changed, 55 insertions, 26 deletions
diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp
index 7583bb96c9..4712dea762 100644
--- a/lib/Bitcode/Writer/ValueEnumerator.cpp
+++ b/lib/Bitcode/Writer/ValueEnumerator.cpp
@@ -114,6 +114,18 @@ ValueEnumerator::ValueEnumerator(const Module *M) {
TypeMap[Types[i].first] = i+1;
}
+unsigned ValueEnumerator::getValueID(const Value *V) const {
+ if (isa<MetadataBase>(V)) {
+ ValueMapType::const_iterator I = MDValueMap.find(V);
+ assert(I != MDValueMap.end() && "Value not in slotcalculator!");
+ return I->second-1;
+ }
+
+ ValueMapType::const_iterator I = ValueMap.find(V);
+ assert(I != ValueMap.end() && "Value not in slotcalculator!");
+ return I->second-1;
+}
+
// Optimize constant ordering.
namespace {
struct CstSortPredicate {
@@ -165,9 +177,51 @@ void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) {
EnumerateValue(VI->getValue());
}
+void ValueEnumerator::EnumerateMetadata(const MetadataBase *MD) {
+ // Check to see if it's already in!
+ unsigned &MDValueID = MDValueMap[MD];
+ if (MDValueID) {
+ // Increment use count.
+ MDValues[MDValueID-1].second++;
+ return;
+ }
+
+ // Enumerate the type of this value.
+ EnumerateType(MD->getType());
+
+ if (const MDNode *N = dyn_cast<MDNode>(MD)) {
+ MDValues.push_back(std::make_pair(MD, 1U));
+ MDValueMap[MD] = MDValues.size();
+ MDValueID = MDValues.size();
+ for (MDNode::const_elem_iterator I = N->elem_begin(), E = N->elem_end();
+ I != E; ++I) {
+ if (*I)
+ EnumerateValue(*I);
+ else
+ EnumerateType(Type::VoidTy);
+ }
+ return;
+ } else if (const NamedMDNode *N = dyn_cast<NamedMDNode>(MD)) {
+ for(NamedMDNode::const_elem_iterator I = N->elem_begin(),
+ E = N->elem_end(); I != E; ++I) {
+ MetadataBase *M = *I;
+ EnumerateValue(M);
+ }
+ MDValues.push_back(std::make_pair(MD, 1U));
+ MDValueMap[MD] = Values.size();
+ return;
+ }
+
+ // Add the value.
+ MDValues.push_back(std::make_pair(MD, 1U));
+ MDValueID = MDValues.size();
+}
+
void ValueEnumerator::EnumerateValue(const Value *V) {
assert(V->getType() != Type::VoidTy && "Can't insert void values!");
-
+ if (const MetadataBase *MB = dyn_cast<MetadataBase>(V))
+ return EnumerateMetadata(MB);
+
// Check to see if it's already in!
unsigned &ValueID = ValueMap[V];
if (ValueID) {
@@ -207,31 +261,6 @@ void ValueEnumerator::EnumerateValue(const Value *V) {
}
}
- if (const MDNode *N = dyn_cast<MDNode>(V)) {
- Values.push_back(std::make_pair(V, 1U));
- ValueMap[V] = Values.size();
- ValueID = Values.size();
- for (MDNode::const_elem_iterator I = N->elem_begin(), E = N->elem_end();
- I != E; ++I) {
- if (*I)
- EnumerateValue(*I);
- else
- EnumerateType(Type::VoidTy);
- }
- return;
- }
-
- if (const NamedMDNode *N = dyn_cast<NamedMDNode>(V)) {
- for(NamedMDNode::const_elem_iterator I = N->elem_begin(),
- E = N->elem_end(); I != E; ++I) {
- MetadataBase *M = *I;
- EnumerateValue(M);
- }
- Values.push_back(std::make_pair(V, 1U));
- ValueMap[V] = Values.size();
- return;
- }
-
// Add the value.
Values.push_back(std::make_pair(V, 1U));
ValueID = Values.size();