llvm-project/mlir/test/lib/IR/TestDiagnostics.cpp
River Riddle 6edef13569 [mlir:PassOption] Rework ListOption parsing and add support for std::vector/SmallVector options
ListOption currently uses llvm:🆑:list under the hood, but the usages
of ListOption are generally a tad different from llvm:🆑:list. This
commit codifies this by making ListOption implicitly comma separated,
and removes the explicit flag set for all of the current list options.
The new parsing for comma separation of ListOption also adds in support
for skipping over delimited sub-ranges (i.e. {}, [], (), "", ''). This
more easily supports nested options that use those as part of the
format, and this constraint (balanced delimiters) is already codified
in the syntax of pass pipelines.

See https://discourse.llvm.org/t/list-of-lists-pass-option/5950 for
related discussion

Differential Revision: https://reviews.llvm.org/D122879
2022-04-02 00:45:11 -07:00

70 lines
2.3 KiB
C++

//===- TestDiagnostics.cpp - Test Diagnostic Utilities --------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains test passes for constructing and resolving dominance
// information.
//
//===----------------------------------------------------------------------===//
#include "mlir/Pass/Pass.h"
#include "llvm/Support/SourceMgr.h"
using namespace mlir;
namespace {
struct TestDiagnosticFilterPass
: public PassWrapper<TestDiagnosticFilterPass,
InterfacePass<SymbolOpInterface>> {
StringRef getArgument() const final { return "test-diagnostic-filter"; }
StringRef getDescription() const final {
return "Test diagnostic filtering support.";
}
TestDiagnosticFilterPass() = default;
TestDiagnosticFilterPass(const TestDiagnosticFilterPass &) {}
void runOnOperation() override {
llvm::errs() << "Test '" << getOperation().getName() << "'\n";
// Build a diagnostic handler that has filtering capabilities.
auto filterFn = [&](Location loc) {
// Ignore non-file locations.
FileLineColLoc fileLoc = loc.dyn_cast<FileLineColLoc>();
if (!fileLoc)
return true;
// Don't show file locations if their name contains a filter.
return llvm::none_of(filters, [&](StringRef filter) {
return fileLoc.getFilename().strref().contains(filter);
});
};
llvm::SourceMgr sourceMgr;
SourceMgrDiagnosticHandler handler(sourceMgr, &getContext(), llvm::errs(),
filterFn);
// Emit a diagnostic for every operation with a valid loc.
getOperation()->walk([&](Operation *op) {
if (LocationAttr locAttr = op->getAttrOfType<LocationAttr>("test.loc"))
emitError(locAttr, "test diagnostic");
});
}
ListOption<std::string> filters{
*this, "filters",
llvm::cl::desc("Specifies the diagnostic file name filters.")};
};
} // namespace
namespace mlir {
namespace test {
void registerTestDiagnosticsPass() {
PassRegistration<TestDiagnosticFilterPass>{};
}
} // namespace test
} // namespace mlir