mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-21 01:06:46 +00:00
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
This commit is contained in:
parent
39a38ae529
commit
740d0db812
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user