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