blob: def5c2e16620425b67f5cf4c7241c1eddc816250 [file] [log] [blame]
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001//===-- RemarkSerializer.h - Remark serialization interface -----*- C++ -*-===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file provides an interface for serializing remarks to different formats.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_REMARKS_REMARK_SERIALIZER_H
14#define LLVM_REMARKS_REMARK_SERIALIZER_H
15
16#include "llvm/Remarks/Remark.h"
17#include "llvm/Remarks/RemarkStringTable.h"
18#include "llvm/Support/YAMLTraits.h"
19#include "llvm/Support/raw_ostream.h"
20
21namespace llvm {
22namespace remarks {
23
24/// This is the base class for a remark serializer.
25/// It includes support for using a string table while emitting.
26struct Serializer {
27 /// The open raw_ostream that the remark diagnostics are emitted to.
28 raw_ostream &OS;
29 /// The string table containing all the unique strings used in the output.
30 /// The table can be serialized to be consumed after the compilation.
31 Optional<StringTable> StrTab;
32
33 Serializer(raw_ostream &OS) : OS(OS), StrTab() {}
34
35 /// This is just an interface.
36 virtual ~Serializer() = default;
37 virtual void emit(const Remark &Remark) = 0;
38};
39
40/// Wether the serializer should use a string table while emitting.
41enum class UseStringTable { No, Yes };
42
43/// Serialize the remarks to YAML. One remark entry looks like this:
44/// --- !<TYPE>
45/// Pass: <PASSNAME>
46/// Name: <REMARKNAME>
47/// DebugLoc: { File: <SOURCEFILENAME>, Line: <SOURCELINE>,
48/// Column: <SOURCECOLUMN> }
49/// Function: <FUNCTIONNAME>
50/// Args:
51/// - <KEY>: <VALUE>
52/// DebugLoc: { File: <FILE>, Line: <LINE>, Column: <COL> }
53/// ...
54struct YAMLSerializer : public Serializer {
55 /// The YAML streamer.
56 yaml::Output YAMLOutput;
57
58 YAMLSerializer(raw_ostream &OS,
59 UseStringTable UseStringTable = remarks::UseStringTable::No);
60
61 /// Emit a remark to the stream.
62 void emit(const Remark &Remark) override;
63};
64
65} // end namespace remarks
66} // end namespace llvm
67
68#endif /* LLVM_REMARKS_REMARK_SERIALIZER_H */