aboutsummaryrefslogtreecommitdiff
path: root/lib/Remarks/RemarkStringTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Remarks/RemarkStringTable.cpp')
-rw-r--r--lib/Remarks/RemarkStringTable.cpp28
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;