From cb33799b9f4e152e3460faa83e59b53ff604c87d Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sun, 10 May 2009 20:57:05 +0000 Subject: Make MDNode use CallbackVH. Also change MDNode to store Value* instead of Constant* in preperation of a future change to support holding non-Constants in an MDNode. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71407 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Bitcode/Writer/ValueEnumerator.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'lib/Bitcode/Writer/ValueEnumerator.cpp') diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp index 1c12bc4cd4..8002a36b47 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -14,6 +14,7 @@ #include "ValueEnumerator.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" +#include "llvm/MDNode.h" #include "llvm/Module.h" #include "llvm/TypeSymbolTable.h" #include "llvm/ValueSymbolTable.h" @@ -200,6 +201,18 @@ void ValueEnumerator::EnumerateValue(const Value *V) { // Finally, add the value. Doing this could make the ValueID reference be // dangling, don't reuse it. + Values.push_back(std::make_pair(V, 1U)); + ValueMap[V] = Values.size(); + return; + } else if (const MDNode *N = dyn_cast(C)) { + for (MDNode::const_elem_iterator I = N->elem_begin(), E = N->elem_end(); + I != E; ++I) { + if (*I) + EnumerateValue(*I); + else + EnumerateType(Type::VoidTy); + } + Values.push_back(std::make_pair(V, 1U)); ValueMap[V] = Values.size(); return; @@ -244,6 +257,11 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) { // them. for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) EnumerateOperandType(C->getOperand(i)); + + if (const MDNode *N = dyn_cast(V)) { + for (unsigned i = 0, e = N->getNumElements(); i != e; ++i) + EnumerateOperandType(N->getElement(i)); + } } } -- cgit v1.2.3-18-g5258