brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 9b521b4 Raw
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