xref: /llvm-project/mlir/test/lib/IR/TestDiagnostics.cpp (revision 5550c821897ab77e664977121a0e90ad5be1ff59)
1d1baf289SRiver Riddle //===- TestDiagnostics.cpp - Test Diagnostic Utilities --------------------===//
2d1baf289SRiver Riddle //
3d1baf289SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d1baf289SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5d1baf289SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d1baf289SRiver Riddle //
7d1baf289SRiver Riddle //===----------------------------------------------------------------------===//
8d1baf289SRiver Riddle //
9d1baf289SRiver Riddle // This file contains test passes for constructing and resolving dominance
10d1baf289SRiver Riddle // information.
11d1baf289SRiver Riddle //
12d1baf289SRiver Riddle //===----------------------------------------------------------------------===//
13d1baf289SRiver Riddle 
1436d3efeaSRiver Riddle #include "mlir/IR/SymbolTable.h"
15d1baf289SRiver Riddle #include "mlir/Pass/Pass.h"
16d1baf289SRiver Riddle #include "llvm/Support/SourceMgr.h"
17d1baf289SRiver Riddle 
18d1baf289SRiver Riddle using namespace mlir;
19d1baf289SRiver Riddle 
20d1baf289SRiver Riddle namespace {
21d1baf289SRiver Riddle struct TestDiagnosticFilterPass
2287d6bf37SRiver Riddle     : public PassWrapper<TestDiagnosticFilterPass,
2387d6bf37SRiver Riddle                          InterfacePass<SymbolOpInterface>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonf1d4fcad0111::TestDiagnosticFilterPass245e50dd04SRiver Riddle   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestDiagnosticFilterPass)
255e50dd04SRiver Riddle 
268b8f5c54SMehdi Amini   StringRef getArgument() const final { return "test-diagnostic-filter"; }
getDescription__anonf1d4fcad0111::TestDiagnosticFilterPass278b8f5c54SMehdi Amini   StringRef getDescription() const final {
288b8f5c54SMehdi Amini     return "Test diagnostic filtering support.";
298b8f5c54SMehdi Amini   }
30e5639b3fSMehdi Amini   TestDiagnosticFilterPass() = default;
TestDiagnosticFilterPass__anonf1d4fcad0111::TestDiagnosticFilterPass31d1baf289SRiver Riddle   TestDiagnosticFilterPass(const TestDiagnosticFilterPass &) {}
32d1baf289SRiver Riddle 
runOnOperation__anonf1d4fcad0111::TestDiagnosticFilterPass33d1baf289SRiver Riddle   void runOnOperation() override {
34d1baf289SRiver Riddle     llvm::errs() << "Test '" << getOperation().getName() << "'\n";
35d1baf289SRiver Riddle 
36d1baf289SRiver Riddle     // Build a diagnostic handler that has filtering capabilities.
37d1baf289SRiver Riddle     auto filterFn = [&](Location loc) {
38d1baf289SRiver Riddle       // Ignore non-file locations.
39*5550c821STres Popp       FileLineColLoc fileLoc = dyn_cast<FileLineColLoc>(loc);
40d1baf289SRiver Riddle       if (!fileLoc)
41d1baf289SRiver Riddle         return true;
42d1baf289SRiver Riddle 
43d1baf289SRiver Riddle       // Don't show file locations if their name contains a filter.
44d1baf289SRiver Riddle       return llvm::none_of(filters, [&](StringRef filter) {
45d1baf289SRiver Riddle         return fileLoc.getFilename().strref().contains(filter);
46d1baf289SRiver Riddle       });
47d1baf289SRiver Riddle     };
48d1baf289SRiver Riddle     llvm::SourceMgr sourceMgr;
49d1baf289SRiver Riddle     SourceMgrDiagnosticHandler handler(sourceMgr, &getContext(), llvm::errs(),
50d1baf289SRiver Riddle                                        filterFn);
51d1baf289SRiver Riddle 
52d1baf289SRiver Riddle     // Emit a diagnostic for every operation with a valid loc.
53d1baf289SRiver Riddle     getOperation()->walk([&](Operation *op) {
54d1baf289SRiver Riddle       if (LocationAttr locAttr = op->getAttrOfType<LocationAttr>("test.loc"))
55d1baf289SRiver Riddle         emitError(locAttr, "test diagnostic");
56d1baf289SRiver Riddle     });
57d1baf289SRiver Riddle   }
58d1baf289SRiver Riddle 
59d1baf289SRiver Riddle   ListOption<std::string> filters{
606edef135SRiver Riddle       *this, "filters",
61d1baf289SRiver Riddle       llvm::cl::desc("Specifies the diagnostic file name filters.")};
62d1baf289SRiver Riddle };
63d1baf289SRiver Riddle 
64be0a7e9fSMehdi Amini } // namespace
65d1baf289SRiver Riddle 
66d1baf289SRiver Riddle namespace mlir {
67d1baf289SRiver Riddle namespace test {
registerTestDiagnosticsPass()68d1baf289SRiver Riddle void registerTestDiagnosticsPass() {
698b8f5c54SMehdi Amini   PassRegistration<TestDiagnosticFilterPass>{};
70d1baf289SRiver Riddle }
71d1baf289SRiver Riddle } // namespace test
72d1baf289SRiver Riddle } // namespace mlir
73