73 lines · cpp
1//===- TestDiagnostics.cpp - Test Diagnostic Utilities --------------------===//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// This file contains test passes for constructing and resolving dominance10// information.11//12//===----------------------------------------------------------------------===//13 14#include "mlir/IR/SymbolTable.h"15#include "mlir/Pass/Pass.h"16#include "llvm/Support/SourceMgr.h"17 18using namespace mlir;19 20namespace {21struct TestDiagnosticFilterPass22 : public PassWrapper<TestDiagnosticFilterPass,23 InterfacePass<SymbolOpInterface>> {24 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestDiagnosticFilterPass)25 26 StringRef getArgument() const final { return "test-diagnostic-filter"; }27 StringRef getDescription() const final {28 return "Test diagnostic filtering support.";29 }30 TestDiagnosticFilterPass() = default;31 TestDiagnosticFilterPass(const TestDiagnosticFilterPass &) {}32 33 void runOnOperation() override {34 llvm::errs() << "Test '" << getOperation().getName() << "'\n";35 36 // Build a diagnostic handler that has filtering capabilities.37 auto filterFn = [&](Location loc) {38 // Ignore non-file locations.39 FileLineColLoc fileLoc = dyn_cast<FileLineColLoc>(loc);40 if (!fileLoc)41 return true;42 43 // Don't show file locations if their name contains a filter.44 return llvm::none_of(filters, [&](StringRef filter) {45 return fileLoc.getFilename().strref().contains(filter);46 });47 };48 llvm::SourceMgr sourceMgr;49 SourceMgrDiagnosticHandler handler(sourceMgr, &getContext(), llvm::errs(),50 filterFn);51 52 // Emit a diagnostic for every operation with a valid loc.53 getOperation()->walk([&](Operation *op) {54 if (LocationAttr locAttr = op->getAttrOfType<LocationAttr>("test.loc"))55 emitError(locAttr, "test diagnostic");56 });57 }58 59 ListOption<std::string> filters{60 *this, "filters",61 llvm::cl::desc("Specifies the diagnostic file name filters.")};62};63 64} // namespace65 66namespace mlir {67namespace test {68void registerTestDiagnosticsPass() {69 PassRegistration<TestDiagnosticFilterPass>{};70}71} // namespace test72} // namespace mlir73