diff options
-rw-r--r-- | include/llvm/Constants.h | 1 | ||||
-rw-r--r-- | lib/VMCore/Constants.cpp | 11 |
2 files changed, 12 insertions, 0 deletions
diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h index 52fff2020c..da69d25cf6 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -865,6 +865,7 @@ public: /// get() - Static factory methods - Return objects of the specified value. /// static MDString *get(const char *StrBegin, const char *StrEnd); + static MDString *get(const std::string &Str); /// size() - The length of this string. /// diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index c164a3b0c2..ba8ab2e392 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -1803,6 +1803,17 @@ MDString *MDString::get(const char *StrBegin, const char *StrEnd) { return S; } +MDString *MDString::get(const std::string &Str) { + sys::SmartScopedWriter<true> Writer(&*ConstantsLock); + StringMapEntry<MDString *> &Entry = MDStringCache->GetOrCreateValue( + Str.data(), Str.data() + Str.size()); + MDString *&S = Entry.getValue(); + if (!S) S = new MDString(Entry.getKeyData(), + Entry.getKeyData() + Entry.getKeyLength()); + + return S; +} + void MDString::destroyConstant() { sys::SmartScopedWriter<true> Writer(&*ConstantsLock); MDStringCache->erase(MDStringCache->find(StrBegin, StrEnd)); |