diff options
Diffstat (limited to 'lib/Remarks/RemarkStringTable.cpp')
-rw-r--r-- | lib/Remarks/RemarkStringTable.cpp | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/lib/Remarks/RemarkStringTable.cpp b/lib/Remarks/RemarkStringTable.cpp index 984aa5b33b48..51156465be51 100644 --- a/lib/Remarks/RemarkStringTable.cpp +++ b/lib/Remarks/RemarkStringTable.cpp @@ -11,6 +11,8 @@ //===----------------------------------------------------------------------===// #include "llvm/Remarks/RemarkStringTable.h" +#include "llvm/Remarks/Remark.h" +#include "llvm/Remarks/RemarkParser.h" #include "llvm/Support/EndianStream.h" #include "llvm/Support/Error.h" #include <vector> @@ -18,6 +20,14 @@ 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}); @@ -28,10 +38,22 @@ std::pair<unsigned, StringRef> StringTable::add(StringRef Str) { 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 number of strings. - uint64_t StrTabSize = SerializedSize; - support::endian::write(OS, StrTabSize, support::little); // Emit the sequence of strings. for (StringRef Str : serialize()) { OS << Str; |