Home | History | Annotate | Line # | Download | only in Remarks
      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 
     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 
     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 
     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 
     49 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