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
16using namespace llvm;
17using namespace llvm::remarks;
18
19static 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
26RemarkStreamer::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
32Error 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
42bool RemarkStreamer::matchesFilter(StringRef Str) {
43  if (PassFilter)
44    return PassFilter->match(Str);
45  // No filter means all strings pass.
46  return true;
47}
48
49bool 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