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