aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/LLVMContextImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/VMCore/LLVMContextImpl.cpp')
-rw-r--r--lib/VMCore/LLVMContextImpl.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/VMCore/LLVMContextImpl.cpp b/lib/VMCore/LLVMContextImpl.cpp
index 93b9e7d..f34aba7 100644
--- a/lib/VMCore/LLVMContextImpl.cpp
+++ b/lib/VMCore/LLVMContextImpl.cpp
@@ -16,6 +16,7 @@
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/LLVMContext.h"
+#include "llvm/MDNode.h"
using namespace llvm;
// Get a ConstantInt from an APInt. Note that the value stored in the DenseMap
@@ -92,9 +93,38 @@ MDString *LLVMContextImpl::getMDString(const char *StrBegin,
return S;
}
+MDNode *LLVMContextImpl::getMDNode(Value*const* Vals, unsigned NumVals) {
+ FoldingSetNodeID ID;
+ for (unsigned i = 0; i != NumVals; ++i)
+ ID.AddPointer(Vals[i]);
+
+ ConstantsLock.reader_acquire();
+ void *InsertPoint;
+ MDNode *N = MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
+ ConstantsLock.reader_release();
+
+ if (!N) {
+ sys::SmartScopedWriter<true> Writer(ConstantsLock);
+ N = MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
+ if (!N) {
+ // InsertPoint will have been set by the FindNodeOrInsertPos call.
+ N = new(0) MDNode(Vals, NumVals);
+ MDNodeSet.InsertNode(N, InsertPoint);
+ }
+ }
+
+ return N;
+}
+
+
// *** erase methods ***
void LLVMContextImpl::erase(MDString *M) {
sys::SmartScopedWriter<true> Writer(ConstantsLock);
MDStringCache.erase(MDStringCache.find(M->StrBegin, M->StrEnd));
}
+
+void LLVMContextImpl::erase(MDNode *M) {
+ sys::SmartScopedWriter<true> Writer(ConstantsLock);
+ MDNodeSet.RemoveNode(M);
+}