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 
19 namespace llvm {
20 namespace 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 /// ...
33 struct 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 
49 protected:
50   YAMLRemarkSerializer(Format SerializerFormat, raw_ostream &OS,
51                        SerializerMode Mode,
52                        Optional<StringTable> StrTab = None);
53 };
54 
55 struct 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.
67 struct 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 
93 struct 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