xref: /llvm-project/mlir/lib/Dialect/Transform/DebugExtension/DebugExtensionOps.cpp (revision 884221eddb9d395830704fac79fd04008e02e368)
12798b72aSOleksandr "Alex" Zinenko //===- DebugExtensionOps.cpp - Debug extension for the Transform dialect --===//
22798b72aSOleksandr "Alex" Zinenko //
32798b72aSOleksandr "Alex" Zinenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42798b72aSOleksandr "Alex" Zinenko // See https://llvm.org/LICENSE.txt for license information.
52798b72aSOleksandr "Alex" Zinenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62798b72aSOleksandr "Alex" Zinenko //
72798b72aSOleksandr "Alex" Zinenko //===----------------------------------------------------------------------===//
82798b72aSOleksandr "Alex" Zinenko 
92798b72aSOleksandr "Alex" Zinenko #include "mlir/Dialect/Transform/DebugExtension/DebugExtensionOps.h"
102798b72aSOleksandr "Alex" Zinenko 
112798b72aSOleksandr "Alex" Zinenko #include "mlir/Dialect/Transform/IR/TransformDialect.h"
122798b72aSOleksandr "Alex" Zinenko #include "mlir/Dialect/Transform/IR/TransformTypes.h"
132798b72aSOleksandr "Alex" Zinenko #include "mlir/IR/OpImplementation.h"
142798b72aSOleksandr "Alex" Zinenko 
152798b72aSOleksandr "Alex" Zinenko using namespace mlir;
162798b72aSOleksandr "Alex" Zinenko 
172798b72aSOleksandr "Alex" Zinenko #define GET_OP_CLASSES
182798b72aSOleksandr "Alex" Zinenko #include "mlir/Dialect/Transform/DebugExtension/DebugExtensionOps.cpp.inc"
192798b72aSOleksandr "Alex" Zinenko 
202798b72aSOleksandr "Alex" Zinenko DiagnosedSilenceableFailure
212798b72aSOleksandr "Alex" Zinenko transform::DebugEmitRemarkAtOp::apply(transform::TransformRewriter &rewriter,
222798b72aSOleksandr "Alex" Zinenko                                       transform::TransformResults &results,
232798b72aSOleksandr "Alex" Zinenko                                       transform::TransformState &state) {
24a5757c5bSChristian Sigg   if (isa<TransformHandleTypeInterface>(getAt().getType())) {
252798b72aSOleksandr "Alex" Zinenko     auto payload = state.getPayloadOps(getAt());
262798b72aSOleksandr "Alex" Zinenko     for (Operation *op : payload)
272798b72aSOleksandr "Alex" Zinenko       op->emitRemark() << getMessage();
282798b72aSOleksandr "Alex" Zinenko     return DiagnosedSilenceableFailure::success();
292798b72aSOleksandr "Alex" Zinenko   }
302798b72aSOleksandr "Alex" Zinenko 
31a5757c5bSChristian Sigg   assert(isa<transform::TransformValueHandleTypeInterface>(getAt().getType()) &&
322798b72aSOleksandr "Alex" Zinenko          "unhandled kind of transform type");
332798b72aSOleksandr "Alex" Zinenko 
342798b72aSOleksandr "Alex" Zinenko   auto describeValue = [](Diagnostic &os, Value value) {
352798b72aSOleksandr "Alex" Zinenko     os << "value handle points to ";
362798b72aSOleksandr "Alex" Zinenko     if (auto arg = llvm::dyn_cast<BlockArgument>(value)) {
372798b72aSOleksandr "Alex" Zinenko       os << "a block argument #" << arg.getArgNumber() << " in block #"
382798b72aSOleksandr "Alex" Zinenko          << std::distance(arg.getOwner()->getParent()->begin(),
392798b72aSOleksandr "Alex" Zinenko                           arg.getOwner()->getIterator())
402798b72aSOleksandr "Alex" Zinenko          << " in region #" << arg.getOwner()->getParent()->getRegionNumber();
412798b72aSOleksandr "Alex" Zinenko     } else {
422798b72aSOleksandr "Alex" Zinenko       os << "an op result #" << llvm::cast<OpResult>(value).getResultNumber();
432798b72aSOleksandr "Alex" Zinenko     }
442798b72aSOleksandr "Alex" Zinenko   };
452798b72aSOleksandr "Alex" Zinenko 
462798b72aSOleksandr "Alex" Zinenko   for (Value value : state.getPayloadValues(getAt())) {
472798b72aSOleksandr "Alex" Zinenko     InFlightDiagnostic diag = ::emitRemark(value.getLoc()) << getMessage();
482798b72aSOleksandr "Alex" Zinenko     describeValue(diag.attachNote(), value);
492798b72aSOleksandr "Alex" Zinenko   }
502798b72aSOleksandr "Alex" Zinenko 
512798b72aSOleksandr "Alex" Zinenko   return DiagnosedSilenceableFailure::success();
522798b72aSOleksandr "Alex" Zinenko }
532798b72aSOleksandr "Alex" Zinenko 
542798b72aSOleksandr "Alex" Zinenko DiagnosedSilenceableFailure transform::DebugEmitParamAsRemarkOp::apply(
552798b72aSOleksandr "Alex" Zinenko     transform::TransformRewriter &rewriter,
562798b72aSOleksandr "Alex" Zinenko     transform::TransformResults &results, transform::TransformState &state) {
572798b72aSOleksandr "Alex" Zinenko   std::string str;
582798b72aSOleksandr "Alex" Zinenko   llvm::raw_string_ostream os(str);
592798b72aSOleksandr "Alex" Zinenko   if (getMessage())
602798b72aSOleksandr "Alex" Zinenko     os << *getMessage() << " ";
612798b72aSOleksandr "Alex" Zinenko   llvm::interleaveComma(state.getParams(getParam()), os);
622798b72aSOleksandr "Alex" Zinenko   if (!getAnchor()) {
63*884221edSJOE1994     emitRemark() << str;
642798b72aSOleksandr "Alex" Zinenko     return DiagnosedSilenceableFailure::success();
652798b72aSOleksandr "Alex" Zinenko   }
662798b72aSOleksandr "Alex" Zinenko   for (Operation *payload : state.getPayloadOps(getAnchor()))
67*884221edSJOE1994     ::mlir::emitRemark(payload->getLoc()) << str;
682798b72aSOleksandr "Alex" Zinenko   return DiagnosedSilenceableFailure::success();
692798b72aSOleksandr "Alex" Zinenko }
70