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" 155ffd83dbSDimitry Andric 165ffd83dbSDimitry Andric using namespace llvm; 175ffd83dbSDimitry Andric using namespace llvm::remarks; 185ffd83dbSDimitry Andric 195ffd83dbSDimitry Andric static cl::opt<cl::boolOrDefault> EnableRemarksSection( 205ffd83dbSDimitry Andric "remarks-section", 215ffd83dbSDimitry Andric cl::desc( 225ffd83dbSDimitry Andric "Emit a section containing remark diagnostics metadata. By default, " 235ffd83dbSDimitry Andric "this is enabled for the following formats: yaml-strtab, bitstream."), 245ffd83dbSDimitry Andric cl::init(cl::BOU_UNSET), cl::Hidden); 255ffd83dbSDimitry Andric 265ffd83dbSDimitry Andric RemarkStreamer::RemarkStreamer( 275ffd83dbSDimitry Andric std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer, 285ffd83dbSDimitry Andric Optional<StringRef> FilenameIn) 29*04eeddc0SDimitry Andric : RemarkSerializer(std::move(RemarkSerializer)), 305ffd83dbSDimitry Andric Filename(FilenameIn ? Optional<std::string>(FilenameIn->str()) : None) {} 315ffd83dbSDimitry Andric 325ffd83dbSDimitry Andric Error RemarkStreamer::setFilter(StringRef Filter) { 335ffd83dbSDimitry Andric Regex R = Regex(Filter); 345ffd83dbSDimitry Andric std::string RegexError; 355ffd83dbSDimitry Andric if (!R.isValid(RegexError)) 365ffd83dbSDimitry Andric return createStringError(std::make_error_code(std::errc::invalid_argument), 375ffd83dbSDimitry Andric RegexError.data()); 385ffd83dbSDimitry Andric PassFilter = std::move(R); 395ffd83dbSDimitry Andric return Error::success(); 405ffd83dbSDimitry Andric } 415ffd83dbSDimitry Andric 425ffd83dbSDimitry Andric bool RemarkStreamer::matchesFilter(StringRef Str) { 435ffd83dbSDimitry Andric if (PassFilter) 445ffd83dbSDimitry Andric return PassFilter->match(Str); 455ffd83dbSDimitry Andric // No filter means all strings pass. 465ffd83dbSDimitry Andric return true; 475ffd83dbSDimitry Andric } 485ffd83dbSDimitry Andric 495ffd83dbSDimitry Andric bool RemarkStreamer::needsSection() const { 505ffd83dbSDimitry Andric if (EnableRemarksSection == cl::BOU_TRUE) 515ffd83dbSDimitry Andric return true; 525ffd83dbSDimitry Andric 535ffd83dbSDimitry Andric if (EnableRemarksSection == cl::BOU_FALSE) 545ffd83dbSDimitry Andric return false; 555ffd83dbSDimitry Andric 565ffd83dbSDimitry Andric assert(EnableRemarksSection == cl::BOU_UNSET); 575ffd83dbSDimitry Andric 585ffd83dbSDimitry Andric // We only need a section if we're in separate mode. 595ffd83dbSDimitry Andric if (RemarkSerializer->Mode != remarks::SerializerMode::Separate) 605ffd83dbSDimitry Andric return false; 615ffd83dbSDimitry Andric 625ffd83dbSDimitry Andric // Only some formats need a section: 635ffd83dbSDimitry Andric // * bitstream 645ffd83dbSDimitry Andric // * yaml-strtab 655ffd83dbSDimitry Andric switch (RemarkSerializer->SerializerFormat) { 665ffd83dbSDimitry Andric case remarks::Format::YAMLStrTab: 675ffd83dbSDimitry Andric case remarks::Format::Bitstream: 685ffd83dbSDimitry Andric return true; 695ffd83dbSDimitry Andric default: 705ffd83dbSDimitry Andric return false; 715ffd83dbSDimitry Andric } 725ffd83dbSDimitry Andric } 73