diff --git a/llvm/test/tools/llvm-remarkutil/filter/filter-exclude.test b/llvm/test/tools/llvm-remarkutil/filter/filter-exclude.test new file mode 100644 index 000000000000..70809a609d56 --- /dev/null +++ b/llvm/test/tools/llvm-remarkutil/filter/filter-exclude.test @@ -0,0 +1,9 @@ +RUN: llvm-remarkutil filter --exclude --function=func1 %p/Inputs/filter.yaml | FileCheck %s --strict-whitespace + +; CHECK: --- !Missed +; CHECK: Name: Remark2 +; CHECK: ... +; CHECK-NEXT: --- !Analysis +; CHECK: Name: Remark3 +; CHECK: ... +; CHECK-NOT: {{.}} diff --git a/llvm/tools/llvm-remarkutil/RemarkFilter.cpp b/llvm/tools/llvm-remarkutil/RemarkFilter.cpp index ca6898a6f47b..72d2f439515e 100644 --- a/llvm/tools/llvm-remarkutil/RemarkFilter.cpp +++ b/llvm/tools/llvm-remarkutil/RemarkFilter.cpp @@ -40,6 +40,11 @@ static cl::list InputFileNames( cl::Positional, cl::OneOrMore, cl::list_init({"-"}), cl::desc(" [ ...]"), cl::sub(FilterSub)); +static cl::opt + ExcludeOpt("exclude", + cl::desc("Keep all remarks except those matching the filter"), + cl::init(false), cl::sub(FilterSub)); + REMARK_FILTER_SETUP_FUNC() namespace { @@ -47,6 +52,7 @@ namespace { class FilterTool { public: Filters Filter; + bool Exclude = false; FilterTool(Filters Filter) : Filter(std::move(Filter)) {} ~FilterTool() { finalize(); } @@ -67,7 +73,7 @@ public: auto MaybeRemark = Parser.next(); for (; MaybeRemark; MaybeRemark = Parser.next()) { Remark &Remark = **MaybeRemark; - if (!Filter.filterRemark(Remark)) + if (Filter.filterRemark(Remark) == Exclude) continue; Serializer->emit(Remark); } @@ -116,6 +122,7 @@ static Error tryFilter() { if (!MaybeFilter) return MaybeFilter.takeError(); FilterTool Tool(std::move(*MaybeFilter)); + Tool.Exclude = ExcludeOpt; for (auto &InputFileName : InputFileNames) { if (Error E = Tool.processInputFile(InputFileName))