diff options
author | Devang Patel <dpatel@apple.com> | 2009-10-13 17:00:54 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2009-10-13 17:00:54 +0000 |
commit | 740d0db812a31a8df4ff1b7d6cfb25a3725f5e01 (patch) | |
tree | 220dfe27c3e4ef478a13b1bcc4a8d40a1f65f9e0 | |
parent | 39a38ae529e8e8bf92edf4cd39e16be57f59406a (diff) | |
download | external_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.h | 1 | ||||
-rw-r--r-- | lib/VMCore/Metadata.cpp | 12 | ||||
-rw-r--r-- | lib/VMCore/Value.cpp | 4 |
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; |