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
70 lines
2.3 KiB
C++
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
|