aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Christopher <echristo@apple.com>2012-02-15 09:09:29 +0000
committerEric Christopher <echristo@apple.com>2012-02-15 09:09:29 +0000
commitf32a960fd32b32f84bb486458ccbc905af490da9 (patch)
tree90c00395fcdcd46d9336607b0e376d42e9dbf43b
parent900d7b78e6cacca6c6062abf803d7ab1a4e39b38 (diff)
downloadexternal_llvm-f32a960fd32b32f84bb486458ccbc905af490da9.zip
external_llvm-f32a960fd32b32f84bb486458ccbc905af490da9.tar.gz
external_llvm-f32a960fd32b32f84bb486458ccbc905af490da9.tar.bz2
Add a way to replace a field inside a metadata node. This can be
used to incrementally update a created node without needing a temporary node and RAUW. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150571 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Metadata.h3
-rw-r--r--lib/VMCore/Metadata.cpp5
2 files changed, 8 insertions, 0 deletions
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h
index 9466a57..29458ef 100644
--- a/include/llvm/Metadata.h
+++ b/include/llvm/Metadata.h
@@ -135,6 +135,9 @@ public:
/// deleteTemporary - Deallocate a node created by getTemporary. The
/// node must not have any users.
static void deleteTemporary(MDNode *N);
+
+ /// replaceOperandWith - Replace a specific operand.
+ void replaceOperandWith(unsigned i, Value *NewVal);
/// getOperand - Return specified operand.
Value *getOperand(unsigned i) const;
diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp
index 5d6eb14..0fc2a25 100644
--- a/lib/VMCore/Metadata.cpp
+++ b/lib/VMCore/Metadata.cpp
@@ -87,6 +87,11 @@ static MDNodeOperand *getOperandPtr(MDNode *N, unsigned Op) {
return reinterpret_cast<MDNodeOperand*>(N+1)+Op;
}
+void MDNode::replaceOperandWith(unsigned i, Value *Val) {
+ MDNodeOperand *Op = getOperandPtr(this, i);
+ replaceOperand(Op, Val);
+}
+
MDNode::MDNode(LLVMContext &C, ArrayRef<Value*> Vals, bool isFunctionLocal)
: Value(Type::getMetadataTy(C), Value::MDNodeVal) {
NumOperands = Vals.size();