1*5ffd83dbSDimitry Andric //===- llvm/Remarks/RemarkStreamer.cpp - Remark Streamer -*- C++ --------*-===// 2*5ffd83dbSDimitry Andric // 3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5ffd83dbSDimitry Andric // 7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 8*5ffd83dbSDimitry Andric // 9*5ffd83dbSDimitry Andric // This file contains the implementation of the main remark streamer. 10*5ffd83dbSDimitry Andric // 11*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 12*5ffd83dbSDimitry Andric 13*5ffd83dbSDimitry Andric #include "llvm/Remarks/RemarkStreamer.h" 14*5ffd83dbSDimitry Andric #include "llvm/Support/CommandLine.h" 15*5ffd83dbSDimitry Andric 16*5ffd83dbSDimitry Andric using namespace llvm; 17*5ffd83dbSDimitry Andric using namespace llvm::remarks; 18*5ffd83dbSDimitry Andric 19*5ffd83dbSDimitry Andric static cl::opt<cl::boolOrDefault> EnableRemarksSection( 20*5ffd83dbSDimitry Andric "remarks-section", 21*5ffd83dbSDimitry Andric cl::desc( 22*5ffd83dbSDimitry Andric "Emit a section containing remark diagnostics metadata. By default, " 23*5ffd83dbSDimitry Andric "this is enabled for the following formats: yaml-strtab, bitstream."), 24*5ffd83dbSDimitry Andric cl::init(cl::BOU_UNSET), cl::Hidden); 25*5ffd83dbSDimitry Andric 26*5ffd83dbSDimitry Andric RemarkStreamer::RemarkStreamer( 27*5ffd83dbSDimitry Andric std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer, 28*5ffd83dbSDimitry Andric Optional<StringRef> FilenameIn) 29*5ffd83dbSDimitry Andric : PassFilter(), RemarkSerializer(std::move(RemarkSerializer)), 30*5ffd83dbSDimitry Andric Filename(FilenameIn ? Optional<std::string>(FilenameIn->str()) : None) {} 31*5ffd83dbSDimitry Andric 32*5ffd83dbSDimitry Andric Error RemarkStreamer::setFilter(StringRef Filter) { 33*5ffd83dbSDimitry Andric Regex R = Regex(Filter); 34*5ffd83dbSDimitry Andric std::string RegexError; 35*5ffd83dbSDimitry Andric if (!R.isValid(RegexError)) 36*5ffd83dbSDimitry Andric return createStringError(std::make_error_code(std::errc::invalid_argument), 37*5ffd83dbSDimitry Andric RegexError.data()); 38*5ffd83dbSDimitry Andric PassFilter = std::move(R); 39*5ffd83dbSDimitry Andric return Error::success(); 40*5ffd83dbSDimitry Andric } 41*5ffd83dbSDimitry Andric 42*5ffd83dbSDimitry Andric bool RemarkStreamer::matchesFilter(StringRef Str) { 43*5ffd83dbSDimitry Andric if (PassFilter) 44*5ffd83dbSDimitry Andric return PassFilter->match(Str); 45*5ffd83dbSDimitry Andric // No filter means all strings pass. 46*5ffd83dbSDimitry Andric return true; 47*5ffd83dbSDimitry Andric } 48*5ffd83dbSDimitry Andric 49*5ffd83dbSDimitry Andric bool RemarkStreamer::needsSection() const { 50*5ffd83dbSDimitry Andric if (EnableRemarksSection == cl::BOU_TRUE) 51*5ffd83dbSDimitry Andric return true; 52*5ffd83dbSDimitry Andric 53*5ffd83dbSDimitry Andric if (EnableRemarksSection == cl::BOU_FALSE) 54*5ffd83dbSDimitry Andric return false; 55*5ffd83dbSDimitry Andric 56*5ffd83dbSDimitry Andric assert(EnableRemarksSection == cl::BOU_UNSET); 57*5ffd83dbSDimitry Andric 58*5ffd83dbSDimitry Andric // We only need a section if we're in separate mode. 59*5ffd83dbSDimitry Andric if (RemarkSerializer->Mode != remarks::SerializerMode::Separate) 60*5ffd83dbSDimitry Andric return false; 61*5ffd83dbSDimitry Andric 62*5ffd83dbSDimitry Andric // Only some formats need a section: 63*5ffd83dbSDimitry Andric // * bitstream 64*5ffd83dbSDimitry Andric // * yaml-strtab 65*5ffd83dbSDimitry Andric switch (RemarkSerializer->SerializerFormat) { 66*5ffd83dbSDimitry Andric case remarks::Format::YAMLStrTab: 67*5ffd83dbSDimitry Andric case remarks::Format::Bitstream: 68*5ffd83dbSDimitry Andric return true; 69*5ffd83dbSDimitry Andric default: 70*5ffd83dbSDimitry Andric return false; 71*5ffd83dbSDimitry Andric } 72*5ffd83dbSDimitry Andric } 73