diff options
Diffstat (limited to 'llvm/lib/Remarks/RemarkStreamer.cpp')
-rw-r--r-- | llvm/lib/Remarks/RemarkStreamer.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/llvm/lib/Remarks/RemarkStreamer.cpp b/llvm/lib/Remarks/RemarkStreamer.cpp new file mode 100644 index 0000000000000..2f00b8e736700 --- /dev/null +++ b/llvm/lib/Remarks/RemarkStreamer.cpp @@ -0,0 +1,72 @@ +//===- 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" + +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, + Optional<StringRef> FilenameIn) + : PassFilter(), RemarkSerializer(std::move(RemarkSerializer)), + Filename(FilenameIn ? Optional<std::string>(FilenameIn->str()) : None) {} + +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; + } +} |