MLIR  21.0.0git
Diagnostics.h
Go to the documentation of this file.
1 //===- Diagnostics.h - Helpers for diagnostics in Python bindings ---------===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef MLIR_BINDINGS_PYTHON_DIAGNOSTICS_H
10 #define MLIR_BINDINGS_PYTHON_DIAGNOSTICS_H
11 
12 #include "mlir-c/Diagnostics.h"
13 #include "mlir-c/IR.h"
14 #include "llvm/Support/raw_ostream.h"
15 
16 #include <cassert>
17 #include <cstdint>
18 #include <string>
19 
20 namespace mlir {
21 namespace python {
22 
23 /// RAII scope intercepting all diagnostics into a string. The message must be
24 /// checked before this goes out of scope.
26 public:
27  explicit CollectDiagnosticsToStringScope(MlirContext ctx) : context(ctx) {
28  handlerID =
29  mlirContextAttachDiagnosticHandler(ctx, &handler, &messageStream,
30  /*deleteUserData=*/nullptr);
31  }
33  assert(message.empty() && "unchecked error message");
34  mlirContextDetachDiagnosticHandler(context, handlerID);
35  }
36 
37  [[nodiscard]] std::string takeMessage() {
38  std::string newMessage;
39  std::swap(message, newMessage);
40  return newMessage;
41  }
42 
43 private:
44  static MlirLogicalResult handler(MlirDiagnostic diag, void *data) {
45  auto printer = +[](MlirStringRef message, void *data) {
46  *static_cast<llvm::raw_string_ostream *>(data)
47  << std::string_view(message.data, message.length);
48  };
49  MlirLocation loc = mlirDiagnosticGetLocation(diag);
50  *static_cast<llvm::raw_string_ostream *>(data) << "at ";
51  mlirLocationPrint(loc, printer, data);
52  *static_cast<llvm::raw_string_ostream *>(data) << ": ";
53  mlirDiagnosticPrint(diag, printer, data);
54  for (intptr_t i = 0; i < mlirDiagnosticGetNumNotes(diag); i++) {
55  *static_cast<llvm::raw_string_ostream *>(data) << "\n";
57  handler(note, data);
58  }
59  return mlirLogicalResultSuccess();
60  }
61 
62  MlirContext context;
63  MlirDiagnosticHandlerID handlerID;
64 
65  std::string message;
66  llvm::raw_string_ostream messageStream{message};
67 };
68 
69 } // namespace python
70 } // namespace mlir
71 
72 #endif // MLIR_BINDINGS_PYTHON_DIAGNOSTICS_H
static std::string diag(const llvm::Value &value)
RAII scope intercepting all diagnostics into a string.
Definition: Diagnostics.h:25
MLIR_CAPI_EXPORTED intptr_t mlirDiagnosticGetNumNotes(MlirDiagnostic diagnostic)
Returns the number of notes attached to the diagnostic.
Definition: Diagnostics.cpp:44
MLIR_CAPI_EXPORTED void mlirDiagnosticPrint(MlirDiagnostic diagnostic, MlirStringCallback callback, void *userData)
Prints a diagnostic using the provided callback.
Definition: Diagnostics.cpp:18
MLIR_CAPI_EXPORTED MlirDiagnostic mlirDiagnosticGetNote(MlirDiagnostic diagnostic, intptr_t pos)
Returns pos-th note attached to the diagnostic.
Definition: Diagnostics.cpp:50
MLIR_CAPI_EXPORTED MlirDiagnosticHandlerID mlirContextAttachDiagnosticHandler(MlirContext context, MlirDiagnosticHandler handler, void *userData, void(*deleteUserData)(void *))
Attaches the diagnostic handler to the context.
Definition: Diagnostics.cpp:56
MLIR_CAPI_EXPORTED void mlirContextDetachDiagnosticHandler(MlirContext context, MlirDiagnosticHandlerID id)
Detaches an attached diagnostic handler from the context given its identifier.
Definition: Diagnostics.cpp:72
uint64_t MlirDiagnosticHandlerID
Opaque identifier of a diagnostic handler, useful to detach a handler.
Definition: Diagnostics.h:41
MLIR_CAPI_EXPORTED MlirLocation mlirDiagnosticGetLocation(MlirDiagnostic diagnostic)
Returns the location at which the diagnostic is reported.
Definition: Diagnostics.cpp:24
MLIR_CAPI_EXPORTED void mlirLocationPrint(MlirLocation location, MlirStringCallback callback, void *userData)
Prints a location by sending chunks of the string representation and forwarding userData tocallback`.
Definition: IR.cpp:415
static MlirLogicalResult mlirLogicalResultSuccess(void)
Creates a logical result representing a success.
Definition: Support.h:132
Include the generated interface declarations.
An opaque reference to a diagnostic, always owned by the diagnostics engine (context).
Definition: Diagnostics.h:26
A logical result value, essentially a boolean with named states.
Definition: Support.h:116
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition: Support.h:73
const char * data
Pointer to the first symbol.
Definition: Support.h:74
size_t length
Length of the fragment.
Definition: Support.h:75