//===- RemarkStringTable.cpp ----------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Implementation of the Remark string table used at remark generation.
//
//===----------------------------------------------------------------------===//

#include "llvm/Remarks/RemarkStringTable.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Remarks/Remark.h"
#include "llvm/Remarks/RemarkParser.h"
#include "llvm/Support/raw_ostream.h"
#include <vector>

using namespace llvm;
using namespace llvm::remarks;

StringTable::StringTable(const ParsedStringTable &Other) : StrTab() {
  for (unsigned i = 0, e = Other.size(); i < e; ++i)
    if (Expected<StringRef> MaybeStr = Other[i])
      add(*MaybeStr);
    else
      llvm_unreachable("Unexpected error while building remarks string table.");
}

std::pair<unsigned, StringRef> StringTable::add(StringRef Str) {
  size_t NextID = StrTab.size();
  auto KV = StrTab.insert({Str, NextID});
  // If it's a new string, add it to the final size.
  if (KV.second)
    SerializedSize += KV.first->first().size() + 1; // +1 for the '\0'
  // Can be either NextID or the previous ID if the string is already there.
  return {KV.first->second, KV.first->first()};
}

void StringTable::internalize(Remark &R) {
  auto Impl = [&](StringRef &S) { S = add(S).second; };
  Impl(R.PassName);
  Impl(R.RemarkName);
  Impl(R.FunctionName);
  if (R.Loc)
    Impl(R.Loc->SourceFilePath);
  for (Argument &Arg : R.Args) {
    Impl(Arg.Key);
    Impl(Arg.Val);
    if (Arg.Loc)
      Impl(Arg.Loc->SourceFilePath);
  }
}

void StringTable::serialize(raw_ostream &OS) const {
  // Emit the sequence of strings.
  for (StringRef Str : serialize()) {
    OS << Str;
    // Explicitly emit a '\0'.
    OS.write('\0');
  }
}

std::vector<StringRef> StringTable::serialize() const {
  std::vector<StringRef> Strings{StrTab.size()};
  for (const auto &KV : StrTab)
    Strings[KV.second] = KV.first();
  return Strings;
}
