1 //===-- mlir-c/Diagnostics.h - MLIR Diagnostic subsystem C API ----*- C -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 // This header declares the C APIs accessing MLIR Diagnostics subsystem.
12 //===----------------------------------------------------------------------===//
14 #ifndef MLIR_C_DIAGNOSTICS_H
15 #define MLIR_C_DIAGNOSTICS_H
17 #include "mlir-c/IR.h"
18 #include "mlir-c/Support.h"
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
{
29 typedef struct MlirDiagnostic MlirDiagnostic
;
31 /// Severity of a diagnostic.
32 enum MlirDiagnosticSeverity
{
34 MlirDiagnosticWarning
,
38 typedef enum MlirDiagnosticSeverity MlirDiagnosticSeverity
;
40 /// Opaque identifier of a diagnostic handler, useful to detach a handler.
41 typedef uint64_t MlirDiagnosticHandlerID
;
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
,
52 /// Prints a diagnostic using the provided callback.
53 MLIR_CAPI_EXPORTED
void mlirDiagnosticPrint(MlirDiagnostic diagnostic
,
54 MlirStringCallback callback
,
57 /// Returns the location at which the diagnostic is reported.
58 MLIR_CAPI_EXPORTED MlirLocation
59 mlirDiagnosticGetLocation(MlirDiagnostic diagnostic
);
61 /// Returns the severity of the diagnostic.
62 MLIR_CAPI_EXPORTED MlirDiagnosticSeverity
63 mlirDiagnosticGetSeverity(MlirDiagnostic diagnostic
);
65 /// Returns the number of notes attached to the diagnostic.
66 MLIR_CAPI_EXPORTED
intptr_t
67 mlirDiagnosticGetNumNotes(MlirDiagnostic diagnostic
);
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
);
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.
82 MLIR_CAPI_EXPORTED MlirDiagnosticHandlerID
mlirContextAttachDiagnosticHandler(
83 MlirContext context
, MlirDiagnosticHandler handler
, void *userData
,
84 void (*deleteUserData
)(void *));
86 /// Detaches an attached diagnostic handler from the context given its
88 MLIR_CAPI_EXPORTED
void
89 mlirContextDetachDiagnosticHandler(MlirContext context
,
90 MlirDiagnosticHandlerID id
);
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
,
101 #endif // MLIR_C_DIAGNOSTICS_H