71 lines · cpp
1//===- RemarkStringTable.cpp ----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Implementation of the Remark string table used at remark generation.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/Remarks/RemarkStringTable.h"14#include "llvm/ADT/StringRef.h"15#include "llvm/Remarks/Remark.h"16#include "llvm/Remarks/RemarkParser.h"17#include "llvm/Support/raw_ostream.h"18#include <vector>19 20using namespace llvm;21using namespace llvm::remarks;22 23StringTable::StringTable(const ParsedStringTable &Other) {24 for (unsigned i = 0, e = Other.size(); i < e; ++i)25 if (Expected<StringRef> MaybeStr = Other[i])26 add(*MaybeStr);27 else28 llvm_unreachable("Unexpected error while building remarks string table.");29}30 31std::pair<unsigned, StringRef> StringTable::add(StringRef Str) {32 size_t NextID = StrTab.size();33 auto KV = StrTab.insert({Str, NextID});34 // If it's a new string, add it to the final size.35 if (KV.second)36 SerializedSize += KV.first->first().size() + 1; // +1 for the '\0'37 // Can be either NextID or the previous ID if the string is already there.38 return {KV.first->second, KV.first->first()};39}40 41void StringTable::internalize(Remark &R) {42 auto Impl = [&](StringRef &S) { S = add(S).second; };43 Impl(R.PassName);44 Impl(R.RemarkName);45 Impl(R.FunctionName);46 if (R.Loc)47 Impl(R.Loc->SourceFilePath);48 for (Argument &Arg : R.Args) {49 Impl(Arg.Key);50 Impl(Arg.Val);51 if (Arg.Loc)52 Impl(Arg.Loc->SourceFilePath);53 }54}55 56void StringTable::serialize(raw_ostream &OS) const {57 // Emit the sequence of strings.58 for (StringRef Str : serialize()) {59 OS << Str;60 // Explicitly emit a '\0'.61 OS.write('\0');62 }63}64 65std::vector<StringRef> StringTable::serialize() const {66 std::vector<StringRef> Strings{StrTab.size()};67 for (const auto &KV : StrTab)68 Strings[KV.second] = KV.first();69 return Strings;70}71