//===- Diagnostics.cpp - C Interface for MLIR Diagnostics -----------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "mlir-c/Diagnostics.h" #include "mlir/CAPI/Diagnostics.h" #include "mlir/CAPI/IR.h" #include "mlir/CAPI/Support.h" #include "mlir/CAPI/Utils.h" #include "mlir/IR/Diagnostics.h" using namespace mlir; void mlirDiagnosticPrint(MlirDiagnostic diagnostic, MlirStringCallback callback, void *userData) { detail::CallbackOstream stream(callback, userData); unwrap(diagnostic).print(stream); } MlirLocation mlirDiagnosticGetLocation(MlirDiagnostic diagnostic) { return wrap(unwrap(diagnostic).getLocation()); } MlirDiagnosticSeverity mlirDiagnosticGetSeverity(MlirDiagnostic diagnostic) { switch (unwrap(diagnostic).getSeverity()) { case mlir::DiagnosticSeverity::Error: return MlirDiagnosticError; case mlir::DiagnosticSeverity::Warning: return MlirDiagnosticWarning; case mlir::DiagnosticSeverity::Note: return MlirDiagnosticNote; case mlir::DiagnosticSeverity::Remark: return MlirDiagnosticRemark; } llvm_unreachable("unhandled diagnostic severity"); } // Notes are stored in a vector, so note iterator range is a pair of // random access iterators, for which it is cheap to compute the size. intptr_t mlirDiagnosticGetNumNotes(MlirDiagnostic diagnostic) { return static_cast(llvm::size(unwrap(diagnostic).getNotes())); } // Notes are stored in a vector, so the iterator is a random access iterator, // cheap to advance multiple steps at a time. MlirDiagnostic mlirDiagnosticGetNote(MlirDiagnostic diagnostic, intptr_t pos) { return wrap(*std::next(unwrap(diagnostic).getNotes().begin(), pos)); } static void deleteUserDataNoop(void *userData) {} MlirDiagnosticHandlerID mlirContextAttachDiagnosticHandler( MlirContext context, MlirDiagnosticHandler handler, void *userData, void (*deleteUserData)(void *)) { assert(handler && "unexpected null diagnostic handler"); if (deleteUserData == NULL) deleteUserData = deleteUserDataNoop; std::shared_ptr sharedUserData(userData, deleteUserData); DiagnosticEngine::HandlerID id = unwrap(context)->getDiagEngine().registerHandler( [handler, sharedUserData](Diagnostic &diagnostic) { return unwrap(handler(wrap(diagnostic), sharedUserData.get())); }); return static_cast(id); } void mlirContextDetachDiagnosticHandler(MlirContext context, MlirDiagnosticHandlerID id) { unwrap(context)->getDiagEngine().eraseHandler( static_cast(id)); } void mlirEmitError(MlirLocation location, const char *message) { emitError(unwrap(location)) << message; }