aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2009-10-13 17:00:54 +0000
committerDevang Patel <dpatel@apple.com>2009-10-13 17:00:54 +0000
commit740d0db812a31a8df4ff1b7d6cfb25a3725f5e01 (patch)
tree220dfe27c3e4ef478a13b1bcc4a8d40a1f65f9e0
parent39a38ae529e8e8bf92edf4cd39e16be57f59406a (diff)
downloadexternal_llvm-740d0db812a31a8df4ff1b7d6cfb25a3725f5e01.zip
external_llvm-740d0db812a31a8df4ff1b7d6cfb25a3725f5e01.tar.gz
external_llvm-740d0db812a31a8df4ff1b7d6cfb25a3725f5e01.tar.bz2
Copy metadata when value is RAUW'd. It is debatable whether this is the right approach for custom metadata data in general. However, right now the only custom data user, "dbg", expects this behavior while FE is constructing llvm IR with debug info.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83977 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Metadata.h1
-rw-r--r--lib/VMCore/Metadata.cpp12
-rw-r--r--lib/VMCore/Value.cpp4
3 files changed, 17 insertions, 0 deletions
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h
index e441481..dd79ac0 100644
--- a/include/llvm/Metadata.h
+++ b/include/llvm/Metadata.h
@@ -361,6 +361,7 @@ public:
void ValueIsDeleted(const Instruction *Inst) {
removeMDs(Inst);
}
+ void ValueIsRAUWd(Value *V1, Value *V2);
/// ValueIsCloned - This handler is used to update metadata store
/// when In1 is cloned to create In2.
diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp
index 2f2345f..f3601cb 100644
--- a/lib/VMCore/Metadata.cpp
+++ b/lib/VMCore/Metadata.cpp
@@ -404,3 +404,15 @@ void MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) {
if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second))
addMD(I->first, MD, In2);
}
+
+/// ValueIsRAUWd - This handler is used when V1's all uses are replaced by
+/// V2.
+void MetadataContext::ValueIsRAUWd(Value *V1, Value *V2) {
+ Instruction *I1 = dyn_cast<Instruction>(V1);
+ Instruction *I2 = dyn_cast<Instruction>(V2);
+ if (!I1 || !I2)
+ return;
+
+ // FIXME : Give custom handlers a chance to override this.
+ ValueIsCloned(I1, I2);
+}
diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp
index 03b0e6f..ba72af6 100644
--- a/lib/VMCore/Value.cpp
+++ b/lib/VMCore/Value.cpp
@@ -309,6 +309,10 @@ void Value::uncheckedReplaceAllUsesWith(Value *New) {
// Notify all ValueHandles (if present) that this value is going away.
if (HasValueHandle)
ValueHandleBase::ValueIsRAUWd(this, New);
+ if (HasMetadata) {
+ LLVMContext &Context = getContext();
+ Context.pImpl->TheMetadata.ValueIsRAUWd(this, New);
+ }
while (!use_empty()) {
Use &U = *UseList;