18f0fd8f6SDimitry Andric //===-- StringSaver.cpp ---------------------------------------------------===//
28f0fd8f6SDimitry Andric //
38f0fd8f6SDimitry Andric //                     The LLVM Compiler Infrastructure
48f0fd8f6SDimitry Andric //
58f0fd8f6SDimitry Andric // This file is distributed under the University of Illinois Open Source
68f0fd8f6SDimitry Andric // License. See LICENSE.TXT for details.
78f0fd8f6SDimitry Andric //
88f0fd8f6SDimitry Andric //===----------------------------------------------------------------------===//
98f0fd8f6SDimitry Andric 
108f0fd8f6SDimitry Andric #include "llvm/Support/StringSaver.h"
118f0fd8f6SDimitry Andric 
128f0fd8f6SDimitry Andric using namespace llvm;
138f0fd8f6SDimitry Andric 
save(StringRef S)14d88c1a5aSDimitry Andric StringRef StringSaver::save(StringRef S) {
158f0fd8f6SDimitry Andric   char *P = Alloc.Allocate<char>(S.size() + 1);
16*b5893f02SDimitry Andric   if (!S.empty())
178f0fd8f6SDimitry Andric     memcpy(P, S.data(), S.size());
188f0fd8f6SDimitry Andric   P[S.size()] = '\0';
19d88c1a5aSDimitry Andric   return StringRef(P, S.size());
208f0fd8f6SDimitry Andric }
214ba319b5SDimitry Andric 
save(StringRef S)224ba319b5SDimitry Andric StringRef UniqueStringSaver::save(StringRef S) {
234ba319b5SDimitry Andric   auto R = Unique.insert(S);
244ba319b5SDimitry Andric   if (R.second)                 // cache miss, need to actually save the string
254ba319b5SDimitry Andric     *R.first = Strings.save(S); // safe replacement with equal value
264ba319b5SDimitry Andric   return *R.first;
274ba319b5SDimitry Andric }
28