81 lines · cpp
1//===- RemarkFilter.cpp ---------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Generic tool to filter remarks10//11//===----------------------------------------------------------------------===//12 13#include "RemarkUtilHelpers.h"14#include "RemarkUtilRegistry.h"15 16#include "llvm/Support/Error.h"17#include "llvm/Support/Regex.h"18 19using namespace llvm;20using namespace remarks;21using namespace llvm::remarkutil;22 23// Note: Avoid using the identifier "filter" in this file, as it is prone to24// namespace collision with headers that might get included e.g.25// curses.h.26 27static cl::SubCommand FilterSub("filter",28 "Filter remarks based on specified criteria.");29 30INPUT_FORMAT_COMMAND_LINE_OPTIONS(FilterSub)31OUTPUT_FORMAT_COMMAND_LINE_OPTIONS(FilterSub)32INPUT_OUTPUT_COMMAND_LINE_OPTIONS(FilterSub)33REMARK_FILTER_COMMAND_LINE_OPTIONS(FilterSub)34 35REMARK_FILTER_SETUP_FUNC()36 37static Error tryFilter() {38 auto MaybeFilter = getRemarkFilters();39 if (!MaybeFilter)40 return MaybeFilter.takeError();41 Filters &Filter = *MaybeFilter;42 43 auto MaybeBuf = getInputMemoryBuffer(InputFileName);44 if (!MaybeBuf)45 return MaybeBuf.takeError();46 auto MaybeParser = createRemarkParser(InputFormat, (*MaybeBuf)->getBuffer());47 if (!MaybeParser)48 return MaybeParser.takeError();49 auto &Parser = **MaybeParser;50 51 Format SerializerFormat =52 getSerializerFormat(OutputFileName, OutputFormat, Parser.ParserFormat);53 54 auto MaybeOF = getOutputFileForRemarks(OutputFileName, SerializerFormat);55 if (!MaybeOF)56 return MaybeOF.takeError();57 auto OF = std::move(*MaybeOF);58 59 auto MaybeSerializer = createRemarkSerializer(SerializerFormat, OF->os());60 if (!MaybeSerializer)61 return MaybeSerializer.takeError();62 auto &Serializer = **MaybeSerializer;63 64 auto MaybeRemark = Parser.next();65 for (; MaybeRemark; MaybeRemark = Parser.next()) {66 Remark &Remark = **MaybeRemark;67 if (!Filter.filterRemark(Remark))68 continue;69 Serializer.emit(Remark);70 }71 72 auto E = MaybeRemark.takeError();73 if (!E.isA<EndOfFileError>())74 return E;75 consumeError(std::move(E));76 OF->keep();77 return Error::success();78}79 80static CommandRegistration FilterReg(&FilterSub, tryFilter);81