xref: /freebsd-src/contrib/llvm-project/llvm/lib/Remarks/RemarkStreamer.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1*5ffd83dbSDimitry Andric //===- llvm/Remarks/RemarkStreamer.cpp - Remark Streamer -*- C++ --------*-===//
2*5ffd83dbSDimitry Andric //
3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5ffd83dbSDimitry Andric //
7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
8*5ffd83dbSDimitry Andric //
9*5ffd83dbSDimitry Andric // This file contains the implementation of the main remark streamer.
10*5ffd83dbSDimitry Andric //
11*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
12*5ffd83dbSDimitry Andric 
13*5ffd83dbSDimitry Andric #include "llvm/Remarks/RemarkStreamer.h"
14*5ffd83dbSDimitry Andric #include "llvm/Support/CommandLine.h"
15*5ffd83dbSDimitry Andric 
16*5ffd83dbSDimitry Andric using namespace llvm;
17*5ffd83dbSDimitry Andric using namespace llvm::remarks;
18*5ffd83dbSDimitry Andric 
19*5ffd83dbSDimitry Andric static cl::opt<cl::boolOrDefault> EnableRemarksSection(
20*5ffd83dbSDimitry Andric     "remarks-section",
21*5ffd83dbSDimitry Andric     cl::desc(
22*5ffd83dbSDimitry Andric         "Emit a section containing remark diagnostics metadata. By default, "
23*5ffd83dbSDimitry Andric         "this is enabled for the following formats: yaml-strtab, bitstream."),
24*5ffd83dbSDimitry Andric     cl::init(cl::BOU_UNSET), cl::Hidden);
25*5ffd83dbSDimitry Andric 
26*5ffd83dbSDimitry Andric RemarkStreamer::RemarkStreamer(
27*5ffd83dbSDimitry Andric     std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,
28*5ffd83dbSDimitry Andric     Optional<StringRef> FilenameIn)
29*5ffd83dbSDimitry Andric     : PassFilter(), RemarkSerializer(std::move(RemarkSerializer)),
30*5ffd83dbSDimitry Andric       Filename(FilenameIn ? Optional<std::string>(FilenameIn->str()) : None) {}
31*5ffd83dbSDimitry Andric 
32*5ffd83dbSDimitry Andric Error RemarkStreamer::setFilter(StringRef Filter) {
33*5ffd83dbSDimitry Andric   Regex R = Regex(Filter);
34*5ffd83dbSDimitry Andric   std::string RegexError;
35*5ffd83dbSDimitry Andric   if (!R.isValid(RegexError))
36*5ffd83dbSDimitry Andric     return createStringError(std::make_error_code(std::errc::invalid_argument),
37*5ffd83dbSDimitry Andric                              RegexError.data());
38*5ffd83dbSDimitry Andric   PassFilter = std::move(R);
39*5ffd83dbSDimitry Andric   return Error::success();
40*5ffd83dbSDimitry Andric }
41*5ffd83dbSDimitry Andric 
42*5ffd83dbSDimitry Andric bool RemarkStreamer::matchesFilter(StringRef Str) {
43*5ffd83dbSDimitry Andric   if (PassFilter)
44*5ffd83dbSDimitry Andric     return PassFilter->match(Str);
45*5ffd83dbSDimitry Andric   // No filter means all strings pass.
46*5ffd83dbSDimitry Andric   return true;
47*5ffd83dbSDimitry Andric }
48*5ffd83dbSDimitry Andric 
49*5ffd83dbSDimitry Andric bool RemarkStreamer::needsSection() const {
50*5ffd83dbSDimitry Andric   if (EnableRemarksSection == cl::BOU_TRUE)
51*5ffd83dbSDimitry Andric     return true;
52*5ffd83dbSDimitry Andric 
53*5ffd83dbSDimitry Andric   if (EnableRemarksSection == cl::BOU_FALSE)
54*5ffd83dbSDimitry Andric     return false;
55*5ffd83dbSDimitry Andric 
56*5ffd83dbSDimitry Andric   assert(EnableRemarksSection == cl::BOU_UNSET);
57*5ffd83dbSDimitry Andric 
58*5ffd83dbSDimitry Andric   // We only need a section if we're in separate mode.
59*5ffd83dbSDimitry Andric   if (RemarkSerializer->Mode != remarks::SerializerMode::Separate)
60*5ffd83dbSDimitry Andric     return false;
61*5ffd83dbSDimitry Andric 
62*5ffd83dbSDimitry Andric   // Only some formats need a section:
63*5ffd83dbSDimitry Andric   // * bitstream
64*5ffd83dbSDimitry Andric   // * yaml-strtab
65*5ffd83dbSDimitry Andric   switch (RemarkSerializer->SerializerFormat) {
66*5ffd83dbSDimitry Andric   case remarks::Format::YAMLStrTab:
67*5ffd83dbSDimitry Andric   case remarks::Format::Bitstream:
68*5ffd83dbSDimitry Andric     return true;
69*5ffd83dbSDimitry Andric   default:
70*5ffd83dbSDimitry Andric     return false;
71*5ffd83dbSDimitry Andric   }
72*5ffd83dbSDimitry Andric }
73