Skip to content
This repository was archived by the owner on Oct 11, 2025. It is now read-only.

Commit 9ee3f7d

Browse files
authored
Revert "Revert "[mlir python] Add nanobind support (#119232)
Reverts revert #118517 after (hopefully) fixing builders (llvm/llvm-zorg#328, llvm/llvm-zorg#327) This reverts commit 5f5b11f.
1 parent d557b31 commit 9ee3f7d

File tree

8 files changed

+770
-55
lines changed

8 files changed

+770
-55
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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 <cassert>
13+
#include <string>
14+
15+
#include "mlir-c/Diagnostics.h"
16+
#include "mlir-c/IR.h"
17+
#include "llvm/ADT/StringRef.h"
18+
19+
namespace mlir {
20+
namespace python {
21+
22+
/// RAII scope intercepting all diagnostics into a string. The message must be
23+
/// checked before this goes out of scope.
24+
class CollectDiagnosticsToStringScope {
25+
public:
26+
explicit CollectDiagnosticsToStringScope(MlirContext ctx) : context(ctx) {
27+
handlerID = mlirContextAttachDiagnosticHandler(ctx, &handler, &errorMessage,
28+
/*deleteUserData=*/nullptr);
29+
}
30+
~CollectDiagnosticsToStringScope() {
31+
assert(errorMessage.empty() && "unchecked error message");
32+
mlirContextDetachDiagnosticHandler(context, handlerID);
33+
}
34+
35+
[[nodiscard]] std::string takeMessage() { return std::move(errorMessage); }
36+
37+
private:
38+
static MlirLogicalResult handler(MlirDiagnostic diag, void *data) {
39+
auto printer = +[](MlirStringRef message, void *data) {
40+
*static_cast<std::string *>(data) +=
41+
llvm::StringRef(message.data, message.length);
42+
};
43+
MlirLocation loc = mlirDiagnosticGetLocation(diag);
44+
*static_cast<std::string *>(data) += "at ";
45+
mlirLocationPrint(loc, printer, data);
46+
*static_cast<std::string *>(data) += ": ";
47+
mlirDiagnosticPrint(diag, printer, data);
48+
return mlirLogicalResultSuccess();
49+
}
50+
51+
MlirContext context;
52+
MlirDiagnosticHandlerID handlerID;
53+
std::string errorMessage = "";
54+
};
55+
56+
} // namespace python
57+
} // namespace mlir
58+
59+
#endif // MLIR_BINDINGS_PYTHON_DIAGNOSTICS_H

0 commit comments

Comments
 (0)