109467b48Spatrick //===- RemarkStringTable.cpp ----------------------------------------------===// 209467b48Spatrick // 309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 609467b48Spatrick // 709467b48Spatrick //===----------------------------------------------------------------------===// 809467b48Spatrick // 909467b48Spatrick // Implementation of the Remark string table used at remark generation. 1009467b48Spatrick // 1109467b48Spatrick //===----------------------------------------------------------------------===// 1209467b48Spatrick 1309467b48Spatrick #include "llvm/Remarks/RemarkStringTable.h" 14097a140dSpatrick #include "llvm/ADT/StringRef.h" 1509467b48Spatrick #include "llvm/Remarks/Remark.h" 1609467b48Spatrick #include "llvm/Remarks/RemarkParser.h" 17097a140dSpatrick #include "llvm/Support/raw_ostream.h" 1809467b48Spatrick #include <vector> 1909467b48Spatrick 2009467b48Spatrick using namespace llvm; 2109467b48Spatrick using namespace llvm::remarks; 2209467b48Spatrick StringTable(const ParsedStringTable & Other)23*d415bd75SrobertStringTable::StringTable(const ParsedStringTable &Other) { 2409467b48Spatrick for (unsigned i = 0, e = Other.size(); i < e; ++i) 2509467b48Spatrick if (Expected<StringRef> MaybeStr = Other[i]) 2609467b48Spatrick add(*MaybeStr); 2709467b48Spatrick else 2809467b48Spatrick llvm_unreachable("Unexpected error while building remarks string table."); 2909467b48Spatrick } 3009467b48Spatrick add(StringRef Str)3109467b48Spatrickstd::pair<unsigned, StringRef> StringTable::add(StringRef Str) { 3209467b48Spatrick size_t NextID = StrTab.size(); 3309467b48Spatrick auto KV = StrTab.insert({Str, NextID}); 3409467b48Spatrick // If it's a new string, add it to the final size. 3509467b48Spatrick if (KV.second) 3609467b48Spatrick SerializedSize += KV.first->first().size() + 1; // +1 for the '\0' 3709467b48Spatrick // Can be either NextID or the previous ID if the string is already there. 3809467b48Spatrick return {KV.first->second, KV.first->first()}; 3909467b48Spatrick } 4009467b48Spatrick internalize(Remark & R)4109467b48Spatrickvoid StringTable::internalize(Remark &R) { 4209467b48Spatrick auto Impl = [&](StringRef &S) { S = add(S).second; }; 4309467b48Spatrick Impl(R.PassName); 4409467b48Spatrick Impl(R.RemarkName); 4509467b48Spatrick Impl(R.FunctionName); 4609467b48Spatrick if (R.Loc) 4709467b48Spatrick Impl(R.Loc->SourceFilePath); 4809467b48Spatrick for (Argument &Arg : R.Args) { 4909467b48Spatrick Impl(Arg.Key); 5009467b48Spatrick Impl(Arg.Val); 5109467b48Spatrick if (Arg.Loc) 5209467b48Spatrick Impl(Arg.Loc->SourceFilePath); 5309467b48Spatrick } 5409467b48Spatrick } 5509467b48Spatrick serialize(raw_ostream & OS) const5609467b48Spatrickvoid StringTable::serialize(raw_ostream &OS) const { 5709467b48Spatrick // Emit the sequence of strings. 5809467b48Spatrick for (StringRef Str : serialize()) { 5909467b48Spatrick OS << Str; 6009467b48Spatrick // Explicitly emit a '\0'. 6109467b48Spatrick OS.write('\0'); 6209467b48Spatrick } 6309467b48Spatrick } 6409467b48Spatrick serialize() const6509467b48Spatrickstd::vector<StringRef> StringTable::serialize() const { 6609467b48Spatrick std::vector<StringRef> Strings{StrTab.size()}; 6709467b48Spatrick for (const auto &KV : StrTab) 6809467b48Spatrick Strings[KV.second] = KV.first(); 6909467b48Spatrick return Strings; 7009467b48Spatrick } 71