12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- //===- 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) {
- 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;
- }
|