diff options
author | Owen Anderson <resistor@mac.com> | 2009-07-31 21:35:40 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-07-31 21:35:40 +0000 |
commit | 0087fe6e5cdc677063a28ce42205ffefbd1ab191 (patch) | |
tree | 90f14b4a060302a3a13505655173c20adb8a5c88 /llvm/lib/VMCore/Metadata.cpp | |
parent | 0d5f37b81ab79103e5dd4ca46054292a947c676b (diff) | |
download | bcm5719-llvm-0087fe6e5cdc677063a28ce42205ffefbd1ab191.tar.gz bcm5719-llvm-0087fe6e5cdc677063a28ce42205ffefbd1ab191.zip |
Move the metadata constructors back to 2.5 syntax.
llvm-svn: 77733
Diffstat (limited to 'llvm/lib/VMCore/Metadata.cpp')
-rw-r--r-- | llvm/lib/VMCore/Metadata.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/VMCore/Metadata.cpp b/llvm/lib/VMCore/Metadata.cpp index 48db0b4f0b3..bf0611f9e46 100644 --- a/llvm/lib/VMCore/Metadata.cpp +++ b/llvm/lib/VMCore/Metadata.cpp @@ -11,12 +11,29 @@ // //===----------------------------------------------------------------------===// +#include "LLVMContextImpl.h" #include "llvm/Metadata.h" +#include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "SymbolTableListTraitsImpl.h" using namespace llvm; //===----------------------------------------------------------------------===// +//MDString implementation +// +MDString *MDString::get(LLVMContext &Context, const StringRef &Str) { + LLVMContextImpl *pImpl = Context.pImpl; + sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); + StringMapEntry<MDString *> &Entry = + pImpl->MDStringCache.GetOrCreateValue(Str); + MDString *&S = Entry.getValue(); + if (!S) S = new MDString(Entry.getKeyData(), + Entry.getKeyLength()); + + return S; +} + +//===----------------------------------------------------------------------===// //MDNode implementation // MDNode::MDNode(Value*const* Vals, unsigned NumVals) @@ -30,6 +47,30 @@ void MDNode::Profile(FoldingSetNodeID &ID) const { ID.AddPointer(*I); } +MDNode *MDNode::get(LLVMContext &Context, Value*const* Vals, unsigned NumVals) { + LLVMContextImpl *pImpl = Context.pImpl; + FoldingSetNodeID ID; + for (unsigned i = 0; i != NumVals; ++i) + ID.AddPointer(Vals[i]); + + pImpl->ConstantsLock.reader_acquire(); + void *InsertPoint; + MDNode *N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); + pImpl->ConstantsLock.reader_release(); + + if (!N) { + sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); + N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); + if (!N) { + // InsertPoint will have been set by the FindNodeOrInsertPos call. + N = new MDNode(Vals, NumVals); + pImpl->MDNodeSet.InsertNode(N, InsertPoint); + } + } + + return N; +} + //===----------------------------------------------------------------------===// //NamedMDNode implementation // |