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
RemarkStreamer(std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,std::optional<StringRef> FilenameIn)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
setFilter(StringRef Filter)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
matchesFilter(StringRef Str)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
needsSection() const51 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