diff --git a/llvm/include/llvm/Support/StringSaver.h b/llvm/include/llvm/Support/StringSaver.h --- a/llvm/include/llvm/Support/StringSaver.h +++ b/llvm/include/llvm/Support/StringSaver.h @@ -29,7 +29,7 @@ // All returned strings are null-terminated: *save(S).end() == 0. StringRef save(const char *S) { return save(StringRef(S)); } StringRef save(StringRef S); - StringRef save(const Twine &S) { return save(StringRef(S.str())); } + StringRef save(const Twine &S); StringRef save(const std::string &S) { return save(StringRef(S)); } }; @@ -51,7 +51,7 @@ // All returned strings are null-terminated: *save(S).end() == 0. StringRef save(const char *S) { return save(StringRef(S)); } StringRef save(StringRef S); - StringRef save(const Twine &S) { return save(StringRef(S.str())); } + StringRef save(const Twine &S); StringRef save(const std::string &S) { return save(StringRef(S)); } }; diff --git a/llvm/lib/Support/StringSaver.cpp b/llvm/lib/Support/StringSaver.cpp --- a/llvm/lib/Support/StringSaver.cpp +++ b/llvm/lib/Support/StringSaver.cpp @@ -8,6 +8,8 @@ #include "llvm/Support/StringSaver.h" +#include "llvm/ADT/SmallString.h" + using namespace llvm; StringRef StringSaver::save(StringRef S) { @@ -18,9 +20,19 @@ return StringRef(P, S.size()); } +StringRef StringSaver::save(const Twine &S) { + SmallString<128> Storage; + return save(S.toStringRef(Storage)); +} + StringRef UniqueStringSaver::save(StringRef S) { auto R = Unique.insert(S); if (R.second) // cache miss, need to actually save the string *R.first = Strings.save(S); // safe replacement with equal value return *R.first; } + +StringRef UniqueStringSaver::save(const Twine &S) { + SmallString<128> Storage; + return save(S.toStringRef(Storage)); +}