summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Instruction.h1
-rw-r--r--include/llvm/Metadata.h8
-rw-r--r--lib/VMCore/Instruction.cpp17
-rw-r--r--lib/VMCore/Metadata.cpp48
4 files changed, 19 insertions, 55 deletions
diff --git a/include/llvm/Instruction.h b/include/llvm/Instruction.h
index b5d5510d7c..d7161cf3f2 100644
--- a/include/llvm/Instruction.h
+++ b/include/llvm/Instruction.h
@@ -160,6 +160,7 @@ private:
MDNode *getMetadataImpl(unsigned KindID) const;
MDNode *getMetadataImpl(const char *Kind) const;
void getAllMetadataImpl(SmallVectorImpl<std::pair<unsigned,MDNode*> > &)const;
+ void removeAllMetadata();
public:
//===--------------------------------------------------------------------===//
// Predicates and helper methods.
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h
index 1f185369a8..f45bdb50d8 100644
--- a/include/llvm/Metadata.h
+++ b/include/llvm/Metadata.h
@@ -231,14 +231,6 @@ public:
/// getMDKindNames - Populate client supplied SmallVector with the name for
/// each custom metadata ID. ID #0 is not used, so it is filled in as empty.
void getMDKindNames(SmallVectorImpl<StringRef> &) const;
-
- /// ValueIsDeleted - This handler is used to update metadata store
- /// when a value is deleted.
- void ValueIsDeleted(Instruction *Inst);
-
- /// ValueIsCloned - This handler is used to update metadata store
- /// when In1 is cloned to create In2.
- void ValueIsCloned(const Instruction *In1, Instruction *In2);
};
} // end llvm namespace
diff --git a/lib/VMCore/Instruction.cpp b/lib/VMCore/Instruction.cpp
index 85fd0e8551..a5500e6de4 100644
--- a/lib/VMCore/Instruction.cpp
+++ b/lib/VMCore/Instruction.cpp
@@ -11,12 +11,10 @@
//
//===----------------------------------------------------------------------===//
-#include "LLVMContextImpl.h"
+#include "llvm/Instruction.h"
#include "llvm/Type.h"
#include "llvm/Instructions.h"
-#include "llvm/Function.h"
#include "llvm/Constants.h"
-#include "llvm/GlobalVariable.h"
#include "llvm/Module.h"
#include "llvm/Support/CallSite.h"
#include "llvm/Support/LeakDetector.h"
@@ -52,7 +50,7 @@ Instruction::Instruction(const Type *ty, unsigned it, Use *Ops, unsigned NumOps,
Instruction::~Instruction() {
assert(Parent == 0 && "Instruction still linked in the program!");
if (hasMetadata())
- getContext().pImpl->TheMetadata.ValueIsDeleted(this);
+ removeAllMetadata();
}
@@ -462,7 +460,14 @@ bool Instruction::isSafeToSpeculativelyExecute() const {
Instruction *Instruction::clone() const {
Instruction *New = clone_impl();
New->SubclassOptionalData = SubclassOptionalData;
- if (hasMetadata())
- getContext().pImpl->TheMetadata.ValueIsCloned(this, New);
+ if (!hasMetadata())
+ return New;
+
+ // Otherwise, enumerate and copy over metadata from the old instruction to the
+ // new one.
+ SmallVector<std::pair<unsigned, MDNode*>, 4> TheMDs;
+ getAllMetadata(TheMDs);
+ for (unsigned i = 0, e = TheMDs.size(); i != e; ++i)
+ New->setMetadata(TheMDs[i].first, TheMDs[i].second);
return New;
}
diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp
index 8fa8d375a1..eb352896e8 100644
--- a/lib/VMCore/Metadata.cpp
+++ b/lib/VMCore/Metadata.cpp
@@ -273,26 +273,12 @@ public:
void setMetadata(Instruction *Inst, unsigned Kind, MDNode *Node);
- /// removeAllMetadata - Remove all metadata attached with an instruction.
+ /// removeAllMetadata - Remove all metadata attached to an instruction.
void removeAllMetadata(Instruction *Inst);
-
-
/// copyMD - If metadata is attached with Instruction In1 then attach
/// the same metadata to In2.
void copyMD(Instruction *In1, Instruction *In2);
-
-
- /// ValueIsDeleted - This handler is used to update metadata store
- /// when a value is deleted.
- void ValueIsDeleted(const Value *) {}
- void ValueIsDeleted(Instruction *Inst) {
- removeAllMetadata(Inst);
- }
-
- /// ValueIsCloned - This handler is used to update metadata store
- /// when In1 is cloned to create In2.
- void ValueIsCloned(const Instruction *In1, Instruction *In2);
};
}
@@ -413,20 +399,6 @@ void MetadataContextImpl::copyMD(Instruction *In1, Instruction *In2) {
In2->setMetadata(I->first, I->second);
}
-/// ValueIsCloned - This handler is used to update metadata store
-/// when In1 is cloned to create In2.
-void MetadataContextImpl::ValueIsCloned(const Instruction *In1,
- Instruction *In2) {
- // Find Metadata handles for In1.
- MDStoreTy::iterator I = MetadataStore.find(In1);
- assert(I != MetadataStore.end() && "Invalid custom metadata info!");
-
- // FIXME: Give all metadata handlers a chance to adjust.
- MDMapTy &In1Info = I->second;
- for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I)
- In2->setMetadata(I->first, I->second);
-}
-
//===----------------------------------------------------------------------===//
// MetadataContext implementation.
//
@@ -466,18 +438,6 @@ void MetadataContext::getMDKindNames(SmallVectorImpl<StringRef> &N) const {
pImpl->getMDKindNames(N);
}
-/// ValueIsDeleted - This handler is used to update metadata store
-/// when a value is deleted.
-void MetadataContext::ValueIsDeleted(Instruction *Inst) {
- pImpl->ValueIsDeleted(Inst);
-}
-
-/// ValueIsCloned - This handler is used to update metadata store
-/// when In1 is cloned to create In2.
-void MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) {
- pImpl->ValueIsCloned(In1, In2);
-}
-
//===----------------------------------------------------------------------===//
// Instruction Metadata method implementations.
//
@@ -509,3 +469,9 @@ void Instruction::getAllMetadataImpl(SmallVectorImpl<std::pair<unsigned,
getContext().getMetadata().pImpl->getAllMetadata(this, Result);
}
+/// removeAllMetadata - Remove all metadata from this instruction.
+void Instruction::removeAllMetadata() {
+ assert(hasMetadata() && "Caller should check");
+ getContext().getMetadata().pImpl->removeAllMetadata(this);
+}
+