1*12dba4d4Sweiwei chen //===- TestDiagnosticsMetadata.cpp - Test Diagnostic Metatdata ------------===// 2*12dba4d4Sweiwei chen // 3*12dba4d4Sweiwei chen // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*12dba4d4Sweiwei chen // See https://llvm.org/LICENSE.txt for license information. 5*12dba4d4Sweiwei chen // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*12dba4d4Sweiwei chen // 7*12dba4d4Sweiwei chen //===----------------------------------------------------------------------===// 8*12dba4d4Sweiwei chen // 9*12dba4d4Sweiwei chen // This file contains test passes for constructing and resolving dominance 10*12dba4d4Sweiwei chen // information. 11*12dba4d4Sweiwei chen // 12*12dba4d4Sweiwei chen //===----------------------------------------------------------------------===// 13*12dba4d4Sweiwei chen 14*12dba4d4Sweiwei chen #include "mlir/IR/SymbolTable.h" 15*12dba4d4Sweiwei chen #include "mlir/Pass/Pass.h" 16*12dba4d4Sweiwei chen #include "llvm/Support/SourceMgr.h" 17*12dba4d4Sweiwei chen 18*12dba4d4Sweiwei chen using namespace mlir; 19*12dba4d4Sweiwei chen 20*12dba4d4Sweiwei chen namespace { 21*12dba4d4Sweiwei chen struct TestDiagnosticMetadataPass 22*12dba4d4Sweiwei chen : public PassWrapper<TestDiagnosticMetadataPass, 23*12dba4d4Sweiwei chen InterfacePass<SymbolOpInterface>> { 24*12dba4d4Sweiwei chen MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestDiagnosticMetadataPass) 25*12dba4d4Sweiwei chen 26*12dba4d4Sweiwei chen StringRef getArgument() const final { return "test-diagnostic-metadata"; } 27*12dba4d4Sweiwei chen StringRef getDescription() const final { return "Test diagnostic metadata."; } 28*12dba4d4Sweiwei chen TestDiagnosticMetadataPass() = default; 29*12dba4d4Sweiwei chen TestDiagnosticMetadataPass(const TestDiagnosticMetadataPass &) {} 30*12dba4d4Sweiwei chen 31*12dba4d4Sweiwei chen void runOnOperation() override { 32*12dba4d4Sweiwei chen llvm::errs() << "Test '" << getOperation().getName() << "'\n"; 33*12dba4d4Sweiwei chen 34*12dba4d4Sweiwei chen // Build a diagnostic handler that has filtering capabilities. 35*12dba4d4Sweiwei chen ScopedDiagnosticHandler handler(&getContext(), [](mlir::Diagnostic &diag) { 36*12dba4d4Sweiwei chen return mlir::success( 37*12dba4d4Sweiwei chen llvm::none_of(diag.getMetadata(), [](mlir::DiagnosticArgument &arg) { 38*12dba4d4Sweiwei chen return arg.getKind() == mlir::DiagnosticArgument:: 39*12dba4d4Sweiwei chen DiagnosticArgumentKind::String && 40*12dba4d4Sweiwei chen arg.getAsString().contains("hello"); 41*12dba4d4Sweiwei chen })); 42*12dba4d4Sweiwei chen }); 43*12dba4d4Sweiwei chen 44*12dba4d4Sweiwei chen // Emit a diagnostic for every operation with a valid loc. 45*12dba4d4Sweiwei chen getOperation()->walk([&](Operation *op) { 46*12dba4d4Sweiwei chen if (StringAttr strAttr = op->getAttrOfType<StringAttr>("attr")) { 47*12dba4d4Sweiwei chen if (strAttr.getValue() == "emit_error") 48*12dba4d4Sweiwei chen emitError(op->getLoc(), "test diagnostic metadata") 49*12dba4d4Sweiwei chen .getUnderlyingDiagnostic() 50*12dba4d4Sweiwei chen ->getMetadata() 51*12dba4d4Sweiwei chen .push_back(DiagnosticArgument("hello")); 52*12dba4d4Sweiwei chen } 53*12dba4d4Sweiwei chen }); 54*12dba4d4Sweiwei chen } 55*12dba4d4Sweiwei chen }; 56*12dba4d4Sweiwei chen 57*12dba4d4Sweiwei chen } // namespace 58*12dba4d4Sweiwei chen 59*12dba4d4Sweiwei chen namespace mlir { 60*12dba4d4Sweiwei chen namespace test { 61*12dba4d4Sweiwei chen void registerTestDiagnosticsMetadataPass() { 62*12dba4d4Sweiwei chen PassRegistration<TestDiagnosticMetadataPass>{}; 63*12dba4d4Sweiwei chen } 64*12dba4d4Sweiwei chen } // namespace test 65*12dba4d4Sweiwei chen } // namespace mlir 66