1 | //===- llvm/Remarks/RemarkStreamer.h ----------------------------*- 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 declares the main interface for streaming remarks. |
10 | // |
11 | // This is used to stream any llvm::remarks::Remark to an open file taking |
12 | // advantage of all the serialization capabilities developed for remarks (e.g. |
13 | // metadata in a section, bitstream format, etc.). |
14 | // |
15 | // Typically, a specialized remark emitter should hold a reference to the main |
16 | // remark streamer set up in the LLVMContext, and should convert specialized |
17 | // diagnostics to llvm::remarks::Remark objects as they get emitted. |
18 | // |
19 | // Specialized remark emitters can be components like: |
20 | // * Remarks from LLVM (M)IR passes |
21 | // * Remarks from the frontend |
22 | // * Remarks from an intermediate IR |
23 | // |
24 | // This allows for composition between specialized remark emitters throughout |
25 | // the compilation pipeline, that end up in the same file, using the same format |
26 | // and serialization techniques. |
27 | // |
28 | //===----------------------------------------------------------------------===// |
29 | |
30 | #ifndef LLVM_REMARKS_REMARKSTREAMER_H |
31 | #define |
32 | |
33 | #include "llvm/Remarks/RemarkSerializer.h" |
34 | #include "llvm/Support/Error.h" |
35 | #include "llvm/Support/Regex.h" |
36 | #include <memory> |
37 | #include <optional> |
38 | |
39 | namespace llvm { |
40 | |
41 | class raw_ostream; |
42 | |
43 | namespace remarks { |
44 | class final { |
45 | /// The regex used to filter remarks based on the passes that emit them. |
46 | std::optional<Regex> ; |
47 | /// The object used to serialize the remarks to a specific format. |
48 | std::unique_ptr<remarks::RemarkSerializer> ; |
49 | /// The filename that the remark diagnostics are emitted to. |
50 | const std::optional<std::string> ; |
51 | |
52 | public: |
53 | (std::unique_ptr<remarks::RemarkSerializer> , |
54 | std::optional<StringRef> Filename = std::nullopt); |
55 | |
56 | /// Return the filename that the remark diagnostics are emitted to. |
57 | std::optional<StringRef> () const { |
58 | return Filename ? std::optional<StringRef>(*Filename) : std::nullopt; |
59 | } |
60 | /// Return stream that the remark diagnostics are emitted to. |
61 | raw_ostream &() { return RemarkSerializer->OS; } |
62 | /// Return the serializer used for this stream. |
63 | remarks::RemarkSerializer &() { return *RemarkSerializer; } |
64 | /// Set a pass filter based on a regex \p Filter. |
65 | /// Returns an error if the regex is invalid. |
66 | Error (StringRef Filter); |
67 | /// Check wether the string matches the filter. |
68 | bool (StringRef Str); |
69 | /// Check if the remarks also need to have associated metadata in a section. |
70 | bool () const; |
71 | }; |
72 | } // end namespace remarks |
73 | } // end namespace llvm |
74 | |
75 | #endif // LLVM_REMARKS_REMARKSTREAMER_H |
76 | |