YAMLRemarkSerializer.h revision 360784
1//===-- YAMLRemarkSerializer.h - YAML Remark serialization ---*- 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 YAML.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_REMARKS_YAML_REMARK_SERIALIZER_H
14#define LLVM_REMARKS_YAML_REMARK_SERIALIZER_H
15
16#include "llvm/Remarks/RemarkSerializer.h"
17#include "llvm/Support/YAMLTraits.h"
18
19namespace llvm {
20namespace remarks {
21
22/// Serialize the remarks to YAML. One remark entry looks like this:
23/// --- !<TYPE>
24/// Pass:            <PASSNAME>
25/// Name:            <REMARKNAME>
26/// DebugLoc:        { File: <SOURCEFILENAME>, Line: <SOURCELINE>,
27///                    Column: <SOURCECOLUMN> }
28/// Function:        <FUNCTIONNAME>
29/// Args:
30///   - <KEY>: <VALUE>
31///     DebugLoc:        { File: <FILE>, Line: <LINE>, Column: <COL> }
32/// ...
33struct YAMLRemarkSerializer : public RemarkSerializer {
34  /// The YAML streamer.
35  yaml::Output YAMLOutput;
36
37  YAMLRemarkSerializer(raw_ostream &OS, SerializerMode Mode,
38                       Optional<StringTable> StrTab = None);
39
40  void emit(const Remark &Remark) override;
41  std::unique_ptr<MetaSerializer>
42  metaSerializer(raw_ostream &OS,
43                 Optional<StringRef> ExternalFilename = None) override;
44
45  static bool classof(const RemarkSerializer *S) {
46    return S->SerializerFormat == Format::YAML;
47  }
48
49protected:
50  YAMLRemarkSerializer(Format SerializerFormat, raw_ostream &OS,
51                       SerializerMode Mode,
52                       Optional<StringTable> StrTab = None);
53};
54
55struct YAMLMetaSerializer : public MetaSerializer {
56  Optional<StringRef> ExternalFilename;
57
58  YAMLMetaSerializer(raw_ostream &OS, Optional<StringRef> ExternalFilename)
59      : MetaSerializer(OS), ExternalFilename(ExternalFilename) {}
60
61  void emit() override;
62};
63
64/// Serialize the remarks to YAML using a string table. An remark entry looks
65/// like the regular YAML remark but instead of string entries it's using
66/// numbers that map to an index in the string table.
67struct YAMLStrTabRemarkSerializer : public YAMLRemarkSerializer {
68  /// Wether we already emitted the metadata in standalone mode.
69  /// This should be set to true after the first invocation of `emit`.
70  bool DidEmitMeta = false;
71
72  YAMLStrTabRemarkSerializer(raw_ostream &OS, SerializerMode Mode)
73      : YAMLRemarkSerializer(Format::YAMLStrTab, OS, Mode) {
74    // We always need a string table for this type of serializer.
75    StrTab.emplace();
76  }
77  YAMLStrTabRemarkSerializer(raw_ostream &OS, SerializerMode Mode,
78                             StringTable StrTab)
79      : YAMLRemarkSerializer(Format::YAMLStrTab, OS, Mode, std::move(StrTab)) {}
80
81  /// Override to emit the metadata if necessary.
82  void emit(const Remark &Remark) override;
83
84  std::unique_ptr<MetaSerializer>
85  metaSerializer(raw_ostream &OS,
86                 Optional<StringRef> ExternalFilename = None) override;
87
88  static bool classof(const RemarkSerializer *S) {
89    return S->SerializerFormat == Format::YAMLStrTab;
90  }
91};
92
93struct YAMLStrTabMetaSerializer : public YAMLMetaSerializer {
94  /// The string table is part of the metadata.
95  const StringTable &StrTab;
96
97  YAMLStrTabMetaSerializer(raw_ostream &OS,
98                           Optional<StringRef> ExternalFilename,
99                           const StringTable &StrTab)
100      : YAMLMetaSerializer(OS, ExternalFilename), StrTab(StrTab) {}
101
102  void emit() override;
103};
104
105} // end namespace remarks
106} // end namespace llvm
107
108#endif /* LLVM_REMARKS_REMARK_SERIALIZER_H */
109