xref: /llvm-project/llvm/lib/Remarks/RemarkStringTable.cpp (revision b932bdf59f7608b7bcc783afcd4ad5a3cd8bfd59)
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"
14a0da4466SSimon Pilgrim #include "llvm/ADT/StringRef.h"
15e14c0c5aSFrancis Visoiu Mistrih #include "llvm/Remarks/Remark.h"
164287c95bSFrancis Visoiu Mistrih #include "llvm/Remarks/RemarkParser.h"
17a0da4466SSimon Pilgrim #include "llvm/Support/raw_ostream.h"
187fee2b89SFrancis Visoiu Mistrih #include <vector>
197fee2b89SFrancis Visoiu Mistrih 
207fee2b89SFrancis Visoiu Mistrih using namespace llvm;
217fee2b89SFrancis Visoiu Mistrih using namespace llvm::remarks;
227fee2b89SFrancis Visoiu Mistrih 
StringTable(const ParsedStringTable & Other)23*b932bdf5SKazu Hirata StringTable::StringTable(const ParsedStringTable &Other) {
244287c95bSFrancis Visoiu Mistrih   for (unsigned i = 0, e = Other.size(); i < e; ++i)
254287c95bSFrancis Visoiu Mistrih     if (Expected<StringRef> MaybeStr = Other[i])
264287c95bSFrancis Visoiu Mistrih       add(*MaybeStr);
274287c95bSFrancis Visoiu Mistrih     else
284287c95bSFrancis Visoiu Mistrih       llvm_unreachable("Unexpected error while building remarks string table.");
294287c95bSFrancis Visoiu Mistrih }
304287c95bSFrancis Visoiu Mistrih 
add(StringRef Str)317fee2b89SFrancis Visoiu Mistrih std::pair<unsigned, StringRef> StringTable::add(StringRef Str) {
327fee2b89SFrancis Visoiu Mistrih   size_t NextID = StrTab.size();
337fee2b89SFrancis Visoiu Mistrih   auto KV = StrTab.insert({Str, NextID});
347fee2b89SFrancis Visoiu Mistrih   // If it's a new string, add it to the final size.
357fee2b89SFrancis Visoiu Mistrih   if (KV.second)
367fee2b89SFrancis Visoiu Mistrih     SerializedSize += KV.first->first().size() + 1; // +1 for the '\0'
377fee2b89SFrancis Visoiu Mistrih   // Can be either NextID or the previous ID if the string is already there.
387fee2b89SFrancis Visoiu Mistrih   return {KV.first->second, KV.first->first()};
397fee2b89SFrancis Visoiu Mistrih }
407fee2b89SFrancis Visoiu Mistrih 
internalize(Remark & R)41e14c0c5aSFrancis Visoiu Mistrih void StringTable::internalize(Remark &R) {
42e14c0c5aSFrancis Visoiu Mistrih   auto Impl = [&](StringRef &S) { S = add(S).second; };
43e14c0c5aSFrancis Visoiu Mistrih   Impl(R.PassName);
44e14c0c5aSFrancis Visoiu Mistrih   Impl(R.RemarkName);
45e14c0c5aSFrancis Visoiu Mistrih   Impl(R.FunctionName);
46e14c0c5aSFrancis Visoiu Mistrih   if (R.Loc)
47e14c0c5aSFrancis Visoiu Mistrih     Impl(R.Loc->SourceFilePath);
48e14c0c5aSFrancis Visoiu Mistrih   for (Argument &Arg : R.Args) {
49e14c0c5aSFrancis Visoiu Mistrih     Impl(Arg.Key);
50e14c0c5aSFrancis Visoiu Mistrih     Impl(Arg.Val);
51e14c0c5aSFrancis Visoiu Mistrih     if (Arg.Loc)
52e14c0c5aSFrancis Visoiu Mistrih       Impl(Arg.Loc->SourceFilePath);
53e14c0c5aSFrancis Visoiu Mistrih   }
54e14c0c5aSFrancis Visoiu Mistrih }
55e14c0c5aSFrancis Visoiu Mistrih 
serialize(raw_ostream & OS) const567fee2b89SFrancis Visoiu Mistrih void StringTable::serialize(raw_ostream &OS) const {
577fee2b89SFrancis Visoiu Mistrih   // Emit the sequence of strings.
587fee2b89SFrancis Visoiu Mistrih   for (StringRef Str : serialize()) {
597fee2b89SFrancis Visoiu Mistrih     OS << Str;
607fee2b89SFrancis Visoiu Mistrih     // Explicitly emit a '\0'.
617fee2b89SFrancis Visoiu Mistrih     OS.write('\0');
627fee2b89SFrancis Visoiu Mistrih   }
637fee2b89SFrancis Visoiu Mistrih }
647fee2b89SFrancis Visoiu Mistrih 
serialize() const657fee2b89SFrancis Visoiu Mistrih std::vector<StringRef> StringTable::serialize() const {
667fee2b89SFrancis Visoiu Mistrih   std::vector<StringRef> Strings{StrTab.size()};
677fee2b89SFrancis Visoiu Mistrih   for (const auto &KV : StrTab)
687fee2b89SFrancis Visoiu Mistrih     Strings[KV.second] = KV.first();
697fee2b89SFrancis Visoiu Mistrih   return Strings;
707fee2b89SFrancis Visoiu Mistrih }
71