1 //===- llvm/Remarks/RemarkStreamer.cpp - Remark Streamer -*- 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 contains the implementation of the main remark streamer.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/Remarks/RemarkStreamer.h"
14 #include "llvm/Support/CommandLine.h"
15 #include <optional>
16 
17 using namespace llvm;
18 using namespace llvm::remarks;
19 
20 static cl::opt<cl::boolOrDefault> EnableRemarksSection(
21     "remarks-section",
22     cl::desc(
23         "Emit a section containing remark diagnostics metadata. By default, "
24         "this is enabled for the following formats: yaml-strtab, bitstream."),
25     cl::init(cl::BOU_UNSET), cl::Hidden);
26 
27 RemarkStreamer::RemarkStreamer(
28     std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,
29     std::optional<StringRef> FilenameIn)
30     : RemarkSerializer(std::move(RemarkSerializer)),
31       Filename(FilenameIn ? std::optional<std::string>(FilenameIn->str())
32                           : std::nullopt) {}
33 
34 Error RemarkStreamer::setFilter(StringRef Filter) {
35   Regex R = Regex(Filter);
36   std::string RegexError;
37   if (!R.isValid(RegexError))
38     return createStringError(std::make_error_code(std::errc::invalid_argument),
39                              RegexError.data());
40   PassFilter = std::move(R);
41   return Error::success();
42 }
43 
44 bool RemarkStreamer::matchesFilter(StringRef Str) {
45   if (PassFilter)
46     return PassFilter->match(Str);
47   // No filter means all strings pass.
48   return true;
49 }
50 
51 bool RemarkStreamer::needsSection() const {
52   if (EnableRemarksSection == cl::BOU_TRUE)
53     return true;
54 
55   if (EnableRemarksSection == cl::BOU_FALSE)
56     return false;
57 
58   assert(EnableRemarksSection == cl::BOU_UNSET);
59 
60   // We only need a section if we're in separate mode.
61   if (RemarkSerializer->Mode != remarks::SerializerMode::Separate)
62     return false;
63 
64   // Only some formats need a section:
65   // * bitstream
66   // * yaml-strtab
67   switch (RemarkSerializer->SerializerFormat) {
68   case remarks::Format::YAMLStrTab:
69   case remarks::Format::Bitstream:
70     return true;
71   default:
72     return false;
73   }
74 }
75