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 Riddlevoid registerTestDiagnosticsPass() { 698b8f5c54SMehdi Amini PassRegistration<TestDiagnosticFilterPass>{}; 70d1baf289SRiver Riddle } 71d1baf289SRiver Riddle } // namespace test 72d1baf289SRiver Riddle } // namespace mlir 73