| //===- llvm/Remarks/RemarkStreamer.cpp - Remark Streamer -*- C++ --------*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file contains the implementation of the main remark streamer. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/Remarks/RemarkStreamer.h" | |
| #include "llvm/Support/CommandLine.h" | |
| #include <optional> | |
| using namespace llvm; | |
| using namespace llvm::remarks; | |
| static cl::opt<cl::boolOrDefault> EnableRemarksSection( | |
| "remarks-section", | |
| cl::desc( | |
| "Emit a section containing remark diagnostics metadata. By default, " | |
| "this is enabled for the following formats: yaml-strtab, bitstream."), | |
| cl::init(cl::BOU_UNSET), cl::Hidden); | |
| RemarkStreamer::RemarkStreamer( | |
| std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer, | |
| std::optional<StringRef> FilenameIn) | |
| : RemarkSerializer(std::move(RemarkSerializer)), | |
| Filename(FilenameIn ? std::optional<std::string>(FilenameIn->str()) | |
| : std::nullopt) {} | |
| Error RemarkStreamer::setFilter(StringRef Filter) { | |
| Regex R = Regex(Filter); | |
| std::string RegexError; | |
| if (!R.isValid(RegexError)) | |
| return createStringError(std::make_error_code(std::errc::invalid_argument), | |
| RegexError.data()); | |
| PassFilter = std::move(R); | |
| return Error::success(); | |
| } | |
| bool RemarkStreamer::matchesFilter(StringRef Str) { | |
| if (PassFilter) | |
| return PassFilter->match(Str); | |
| // No filter means all strings pass. | |
| return true; | |
| } | |
| bool RemarkStreamer::needsSection() const { | |
| if (EnableRemarksSection == cl::BOU_TRUE) | |
| return true; | |
| if (EnableRemarksSection == cl::BOU_FALSE) | |
| return false; | |
| assert(EnableRemarksSection == cl::BOU_UNSET); | |
| // We only need a section if we're in separate mode. | |
| if (RemarkSerializer->Mode != remarks::SerializerMode::Separate) | |
| return false; | |
| // Only some formats need a section: | |
| // * bitstream | |
| // * yaml-strtab | |
| switch (RemarkSerializer->SerializerFormat) { | |
| case remarks::Format::YAMLStrTab: | |
| case remarks::Format::Bitstream: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| } |