xref: /freebsd-src/contrib/llvm-project/llvm/lib/Remarks/RemarkStreamer.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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"
15*bdd1243dSDimitry Andric #include <optional>
165ffd83dbSDimitry Andric 
175ffd83dbSDimitry Andric using namespace llvm;
185ffd83dbSDimitry Andric using namespace llvm::remarks;
195ffd83dbSDimitry Andric 
205ffd83dbSDimitry Andric static cl::opt<cl::boolOrDefault> EnableRemarksSection(
215ffd83dbSDimitry Andric     "remarks-section",
225ffd83dbSDimitry Andric     cl::desc(
235ffd83dbSDimitry Andric         "Emit a section containing remark diagnostics metadata. By default, "
245ffd83dbSDimitry Andric         "this is enabled for the following formats: yaml-strtab, bitstream."),
255ffd83dbSDimitry Andric     cl::init(cl::BOU_UNSET), cl::Hidden);
265ffd83dbSDimitry Andric 
RemarkStreamer(std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,std::optional<StringRef> FilenameIn)275ffd83dbSDimitry Andric RemarkStreamer::RemarkStreamer(
285ffd83dbSDimitry Andric     std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,
29*bdd1243dSDimitry Andric     std::optional<StringRef> FilenameIn)
3004eeddc0SDimitry Andric     : RemarkSerializer(std::move(RemarkSerializer)),
31*bdd1243dSDimitry Andric       Filename(FilenameIn ? std::optional<std::string>(FilenameIn->str())
32*bdd1243dSDimitry Andric                           : std::nullopt) {}
335ffd83dbSDimitry Andric 
setFilter(StringRef Filter)345ffd83dbSDimitry Andric Error RemarkStreamer::setFilter(StringRef Filter) {
355ffd83dbSDimitry Andric   Regex R = Regex(Filter);
365ffd83dbSDimitry Andric   std::string RegexError;
375ffd83dbSDimitry Andric   if (!R.isValid(RegexError))
385ffd83dbSDimitry Andric     return createStringError(std::make_error_code(std::errc::invalid_argument),
395ffd83dbSDimitry Andric                              RegexError.data());
405ffd83dbSDimitry Andric   PassFilter = std::move(R);
415ffd83dbSDimitry Andric   return Error::success();
425ffd83dbSDimitry Andric }
435ffd83dbSDimitry Andric 
matchesFilter(StringRef Str)445ffd83dbSDimitry Andric bool RemarkStreamer::matchesFilter(StringRef Str) {
455ffd83dbSDimitry Andric   if (PassFilter)
465ffd83dbSDimitry Andric     return PassFilter->match(Str);
475ffd83dbSDimitry Andric   // No filter means all strings pass.
485ffd83dbSDimitry Andric   return true;
495ffd83dbSDimitry Andric }
505ffd83dbSDimitry Andric 
needsSection() const515ffd83dbSDimitry Andric bool RemarkStreamer::needsSection() const {
525ffd83dbSDimitry Andric   if (EnableRemarksSection == cl::BOU_TRUE)
535ffd83dbSDimitry Andric     return true;
545ffd83dbSDimitry Andric 
555ffd83dbSDimitry Andric   if (EnableRemarksSection == cl::BOU_FALSE)
565ffd83dbSDimitry Andric     return false;
575ffd83dbSDimitry Andric 
585ffd83dbSDimitry Andric   assert(EnableRemarksSection == cl::BOU_UNSET);
595ffd83dbSDimitry Andric 
605ffd83dbSDimitry Andric   // We only need a section if we're in separate mode.
615ffd83dbSDimitry Andric   if (RemarkSerializer->Mode != remarks::SerializerMode::Separate)
625ffd83dbSDimitry Andric     return false;
635ffd83dbSDimitry Andric 
645ffd83dbSDimitry Andric   // Only some formats need a section:
655ffd83dbSDimitry Andric   // * bitstream
665ffd83dbSDimitry Andric   // * yaml-strtab
675ffd83dbSDimitry Andric   switch (RemarkSerializer->SerializerFormat) {
685ffd83dbSDimitry Andric   case remarks::Format::YAMLStrTab:
695ffd83dbSDimitry Andric   case remarks::Format::Bitstream:
705ffd83dbSDimitry Andric     return true;
715ffd83dbSDimitry Andric   default:
725ffd83dbSDimitry Andric     return false;
735ffd83dbSDimitry Andric   }
745ffd83dbSDimitry Andric }
75