From 740d0db812a31a8df4ff1b7d6cfb25a3725f5e01 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Tue, 13 Oct 2009 17:00:54 +0000 Subject: [PATCH] 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 --- include/llvm/Metadata.h | 1 + lib/VMCore/Metadata.cpp | 12 ++++++++++++ lib/VMCore/Value.cpp | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index e4414817ca0..dd79ac09a2d 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 2f2345f55ef..f3601cbdf5c 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(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(V1); + Instruction *I2 = dyn_cast(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 03b0e6f172e..ba72af635cd 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; -- 2.34.1