brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 03d93ba Raw
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