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