xref: /freebsd-src/contrib/llvm-project/llvm/lib/Remarks/RemarkStreamer.cpp (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
15ffd83dbSDimitry Andric //===- llvm/Remarks/RemarkStreamer.cpp - Remark Streamer -*- C++ --------*-===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric //
95ffd83dbSDimitry Andric // This file contains the implementation of the main remark streamer.
105ffd83dbSDimitry Andric //
115ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
125ffd83dbSDimitry Andric 
135ffd83dbSDimitry Andric #include "llvm/Remarks/RemarkStreamer.h"
145ffd83dbSDimitry Andric #include "llvm/Support/CommandLine.h"
155ffd83dbSDimitry Andric 
165ffd83dbSDimitry Andric using namespace llvm;
175ffd83dbSDimitry Andric using namespace llvm::remarks;
185ffd83dbSDimitry Andric 
195ffd83dbSDimitry Andric static cl::opt<cl::boolOrDefault> EnableRemarksSection(
205ffd83dbSDimitry Andric     "remarks-section",
215ffd83dbSDimitry Andric     cl::desc(
225ffd83dbSDimitry Andric         "Emit a section containing remark diagnostics metadata. By default, "
235ffd83dbSDimitry Andric         "this is enabled for the following formats: yaml-strtab, bitstream."),
245ffd83dbSDimitry Andric     cl::init(cl::BOU_UNSET), cl::Hidden);
255ffd83dbSDimitry Andric 
265ffd83dbSDimitry Andric RemarkStreamer::RemarkStreamer(
275ffd83dbSDimitry Andric     std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,
285ffd83dbSDimitry Andric     Optional<StringRef> FilenameIn)
29*04eeddc0SDimitry Andric     : RemarkSerializer(std::move(RemarkSerializer)),
305ffd83dbSDimitry Andric       Filename(FilenameIn ? Optional<std::string>(FilenameIn->str()) : None) {}
315ffd83dbSDimitry Andric 
325ffd83dbSDimitry Andric Error RemarkStreamer::setFilter(StringRef Filter) {
335ffd83dbSDimitry Andric   Regex R = Regex(Filter);
345ffd83dbSDimitry Andric   std::string RegexError;
355ffd83dbSDimitry Andric   if (!R.isValid(RegexError))
365ffd83dbSDimitry Andric     return createStringError(std::make_error_code(std::errc::invalid_argument),
375ffd83dbSDimitry Andric                              RegexError.data());
385ffd83dbSDimitry Andric   PassFilter = std::move(R);
395ffd83dbSDimitry Andric   return Error::success();
405ffd83dbSDimitry Andric }
415ffd83dbSDimitry Andric 
425ffd83dbSDimitry Andric bool RemarkStreamer::matchesFilter(StringRef Str) {
435ffd83dbSDimitry Andric   if (PassFilter)
445ffd83dbSDimitry Andric     return PassFilter->match(Str);
455ffd83dbSDimitry Andric   // No filter means all strings pass.
465ffd83dbSDimitry Andric   return true;
475ffd83dbSDimitry Andric }
485ffd83dbSDimitry Andric 
495ffd83dbSDimitry Andric bool RemarkStreamer::needsSection() const {
505ffd83dbSDimitry Andric   if (EnableRemarksSection == cl::BOU_TRUE)
515ffd83dbSDimitry Andric     return true;
525ffd83dbSDimitry Andric 
535ffd83dbSDimitry Andric   if (EnableRemarksSection == cl::BOU_FALSE)
545ffd83dbSDimitry Andric     return false;
555ffd83dbSDimitry Andric 
565ffd83dbSDimitry Andric   assert(EnableRemarksSection == cl::BOU_UNSET);
575ffd83dbSDimitry Andric 
585ffd83dbSDimitry Andric   // We only need a section if we're in separate mode.
595ffd83dbSDimitry Andric   if (RemarkSerializer->Mode != remarks::SerializerMode::Separate)
605ffd83dbSDimitry Andric     return false;
615ffd83dbSDimitry Andric 
625ffd83dbSDimitry Andric   // Only some formats need a section:
635ffd83dbSDimitry Andric   // * bitstream
645ffd83dbSDimitry Andric   // * yaml-strtab
655ffd83dbSDimitry Andric   switch (RemarkSerializer->SerializerFormat) {
665ffd83dbSDimitry Andric   case remarks::Format::YAMLStrTab:
675ffd83dbSDimitry Andric   case remarks::Format::Bitstream:
685ffd83dbSDimitry Andric     return true;
695ffd83dbSDimitry Andric   default:
705ffd83dbSDimitry Andric     return false;
715ffd83dbSDimitry Andric   }
725ffd83dbSDimitry Andric }
73