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 AndricStringRef 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 AndricStringRef 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