1 | //===-- mlir-c/Diagnostics.h - MLIR Diagnostic subsystem C API ----*- C -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM |
4 | // Exceptions. |
5 | // See https://llvm.org/LICENSE.txt for license information. |
6 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
7 | // |
8 | //===----------------------------------------------------------------------===// |
9 | // |
10 | // This header declares the C APIs accessing MLIR Diagnostics subsystem. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef MLIR_C_DIAGNOSTICS_H |
15 | #define MLIR_C_DIAGNOSTICS_H |
16 | |
17 | #include "mlir-c/IR.h" |
18 | #include "mlir-c/Support.h" |
19 | |
20 | #ifdef __cplusplus |
21 | extern "C" { |
22 | #endif |
23 | |
24 | /// An opaque reference to a diagnostic, always owned by the diagnostics engine |
25 | /// (context). Must not be stored outside of the diagnostic handler. |
26 | struct MlirDiagnostic { |
27 | void *ptr; |
28 | }; |
29 | typedef struct MlirDiagnostic MlirDiagnostic; |
30 | |
31 | /// Severity of a diagnostic. |
32 | enum MlirDiagnosticSeverity { |
33 | MlirDiagnosticError, |
34 | MlirDiagnosticWarning, |
35 | MlirDiagnosticNote, |
36 | |
37 | }; |
38 | typedef enum MlirDiagnosticSeverity MlirDiagnosticSeverity; |
39 | |
40 | /// Opaque identifier of a diagnostic handler, useful to detach a handler. |
41 | typedef uint64_t MlirDiagnosticHandlerID; |
42 | |
43 | /// Diagnostic handler type. Accepts a reference to a diagnostic, which is only |
44 | /// guaranteed to be live during the call. The handler is passed the `userData` |
45 | /// that was provided when the handler was attached to a context. If the handler |
46 | /// processed the diagnostic completely, it is expected to return success. |
47 | /// Otherwise, it is expected to return failure to indicate that other handlers |
48 | /// should attempt to process the diagnostic. |
49 | typedef MlirLogicalResult (*MlirDiagnosticHandler)(MlirDiagnostic, |
50 | void *userData); |
51 | |
52 | /// Prints a diagnostic using the provided callback. |
53 | MLIR_CAPI_EXPORTED void mlirDiagnosticPrint(MlirDiagnostic diagnostic, |
54 | MlirStringCallback callback, |
55 | void *userData); |
56 | |
57 | /// Returns the location at which the diagnostic is reported. |
58 | MLIR_CAPI_EXPORTED MlirLocation |
59 | mlirDiagnosticGetLocation(MlirDiagnostic diagnostic); |
60 | |
61 | /// Returns the severity of the diagnostic. |
62 | MLIR_CAPI_EXPORTED MlirDiagnosticSeverity |
63 | mlirDiagnosticGetSeverity(MlirDiagnostic diagnostic); |
64 | |
65 | /// Returns the number of notes attached to the diagnostic. |
66 | MLIR_CAPI_EXPORTED intptr_t |
67 | mlirDiagnosticGetNumNotes(MlirDiagnostic diagnostic); |
68 | |
69 | /// Returns `pos`-th note attached to the diagnostic. Expects `pos` to be a |
70 | /// valid zero-based index into the list of notes. |
71 | MLIR_CAPI_EXPORTED MlirDiagnostic |
72 | mlirDiagnosticGetNote(MlirDiagnostic diagnostic, intptr_t pos); |
73 | |
74 | /// Attaches the diagnostic handler to the context. Handlers are invoked in the |
75 | /// reverse order of attachment until one of them processes the diagnostic |
76 | /// completely. When a handler is invoked it is passed the `userData` that was |
77 | /// provided when it was attached. If non-NULL, `deleteUserData` is called once |
78 | /// the system no longer needs to call the handler (for instance after the |
79 | /// handler is detached or the context is destroyed). Returns an identifier that |
80 | /// can be used to detach the handler. |
81 | |
82 | MLIR_CAPI_EXPORTED MlirDiagnosticHandlerID mlirContextAttachDiagnosticHandler( |
83 | MlirContext context, MlirDiagnosticHandler handler, void *userData, |
84 | void (*deleteUserData)(void *)); |
85 | |
86 | /// Detaches an attached diagnostic handler from the context given its |
87 | /// identifier. |
88 | MLIR_CAPI_EXPORTED void |
89 | mlirContextDetachDiagnosticHandler(MlirContext context, |
90 | MlirDiagnosticHandlerID id); |
91 | |
92 | /// Emits an error at the given location through the diagnostics engine. Used |
93 | /// for testing purposes. |
94 | MLIR_CAPI_EXPORTED void mlirEmitError(MlirLocation location, |
95 | const char *message); |
96 | |
97 | #ifdef __cplusplus |
98 | } |
99 | #endif |
100 | |
101 | #endif // MLIR_C_DIAGNOSTICS_H |
102 | |