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