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 LLVM_REMARKS_REMARKSTREAMER_H
32
33#include "llvm/ADT/Optional.h"
34#include "llvm/Remarks/RemarkSerializer.h"
35#include "llvm/Support/Error.h"
36#include "llvm/Support/Regex.h"
37#include "llvm/Support/raw_ostream.h"
38#include <memory>
39
40namespace llvm {
41namespace remarks {
42class RemarkStreamer final {
43 /// The regex used to filter remarks based on the passes that emit them.
44 Optional<Regex> PassFilter;
45 /// The object used to serialize the remarks to a specific format.
46 std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer;
47 /// The filename that the remark diagnostics are emitted to.
48 const Optional<std::string> Filename;
49
50public:
51 RemarkStreamer(std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,
52 Optional<StringRef> Filename = None);
53
54 /// Return the filename that the remark diagnostics are emitted to.
55 Optional<StringRef> getFilename() const {
56 return Filename ? Optional<StringRef>(*Filename) : None;
57 }
58 /// Return stream that the remark diagnostics are emitted to.
59 raw_ostream &getStream() { return RemarkSerializer->OS; }
60 /// Return the serializer used for this stream.
61 remarks::RemarkSerializer &getSerializer() { return *RemarkSerializer; }
62 /// Set a pass filter based on a regex \p Filter.
63 /// Returns an error if the regex is invalid.
64 Error setFilter(StringRef Filter);
65 /// Check wether the string matches the filter.
66 bool matchesFilter(StringRef Str);
67 /// Check if the remarks also need to have associated metadata in a section.
68 bool needsSection() const;
69};
70} // end namespace remarks
71} // end namespace llvm
72
73#endif // LLVM_REMARKS_REMARKSTREAMER_H
74