xref: /llvm-project/mlir/test/lib/IR/TestDiagnosticsMetadata.cpp (revision 12dba4d48461c571cb5bdb7c3ac6078b9a357a02)
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