diff options
author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-10-28 14:53:31 -0700 |
---|---|---|
committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2020-02-04 17:16:02 -0800 |
commit | 7531a5039fd7ee9b48eb8a0d0770e8dfb9fa8bdf (patch) | |
tree | 85f6ce820fd44fcac45972f3e277ca474b2bdecc /llvm/lib/Remarks | |
parent | 1c03cc5a39f7088551151c5c6c64d58819c89369 (diff) | |
download | llvm-7531a5039fd7ee9b48eb8a0d0770e8dfb9fa8bdf.zip llvm-7531a5039fd7ee9b48eb8a0d0770e8dfb9fa8bdf.tar.gz llvm-7531a5039fd7ee9b48eb8a0d0770e8dfb9fa8bdf.tar.bz2 |
[Remarks] Extend the RemarkStreamer to support other emitters
This extends the RemarkStreamer to allow for other emitters (e.g.
frontends, SIL, etc.) to emit remarks through a common interface.
See changes in llvm/docs/Remarks.rst for motivation and design choices.
Differential Revision: https://reviews.llvm.org/D73676
Diffstat (limited to 'llvm/lib/Remarks')
-rw-r--r-- | llvm/lib/Remarks/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/Remarks/RemarkStreamer.cpp | 72 |
2 files changed, 73 insertions, 0 deletions
diff --git a/llvm/lib/Remarks/CMakeLists.txt b/llvm/lib/Remarks/CMakeLists.txt index c0e67f6..c49d321 100644 --- a/llvm/lib/Remarks/CMakeLists.txt +++ b/llvm/lib/Remarks/CMakeLists.txt @@ -6,6 +6,7 @@ add_llvm_component_library(LLVMRemarks RemarkLinker.cpp RemarkParser.cpp RemarkSerializer.cpp + RemarkStreamer.cpp RemarkStringTable.cpp YAMLRemarkParser.cpp YAMLRemarkSerializer.cpp diff --git a/llvm/lib/Remarks/RemarkStreamer.cpp b/llvm/lib/Remarks/RemarkStreamer.cpp new file mode 100644 index 0000000..2f00b8e --- /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; + } +} |