17fee2b89SFrancis Visoiu Mistrih //===- RemarkStringTable.cpp ----------------------------------------------===//
27fee2b89SFrancis Visoiu Mistrih //
37fee2b89SFrancis Visoiu Mistrih // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47fee2b89SFrancis Visoiu Mistrih // See https://llvm.org/LICENSE.txt for license information.
57fee2b89SFrancis Visoiu Mistrih // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67fee2b89SFrancis Visoiu Mistrih //
77fee2b89SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===//
87fee2b89SFrancis Visoiu Mistrih //
97fee2b89SFrancis Visoiu Mistrih // Implementation of the Remark string table used at remark generation.
107fee2b89SFrancis Visoiu Mistrih //
117fee2b89SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===//
127fee2b89SFrancis Visoiu Mistrih 
137fee2b89SFrancis Visoiu Mistrih #include "llvm/Remarks/RemarkStringTable.h"
14*4287c95bSFrancis Visoiu Mistrih #include "llvm/Remarks/RemarkParser.h"
157fee2b89SFrancis Visoiu Mistrih #include "llvm/Support/EndianStream.h"
167fee2b89SFrancis Visoiu Mistrih #include "llvm/Support/Error.h"
177fee2b89SFrancis Visoiu Mistrih #include <vector>
187fee2b89SFrancis Visoiu Mistrih 
197fee2b89SFrancis Visoiu Mistrih using namespace llvm;
207fee2b89SFrancis Visoiu Mistrih using namespace llvm::remarks;
217fee2b89SFrancis Visoiu Mistrih 
22*4287c95bSFrancis Visoiu Mistrih StringTable::StringTable(const ParsedStringTable &Other) : StrTab() {
23*4287c95bSFrancis Visoiu Mistrih   for (unsigned i = 0, e = Other.size(); i < e; ++i)
24*4287c95bSFrancis Visoiu Mistrih     if (Expected<StringRef> MaybeStr = Other[i])
25*4287c95bSFrancis Visoiu Mistrih       add(*MaybeStr);
26*4287c95bSFrancis Visoiu Mistrih     else
27*4287c95bSFrancis Visoiu Mistrih       llvm_unreachable("Unexpected error while building remarks string table.");
28*4287c95bSFrancis Visoiu Mistrih }
29*4287c95bSFrancis Visoiu Mistrih 
307fee2b89SFrancis Visoiu Mistrih std::pair<unsigned, StringRef> StringTable::add(StringRef Str) {
317fee2b89SFrancis Visoiu Mistrih   size_t NextID = StrTab.size();
327fee2b89SFrancis Visoiu Mistrih   auto KV = StrTab.insert({Str, NextID});
337fee2b89SFrancis Visoiu Mistrih   // If it's a new string, add it to the final size.
347fee2b89SFrancis Visoiu Mistrih   if (KV.second)
357fee2b89SFrancis Visoiu Mistrih     SerializedSize += KV.first->first().size() + 1; // +1 for the '\0'
367fee2b89SFrancis Visoiu Mistrih   // Can be either NextID or the previous ID if the string is already there.
377fee2b89SFrancis Visoiu Mistrih   return {KV.first->second, KV.first->first()};
387fee2b89SFrancis Visoiu Mistrih }
397fee2b89SFrancis Visoiu Mistrih 
407fee2b89SFrancis Visoiu Mistrih void StringTable::serialize(raw_ostream &OS) const {
417fee2b89SFrancis Visoiu Mistrih   // Emit the sequence of strings.
427fee2b89SFrancis Visoiu Mistrih   for (StringRef Str : serialize()) {
437fee2b89SFrancis Visoiu Mistrih     OS << Str;
447fee2b89SFrancis Visoiu Mistrih     // Explicitly emit a '\0'.
457fee2b89SFrancis Visoiu Mistrih     OS.write('\0');
467fee2b89SFrancis Visoiu Mistrih   }
477fee2b89SFrancis Visoiu Mistrih }
487fee2b89SFrancis Visoiu Mistrih 
497fee2b89SFrancis Visoiu Mistrih std::vector<StringRef> StringTable::serialize() const {
507fee2b89SFrancis Visoiu Mistrih   std::vector<StringRef> Strings{StrTab.size()};
517fee2b89SFrancis Visoiu Mistrih   for (const auto &KV : StrTab)
527fee2b89SFrancis Visoiu Mistrih     Strings[KV.second] = KV.first();
537fee2b89SFrancis Visoiu Mistrih   return Strings;
547fee2b89SFrancis Visoiu Mistrih }
55