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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Generic tool to filter remarks
10//
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 to
24// 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(ParserFormat: InputFormat, Buf: (*MaybeBuf)->getBuffer());
47 if (!MaybeParser)
48 return MaybeParser.takeError();
49 auto &Parser = **MaybeParser;
50
51 Format SerializerFormat =
52 getSerializerFormat(OutputFileName, SelectedFormat: OutputFormat, DefaultFormat: Parser.ParserFormat);
53
54 auto MaybeOF = getOutputFileForRemarks(OutputFileName, OutputFormat: SerializerFormat);
55 if (!MaybeOF)
56 return MaybeOF.takeError();
57 auto OF = std::move(*MaybeOF);
58
59 auto MaybeSerializer = createRemarkSerializer(RemarksFormat: SerializerFormat, OS&: 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(Err: std::move(E));
76 OF->keep();
77 return Error::success();
78}
79
80static CommandRegistration FilterReg(&FilterSub, tryFilter);
81