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 HirataStringTable::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 Mistrihstd::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 Mistrihvoid 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 Mistrihvoid 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 Mistrihstd::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