23 #include "llvm/ADT/ArrayRef.h"
24 #include "llvm/ADT/SmallVector.h"
27 using namespace nb::literals;
32 using llvm::StringRef;
40 R
"(Parses the assembly form of a type.
42 Returns a Type object or raises an MLIRError if the type cannot be parsed.
44 See also: https://mlir.llvm.org/docs/LangRef/#type-system
48 R
"(Gets a Location representing a caller and callsite)";
51 R
"(Gets a Location representing a file, line and column)";
54 R
"(Gets a Location representing a file, line and column range)";
57 R
"(Gets a Location representing a fused location with optional metadata)";
60 R
"(Gets a Location representing a named location with optional child location)";
63 R
"(Parses a module's assembly format from a string.
65 Returns a new MlirModule or raises an MLIRError if the parsing fails.
67 See also: https://mlir.llvm.org/docs/LangRef/
71 R
"(Creates a new operation.
74 name: Operation name (e.g. "dialect.operation").
75 results: Sequence of Type representing op result types.
76 attributes: Dict of str:Attribute.
77 successors: List of Block for the operation's successors.
78 regions: Number of regions to create.
79 location: A Location object (defaults to resolve from context manager).
80 ip: An InsertionPoint (defaults to resolve from context manager or set to
81 False to disable insertion, even with an insertion point set in the
83 infer_type: Whether to infer result types.
85 A new "detached" Operation object. Detached operations can be added
86 to blocks, which causes them to become "attached."
90 R
"(Prints the assembly form of the operation to a file like object.
93 file: The file like object to write to. Defaults to sys.stdout.
94 binary: Whether to write bytes (True) or str (False). Defaults to False.
95 large_elements_limit: Whether to elide elements attributes above this
96 number of elements. Defaults to None (no limit).
97 enable_debug_info: Whether to print debug/location information. Defaults
99 pretty_debug_info: Whether to format debug information for easier reading
100 by a human (warning: the result is unparseable).
101 print_generic_op_form: Whether to print the generic assembly forms of all
102 ops. Defaults to False.
103 use_local_Scope: Whether to print in a way that is more optimized for
104 multi-threaded access but may not be consistent with how the overall
106 assume_verified: By default, if not printing generic form, the verifier
107 will be run and if it fails, generic form will be printed with a comment
108 about failed verification. While a reasonable default for interactive use,
109 for systematic use, it is often better for the caller to verify explicitly
110 and report failures in a more robust fashion. Set this to True if doing this
111 in order to avoid running a redundant verification. If the IR is actually
112 invalid, behavior is undefined.
113 skip_regions: Whether to skip printing regions. Defaults to False.
117 R
"(Prints the assembly form of the operation to a file like object.
120 file: The file like object to write to. Defaults to sys.stdout.
121 binary: Whether to write bytes (True) or str (False). Defaults to False.
122 state: AsmState capturing the operation numbering and flags.
126 R
"(Gets the assembly form of the operation with all options available.
129 binary: Whether to return a bytes (True) or str (False) object. Defaults to
131 ... others ...: See the print() method for common keyword arguments for
132 configuring the printout.
134 Either a bytes or str object, depending on the setting of the 'binary'
139 R
"(Write the bytecode form of the operation to a file like object.
142 file: The file like object to write to.
143 desired_version: The version of bytecode to emit.
145 The bytecode writer status.
149 R
"(Gets the assembly form of the operation with default options.
151 If more advanced control over the assembly formatting or I/O options is needed,
152 use the dedicated print or get_asm method, which supports keyword arguments to
157 R
"(Dumps a debug representation of the object to stderr.)";
160 R
"(Appends a new block, with argument types as positional args.
167 R
"(Returns the string form of the value.
169 If the value is a block argument, this is the assembly form of its type and the
170 position in the argument list. If the value is an operation result, this is
171 equivalent to printing the operation that produced it.
175 R
"(Returns the string form of value as an operand (i.e., the ValueID).
179 R
"(Replace all uses of value with the new value, updating anything in
180 the IR that uses 'self' to use the other value instead.
184 R
"("Replace all uses of this value with the 'with' value, except for those
185 in 'exceptions'. 'exceptions' can be either a single operation or a list of
194 template <
class Func,
typename... Args>
196 nb::object cf = nb::cpp_function(f, args...);
197 return nb::borrow<nb::object>((PyClassMethod_New(cf.ptr())));
202 nb::object dialectDescriptor) {
203 auto dialectClass =
PyGlobals::get().lookupDialectClass(dialectNamespace);
206 return nb::cast(
PyDialect(std::move(dialectDescriptor)));
210 return (*dialectClass)(std::move(dialectDescriptor));
228 const std::optional<nb::sequence> &pyArgLocs) {
230 argTypes.reserve(nb::len(pyArgTypes));
231 for (
const auto &pyType : pyArgTypes)
232 argTypes.push_back(nb::cast<PyType &>(pyType));
236 argLocs.reserve(nb::len(*pyArgLocs));
237 for (
const auto &pyLoc : *pyArgLocs)
238 argLocs.push_back(nb::cast<PyLocation &>(pyLoc));
239 }
else if (!argTypes.empty()) {
240 argLocs.assign(argTypes.size(), DefaultingPyLocation::resolve());
243 if (argTypes.size() != argLocs.size())
244 throw nb::value_error((
"Expected " + Twine(argTypes.size()) +
245 " locations, got: " + Twine(argLocs.size()))
248 return mlirBlockCreate(argTypes.size(), argTypes.data(), argLocs.data());
253 static void set(nb::object &o,
bool enable) {
254 nb::ft_lock_guard lock(mutex);
258 static bool get(
const nb::object &) {
259 nb::ft_lock_guard lock(mutex);
263 static void bind(nb::module_ &m) {
265 nb::class_<PyGlobalDebugFlag>(m,
"_GlobalDebug")
270 [](
const std::string &type) {
271 nb::ft_lock_guard lock(mutex);
274 "types"_a,
"Sets specific debug types to be produced by LLVM")
275 .def_static(
"set_types", [](
const std::vector<std::string> &types) {
276 std::vector<const char *> pointers;
277 pointers.reserve(types.size());
278 for (
const std::string &str : types)
279 pointers.push_back(str.c_str());
280 nb::ft_lock_guard lock(mutex);
286 static nb::ft_mutex mutex;
289 nb::ft_mutex PyGlobalDebugFlag::mutex;
293 return PyGlobals::get().lookupAttributeBuilder(attributeKind).has_value();
296 auto builder =
PyGlobals::get().lookupAttributeBuilder(attributeKind);
298 throw nb::key_error(attributeKind.c_str());
302 nb::callable func,
bool replace) {
303 PyGlobals::get().registerAttributeBuilder(attributeKind, std::move(func),
307 static void bind(nb::module_ &m) {
308 nb::class_<PyAttrBuilderMap>(m,
"AttrBuilder")
312 "attribute_kind"_a,
"attr_builder"_a,
"replace"_a =
false,
313 "Register an attribute builder for building MLIR "
314 "attributes from python values.");
322 nb::object PyBlock::getCapsule() {
332 class PyRegionIterator {
335 : operation(std::move(operation)) {}
337 PyRegionIterator &dunderIter() {
return *
this; }
342 throw nb::stop_iteration();
348 static void bind(nb::module_ &m) {
349 nb::class_<PyRegionIterator>(m,
"RegionIterator")
350 .def(
"__iter__", &PyRegionIterator::dunderIter)
351 .def(
"__next__", &PyRegionIterator::dunderNext);
363 PyRegionList(
PyOperationRef operation) : operation(std::move(operation)) {}
365 PyRegionIterator dunderIter() {
367 return PyRegionIterator(operation);
370 intptr_t dunderLen() {
371 operation->checkValid();
375 PyRegion dunderGetItem(intptr_t index) {
377 if (index < 0 || index >= dunderLen()) {
378 throw nb::index_error(
"attempt to access out of bounds region");
384 static void bind(nb::module_ &m) {
385 nb::class_<PyRegionList>(m,
"RegionSequence")
386 .def(
"__len__", &PyRegionList::dunderLen)
387 .def(
"__iter__", &PyRegionList::dunderIter)
388 .def(
"__getitem__", &PyRegionList::dunderGetItem);
395 class PyBlockIterator {
398 : operation(std::move(operation)), next(next) {}
400 PyBlockIterator &dunderIter() {
return *
this; }
405 throw nb::stop_iteration();
408 PyBlock returnBlock(operation, next);
413 static void bind(nb::module_ &m) {
414 nb::class_<PyBlockIterator>(m,
"BlockIterator")
415 .def(
"__iter__", &PyBlockIterator::dunderIter)
416 .def(
"__next__", &PyBlockIterator::dunderNext);
430 : operation(std::move(operation)), region(region) {}
432 PyBlockIterator dunderIter() {
437 intptr_t dunderLen() {
438 operation->checkValid();
448 PyBlock dunderGetItem(intptr_t index) {
451 throw nb::index_error(
"attempt to access out of bounds block");
456 return PyBlock(operation, block);
461 throw nb::index_error(
"attempt to access out of bounds block");
464 PyBlock appendBlock(
const nb::args &pyArgTypes,
465 const std::optional<nb::sequence> &pyArgLocs) {
468 createBlock(nb::cast<nb::sequence>(pyArgTypes), pyArgLocs);
470 return PyBlock(operation, block);
473 static void bind(nb::module_ &m) {
474 nb::class_<PyBlockList>(m,
"BlockList")
475 .def(
"__getitem__", &PyBlockList::dunderGetItem)
476 .def(
"__iter__", &PyBlockList::dunderIter)
477 .def(
"__len__", &PyBlockList::dunderLen)
479 nb::arg(
"args"), nb::kw_only(),
480 nb::arg(
"arg_locs") = std::nullopt);
488 class PyOperationIterator {
490 PyOperationIterator(
PyOperationRef parentOperation, MlirOperation next)
491 : parentOperation(std::move(parentOperation)), next(next) {}
493 PyOperationIterator &dunderIter() {
return *
this; }
495 nb::object dunderNext() {
498 throw nb::stop_iteration();
502 PyOperation::forOperation(parentOperation->getContext(), next);
507 static void bind(nb::module_ &m) {
508 nb::class_<PyOperationIterator>(m,
"OperationIterator")
509 .def(
"__iter__", &PyOperationIterator::dunderIter)
510 .def(
"__next__", &PyOperationIterator::dunderNext);
522 class PyOperationList {
525 : parentOperation(std::move(parentOperation)), block(block) {}
527 PyOperationIterator dunderIter() {
529 return PyOperationIterator(parentOperation,
533 intptr_t dunderLen() {
534 parentOperation->checkValid();
544 nb::object dunderGetItem(intptr_t index) {
545 parentOperation->checkValid();
547 throw nb::index_error(
"attempt to access out of bounds operation");
552 return PyOperation::forOperation(parentOperation->getContext(), childOp)
558 throw nb::index_error(
"attempt to access out of bounds operation");
561 static void bind(nb::module_ &m) {
562 nb::class_<PyOperationList>(m,
"OperationList")
563 .def(
"__getitem__", &PyOperationList::dunderGetItem)
564 .def(
"__iter__", &PyOperationList::dunderIter)
565 .def(
"__len__", &PyOperationList::dunderLen);
575 PyOpOperand(MlirOpOperand opOperand) : opOperand(opOperand) {}
577 nb::object getOwner() {
581 return PyOperation::forOperation(context, owner)->createOpView();
586 static void bind(nb::module_ &m) {
587 nb::class_<PyOpOperand>(m,
"OpOperand")
588 .def_prop_ro(
"owner", &PyOpOperand::getOwner)
589 .def_prop_ro(
"operand_number", &PyOpOperand::getOperandNumber);
593 MlirOpOperand opOperand;
596 class PyOpOperandIterator {
598 PyOpOperandIterator(MlirOpOperand opOperand) : opOperand(opOperand) {}
600 PyOpOperandIterator &dunderIter() {
return *
this; }
602 PyOpOperand dunderNext() {
604 throw nb::stop_iteration();
606 PyOpOperand returnOpOperand(opOperand);
608 return returnOpOperand;
611 static void bind(nb::module_ &m) {
612 nb::class_<PyOpOperandIterator>(m,
"OpOperandIterator")
613 .def(
"__iter__", &PyOpOperandIterator::dunderIter)
614 .def(
"__next__", &PyOpOperandIterator::dunderNext);
618 MlirOpOperand opOperand;
627 PyMlirContext::PyMlirContext(MlirContext context) : context(context) {
628 nb::gil_scoped_acquire acquire;
629 nb::ft_lock_guard lock(live_contexts_mutex);
630 auto &liveContexts = getLiveContexts();
631 liveContexts[context.ptr] =
this;
638 nb::gil_scoped_acquire acquire;
640 nb::ft_lock_guard lock(live_contexts_mutex);
641 getLiveContexts().erase(context.ptr);
653 throw nb::python_error();
658 nb::gil_scoped_acquire acquire;
659 nb::ft_lock_guard lock(live_contexts_mutex);
660 auto &liveContexts = getLiveContexts();
661 auto it = liveContexts.find(context.ptr);
662 if (it == liveContexts.end()) {
665 nb::object pyRef = nb::cast(unownedContextWrapper);
666 assert(pyRef &&
"cast to nb::object failed");
667 liveContexts[context.ptr] = unownedContextWrapper;
671 nb::object pyRef = nb::cast(it->second);
675 nb::ft_mutex PyMlirContext::live_contexts_mutex;
678 static LiveContextMap liveContexts;
683 nb::ft_lock_guard lock(live_contexts_mutex);
684 return getLiveContexts().size();
688 nb::ft_lock_guard lock(liveOperationsMutex);
689 return liveOperations.size();
693 std::vector<PyOperation *> liveObjects;
694 nb::ft_lock_guard lock(liveOperationsMutex);
695 for (
auto &entry : liveOperations)
696 liveObjects.push_back(entry.second.second);
704 nb::ft_lock_guard lock(liveOperationsMutex);
705 std::swap(operations, liveOperations);
707 for (
auto &op : operations)
708 op.second.second->setInvalid();
709 size_t numInvalidated = operations.size();
710 return numInvalidated;
716 nb::ft_lock_guard lock(liveOperationsMutex);
717 auto it = liveOperations.find(op.ptr);
718 if (it == liveOperations.end()) {
721 py_op = it->second.second;
722 liveOperations.erase(it);
737 callBackData *data =
static_cast<callBackData *
>(userData);
738 if (LLVM_LIKELY(data->rootSeen))
739 data->rootOp.getOperation().getContext()->clearOperation(op);
741 data->rootSeen =
true;
770 const nb::object &excVal,
771 const nb::object &excTb) {
780 nb::object pyHandlerObject =
781 nb::cast(pyHandler, nb::rv_policy::take_ownership);
782 pyHandlerObject.inc_ref();
786 auto handlerCallback =
789 nb::object pyDiagnosticObject =
790 nb::cast(pyDiagnostic, nb::rv_policy::take_ownership);
797 nb::gil_scoped_acquire gil;
799 result = nb::cast<bool>(pyHandler->callback(pyDiagnostic));
800 }
catch (std::exception &e) {
801 fprintf(stderr,
"MLIR Python Diagnostic handler raised exception: %s\n",
803 pyHandler->hadError =
true;
810 auto deleteCallback = +[](
void *userData) {
812 assert(pyHandler->registeredID &&
"handler is not registered");
813 pyHandler->registeredID.reset();
816 nb::object pyHandlerObject = nb::cast(pyHandler, nb::rv_policy::reference);
817 pyHandlerObject.dec_ref();
821 get(), handlerCallback,
static_cast<void *
>(pyHandler), deleteCallback);
822 return pyHandlerObject;
829 if (self->ctx->emitErrorDiagnostics)
842 throw std::runtime_error(
843 "An MLIR function requires a Context but none was provided in the call "
844 "or from the surrounding environment. Either pass to the function with "
845 "a 'context=' argument or establish a default using 'with Context():'");
855 static thread_local std::vector<PyThreadContextEntry> stack;
860 auto &stack = getStack();
863 return &stack.back();
866 void PyThreadContextEntry::push(FrameKind frameKind, nb::object context,
867 nb::object insertionPoint,
868 nb::object location) {
869 auto &stack = getStack();
870 stack.emplace_back(frameKind, std::move(context), std::move(insertionPoint),
871 std::move(location));
875 if (stack.size() > 1) {
876 auto &prev = *(stack.rbegin() + 1);
877 auto ¤t = stack.back();
878 if (current.context.is(prev.context)) {
880 if (!current.insertionPoint)
881 current.insertionPoint = prev.insertionPoint;
882 if (!current.location)
883 current.location = prev.location;
891 return nb::cast<PyMlirContext *>(context);
897 return nb::cast<PyInsertionPoint *>(insertionPoint);
903 return nb::cast<PyLocation *>(location);
907 auto *tos = getTopOfStack();
908 return tos ? tos->getContext() :
nullptr;
912 auto *tos = getTopOfStack();
913 return tos ? tos->getInsertionPoint() :
nullptr;
917 auto *tos = getTopOfStack();
918 return tos ? tos->getLocation() :
nullptr;
922 push(FrameKind::Context, context,
929 auto &stack = getStack();
931 throw std::runtime_error(
"Unbalanced Context enter/exit");
932 auto &tos = stack.back();
933 if (tos.frameKind != FrameKind::Context && tos.getContext() != &context)
934 throw std::runtime_error(
"Unbalanced Context enter/exit");
941 nb::cast<PyInsertionPoint &>(insertionPointObj);
942 nb::object contextObj =
944 push(FrameKind::InsertionPoint,
948 return insertionPointObj;
952 auto &stack = getStack();
954 throw std::runtime_error(
"Unbalanced InsertionPoint enter/exit");
955 auto &tos = stack.back();
956 if (tos.frameKind != FrameKind::InsertionPoint &&
957 tos.getInsertionPoint() != &insertionPoint)
958 throw std::runtime_error(
"Unbalanced InsertionPoint enter/exit");
963 PyLocation &location = nb::cast<PyLocation &>(locationObj);
965 push(FrameKind::Location, contextObj,
972 auto &stack = getStack();
974 throw std::runtime_error(
"Unbalanced Location enter/exit");
975 auto &tos = stack.back();
976 if (tos.frameKind != FrameKind::Location && tos.getLocation() != &location)
977 throw std::runtime_error(
"Unbalanced Location enter/exit");
987 if (materializedNotes) {
988 for (nb::handle noteObject : *materializedNotes) {
989 PyDiagnostic *note = nb::cast<PyDiagnostic *>(noteObject);
997 : context(context), callback(std::move(callback)) {}
1006 assert(!registeredID &&
"should have unregistered");
1009 context = {
nullptr};
1012 void PyDiagnostic::checkValid() {
1014 throw std::invalid_argument(
1015 "Diagnostic is invalid (used outside of callback)");
1033 nb::object fileObject = nb::module_::import_(
"io").attr(
"StringIO")();
1036 return nb::cast<nb::str>(fileObject.attr(
"getvalue")());
1041 if (materializedNotes)
1042 return *materializedNotes;
1044 nb::tuple notes = nb::steal<nb::tuple>(PyTuple_New(numNotes));
1045 for (intptr_t i = 0; i < numNotes; ++i) {
1047 nb::object diagnostic = nb::cast(
PyDiagnostic(noteDiag));
1048 PyTuple_SET_ITEM(notes.ptr(), i, diagnostic.release().ptr());
1050 materializedNotes = std::move(notes);
1052 return *materializedNotes;
1056 std::vector<DiagnosticInfo> notes;
1058 notes.emplace_back(nb::cast<PyDiagnostic>(n).
getInfo());
1070 {key.data(), key.size()});
1072 std::string msg = (Twine(
"Dialect '") + key +
"' not found").str();
1074 throw nb::attribute_error(msg.c_str());
1075 throw nb::index_error(msg.c_str());
1085 MlirDialectRegistry rawRegistry =
1088 throw nb::python_error();
1103 throw nb::python_error();
1113 const nb::object &excVal,
1114 const nb::object &excTb) {
1121 throw std::runtime_error(
1122 "An MLIR function requires a Location but none was provided in the "
1123 "call or from the surrounding environment. Either pass to the function "
1124 "with a 'loc=' argument or establish a default using 'with loc:'");
1137 nb::gil_scoped_acquire acquire;
1138 auto &liveModules =
getContext()->liveModules;
1139 assert(liveModules.count(module.ptr) == 1 &&
1140 "destroying module not in live map");
1141 liveModules.erase(module.ptr);
1149 nb::gil_scoped_acquire acquire;
1150 auto &liveModules = contextRef->liveModules;
1151 auto it = liveModules.find(module.ptr);
1152 if (it == liveModules.end()) {
1158 nb::object pyRef = nb::cast(unownedModule, nb::rv_policy::take_ownership);
1159 unownedModule->handle = pyRef;
1160 liveModules[module.ptr] =
1161 std::make_pair(unownedModule->handle, unownedModule);
1162 return PyModuleRef(unownedModule, std::move(pyRef));
1165 PyModule *existing = it->second.second;
1166 nb::object pyRef = nb::borrow<nb::object>(it->second.first);
1173 throw nb::python_error();
1209 template <
typename T,
class... Args>
1211 nb::handle type = nb::type<T>();
1212 nb::object instance = nb::inst_alloc(type);
1213 T *ptr = nb::inst_ptr<T>(instance);
1214 new (ptr) T(std::forward<Args>(args)...);
1215 nb::inst_mark_ready(instance);
1222 MlirOperation operation,
1223 nb::object parentKeepAlive) {
1226 makeObjectRef<PyOperation>(std::move(contextRef), operation);
1227 unownedOperation->handle = unownedOperation.
getObject();
1228 if (parentKeepAlive) {
1229 unownedOperation->parentKeepAlive = std::move(parentKeepAlive);
1231 return unownedOperation;
1235 MlirOperation operation,
1236 nb::object parentKeepAlive) {
1237 nb::ft_lock_guard lock(contextRef->liveOperationsMutex);
1238 auto &liveOperations = contextRef->liveOperations;
1239 auto it = liveOperations.find(operation.ptr);
1240 if (it == liveOperations.end()) {
1242 PyOperationRef result = createInstance(std::move(contextRef), operation,
1243 std::move(parentKeepAlive));
1244 liveOperations[operation.ptr] =
1250 nb::object pyRef = nb::borrow<nb::object>(it->second.first);
1255 MlirOperation operation,
1256 nb::object parentKeepAlive) {
1257 nb::ft_lock_guard lock(contextRef->liveOperationsMutex);
1258 auto &liveOperations = contextRef->liveOperations;
1259 assert(liveOperations.count(operation.ptr) == 0 &&
1260 "cannot create detached operation that already exists");
1261 (void)liveOperations;
1262 PyOperationRef created = createInstance(std::move(contextRef), operation,
1263 std::move(parentKeepAlive));
1264 liveOperations[operation.ptr] =
1266 created->attached =
false;
1271 const std::string &sourceStr,
1272 const std::string &sourceName) {
1278 throw MLIRError(
"Unable to parse operation assembly", errors.
take());
1284 throw std::runtime_error(
"the operation has been invalidated");
1289 bool enableDebugInfo,
bool prettyDebugInfo,
1290 bool printGenericOpForm,
bool useLocalScope,
1291 bool assumeVerified, nb::object fileObject,
1292 bool binary,
bool skipRegions) {
1295 if (fileObject.is_none())
1296 fileObject = nb::module_::import_(
"sys").attr(
"stdout");
1299 if (largeElementsLimit) {
1303 if (enableDebugInfo)
1306 if (printGenericOpForm)
1317 accum.getUserData());
1325 if (fileObject.is_none())
1326 fileObject = nb::module_::import_(
"sys").attr(
"stdout");
1329 accum.getUserData());
1333 std::optional<int64_t> bytecodeVersion) {
1338 if (!bytecodeVersion.has_value())
1348 throw nb::value_error((Twine(
"Unable to honor desired bytecode version ") +
1349 Twine(*bytecodeVersion))
1362 std::string exceptionWhat;
1363 nb::object exceptionType;
1365 UserData userData{callback,
false, {}, {}};
1368 UserData *calleeUserData =
static_cast<UserData *
>(userData);
1370 return (calleeUserData->callback)(op);
1371 }
catch (nb::python_error &e) {
1372 calleeUserData->gotException =
true;
1373 calleeUserData->exceptionWhat = std::string(e.what());
1374 calleeUserData->exceptionType = nb::borrow(e.type());
1379 if (userData.gotException) {
1380 std::string message(
"Exception raised in callback: ");
1381 message.append(userData.exceptionWhat);
1382 throw std::runtime_error(message);
1387 std::optional<int64_t> largeElementsLimit,
1388 bool enableDebugInfo,
bool prettyDebugInfo,
1389 bool printGenericOpForm,
bool useLocalScope,
1390 bool assumeVerified,
bool skipRegions) {
1391 nb::object fileObject;
1393 fileObject = nb::module_::import_(
"io").attr(
"BytesIO")();
1395 fileObject = nb::module_::import_(
"io").attr(
"StringIO")();
1397 print(largeElementsLimit,
1407 return fileObject.attr(
"getvalue")();
1416 operation.parentKeepAlive = otherOp.parentKeepAlive;
1425 operation.parentKeepAlive = otherOp.parentKeepAlive;
1439 throw nb::value_error(
"Detached operations have no parent");
1450 assert(!
mlirBlockIsNull(block) &&
"Attached operation has null parent");
1451 assert(parentOperation &&
"Operation has no parent");
1452 return PyBlock{std::move(*parentOperation), block};
1463 throw nb::python_error();
1470 const nb::object &maybeIp) {
1472 if (!maybeIp.is(nb::cast(
false))) {
1474 if (maybeIp.is_none()) {
1477 ip = nb::cast<PyInsertionPoint *>(maybeIp);
1485 std::optional<std::vector<PyType *>> results,
1487 std::optional<nb::dict> attributes,
1488 std::optional<std::vector<PyBlock *>> successors,
1490 const nb::object &maybeIp,
bool inferType) {
1497 throw nb::value_error(
"number of regions must be >= 0");
1501 mlirResults.reserve(results->size());
1502 for (
PyType *result : *results) {
1505 throw nb::value_error(
"result type cannot be None");
1506 mlirResults.push_back(*result);
1511 mlirAttributes.reserve(attributes->size());
1512 for (std::pair<nb::handle, nb::handle> it : *attributes) {
1515 key = nb::cast<std::string>(it.first);
1516 }
catch (nb::cast_error &err) {
1517 std::string msg =
"Invalid attribute key (not a string) when "
1518 "attempting to create the operation \"" +
1519 std::string(name) +
"\" (" + err.what() +
")";
1520 throw nb::type_error(msg.c_str());
1523 auto &attribute = nb::cast<PyAttribute &>(it.second);
1525 mlirAttributes.emplace_back(std::move(key), attribute);
1526 }
catch (nb::cast_error &err) {
1527 std::string msg =
"Invalid attribute value for the key \"" + key +
1528 "\" when attempting to create the operation \"" +
1529 std::string(name) +
"\" (" + err.what() +
")";
1530 throw nb::type_error(msg.c_str());
1531 }
catch (std::runtime_error &) {
1534 "Found an invalid (`None`?) attribute value for the key \"" + key +
1535 "\" when attempting to create the operation \"" +
1536 std::string(name) +
"\"";
1537 throw std::runtime_error(msg);
1543 mlirSuccessors.reserve(successors->size());
1544 for (
auto *successor : *successors) {
1547 throw nb::value_error(
"successor block cannot be None");
1548 mlirSuccessors.push_back(successor->get());
1556 if (!operands.empty())
1558 state.enableResultTypeInference = inferType;
1559 if (!mlirResults.empty())
1561 mlirResults.data());
1562 if (!mlirAttributes.empty()) {
1567 mlirNamedAttributes.reserve(mlirAttributes.size());
1568 for (
auto &it : mlirAttributes)
1574 mlirNamedAttributes.data());
1576 if (!mlirSuccessors.empty())
1578 mlirSuccessors.data());
1581 mlirRegions.resize(regions);
1582 for (
int i = 0; i < regions; ++i)
1585 mlirRegions.data());
1591 throw nb::value_error(
"Operation creation failed");
1629 template <
typename DerivedTy>
1630 class PyConcreteValue :
public PyValue {
1636 using ClassTy = nb::class_<DerivedTy, PyValue>;
1637 using IsAFunctionTy = bool (*)(MlirValue);
1639 PyConcreteValue() =
default;
1641 :
PyValue(operationRef, value) {}
1642 PyConcreteValue(
PyValue &orig)
1643 : PyConcreteValue(orig.getParentOperation(), castFrom(orig)) {}
1647 static MlirValue castFrom(
PyValue &orig) {
1648 if (!DerivedTy::isaFunction(orig.
get())) {
1649 auto origRepr = nb::cast<std::string>(nb::repr(nb::cast(orig)));
1650 throw nb::value_error((Twine(
"Cannot cast value to ") +
1651 DerivedTy::pyClassName +
" (from " + origRepr +
1660 static void bind(nb::module_ &m) {
1661 auto cls = ClassTy(m, DerivedTy::pyClassName);
1662 cls.def(nb::init<PyValue &>(), nb::keep_alive<0, 1>(), nb::arg(
"value"));
1665 [](
PyValue &otherValue) ->
bool {
1666 return DerivedTy::isaFunction(otherValue);
1668 nb::arg(
"other_value"));
1670 [](
DerivedTy &
self) {
return self.maybeDownCast(); });
1671 DerivedTy::bindDerived(cls);
1675 static void bindDerived(ClassTy &m) {}
1684 static constexpr
const char *pyClassName =
"OpResult";
1685 using PyConcreteValue::PyConcreteValue;
1688 c.def_prop_ro(
"owner", [](
PyOpResult &
self) {
1692 "expected the owner of the value in Python to match that in the IR");
1693 return self.getParentOperation().getObject();
1695 c.def_prop_ro(
"result_number", [](
PyOpResult &
self) {
1702 template <
typename Container>
1705 std::vector<MlirType> result;
1706 result.reserve(container.size());
1707 for (
int i = 0, e = container.size(); i < e; ++i) {
1719 static constexpr
const char *pyClassName =
"OpResultList";
1723 intptr_t length = -1, intptr_t step = 1)
1728 operation(std::move(operation)) {}
1735 return self.operation->createOpView();
1745 intptr_t getRawNumElements() {
1755 PyOpResultList slice(intptr_t startIndex, intptr_t length, intptr_t step) {
1767 const nb::object &resultSegmentSpecObj,
1768 std::vector<int32_t> &resultSegmentLengths,
1769 std::vector<PyType *> &resultTypes) {
1770 resultTypes.reserve(resultTypeList.size());
1771 if (resultSegmentSpecObj.is_none()) {
1775 resultTypes.push_back(nb::cast<PyType *>(it.value()));
1776 if (!resultTypes.back())
1777 throw nb::cast_error();
1778 }
catch (nb::cast_error &err) {
1779 throw nb::value_error((llvm::Twine(
"Result ") +
1780 llvm::Twine(it.index()) +
" of operation \"" +
1781 name +
"\" must be a Type (" + err.what() +
")")
1788 auto resultSegmentSpec = nb::cast<std::vector<int>>(resultSegmentSpecObj);
1789 if (resultSegmentSpec.size() != resultTypeList.size()) {
1790 throw nb::value_error((llvm::Twine(
"Operation \"") + name +
1792 llvm::Twine(resultSegmentSpec.size()) +
1793 " result segments but was provided " +
1794 llvm::Twine(resultTypeList.size()))
1798 resultSegmentLengths.reserve(resultTypeList.size());
1799 for (
const auto &it :
1801 int segmentSpec = std::get<1>(it.value());
1802 if (segmentSpec == 1 || segmentSpec == 0) {
1805 auto *resultType = nb::cast<PyType *>(std::get<0>(it.value()));
1807 resultTypes.push_back(resultType);
1808 resultSegmentLengths.push_back(1);
1809 }
else if (segmentSpec == 0) {
1811 resultSegmentLengths.push_back(0);
1813 throw nb::value_error(
1814 (llvm::Twine(
"Result ") + llvm::Twine(it.index()) +
1815 " of operation \"" + name +
1816 "\" must be a Type (was None and result is not optional)")
1820 }
catch (nb::cast_error &err) {
1821 throw nb::value_error((llvm::Twine(
"Result ") +
1822 llvm::Twine(it.index()) +
" of operation \"" +
1823 name +
"\" must be a Type (" + err.what() +
1828 }
else if (segmentSpec == -1) {
1831 if (std::get<0>(it.value()).is_none()) {
1833 resultSegmentLengths.push_back(0);
1836 auto segment = nb::cast<nb::sequence>(std::get<0>(it.value()));
1837 for (nb::handle segmentItem : segment) {
1838 resultTypes.push_back(nb::cast<PyType *>(segmentItem));
1839 if (!resultTypes.back()) {
1840 throw nb::type_error(
"contained a None item");
1843 resultSegmentLengths.push_back(nb::len(segment));
1845 }
catch (std::exception &err) {
1849 throw nb::value_error((llvm::Twine(
"Result ") +
1850 llvm::Twine(it.index()) +
" of operation \"" +
1851 name +
"\" must be a Sequence of Types (" +
1857 throw nb::value_error(
"Unexpected segment spec");
1865 if (numResults != 1) {
1867 throw nb::value_error((Twine(
"Cannot call .result on operation ") +
1868 StringRef(name.data, name.length) +
" which has " +
1870 " results (it is only valid for operations with a "
1879 if (operand.is_none()) {
1880 throw nb::value_error(
"contained a None item");
1883 if (nb::try_cast<PyOperationBase *>(operand, op)) {
1887 if (nb::try_cast<PyOpResultList *>(operand, opResultList)) {
1891 if (nb::try_cast<PyValue *>(operand, value)) {
1892 return value->
get();
1894 throw nb::value_error(
"is not a Value");
1898 std::string_view name, std::tuple<int, bool> opRegionSpec,
1899 nb::object operandSegmentSpecObj, nb::object resultSegmentSpecObj,
1900 std::optional<nb::list> resultTypeList, nb::list operandList,
1901 std::optional<nb::dict> attributes,
1902 std::optional<std::vector<PyBlock *>> successors,
1904 const nb::object &maybeIp) {
1913 std::vector<int32_t> operandSegmentLengths;
1914 std::vector<int32_t> resultSegmentLengths;
1917 int opMinRegionCount = std::get<0>(opRegionSpec);
1918 bool opHasNoVariadicRegions = std::get<1>(opRegionSpec);
1920 regions = opMinRegionCount;
1922 if (*regions < opMinRegionCount) {
1923 throw nb::value_error(
1924 (llvm::Twine(
"Operation \"") + name +
"\" requires a minimum of " +
1925 llvm::Twine(opMinRegionCount) +
1926 " regions but was built with regions=" + llvm::Twine(*regions))
1930 if (opHasNoVariadicRegions && *regions > opMinRegionCount) {
1931 throw nb::value_error(
1932 (llvm::Twine(
"Operation \"") + name +
"\" requires a maximum of " +
1933 llvm::Twine(opMinRegionCount) +
1934 " regions but was built with regions=" + llvm::Twine(*regions))
1940 std::vector<PyType *> resultTypes;
1941 if (resultTypeList.has_value()) {
1943 resultSegmentLengths, resultTypes);
1948 operands.reserve(operands.size());
1949 if (operandSegmentSpecObj.is_none()) {
1954 }
catch (nb::builtin_exception &err) {
1955 throw nb::value_error((llvm::Twine(
"Operand ") +
1956 llvm::Twine(it.index()) +
" of operation \"" +
1957 name +
"\" must be a Value (" + err.what() +
")")
1964 auto operandSegmentSpec = nb::cast<std::vector<int>>(operandSegmentSpecObj);
1965 if (operandSegmentSpec.size() != operandList.size()) {
1966 throw nb::value_error((llvm::Twine(
"Operation \"") + name +
1968 llvm::Twine(operandSegmentSpec.size()) +
1969 "operand segments but was provided " +
1970 llvm::Twine(operandList.size()))
1974 operandSegmentLengths.reserve(operandList.size());
1975 for (
const auto &it :
1977 int segmentSpec = std::get<1>(it.value());
1978 if (segmentSpec == 1 || segmentSpec == 0) {
1980 auto &operand = std::get<0>(it.value());
1981 if (!operand.is_none()) {
1985 }
catch (nb::builtin_exception &err) {
1986 throw nb::value_error((llvm::Twine(
"Operand ") +
1987 llvm::Twine(it.index()) +
1988 " of operation \"" + name +
1989 "\" must be a Value (" + err.what() +
")")
1994 operandSegmentLengths.push_back(1);
1995 }
else if (segmentSpec == 0) {
1997 operandSegmentLengths.push_back(0);
1999 throw nb::value_error(
2000 (llvm::Twine(
"Operand ") + llvm::Twine(it.index()) +
2001 " of operation \"" + name +
2002 "\" must be a Value (was None and operand is not optional)")
2006 }
else if (segmentSpec == -1) {
2009 if (std::get<0>(it.value()).is_none()) {
2011 operandSegmentLengths.push_back(0);
2014 auto segment = nb::cast<nb::sequence>(std::get<0>(it.value()));
2015 for (nb::handle segmentItem : segment) {
2018 operandSegmentLengths.push_back(nb::len(segment));
2020 }
catch (std::exception &err) {
2024 throw nb::value_error((llvm::Twine(
"Operand ") +
2025 llvm::Twine(it.index()) +
" of operation \"" +
2026 name +
"\" must be a Sequence of Values (" +
2032 throw nb::value_error(
"Unexpected segment spec");
2038 if (!operandSegmentLengths.empty() || !resultSegmentLengths.empty()) {
2041 attributes = nb::dict(*attributes);
2043 attributes = nb::dict();
2045 if (attributes->contains(
"resultSegmentSizes") ||
2046 attributes->contains(
"operandSegmentSizes")) {
2047 throw nb::value_error(
"Manually setting a 'resultSegmentSizes' or "
2048 "'operandSegmentSizes' attribute is unsupported. "
2049 "Use Operation.create for such low-level access.");
2053 if (!resultSegmentLengths.empty()) {
2054 MlirAttribute segmentLengthAttr =
2056 resultSegmentLengths.data());
2057 (*attributes)[
"resultSegmentSizes"] =
2062 if (!operandSegmentLengths.empty()) {
2063 MlirAttribute segmentLengthAttr =
2065 operandSegmentLengths.data());
2066 (*attributes)[
"operandSegmentSizes"] =
2073 std::move(resultTypes),
2074 std::move(operands),
2075 std::move(attributes),
2076 std::move(successors),
2077 *regions, location, maybeIp,
2082 const nb::object &operation) {
2083 nb::handle opViewType = nb::type<PyOpView>();
2084 nb::object instance = cls.attr(
"__new__")(cls);
2085 opViewType.attr(
"__init__")(instance, operation);
2093 operationObject(operation.getRef().getObject()) {}
2102 : refOperation(beforeOperationBase.getOperation().getRef()),
2103 block((*refOperation)->getBlock()) {}
2108 throw nb::value_error(
2109 "Attempt to insert operation that is already attached");
2110 block.getParentOperation()->checkValid();
2111 MlirOperation beforeOp = {
nullptr};
2114 (*refOperation)->checkValid();
2115 beforeOp = (*refOperation)->get();
2121 throw nb::index_error(
"Cannot insert operation at the end of a block "
2122 "that already has a terminator. Did you mean to "
2123 "use 'InsertionPoint.at_block_terminator(block)' "
2124 "versus 'InsertionPoint(block)'?");
2147 throw nb::value_error(
"Block has no terminator");
2158 const nb::object &excVal,
2159 const nb::object &excTb) {
2178 throw nb::python_error();
2188 : ownedName(new std::string(std::move(ownedName))) {
2210 throw nb::python_error();
2226 throw nb::python_error();
2245 "mlirTypeID was expected to be non-null.");
2246 std::optional<nb::callable> valueCaster =
2250 nb::object thisObj = nb::cast(
this, nb::rv_policy::move);
2253 return valueCaster.value()(thisObj);
2259 throw nb::python_error();
2260 MlirOperation owner;
2266 throw nb::python_error();
2270 return PyValue(ownerRef, value);
2278 : operation(operation.getOperation().getRef()) {
2281 throw nb::type_error(
"Operation is not a Symbol Table.");
2290 throw nb::key_error(
2291 (
"Symbol '" + name +
"' not in the symbol table.").c_str());
2294 operation.getObject())
2310 erase(nb::cast<PyOperationBase &>(operation));
2319 throw nb::value_error(
"Expected operation to have a symbol name.");
2328 MlirAttribute existingNameAttr =
2331 throw nb::value_error(
"Expected operation to have a symbol name.");
2332 return existingNameAttr;
2336 const std::string &name) {
2341 MlirAttribute existingNameAttr =
2344 throw nb::value_error(
"Expected operation to have a symbol name.");
2345 MlirAttribute newNameAttr =
2354 MlirAttribute existingVisAttr =
2357 throw nb::value_error(
"Expected operation to have a symbol visibility.");
2358 return existingVisAttr;
2362 const std::string &visibility) {
2363 if (visibility !=
"public" && visibility !=
"private" &&
2364 visibility !=
"nested")
2365 throw nb::value_error(
2366 "Expected visibility to be 'public', 'private' or 'nested'");
2370 MlirAttribute existingVisAttr =
2373 throw nb::value_error(
"Expected operation to have a symbol visibility.");
2380 const std::string &newSymbol,
2388 throw nb::value_error(
"Symbol rename failed");
2392 bool allSymUsesVisible,
2393 nb::object callback) {
2398 nb::object callback;
2400 std::string exceptionWhat;
2401 nb::object exceptionType;
2404 fromOperation.
getContext(), std::move(callback),
false, {}, {}};
2406 fromOperation.
get(), allSymUsesVisible,
2407 [](MlirOperation foundOp,
bool isVisible,
void *calleeUserDataVoid) {
2408 UserData *calleeUserData = static_cast<UserData *>(calleeUserDataVoid);
2410 PyOperation::forOperation(calleeUserData->context, foundOp);
2411 if (calleeUserData->gotException)
2414 calleeUserData->callback(pyFoundOp.getObject(), isVisible);
2415 } catch (nb::python_error &e) {
2416 calleeUserData->gotException =
true;
2417 calleeUserData->exceptionWhat = e.what();
2418 calleeUserData->exceptionType = nb::borrow(e.type());
2421 static_cast<void *
>(&userData));
2422 if (userData.gotException) {
2423 std::string message(
"Exception raised in callback: ");
2424 message.append(userData.exceptionWhat);
2425 throw std::runtime_error(message);
2432 class PyBlockArgument :
public PyConcreteValue<PyBlockArgument> {
2435 static constexpr
const char *pyClassName =
"BlockArgument";
2436 using PyConcreteValue::PyConcreteValue;
2438 static void bindDerived(ClassTy &c) {
2439 c.def_prop_ro(
"owner", [](PyBlockArgument &
self) {
2440 return PyBlock(
self.getParentOperation(),
2443 c.def_prop_ro(
"arg_number", [](PyBlockArgument &
self) {
2448 [](PyBlockArgument &
self,
PyType type) {
2459 class PyBlockArgumentList
2460 :
public Sliceable<PyBlockArgumentList, PyBlockArgument> {
2462 static constexpr
const char *pyClassName =
"BlockArgumentList";
2466 intptr_t startIndex = 0, intptr_t length = -1,
2471 operation(std::move(operation)), block(block) {}
2473 static void bindDerived(ClassTy &c) {
2474 c.def_prop_ro(
"types", [](PyBlockArgumentList &
self) {
2481 friend class Sliceable<PyBlockArgumentList, PyBlockArgument>;
2484 intptr_t getRawNumElements() {
2490 PyBlockArgument getRawElement(intptr_t pos) {
2492 return PyBlockArgument(operation, argument);
2496 PyBlockArgumentList slice(intptr_t startIndex, intptr_t length,
2498 return PyBlockArgumentList(operation, block, startIndex, length, step);
2509 class PyOpOperandList :
public Sliceable<PyOpOperandList, PyValue> {
2511 static constexpr
const char *pyClassName =
"OpOperandList";
2514 PyOpOperandList(
PyOperationRef operation, intptr_t startIndex = 0,
2515 intptr_t length = -1, intptr_t step = 1)
2520 operation(operation) {}
2522 void dunderSetItem(intptr_t index,
PyValue value) {
2523 index = wrapIndex(index);
2527 static void bindDerived(ClassTy &c) {
2528 c.def(
"__setitem__", &PyOpOperandList::dunderSetItem);
2535 intptr_t getRawNumElements() {
2540 PyValue getRawElement(intptr_t pos) {
2542 MlirOperation owner;
2548 assert(
false &&
"Value must be an block arg or op result.");
2550 PyOperation::forOperation(operation->
getContext(), owner);
2551 return PyValue(pyOwner, operand);
2554 PyOpOperandList slice(intptr_t startIndex, intptr_t length, intptr_t step) {
2555 return PyOpOperandList(operation, startIndex, length, step);
2565 class PyOpSuccessors :
public Sliceable<PyOpSuccessors, PyBlock> {
2567 static constexpr
const char *pyClassName =
"OpSuccessors";
2569 PyOpSuccessors(
PyOperationRef operation, intptr_t startIndex = 0,
2570 intptr_t length = -1, intptr_t step = 1)
2575 operation(operation) {}
2577 void dunderSetItem(intptr_t index,
PyBlock block) {
2578 index = wrapIndex(index);
2582 static void bindDerived(ClassTy &c) {
2583 c.def(
"__setitem__", &PyOpSuccessors::dunderSetItem);
2590 intptr_t getRawNumElements() {
2595 PyBlock getRawElement(intptr_t pos) {
2597 return PyBlock(operation, block);
2600 PyOpSuccessors slice(intptr_t startIndex, intptr_t length, intptr_t step) {
2601 return PyOpSuccessors(operation, startIndex, length, step);
2609 class PyOpAttributeMap {
2612 : operation(std::move(operation)) {}
2614 MlirAttribute dunderGetItemNamed(
const std::string &name) {
2618 throw nb::key_error(
"attempt to access a non-existent attribute");
2624 if (index < 0 || index >= dunderLen()) {
2625 throw nb::index_error(
"attempt to access out of bounds attribute");
2635 void dunderSetItem(
const std::string &name,
const PyAttribute &attr) {
2640 void dunderDelItem(
const std::string &name) {
2644 throw nb::key_error(
"attempt to delete a non-existent attribute");
2647 intptr_t dunderLen() {
2651 bool dunderContains(
const std::string &name) {
2656 static void bind(nb::module_ &m) {
2657 nb::class_<PyOpAttributeMap>(m,
"OpAttributeMap")
2658 .def(
"__contains__", &PyOpAttributeMap::dunderContains)
2659 .def(
"__len__", &PyOpAttributeMap::dunderLen)
2660 .def(
"__getitem__", &PyOpAttributeMap::dunderGetItemNamed)
2661 .def(
"__getitem__", &PyOpAttributeMap::dunderGetItemIndexed)
2662 .def(
"__setitem__", &PyOpAttributeMap::dunderSetItem)
2663 .def(
"__delitem__", &PyOpAttributeMap::dunderDelItem);
2678 nb::set_leak_warnings(
false);
2682 nb::enum_<MlirDiagnosticSeverity>(m,
"DiagnosticSeverity")
2688 nb::enum_<MlirWalkOrder>(m,
"WalkOrder")
2692 nb::enum_<MlirWalkResult>(m,
"WalkResult")
2700 nb::class_<PyDiagnostic>(m,
"Diagnostic")
2701 .def_prop_ro(
"severity", &PyDiagnostic::getSeverity)
2702 .def_prop_ro(
"location", &PyDiagnostic::getLocation)
2703 .def_prop_ro(
"message", &PyDiagnostic::getMessage)
2704 .def_prop_ro(
"notes", &PyDiagnostic::getNotes)
2706 if (!
self.isValid())
2707 return nb::str(
"<Invalid Diagnostic>");
2708 return self.getMessage();
2711 nb::class_<PyDiagnostic::DiagnosticInfo>(m,
"DiagnosticInfo")
2716 .def_ro(
"severity", &PyDiagnostic::DiagnosticInfo::severity)
2717 .def_ro(
"location", &PyDiagnostic::DiagnosticInfo::location)
2718 .def_ro(
"message", &PyDiagnostic::DiagnosticInfo::message)
2719 .def_ro(
"notes", &PyDiagnostic::DiagnosticInfo::notes)
2723 nb::class_<PyDiagnosticHandler>(m,
"DiagnosticHandler")
2724 .def(
"detach", &PyDiagnosticHandler::detach)
2725 .def_prop_ro(
"attached", &PyDiagnosticHandler::isAttached)
2726 .def_prop_ro(
"had_error", &PyDiagnosticHandler::getHadError)
2727 .def(
"__enter__", &PyDiagnosticHandler::contextEnter)
2728 .def(
"__exit__", &PyDiagnosticHandler::contextExit,
2729 nb::arg(
"exc_type").none(), nb::arg(
"exc_value").none(),
2730 nb::arg(
"traceback").none());
2738 nb::class_<PyMlirContext>(m,
"_BaseContext")
2744 .def_static(
"_get_live_count", &PyMlirContext::getLiveCount)
2745 .def(
"_get_context_again",
2750 .def(
"_get_live_operation_count", &PyMlirContext::getLiveOperationCount)
2751 .def(
"_get_live_operation_objects",
2752 &PyMlirContext::getLiveOperationObjects)
2753 .def(
"_clear_live_operations", &PyMlirContext::clearLiveOperations)
2754 .def(
"_clear_live_operations_inside",
2755 nb::overload_cast<MlirOperation>(
2756 &PyMlirContext::clearOperationsInside))
2757 .def(
"_get_live_module_count", &PyMlirContext::getLiveModuleCount)
2760 .def(
"__enter__", &PyMlirContext::contextEnter)
2761 .def(
"__exit__", &PyMlirContext::contextExit, nb::arg(
"exc_type").none(),
2762 nb::arg(
"exc_value").none(), nb::arg(
"traceback").none())
2763 .def_prop_ro_static(
2769 return nb::cast(context);
2771 "Gets the Context bound to the current thread or raises ValueError")
2775 "Gets a container for accessing dialects by name")
2778 "Alias for 'dialect'")
2780 "get_dialect_descriptor",
2783 self.
get(), {name.data(), name.size()});
2785 throw nb::value_error(
2786 (Twine(
"Dialect '") + name +
"' not found").str().c_str());
2790 nb::arg(
"dialect_name"),
2791 "Gets or loads a dialect by name, returning its descriptor object")
2793 "allow_unregistered_dialects",
2800 .def(
"attach_diagnostic_handler", &PyMlirContext::attachDiagnosticHandler,
2801 nb::arg(
"callback"),
2802 "Attaches a diagnostic handler that will receive callbacks")
2804 "enable_multithreading",
2810 "is_registered_operation",
2815 nb::arg(
"operation_name"))
2817 "append_dialect_registry",
2821 nb::arg(
"registry"))
2822 .def_prop_rw(
"emit_error_diagnostics",
nullptr,
2823 &PyMlirContext::setEmitErrorDiagnostics,
2824 "Emit error diagnostics to diagnostic handlers. By default "
2825 "error diagnostics are captured and reported through "
2826 "MLIRError exceptions.")
2827 .def(
"load_all_available_dialects", [](
PyMlirContext &
self) {
2834 nb::class_<PyDialectDescriptor>(m,
"DialectDescriptor")
2835 .def_prop_ro(
"namespace",
2842 std::string repr(
"<DialectDescriptor ");
2851 nb::class_<PyDialects>(m,
"Dialects")
2854 MlirDialect dialect =
2855 self.getDialectForKey(keyName,
false);
2856 nb::object descriptor =
2860 .def(
"__getattr__", [=](
PyDialects &
self, std::string attrName) {
2861 MlirDialect dialect =
2862 self.getDialectForKey(attrName,
true);
2863 nb::object descriptor =
2871 nb::class_<PyDialect>(m,
"Dialect")
2872 .def(nb::init<nb::object>(), nb::arg(
"descriptor"))
2873 .def_prop_ro(
"descriptor",
2874 [](
PyDialect &
self) {
return self.getDescriptor(); })
2875 .def(
"__repr__", [](nb::object
self) {
2876 auto clazz =
self.attr(
"__class__");
2877 return nb::str(
"<Dialect ") +
2878 self.attr(
"descriptor").attr(
"namespace") + nb::str(
" (class ") +
2879 clazz.attr(
"__module__") + nb::str(
".") +
2880 clazz.attr(
"__name__") + nb::str(
")>");
2886 nb::class_<PyDialectRegistry>(m,
"DialectRegistry")
2894 nb::class_<PyLocation>(m,
"Location")
2897 .def(
"__enter__", &PyLocation::contextEnter)
2898 .def(
"__exit__", &PyLocation::contextExit, nb::arg(
"exc_type").none(),
2899 nb::arg(
"exc_value").none(), nb::arg(
"traceback").none())
2904 .def(
"__eq__", [](
PyLocation &
self, nb::object other) {
return false; })
2905 .def_prop_ro_static(
2908 auto *loc = PyThreadContextEntry::getDefaultLocation();
2910 throw nb::value_error(
"No current Location");
2913 "Gets the Location bound to the current thread or raises ValueError")
2920 nb::arg(
"context").none() = nb::none(),
2921 "Gets a Location representing an unknown location")
2924 [](
PyLocation callee,
const std::vector<PyLocation> &frames,
2927 throw nb::value_error(
"No caller frames provided");
2928 MlirLocation caller = frames.back().get();
2935 nb::arg(
"callee"), nb::arg(
"frames"),
2936 nb::arg(
"context").none() = nb::none(),
2940 [](std::string filename,
int line,
int col,
2947 nb::arg(
"filename"), nb::arg(
"line"), nb::arg(
"col"),
2948 nb::arg(
"context").none() = nb::none(),
2952 [](std::string filename,
int startLine,
int startCol,
int endLine,
2957 startLine, startCol, endLine, endCol));
2959 nb::arg(
"filename"), nb::arg(
"start_line"), nb::arg(
"start_col"),
2960 nb::arg(
"end_line"), nb::arg(
"end_col"),
2964 [](
const std::vector<PyLocation> &pyLocations,
2965 std::optional<PyAttribute> metadata,
2968 locations.reserve(pyLocations.size());
2969 for (
auto &pyLocation : pyLocations)
2970 locations.push_back(pyLocation.get());
2972 context->
get(), locations.size(), locations.data(),
2973 metadata ? metadata->get() : MlirAttribute{0});
2974 return PyLocation(context->getRef(), location);
2976 nb::arg(
"locations"), nb::arg(
"metadata").none() = nb::none(),
2977 nb::arg(
"context").none() = nb::none(),
2981 [](std::string name, std::optional<PyLocation> childLoc,
2987 childLoc ? childLoc->get()
2990 nb::arg(
"name"), nb::arg(
"childLoc").none() = nb::none(),
2991 nb::arg(
"context").none() = nb::none(),
2999 nb::arg(
"attribute"), nb::arg(
"context").none() = nb::none(),
3000 "Gets a Location from a LocationAttr")
3003 [](
PyLocation &
self) {
return self.getContext().getObject(); },
3004 "Context that owns the Location")
3008 "Get the underlying LocationAttr")
3014 nb::arg(
"message"),
"Emits an error at this location")
3019 return printAccum.
join();
3025 nb::class_<PyModule>(m,
"Module", nb::is_weak_referenceable())
3035 throw MLIRError(
"Unable to parse module assembly", errors.take());
3036 return PyModule::forModule(module).releaseObject();
3038 nb::arg(
"asm"), nb::arg(
"context").none() = nb::none(),
3047 throw MLIRError(
"Unable to parse module assembly", errors.take());
3048 return PyModule::forModule(module).releaseObject();
3050 nb::arg(
"asm"), nb::arg(
"context").none() = nb::none(),
3059 throw MLIRError(
"Unable to parse module assembly", errors.take());
3060 return PyModule::forModule(module).releaseObject();
3062 nb::arg(
"path"), nb::arg(
"context").none() = nb::none(),
3068 return PyModule::forModule(module).releaseObject();
3070 nb::arg(
"loc").none() = nb::none(),
"Creates an empty module")
3073 [](
PyModule &
self) {
return self.getContext().getObject(); },
3074 "Context that created the Module")
3078 return PyOperation::forOperation(
self.
getContext(),
3080 self.getRef().releaseObject())
3083 "Accesses the module as an operation")
3089 self.getRef().releaseObject());
3093 "Return the block for this module")
3102 [](nb::object
self) {
3104 return self.attr(
"operation").attr(
"__str__")();
3111 nb::class_<PyOperationBase>(m,
"_OperationBase")
3114 return self.getOperation().getCapsule();
3126 .def_prop_ro(
"attributes",
3128 return PyOpAttributeMap(
self.getOperation().getRef());
3137 "Context that owns the Operation")
3138 .def_prop_ro(
"name",
3142 MlirOperation operation = concreteOperation.
get();
3147 .def_prop_ro(
"operands",
3149 return PyOpOperandList(
self.getOperation().getRef());
3151 .def_prop_ro(
"regions",
3153 return PyRegionList(
self.getOperation().getRef());
3160 "Returns the list of Operation results.")
3164 auto &operation =
self.getOperation();
3168 "Shortcut to get an op result if it has only one (throws an error "
3177 "Returns the source location the operation was defined or derived "
3179 .def_prop_ro(
"parent",
3181 auto parent =
self.getOperation().getParentOperation();
3183 return parent->getObject();
3189 return self.getAsm(
false,
3198 "Returns the assembly form of the operation.")
3200 nb::overload_cast<PyAsmState &, nb::object, bool>(
3202 nb::arg(
"state"), nb::arg(
"file").none() = nb::none(),
3205 nb::overload_cast<std::optional<int64_t>,
bool,
bool,
bool,
bool,
3206 bool, nb::object,
bool,
bool>(
3209 nb::arg(
"large_elements_limit").none() = nb::none(),
3210 nb::arg(
"enable_debug_info") =
false,
3211 nb::arg(
"pretty_debug_info") =
false,
3212 nb::arg(
"print_generic_op_form") =
false,
3213 nb::arg(
"use_local_scope") =
false,
3214 nb::arg(
"assume_verified") =
false,
3215 nb::arg(
"file").none() = nb::none(), nb::arg(
"binary") =
false,
3217 .def(
"write_bytecode", &PyOperationBase::writeBytecode, nb::arg(
"file"),
3218 nb::arg(
"desired_version").none() = nb::none(),
3220 .def(
"get_asm", &PyOperationBase::getAsm,
3222 nb::arg(
"binary") =
false,
3223 nb::arg(
"large_elements_limit").none() = nb::none(),
3224 nb::arg(
"enable_debug_info") =
false,
3225 nb::arg(
"pretty_debug_info") =
false,
3226 nb::arg(
"print_generic_op_form") =
false,
3227 nb::arg(
"use_local_scope") =
false,
3228 nb::arg(
"assume_verified") =
false, nb::arg(
"skip_regions") =
false,
3231 "Verify the operation. Raises MLIRError if verification fails, and "
3232 "returns true otherwise.")
3233 .def(
"move_after", &PyOperationBase::moveAfter, nb::arg(
"other"),
3234 "Puts self immediately after the other operation in its parent "
3236 .def(
"move_before", &PyOperationBase::moveBefore, nb::arg(
"other"),
3237 "Puts self immediately before the other operation in its parent "
3242 return self.getOperation().clone(ip);
3244 nb::arg(
"ip").none() = nb::none())
3246 "detach_from_parent",
3251 throw nb::value_error(
"Detached operation has no parent.");
3256 "Detaches the operation from its parent block.")
3257 .def(
"erase", [](
PyOperationBase &
self) {
self.getOperation().erase(); })
3261 nb::class_<PyOperation, PyOperationBase>(m,
"Operation")
3264 [](std::string_view name,
3265 std::optional<std::vector<PyType *>> results,
3266 std::optional<std::vector<PyValue *>> operands,
3267 std::optional<nb::dict> attributes,
3268 std::optional<std::vector<PyBlock *>> successors,
int regions,
3274 mlirOperands.reserve(operands->size());
3275 for (
PyValue *operand : *operands) {
3277 throw nb::value_error(
"operand value cannot be None");
3278 mlirOperands.push_back(operand->get());
3282 return PyOperation::create(name, results, mlirOperands, attributes,
3283 successors, regions, location, maybeIp,
3286 nb::arg(
"name"), nb::arg(
"results").none() = nb::none(),
3287 nb::arg(
"operands").none() = nb::none(),
3288 nb::arg(
"attributes").none() = nb::none(),
3289 nb::arg(
"successors").none() = nb::none(), nb::arg(
"regions") = 0,
3290 nb::arg(
"loc").none() = nb::none(), nb::arg(
"ip").none() = nb::none(),
3294 [](
const std::string &sourceStr,
const std::string &sourceName,
3299 nb::arg(
"source"), nb::kw_only(), nb::arg(
"source_name") =
"",
3300 nb::arg(
"context").none() = nb::none(),
3301 "Parses an operation. Supports both text assembly format and binary "
3305 .def_prop_ro(
"operation", [](nb::object
self) {
return self; })
3306 .def_prop_ro(
"opview", &PyOperation::createOpView)
3310 return PyOpSuccessors(
self.getOperation().getRef());
3312 "Returns the list of Operation successors.");
3315 nb::class_<PyOpView, PyOperationBase>(m,
"OpView")
3316 .def(nb::init<nb::object>(), nb::arg(
"operation"))
3319 [](
PyOpView *
self, std::string_view name,
3320 std::tuple<int, bool> opRegionSpec,
3321 nb::object operandSegmentSpecObj,
3322 nb::object resultSegmentSpecObj,
3323 std::optional<nb::list> resultTypeList, nb::list operandList,
3324 std::optional<nb::dict> attributes,
3325 std::optional<std::vector<PyBlock *>> successors,
3327 const nb::object &maybeIp) {
3328 new (
self)
PyOpView(PyOpView::buildGeneric(
3329 name, opRegionSpec, operandSegmentSpecObj,
3330 resultSegmentSpecObj, resultTypeList, operandList,
3331 attributes, successors, regions, location, maybeIp));
3333 nb::arg(
"name"), nb::arg(
"opRegionSpec"),
3334 nb::arg(
"operandSegmentSpecObj").none() = nb::none(),
3335 nb::arg(
"resultSegmentSpecObj").none() = nb::none(),
3336 nb::arg(
"results").none() = nb::none(),
3337 nb::arg(
"operands").none() = nb::none(),
3338 nb::arg(
"attributes").none() = nb::none(),
3339 nb::arg(
"successors").none() = nb::none(),
3340 nb::arg(
"regions").none() = nb::none(),
3341 nb::arg(
"loc").none() = nb::none(),
3342 nb::arg(
"ip").none() = nb::none())
3344 .def_prop_ro(
"operation", &PyOpView::getOperationObject)
3345 .def_prop_ro(
"opview", [](nb::object
self) {
return self; })
3348 [](
PyOpView &
self) {
return nb::str(
self.getOperationObject()); })
3352 return PyOpSuccessors(
self.getOperation().getRef());
3354 "Returns the list of Operation successors.");
3355 opViewClass.attr(
"_ODS_REGIONS") = nb::make_tuple(0,
true);
3356 opViewClass.attr(
"_ODS_OPERAND_SEGMENTS") = nb::none();
3357 opViewClass.attr(
"_ODS_RESULT_SEGMENTS") = nb::none();
3362 [](nb::handle cls, std::optional<nb::list> resultTypeList,
3363 nb::list operandList, std::optional<nb::dict> attributes,
3364 std::optional<std::vector<PyBlock *>> successors,
3366 const nb::object &maybeIp) {
3367 std::string name = nb::cast<std::string>(cls.attr(
"OPERATION_NAME"));
3368 std::tuple<int, bool> opRegionSpec =
3369 nb::cast<std::tuple<int, bool>>(cls.attr(
"_ODS_REGIONS"));
3370 nb::object operandSegmentSpec = cls.attr(
"_ODS_OPERAND_SEGMENTS");
3371 nb::object resultSegmentSpec = cls.attr(
"_ODS_RESULT_SEGMENTS");
3372 return PyOpView::buildGeneric(name, opRegionSpec, operandSegmentSpec,
3373 resultSegmentSpec, resultTypeList,
3374 operandList, attributes, successors,
3375 regions, location, maybeIp);
3377 nb::arg(
"cls"), nb::arg(
"results").none() = nb::none(),
3378 nb::arg(
"operands").none() = nb::none(),
3379 nb::arg(
"attributes").none() = nb::none(),
3380 nb::arg(
"successors").none() = nb::none(),
3381 nb::arg(
"regions").none() = nb::none(),
3382 nb::arg(
"loc").none() = nb::none(), nb::arg(
"ip").none() = nb::none(),
3383 "Builds a specific, generated OpView based on class level attributes.");
3385 [](
const nb::object &cls,
const std::string &sourceStr,
3395 std::string clsOpName =
3396 nb::cast<std::string>(cls.attr(
"OPERATION_NAME"));
3399 std::string_view parsedOpName(identifier.
data, identifier.
length);
3400 if (clsOpName != parsedOpName)
3401 throw MLIRError(Twine(
"Expected a '") + clsOpName +
"' op, got: '" +
3402 parsedOpName +
"'");
3403 return PyOpView::constructDerived(cls, parsed.
getObject());
3405 nb::arg(
"cls"), nb::arg(
"source"), nb::kw_only(),
3406 nb::arg(
"source_name") =
"", nb::arg(
"context").none() = nb::none(),
3407 "Parses a specific, generated OpView based on class level attributes");
3412 nb::class_<PyRegion>(m,
"Region")
3416 return PyBlockList(
self.getParentOperation(),
self.
get());
3418 "Returns a forward-optimized sequence of blocks.")
3422 return self.getParentOperation()->createOpView();
3424 "Returns the operation owning this region.")
3430 return PyBlockIterator(
self.getParentOperation(), firstBlock);
3432 "Iterates over blocks in the region.")
3435 return self.get().ptr == other.
get().ptr;
3437 .def(
"__eq__", [](
PyRegion &
self, nb::object &other) {
return false; });
3442 nb::class_<PyBlock>(m,
"Block")
3447 return self.getParentOperation()->createOpView();
3449 "Returns the owning operation of this block.")
3454 return PyRegion(
self.getParentOperation(), region);
3456 "Returns the owning region of this block.")
3460 return PyBlockArgumentList(
self.getParentOperation(),
self.
get());
3462 "Returns a list of block arguments.")
3468 "Append an argument of the specified type to the block and returns "
3469 "the newly added argument.")
3472 [](
PyBlock &
self,
unsigned index) {
3475 "Erase the argument at 'index' and remove it from the argument list.")
3479 return PyOperationList(
self.getParentOperation(),
self.
get());
3481 "Returns a forward-optimized sequence of operations.")
3484 [](
PyRegion &parent,
const nb::sequence &pyArgTypes,
3485 const std::optional<nb::sequence> &pyArgLocs) {
3487 MlirBlock block =
createBlock(pyArgTypes, pyArgLocs);
3491 nb::arg(
"parent"), nb::arg(
"arg_types") = nb::list(),
3492 nb::arg(
"arg_locs") = std::nullopt,
3493 "Creates and returns a new Block at the beginning of the given "
3494 "region (with given argument types and locations).")
3498 MlirBlock b =
self.get();
3503 "Append this block to a region, transferring ownership if necessary")
3506 [](
PyBlock &
self,
const nb::args &pyArgTypes,
3507 const std::optional<nb::sequence> &pyArgLocs) {
3510 createBlock(nb::cast<nb::sequence>(pyArgTypes), pyArgLocs);
3513 return PyBlock(
self.getParentOperation(), block);
3515 nb::arg(
"arg_types"), nb::kw_only(),
3516 nb::arg(
"arg_locs") = std::nullopt,
3517 "Creates and returns a new Block before this block "
3518 "(with given argument types and locations).")
3521 [](
PyBlock &
self,
const nb::args &pyArgTypes,
3522 const std::optional<nb::sequence> &pyArgLocs) {
3525 createBlock(nb::cast<nb::sequence>(pyArgTypes), pyArgLocs);
3528 return PyBlock(
self.getParentOperation(), block);
3530 nb::arg(
"arg_types"), nb::kw_only(),
3531 nb::arg(
"arg_locs") = std::nullopt,
3532 "Creates and returns a new Block after this block "
3533 "(with given argument types and locations).")
3538 MlirOperation firstOperation =
3540 return PyOperationIterator(
self.getParentOperation(),
3543 "Iterates over operations in the block.")
3546 return self.get().ptr == other.
get().ptr;
3548 .def(
"__eq__", [](
PyBlock &
self, nb::object &other) {
return false; })
3560 return printAccum.
join();
3562 "Returns the assembly form of the block.")
3572 self.getParentOperation().getObject());
3574 nb::arg(
"operation"),
3575 "Appends an operation to this block. If the operation is currently "
3576 "in another block, it will be moved.");
3582 nb::class_<PyInsertionPoint>(m,
"InsertionPoint")
3583 .def(nb::init<PyBlock &>(), nb::arg(
"block"),
3584 "Inserts after the last operation but still inside the block.")
3585 .def(
"__enter__", &PyInsertionPoint::contextEnter)
3586 .def(
"__exit__", &PyInsertionPoint::contextExit,
3587 nb::arg(
"exc_type").none(), nb::arg(
"exc_value").none(),
3588 nb::arg(
"traceback").none())
3589 .def_prop_ro_static(
3592 auto *ip = PyThreadContextEntry::getDefaultInsertionPoint();
3594 throw nb::value_error(
"No current InsertionPoint");
3597 "Gets the InsertionPoint bound to the current thread or raises "
3598 "ValueError if none has been set")
3599 .def(nb::init<PyOperationBase &>(), nb::arg(
"beforeOperation"),
3600 "Inserts before a referenced operation.")
3601 .def_static(
"at_block_begin", &PyInsertionPoint::atBlockBegin,
3602 nb::arg(
"block"),
"Inserts at the beginning of the block.")
3603 .def_static(
"at_block_terminator", &PyInsertionPoint::atBlockTerminator,
3604 nb::arg(
"block"),
"Inserts before the block terminator.")
3605 .def(
"insert", &PyInsertionPoint::insert, nb::arg(
"operation"),
3606 "Inserts an operation.")
3609 "Returns the block that this InsertionPoint points to.")
3613 auto refOperation =
self.getRefOperation();
3615 return refOperation->getObject();
3618 "The reference operation before which new operations are "
3619 "inserted, or None if the insertion point is at the end of "
3625 nb::class_<PyAttribute>(m,
"Attribute")
3628 .def(nb::init<PyAttribute &>(), nb::arg(
"cast_from_type"),
3629 "Casts the passed attribute to the generic Attribute")
3639 throw MLIRError(
"Unable to parse attribute", errors.take());
3642 nb::arg(
"asm"), nb::arg(
"context").none() = nb::none(),
3643 "Parses an attribute from an assembly form. Raises an MLIRError on "
3647 [](
PyAttribute &
self) {
return self.getContext().getObject(); },
3648 "Context that owns the Attribute")
3649 .def_prop_ro(
"type",
3656 nb::keep_alive<0, 1>(),
"Binds a name to the attribute")
3659 .def(
"__eq__", [](
PyAttribute &
self, nb::object &other) {
return false; })
3673 return printAccum.
join();
3675 "Returns the assembly form of the Attribute.")
3684 printAccum.
parts.append(
"Attribute(");
3687 printAccum.
parts.append(
")");
3688 return printAccum.
join();
3690 .def_prop_ro(
"typeid",
3694 "mlirTypeID was expected to be non-null.");
3700 "mlirTypeID was expected to be non-null.");
3701 std::optional<nb::callable> typeCaster =
3705 return nb::cast(
self);
3706 return typeCaster.value()(
self);
3712 nb::class_<PyNamedAttribute>(m,
"NamedAttribute")
3716 printAccum.
parts.append(
"NamedAttribute(");
3717 printAccum.
parts.append(
3720 printAccum.
parts.append(
"=");
3724 printAccum.
parts.append(
")");
3725 return printAccum.
join();
3733 "The name of the NamedAttribute binding")
3737 nb::keep_alive<0, 1>(),
3738 "The underlying generic attribute of the NamedAttribute binding");
3743 nb::class_<PyType>(m,
"Type")
3746 .def(nb::init<PyType &>(), nb::arg(
"cast_from_type"),
3747 "Casts the passed type to the generic Type")
3757 throw MLIRError(
"Unable to parse type", errors.take());
3760 nb::arg(
"asm"), nb::arg(
"context").none() = nb::none(),
3763 "context", [](
PyType &
self) {
return self.getContext().getObject(); },
3764 "Context that owns the Type")
3765 .def(
"__eq__", [](
PyType &
self,
PyType &other) {
return self == other; })
3767 "__eq__", [](
PyType &
self, nb::object &other) {
return false; },
3768 nb::arg(
"other").none())
3781 return printAccum.
join();
3783 "Returns the assembly form of the type.")
3791 printAccum.
parts.append(
"Type(");
3794 printAccum.
parts.append(
")");
3795 return printAccum.
join();
3801 "mlirTypeID was expected to be non-null.");
3802 std::optional<nb::callable> typeCaster =
3806 return nb::cast(
self);
3807 return typeCaster.value()(
self);
3809 .def_prop_ro(
"typeid", [](
PyType &
self) -> MlirTypeID {
3813 auto origRepr = nb::cast<std::string>(nb::repr(nb::cast(
self)));
3814 throw nb::value_error(
3815 (origRepr + llvm::Twine(
" has no typeid.")).str().c_str());
3821 nb::class_<PyTypeID>(m,
"TypeID")
3830 [](
PyTypeID &
self,
const nb::object &other) {
return false; })
3834 .def(
"__hash__", [](
PyTypeID &
self) {
3841 nb::class_<PyValue>(m,
"Value")
3842 .def(nb::init<PyValue &>(), nb::keep_alive<0, 1>(), nb::arg(
"value"))
3848 "Context in which the value lives.")
3854 [](
PyValue &
self) -> nb::object {
3855 MlirValue v =
self.get();
3860 "expected the owner of the value in Python to match that in "
3862 return self.getParentOperation().getObject();
3867 return nb::cast(
PyBlock(
self.getParentOperation(), block));
3870 assert(
false &&
"Value must be a block argument or an op result");
3873 .def_prop_ro(
"uses",
3875 return PyOpOperandIterator(
3880 return self.get().ptr == other.
get().ptr;
3882 .def(
"__eq__", [](
PyValue &
self, nb::object other) {
return false; })
3891 printAccum.
parts.append(
"Value(");
3894 printAccum.
parts.append(
")");
3895 return printAccum.
join();
3900 [](
PyValue &
self,
bool useLocalScope) {
3905 MlirAsmState valueState =
3912 return printAccum.
join();
3914 nb::arg(
"use_local_scope") =
false)
3919 MlirAsmState valueState = state.get();
3923 return printAccum.
join();
3926 .def_prop_ro(
"type",
3935 "replace_all_uses_with",
3941 "replace_all_uses_except",
3942 [](MlirValue
self, MlirValue with,
PyOperation &exception) {
3943 MlirOperation exceptedUser = exception.
get();
3946 nb::arg(
"with"), nb::arg(
"exceptions"),
3949 "replace_all_uses_except",
3950 [](MlirValue
self, MlirValue with, nb::list exceptions) {
3953 for (nb::handle exception : exceptions) {
3954 exceptionOps.push_back(nb::cast<PyOperation &>(exception).
get());
3958 self, with,
static_cast<intptr_t
>(exceptionOps.size()),
3959 exceptionOps.data());
3961 nb::arg(
"with"), nb::arg(
"exceptions"),
3964 [](
PyValue &
self) {
return self.maybeDownCast(); });
3965 PyBlockArgument::bind(m);
3966 PyOpResult::bind(m);
3967 PyOpOperand::bind(m);
3969 nb::class_<PyAsmState>(m,
"AsmState")
3970 .def(nb::init<PyValue &, bool>(), nb::arg(
"value"),
3971 nb::arg(
"use_local_scope") =
false)
3972 .def(nb::init<PyOperationBase &, bool>(), nb::arg(
"op"),
3973 nb::arg(
"use_local_scope") =
false);
3978 nb::class_<PySymbolTable>(m,
"SymbolTable")
3979 .def(nb::init<PyOperationBase &>())
3980 .def(
"__getitem__", &PySymbolTable::dunderGetItem)
3981 .def(
"insert", &PySymbolTable::insert, nb::arg(
"operation"))
3982 .def(
"erase", &PySymbolTable::erase, nb::arg(
"operation"))
3983 .def(
"__delitem__", &PySymbolTable::dunderDel)
3984 .def(
"__contains__",
3990 .def_static(
"set_symbol_name", &PySymbolTable::setSymbolName,
3991 nb::arg(
"symbol"), nb::arg(
"name"))
3992 .def_static(
"get_symbol_name", &PySymbolTable::getSymbolName,
3994 .def_static(
"get_visibility", &PySymbolTable::getVisibility,
3996 .def_static(
"set_visibility", &PySymbolTable::setVisibility,
3997 nb::arg(
"symbol"), nb::arg(
"visibility"))
3998 .def_static(
"replace_all_symbol_uses",
3999 &PySymbolTable::replaceAllSymbolUses, nb::arg(
"old_symbol"),
4000 nb::arg(
"new_symbol"), nb::arg(
"from_op"))
4001 .def_static(
"walk_symbol_tables", &PySymbolTable::walkSymbolTables,
4002 nb::arg(
"from_op"), nb::arg(
"all_sym_uses_visible"),
4003 nb::arg(
"callback"));
4006 PyBlockArgumentList::bind(m);
4007 PyBlockIterator::bind(m);
4008 PyBlockList::bind(m);
4009 PyOperationIterator::bind(m);
4010 PyOperationList::bind(m);
4011 PyOpAttributeMap::bind(m);
4012 PyOpOperandIterator::bind(m);
4013 PyOpOperandList::bind(m);
4015 PyOpSuccessors::bind(m);
4016 PyRegionIterator::bind(m);
4017 PyRegionList::bind(m);
4025 nb::register_exception_translator([](
const std::exception_ptr &p,
4031 std::rethrow_exception(p);
4035 PyErr_SetObject(PyExc_Exception, obj.ptr());
MLIR_CAPI_EXPORTED void mlirSetGlobalDebugType(const char *type)
Sets the current debug type, similarly to -debug-only=type in the command-line tools.
MLIR_CAPI_EXPORTED void mlirSetGlobalDebugTypes(const char **types, intptr_t n)
Sets multiple current debug types, similarly to `-debug-only=type1,type2" in the command-line tools.
MLIR_CAPI_EXPORTED bool mlirIsGlobalDebugEnabled()
Retuns true if the global debugging flag is set, false otherwise.
MLIR_CAPI_EXPORTED void mlirEnableGlobalDebug(bool enable)
Sets the global debugging flag.
static const char kOperationPrintStateDocstring[]
static const char kValueReplaceAllUsesWithDocstring[]
static const char kContextGetNameLocationDocString[]
static const char kGetNameAsOperand[]
static MlirStringRef toMlirStringRef(const std::string &s)
static const char kModuleParseDocstring[]
static const char kOperationStrDunderDocstring[]
static const char kOperationPrintDocstring[]
static MlirValue getUniqueResult(MlirOperation operation)
static const char kContextGetFileLocationDocstring[]
static const char kDumpDocstring[]
static const char kAppendBlockDocstring[]
static MlirValue getOpResultOrValue(nb::handle operand)
static const char kContextGetFusedLocationDocstring[]
static const char kContextGetFileRangeDocstring[]
static void maybeInsertOperation(PyOperationRef &op, const nb::object &maybeIp)
static nb::object createCustomDialectWrapper(const std::string &dialectNamespace, nb::object dialectDescriptor)
nb::object classmethod(Func f, Args... args)
Helper for creating an @classmethod.
static const char kOperationPrintBytecodeDocstring[]
static const char kOperationGetAsmDocstring[]
static MlirBlock createBlock(const nb::sequence &pyArgTypes, const std::optional< nb::sequence > &pyArgLocs)
Create a block, using the current location context if no locations are specified.
static const char kOperationCreateDocstring[]
static std::vector< MlirType > getValueTypes(Container &container, PyMlirContextRef &context)
Returns the list of types of the values held by container.
static const char kContextParseTypeDocstring[]
static void populateResultTypes(StringRef name, nb::list resultTypeList, const nb::object &resultSegmentSpecObj, std::vector< int32_t > &resultSegmentLengths, std::vector< PyType * > &resultTypes)
static const char kContextGetCallSiteLocationDocstring[]
static const char kValueDunderStrDocstring[]
static const char kValueReplaceAllUsesExceptDocstring[]
static MLIRContext * getContext(OpFoldResult val)
static PyObject * mlirPythonModuleToCapsule(MlirModule module)
Creates a capsule object encapsulating the raw C-API MlirModule.
#define MLIR_PYTHON_MAYBE_DOWNCAST_ATTR
Attribute on MLIR Python objects that expose a function for downcasting the corresponding Python obje...
static PyObject * mlirPythonTypeIDToCapsule(MlirTypeID typeID)
Creates a capsule object encapsulating the raw C-API MlirTypeID.
static MlirOperation mlirPythonCapsuleToOperation(PyObject *capsule)
Extracts an MlirOperations from a capsule as produced from mlirPythonOperationToCapsule.
#define MLIR_PYTHON_CAPI_PTR_ATTR
Attribute on MLIR Python objects that expose their C-API pointer.
static MlirAttribute mlirPythonCapsuleToAttribute(PyObject *capsule)
Extracts an MlirAttribute from a capsule as produced from mlirPythonAttributeToCapsule.
static PyObject * mlirPythonAttributeToCapsule(MlirAttribute attribute)
Creates a capsule object encapsulating the raw C-API MlirAttribute.
static PyObject * mlirPythonLocationToCapsule(MlirLocation loc)
Creates a capsule object encapsulating the raw C-API MlirLocation.
#define MLIR_PYTHON_CAPI_FACTORY_ATTR
Attribute on MLIR Python objects that exposes a factory function for constructing the corresponding P...
static MlirModule mlirPythonCapsuleToModule(PyObject *capsule)
Extracts an MlirModule from a capsule as produced from mlirPythonModuleToCapsule.
static MlirContext mlirPythonCapsuleToContext(PyObject *capsule)
Extracts a MlirContext from a capsule as produced from mlirPythonContextToCapsule.
static MlirTypeID mlirPythonCapsuleToTypeID(PyObject *capsule)
Extracts an MlirTypeID from a capsule as produced from mlirPythonTypeIDToCapsule.
static PyObject * mlirPythonDialectRegistryToCapsule(MlirDialectRegistry registry)
Creates a capsule object encapsulating the raw C-API MlirDialectRegistry.
static PyObject * mlirPythonTypeToCapsule(MlirType type)
Creates a capsule object encapsulating the raw C-API MlirType.
static MlirDialectRegistry mlirPythonCapsuleToDialectRegistry(PyObject *capsule)
Extracts an MlirDialectRegistry from a capsule as produced from mlirPythonDialectRegistryToCapsule.
#define MAKE_MLIR_PYTHON_QUALNAME(local)
static MlirType mlirPythonCapsuleToType(PyObject *capsule)
Extracts an MlirType from a capsule as produced from mlirPythonTypeToCapsule.
static MlirValue mlirPythonCapsuleToValue(PyObject *capsule)
Extracts an MlirValue from a capsule as produced from mlirPythonValueToCapsule.
static PyObject * mlirPythonBlockToCapsule(MlirBlock block)
Creates a capsule object encapsulating the raw C-API MlirBlock.
static PyObject * mlirPythonOperationToCapsule(MlirOperation operation)
Creates a capsule object encapsulating the raw C-API MlirOperation.
static MlirLocation mlirPythonCapsuleToLocation(PyObject *capsule)
Extracts an MlirLocation from a capsule as produced from mlirPythonLocationToCapsule.
static PyObject * mlirPythonValueToCapsule(MlirValue value)
Creates a capsule object encapsulating the raw C-API MlirValue.
static PyObject * mlirPythonContextToCapsule(MlirContext context)
Creates a capsule object encapsulating the raw C-API MlirContext.
static LogicalResult nextIndex(ArrayRef< int64_t > shape, MutableArrayRef< int64_t > index)
Walks over the indices of the elements of a tensor of a given shape by updating index in place to the...
static std::string diag(const llvm::Value &value)
static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer)
static sycl::context getDefaultContext()
A list of operation results.
PyOperationRef & getOperation()
static void bindDerived(ClassTy &c)
PyOpResultList(PyOperationRef operation, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
Python wrapper for MlirOpResult.
static void bindDerived(ClassTy &c)
Accumulates int a python file-like object, either writing text (default) or binary.
MlirStringCallback getCallback()
A CRTP base class for pseudo-containers willing to support Python-type slicing access on top of index...
static void bind(nanobind::module_ &m)
Binds the indexing and length methods in the Python class.
nanobind::class_< PyOpResultList > ClassTy
Base class for all objects that directly or indirectly depend on an MlirContext.
PyMlirContextRef & getContext()
Accesses the context reference.
Used in function arguments when None should resolve to the current context manager set instance.
static PyLocation & resolve()
Used in function arguments when None should resolve to the current context manager set instance.
static PyMlirContext & resolve()
ReferrentTy * get() const
Wrapper around an MlirAsmState.
Wrapper around the generic MlirAttribute.
PyAttribute(PyMlirContextRef contextRef, MlirAttribute attr)
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirAttribute.
static PyAttribute createFromCapsule(nanobind::object capsule)
Creates a PyAttribute from the MlirAttribute wrapped by a capsule.
bool operator==(const PyAttribute &other) const
Wrapper around an MlirBlock.
PyOperationRef & getParentOperation()
Represents a diagnostic handler attached to the context.
PyDiagnosticHandler(MlirContext context, nanobind::object callback)
void detach()
Detaches the handler. Does nothing if not attached.
Python class mirroring the C MlirDiagnostic struct.
nanobind::tuple getNotes()
nanobind::str getMessage()
PyDiagnostic(MlirDiagnostic diagnostic)
MlirDiagnosticSeverity getSeverity()
Wrapper around an MlirDialect.
Wrapper around an MlirDialectRegistry.
nanobind::object getCapsule()
static PyDialectRegistry createFromCapsule(nanobind::object capsule)
User-level dialect object.
User-level object for accessing dialects with dotted syntax such as: ctx.dialect.std.
MlirDialect getDialectForKey(const std::string &key, bool attrError)
std::optional< nanobind::callable > lookupValueCaster(MlirTypeID mlirTypeID, MlirDialect dialect)
Returns the custom value caster for MlirTypeID mlirTypeID.
std::optional< nanobind::object > lookupOperationClass(llvm::StringRef operationName)
Looks up a registered operation class (deriving from OpView) by operation name.
static PyGlobals & get()
Most code should get the globals via this static accessor.
An insertion point maintains a pointer to a Block and a reference operation.
static PyInsertionPoint atBlockTerminator(PyBlock &block)
Shortcut to create an insertion point before the block terminator.
PyInsertionPoint(PyBlock &block)
Creates an insertion point positioned after the last operation in the block, but still inside the blo...
static PyInsertionPoint atBlockBegin(PyBlock &block)
Shortcut to create an insertion point at the beginning of the block.
void contextExit(const nanobind::object &excType, const nanobind::object &excVal, const nanobind::object &excTb)
void insert(PyOperationBase &operationBase)
Inserts an operation.
static nanobind::object contextEnter(nanobind::object insertionPoint)
Enter and exit the context manager.
Wrapper around an MlirLocation.
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirLocation.
PyLocation(PyMlirContextRef contextRef, MlirLocation loc)
static PyLocation createFromCapsule(nanobind::object capsule)
Creates a PyLocation from the MlirLocation wrapped by a capsule.
void contextExit(const nanobind::object &excType, const nanobind::object &excVal, const nanobind::object &excTb)
static nanobind::object contextEnter(nanobind::object location)
Enter and exit the context manager.
MlirContext get()
Accesses the underlying MlirContext.
PyMlirContextRef getRef()
Gets a strong reference to this context, which will ensure it is kept alive for the life of the refer...
void clearOperationsInside(PyOperationBase &op)
Clears all operations nested inside the given op using clearOperation(MlirOperation).
static size_t getLiveCount()
Gets the count of live context objects. Used for testing.
void clearOperationAndInside(PyOperationBase &op)
Clears the operaiton and all operations inside using clearOperation(MlirOperation).
size_t getLiveModuleCount()
Gets the count of live modules associated with this context.
nanobind::object attachDiagnosticHandler(nanobind::object callback)
Attaches a Python callback as a diagnostic handler, returning a registration object (internally a PyD...
size_t clearLiveOperations()
Clears the live operations map, returning the number of entries which were invalidated.
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirContext.
std::vector< PyOperation * > getLiveOperationObjects()
Get a list of Python objects which are still in the live context map.
void contextExit(const nanobind::object &excType, const nanobind::object &excVal, const nanobind::object &excTb)
void clearOperation(MlirOperation op)
Removes an operation from the live operations map and sets it invalid.
static PyMlirContextRef forContext(MlirContext context)
Returns a context reference for the singleton PyMlirContext wrapper for the given context.
static nanobind::object createFromCapsule(nanobind::object capsule)
Creates a PyMlirContext from the MlirContext wrapped by a capsule.
size_t getLiveOperationCount()
Gets the count of live operations associated with this context.
static nanobind::object contextEnter(nanobind::object context)
Enter and exit the context manager.
MlirModule get()
Gets the backing MlirModule.
static PyModuleRef forModule(MlirModule module)
Returns a PyModule reference for the given MlirModule.
static nanobind::object createFromCapsule(nanobind::object capsule)
Creates a PyModule from the MlirModule wrapped by a capsule.
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirModule.
PyModule(PyModule &)=delete
Represents a Python MlirNamedAttr, carrying an optional owned name.
PyNamedAttribute(MlirAttribute attr, std::string ownedName)
Constructs a PyNamedAttr that retains an owned name.
MlirNamedAttribute namedAttr
nanobind::object getObject()
nanobind::object releaseObject()
Releases the object held by this instance, returning it.
A PyOpView is equivalent to the C++ "Op" wrappers: these are the basis for providing more instance-sp...
static nanobind::object constructDerived(const nanobind::object &cls, const nanobind::object &operation)
Construct an instance of a class deriving from OpView, bypassing its __init__ method.
static nanobind::object buildGeneric(std::string_view name, std::tuple< int, bool > opRegionSpec, nanobind::object operandSegmentSpecObj, nanobind::object resultSegmentSpecObj, std::optional< nanobind::list > resultTypeList, nanobind::list operandList, std::optional< nanobind::dict > attributes, std::optional< std::vector< PyBlock * >> successors, std::optional< int > regions, DefaultingPyLocation location, const nanobind::object &maybeIp)
PyOpView(const nanobind::object &operationObject)
Base class for PyOperation and PyOpView which exposes the primary, user visible methods for manipulat...
void walk(std::function< MlirWalkResult(MlirOperation)> callback, MlirWalkOrder walkOrder)
virtual PyOperation & getOperation()=0
Each must provide access to the raw Operation.
void print(std::optional< int64_t > largeElementsLimit, bool enableDebugInfo, bool prettyDebugInfo, bool printGenericOpForm, bool useLocalScope, bool assumeVerified, nanobind::object fileObject, bool binary, bool skipRegions)
Implements the bound 'print' method and helps with others.
void moveAfter(PyOperationBase &other)
Moves the operation before or after the other operation.
nanobind::object getAsm(bool binary, std::optional< int64_t > largeElementsLimit, bool enableDebugInfo, bool prettyDebugInfo, bool printGenericOpForm, bool useLocalScope, bool assumeVerified, bool skipRegions)
void writeBytecode(const nanobind::object &fileObject, std::optional< int64_t > bytecodeVersion)
void moveBefore(PyOperationBase &other)
bool verify()
Verify the operation.
void detachFromParent()
Detaches the operation from its parent block and updates its state accordingly.
PyOperation(PyMlirContextRef contextRef, MlirOperation operation)
void erase()
Erases the underlying MlirOperation, removes its pointer from the parent context's live operations ma...
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirOperation.
static PyOperationRef createDetached(PyMlirContextRef contextRef, MlirOperation operation, nanobind::object parentKeepAlive=nanobind::object())
Creates a detached operation.
nanobind::object clone(const nanobind::object &ip)
Clones this operation.
PyOperation & getOperation() override
Each must provide access to the raw Operation.
static nanobind::object createFromCapsule(nanobind::object capsule)
Creates a PyOperation from the MlirOperation wrapped by a capsule.
MlirOperation get() const
static PyOperationRef forOperation(PyMlirContextRef contextRef, MlirOperation operation, nanobind::object parentKeepAlive=nanobind::object())
Returns a PyOperation for the given MlirOperation, optionally associating it with a parentKeepAlive.
void setAttached(const nanobind::object &parent=nanobind::object())
std::optional< PyOperationRef > getParentOperation()
Gets the parent operation or raises an exception if the operation has no parent.
nanobind::object createOpView()
Creates an OpView suitable for this operation.
PyBlock getBlock()
Gets the owning block or raises an exception if the operation has no owning block.
static nanobind::object create(std::string_view name, std::optional< std::vector< PyType * >> results, llvm::ArrayRef< MlirValue > operands, std::optional< nanobind::dict > attributes, std::optional< std::vector< PyBlock * >> successors, int regions, DefaultingPyLocation location, const nanobind::object &ip, bool inferType)
Creates an operation. See corresponding python docstring.
static PyOperationRef parse(PyMlirContextRef contextRef, const std::string &sourceStr, const std::string &sourceName)
Parses a source string (either text assembly or bytecode), creating a detached operation.
void setInvalid()
Invalidate the operation.
Wrapper around an MlirRegion.
PyOperationRef & getParentOperation()
Bindings for MLIR symbol tables.
void dunderDel(const std::string &name)
Removes the operation with the given name from the symbol table and erases it, throws if there is no ...
static void walkSymbolTables(PyOperationBase &from, bool allSymUsesVisible, nanobind::object callback)
Walks all symbol tables under and including 'from'.
static void replaceAllSymbolUses(const std::string &oldSymbol, const std::string &newSymbol, PyOperationBase &from)
Replaces all symbol uses within an operation.
static void setVisibility(PyOperationBase &symbol, const std::string &visibility)
static void setSymbolName(PyOperationBase &symbol, const std::string &name)
MlirAttribute insert(PyOperationBase &symbol)
Inserts the given operation into the symbol table.
void erase(PyOperationBase &symbol)
Removes the given operation from the symbol table and erases it.
PySymbolTable(PyOperationBase &operation)
Constructs a symbol table for the given operation.
static MlirAttribute getSymbolName(PyOperationBase &symbol)
Gets and sets the name of a symbol op.
nanobind::object dunderGetItem(const std::string &name)
Returns the symbol (opview) with the given name, throws if there is no such symbol in the table.
static MlirAttribute getVisibility(PyOperationBase &symbol)
Gets and sets the visibility of a symbol op.
Tracks an entry in the thread context stack.
static PyThreadContextEntry * getTopOfStack()
Stack management.
static void popLocation(PyLocation &location)
static nanobind::object pushLocation(nanobind::object location)
PyLocation * getLocation()
static nanobind::object pushContext(nanobind::object context)
static PyLocation * getDefaultLocation()
Gets the top of stack location and returns nullptr if not defined.
static void popInsertionPoint(PyInsertionPoint &insertionPoint)
static nanobind::object pushInsertionPoint(nanobind::object insertionPoint)
static void popContext(PyMlirContext &context)
static PyInsertionPoint * getDefaultInsertionPoint()
Gets the top of stack insertion point and return nullptr if not defined.
PyMlirContext * getContext()
static PyMlirContext * getDefaultContext()
Gets the top of stack context and return nullptr if not defined.
static std::vector< PyThreadContextEntry > & getStack()
Gets the thread local stack.
PyInsertionPoint * getInsertionPoint()
A TypeID provides an efficient and unique identifier for a specific C++ type.
static PyTypeID createFromCapsule(nanobind::object capsule)
Creates a PyTypeID from the MlirTypeID wrapped by a capsule.
bool operator==(const PyTypeID &other) const
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirTypeID.
PyTypeID(MlirTypeID typeID)
Wrapper around the generic MlirType.
PyType(PyMlirContextRef contextRef, MlirType type)
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirType.
static PyType createFromCapsule(nanobind::object capsule)
Creates a PyType from the MlirType wrapped by a capsule.
bool operator==(const PyType &other) const
Wrapper around the generic MlirValue.
PyValue(PyOperationRef parentOperation, MlirValue value)
static PyValue createFromCapsule(nanobind::object capsule)
Creates a PyValue from the MlirValue wrapped by a capsule.
nanobind::object maybeDownCast()
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirValue.
MLIR_CAPI_EXPORTED intptr_t mlirDiagnosticGetNumNotes(MlirDiagnostic diagnostic)
Returns the number of notes attached to the diagnostic.
MLIR_CAPI_EXPORTED MlirDiagnosticSeverity mlirDiagnosticGetSeverity(MlirDiagnostic diagnostic)
Returns the severity of the diagnostic.
MLIR_CAPI_EXPORTED void mlirDiagnosticPrint(MlirDiagnostic diagnostic, MlirStringCallback callback, void *userData)
Prints a diagnostic using the provided callback.
MlirDiagnosticSeverity
Severity of a diagnostic.
MLIR_CAPI_EXPORTED MlirDiagnostic mlirDiagnosticGetNote(MlirDiagnostic diagnostic, intptr_t pos)
Returns pos-th note attached to the diagnostic.
MLIR_CAPI_EXPORTED void mlirEmitError(MlirLocation location, const char *message)
Emits an error at the given location through the diagnostics engine.
MLIR_CAPI_EXPORTED MlirDiagnosticHandlerID mlirContextAttachDiagnosticHandler(MlirContext context, MlirDiagnosticHandler handler, void *userData, void(*deleteUserData)(void *))
Attaches the diagnostic handler to the context.
MLIR_CAPI_EXPORTED void mlirContextDetachDiagnosticHandler(MlirContext context, MlirDiagnosticHandlerID id)
Detaches an attached diagnostic handler from the context given its identifier.
uint64_t MlirDiagnosticHandlerID
Opaque identifier of a diagnostic handler, useful to detach a handler.
MLIR_CAPI_EXPORTED MlirLocation mlirDiagnosticGetLocation(MlirDiagnostic diagnostic)
Returns the location at which the diagnostic is reported.
MLIR_CAPI_EXPORTED MlirAttribute mlirDenseI32ArrayGet(MlirContext ctx, intptr_t size, int32_t const *values)
MLIR_CAPI_EXPORTED MlirAttribute mlirStringAttrGet(MlirContext ctx, MlirStringRef str)
Creates a string attribute in the given context containing the given string.
MLIR_CAPI_EXPORTED MlirAttribute mlirLocationGetAttribute(MlirLocation location)
Returns the underlying location attribute of this location.
MLIR_CAPI_EXPORTED intptr_t mlirBlockArgumentGetArgNumber(MlirValue value)
Returns the position of the value in the argument list of its block.
static bool mlirAttributeIsNull(MlirAttribute attr)
Checks whether an attribute is null.
MlirWalkResult(* MlirOperationWalkCallback)(MlirOperation, void *userData)
Operation walker type.
MLIR_CAPI_EXPORTED void mlirOperationWriteBytecode(MlirOperation op, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but writing the bytecode format.
MLIR_CAPI_EXPORTED MlirIdentifier mlirOperationGetName(MlirOperation op)
Gets the name of the operation as an identifier.
MLIR_CAPI_EXPORTED MlirLocation mlirLocationFileLineColGet(MlirContext context, MlirStringRef filename, unsigned line, unsigned col)
Creates an File/Line/Column location owned by the given context.
MLIR_CAPI_EXPORTED void mlirSymbolTableWalkSymbolTables(MlirOperation from, bool allSymUsesVisible, void(*callback)(MlirOperation, bool, void *userData), void *userData)
Walks all symbol table operations nested within, and including, op.
MLIR_CAPI_EXPORTED MlirStringRef mlirDialectGetNamespace(MlirDialect dialect)
Returns the namespace of the given dialect.
MLIR_CAPI_EXPORTED intptr_t mlirOperationGetNumResults(MlirOperation op)
Returns the number of results of the operation.
MLIR_CAPI_EXPORTED MlirAttribute mlirSymbolTableInsert(MlirSymbolTable symbolTable, MlirOperation operation)
Inserts the given operation into the given symbol table.
MlirWalkOrder
Traversal order for operation walk.
MLIR_CAPI_EXPORTED MlirNamedAttribute mlirOperationGetAttribute(MlirOperation op, intptr_t pos)
Return pos-th attribute of the operation.
MLIR_CAPI_EXPORTED void mlirOperationStateAddOperands(MlirOperationState *state, intptr_t n, MlirValue const *operands)
MLIR_CAPI_EXPORTED void mlirModuleDestroy(MlirModule module)
Takes a module owned by the caller and deletes it.
MLIR_CAPI_EXPORTED MlirNamedAttribute mlirNamedAttributeGet(MlirIdentifier name, MlirAttribute attr)
Associates an attribute with the name. Takes ownership of neither.
MLIR_CAPI_EXPORTED void mlirSymbolTableErase(MlirSymbolTable symbolTable, MlirOperation operation)
Removes the given operation from the symbol table and erases it.
MLIR_CAPI_EXPORTED void mlirOpPrintingFlagsUseLocalScope(MlirOpPrintingFlags flags)
Use local scope when printing the operation.
MLIR_CAPI_EXPORTED bool mlirValueIsABlockArgument(MlirValue value)
Returns 1 if the value is a block argument, 0 otherwise.
MLIR_CAPI_EXPORTED void mlirContextAppendDialectRegistry(MlirContext ctx, MlirDialectRegistry registry)
Append the contents of the given dialect registry to the registry associated with the context.
MLIR_CAPI_EXPORTED MlirStringRef mlirIdentifierStr(MlirIdentifier ident)
Gets the string value of the identifier.
static bool mlirModuleIsNull(MlirModule module)
Checks whether a module is null.
MLIR_CAPI_EXPORTED MlirType mlirTypeParseGet(MlirContext context, MlirStringRef type)
Parses a type. The type is owned by the context.
MLIR_CAPI_EXPORTED MlirOpOperand mlirOpOperandGetNextUse(MlirOpOperand opOperand)
Returns an op operand representing the next use of the value, or a null op operand if there is no nex...
MLIR_CAPI_EXPORTED MlirType mlirAttributeGetType(MlirAttribute attribute)
Gets the type of this attribute.
MLIR_CAPI_EXPORTED void mlirContextSetAllowUnregisteredDialects(MlirContext context, bool allow)
Sets whether unregistered dialects are allowed in this context.
MLIR_CAPI_EXPORTED void mlirRegionInsertOwnedBlockBefore(MlirRegion region, MlirBlock reference, MlirBlock block)
Takes a block owned by the caller and inserts it before the (non-owned) reference block in the given ...
MLIR_CAPI_EXPORTED void mlirValueReplaceAllUsesOfWith(MlirValue of, MlirValue with)
Replace all uses of 'of' value with the 'with' value, updating anything in the IR that uses 'of' to u...
MLIR_CAPI_EXPORTED MlirBlock mlirOperationGetSuccessor(MlirOperation op, intptr_t pos)
Returns pos-th successor of the operation.
MLIR_CAPI_EXPORTED void mlirValuePrintAsOperand(MlirValue value, MlirAsmState state, MlirStringCallback callback, void *userData)
Prints a value as an operand (i.e., the ValueID).
MLIR_CAPI_EXPORTED MlirLocation mlirLocationUnknownGet(MlirContext context)
Creates a location with unknown position owned by the given context.
MLIR_CAPI_EXPORTED void mlirTypePrint(MlirType type, MlirStringCallback callback, void *userData)
Prints a location by sending chunks of the string representation and forwarding userData tocallback`.
MLIR_CAPI_EXPORTED void mlirOperationSetAttributeByName(MlirOperation op, MlirStringRef name, MlirAttribute attr)
Sets an attribute by name, replacing the existing if it exists or adding a new one otherwise.
MLIR_CAPI_EXPORTED MlirOperation mlirOpOperandGetOwner(MlirOpOperand opOperand)
Returns the owner operation of an op operand.
MLIR_CAPI_EXPORTED void mlirOpPrintingFlagsElideLargeResourceString(MlirOpPrintingFlags flags, intptr_t largeResourceLimit)
Enables the elision of large resources strings by omitting them from the dialect_resources section.
MLIR_CAPI_EXPORTED MlirDialect mlirAttributeGetDialect(MlirAttribute attribute)
Gets the dialect of the attribute.
MLIR_CAPI_EXPORTED void mlirAttributePrint(MlirAttribute attr, MlirStringCallback callback, void *userData)
Prints an attribute by sending chunks of the string representation and forwarding userData tocallback...
MLIR_CAPI_EXPORTED MlirRegion mlirBlockGetParentRegion(MlirBlock block)
Returns the region that contains this block.
MLIR_CAPI_EXPORTED void mlirOperationMoveBefore(MlirOperation op, MlirOperation other)
Moves the given operation immediately before the other operation in its parent block.
static bool mlirValueIsNull(MlirValue value)
Returns whether the value is null.
MLIR_CAPI_EXPORTED void mlirValueReplaceAllUsesExcept(MlirValue of, MlirValue with, intptr_t numExceptions, MlirOperation *exceptions)
Replace all uses of 'of' value with 'with' value, updating anything in the IR that uses 'of' to use '...
MLIR_CAPI_EXPORTED void mlirOperationPrintWithState(MlirOperation op, MlirAsmState state, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but accepts AsmState controlling the printing behavior as well as caching ...
MlirWalkResult
Operation walk result.
@ MlirWalkResultInterrupt
MLIR_CAPI_EXPORTED void mlirRegionInsertOwnedBlock(MlirRegion region, intptr_t pos, MlirBlock block)
Takes a block owned by the caller and inserts it at pos to the given region.
MLIR_CAPI_EXPORTED MlirAttribute mlirOperationGetAttributeByName(MlirOperation op, MlirStringRef name)
Returns an attribute attached to the operation given its name.
static bool mlirTypeIsNull(MlirType type)
Checks whether a type is null.
MLIR_CAPI_EXPORTED bool mlirContextIsRegisteredOperation(MlirContext context, MlirStringRef name)
Returns whether the given fully-qualified operation (i.e.
MLIR_CAPI_EXPORTED intptr_t mlirOperationGetNumSuccessors(MlirOperation op)
Returns the number of successor blocks of the operation.
MLIR_CAPI_EXPORTED MlirOperation mlirOperationClone(MlirOperation op)
Creates a deep copy of an operation.
MLIR_CAPI_EXPORTED intptr_t mlirBlockGetNumArguments(MlirBlock block)
Returns the number of arguments of the block.
MLIR_CAPI_EXPORTED void mlirOpPrintingFlagsPrintGenericOpForm(MlirOpPrintingFlags flags)
Always print operations in the generic form.
MLIR_CAPI_EXPORTED MlirLocation mlirLocationFusedGet(MlirContext ctx, intptr_t nLocations, MlirLocation const *locations, MlirAttribute metadata)
Creates a fused location with an array of locations and metadata.
MLIR_CAPI_EXPORTED void mlirBlockInsertOwnedOperationBefore(MlirBlock block, MlirOperation reference, MlirOperation operation)
Takes an operation owned by the caller and inserts it before the (non-owned) reference operation in t...
MLIR_CAPI_EXPORTED void mlirAsmStateDestroy(MlirAsmState state)
Destroys printing flags created with mlirAsmStateCreate.
static bool mlirContextIsNull(MlirContext context)
Checks whether a context is null.
MLIR_CAPI_EXPORTED MlirDialect mlirContextGetOrLoadDialect(MlirContext context, MlirStringRef name)
Gets the dialect instance owned by the given context using the dialect namespace to identify it,...
MLIR_CAPI_EXPORTED void mlirOpPrintingFlagsElideLargeElementsAttrs(MlirOpPrintingFlags flags, intptr_t largeElementLimit)
Enables the elision of large elements attributes by printing a lexically valid but otherwise meaningl...
MLIR_CAPI_EXPORTED void mlirRegionInsertOwnedBlockAfter(MlirRegion region, MlirBlock reference, MlirBlock block)
Takes a block owned by the caller and inserts it after the (non-owned) reference block in the given r...
MLIR_CAPI_EXPORTED void mlirBlockArgumentSetType(MlirValue value, MlirType type)
Sets the type of the block argument to the given type.
MLIR_CAPI_EXPORTED MlirContext mlirOperationGetContext(MlirOperation op)
Gets the context this operation is associated with.
MLIR_CAPI_EXPORTED MlirBlock mlirBlockCreate(intptr_t nArgs, MlirType const *args, MlirLocation const *locs)
Creates a new empty block with the given argument types and transfers ownership to the caller.
static bool mlirBlockIsNull(MlirBlock block)
Checks whether a block is null.
MLIR_CAPI_EXPORTED void mlirBlockAppendOwnedOperation(MlirBlock block, MlirOperation operation)
Takes an operation owned by the caller and appends it to the block.
MLIR_CAPI_EXPORTED MlirValue mlirBlockGetArgument(MlirBlock block, intptr_t pos)
Returns pos-th argument of the block.
MLIR_CAPI_EXPORTED MlirOperation mlirSymbolTableLookup(MlirSymbolTable symbolTable, MlirStringRef name)
Looks up a symbol with the given name in the given symbol table and returns the operation that corres...
MLIR_CAPI_EXPORTED MlirContext mlirTypeGetContext(MlirType type)
Gets the context that a type was created with.
MLIR_CAPI_EXPORTED MlirLocation mlirLocationFileLineColRangeGet(MlirContext context, MlirStringRef filename, unsigned start_line, unsigned start_col, unsigned end_line, unsigned end_col)
Creates an File/Line/Column range location owned by the given context.
MLIR_CAPI_EXPORTED void mlirValueDump(MlirValue value)
Prints the value to the standard error stream.
MLIR_CAPI_EXPORTED MlirModule mlirModuleCreateEmpty(MlirLocation location)
Creates a new, empty module and transfers ownership to the caller.
MLIR_CAPI_EXPORTED bool mlirOpOperandIsNull(MlirOpOperand opOperand)
Returns whether the op operand is null.
MLIR_CAPI_EXPORTED MlirSymbolTable mlirSymbolTableCreate(MlirOperation operation)
Creates a symbol table for the given operation.
MLIR_CAPI_EXPORTED bool mlirLocationEqual(MlirLocation l1, MlirLocation l2)
Checks if two locations are equal.
MLIR_CAPI_EXPORTED MlirBlock mlirOperationGetBlock(MlirOperation op)
Gets the block that owns this operation, returning null if the operation is not owned.
static bool mlirLocationIsNull(MlirLocation location)
Checks if the location is null.
MLIR_CAPI_EXPORTED bool mlirOperationEqual(MlirOperation op, MlirOperation other)
Checks whether two operation handles point to the same operation.
MLIR_CAPI_EXPORTED MlirValue mlirBlockAddArgument(MlirBlock block, MlirType type, MlirLocation loc)
Appends an argument of the specified type to the block.
MLIR_CAPI_EXPORTED void mlirOperationPrintWithFlags(MlirOperation op, MlirOpPrintingFlags flags, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but accepts flags controlling the printing behavior.
MLIR_CAPI_EXPORTED MlirOpOperand mlirValueGetFirstUse(MlirValue value)
Returns an op operand representing the first use of the value, or a null op operand if there are no u...
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`.
MLIR_CAPI_EXPORTED bool mlirOperationVerify(MlirOperation op)
Verify the operation and return true if it passes, false if it fails.
MLIR_CAPI_EXPORTED MlirOperation mlirModuleGetOperation(MlirModule module)
Views the module as a generic operation.
MLIR_CAPI_EXPORTED bool mlirTypeEqual(MlirType t1, MlirType t2)
Checks if two types are equal.
MLIR_CAPI_EXPORTED MlirOperationState mlirOperationStateGet(MlirStringRef name, MlirLocation loc)
Constructs an operation state from a name and a location.
MLIR_CAPI_EXPORTED unsigned mlirOpOperandGetOperandNumber(MlirOpOperand opOperand)
Returns the operand number of an op operand.
MLIR_CAPI_EXPORTED MlirOperation mlirBlockGetTerminator(MlirBlock block)
Returns the terminator operation in the block or null if no terminator.
MLIR_CAPI_EXPORTED void mlirOpPrintingFlagsSkipRegions(MlirOpPrintingFlags flags)
Skip printing regions.
MLIR_CAPI_EXPORTED MlirOperation mlirOperationGetNextInBlock(MlirOperation op)
Returns an operation immediately following the given operation it its enclosing block.
MLIR_CAPI_EXPORTED MlirOperation mlirOperationGetParentOperation(MlirOperation op)
Gets the operation that owns this operation, returning null if the operation is not owned.
MLIR_CAPI_EXPORTED MlirContext mlirModuleGetContext(MlirModule module)
Gets the context that a module was created with.
MLIR_CAPI_EXPORTED MlirLocation mlirLocationFromAttribute(MlirAttribute attribute)
Creates a location from a location attribute.
MLIR_CAPI_EXPORTED void mlirOpPrintingFlagsAssumeVerified(MlirOpPrintingFlags flags)
Do not verify the operation when using custom operation printers.
MLIR_CAPI_EXPORTED MlirTypeID mlirTypeGetTypeID(MlirType type)
Gets the type ID of the type.
MLIR_CAPI_EXPORTED MlirStringRef mlirSymbolTableGetVisibilityAttributeName(void)
Returns the name of the attribute used to store symbol visibility.
static bool mlirDialectIsNull(MlirDialect dialect)
Checks if the dialect is null.
MLIR_CAPI_EXPORTED void mlirBytecodeWriterConfigDestroy(MlirBytecodeWriterConfig config)
Destroys printing flags created with mlirBytecodeWriterConfigCreate.
MLIR_CAPI_EXPORTED MlirValue mlirOperationGetOperand(MlirOperation op, intptr_t pos)
Returns pos-th operand of the operation.
MLIR_CAPI_EXPORTED void mlirOperationStateAddAttributes(MlirOperationState *state, intptr_t n, MlirNamedAttribute const *attributes)
MLIR_CAPI_EXPORTED MlirBlock mlirBlockGetNextInRegion(MlirBlock block)
Returns the block immediately following the given block in its parent region.
MLIR_CAPI_EXPORTED MlirLocation mlirLocationCallSiteGet(MlirLocation callee, MlirLocation caller)
Creates a call site location with a callee and a caller.
MLIR_CAPI_EXPORTED MlirOperation mlirOpResultGetOwner(MlirValue value)
Returns an operation that produced this value as its result.
MLIR_CAPI_EXPORTED bool mlirValueIsAOpResult(MlirValue value)
Returns 1 if the value is an operation result, 0 otherwise.
MLIR_CAPI_EXPORTED intptr_t mlirOperationGetNumOperands(MlirOperation op)
Returns the number of operands of the operation.
static bool mlirDialectRegistryIsNull(MlirDialectRegistry registry)
Checks if the dialect registry is null.
MLIR_CAPI_EXPORTED void mlirOperationWalk(MlirOperation op, MlirOperationWalkCallback callback, void *userData, MlirWalkOrder walkOrder)
Walks operation op in walkOrder and calls callback on that operation.
MLIR_CAPI_EXPORTED MlirContext mlirContextCreateWithThreading(bool threadingEnabled)
Creates an MLIR context with an explicit setting of the multithreading setting and transfers its owne...
MLIR_CAPI_EXPORTED MlirOperation mlirBlockGetParentOperation(MlirBlock)
Returns the closest surrounding operation that contains this block.
MLIR_CAPI_EXPORTED intptr_t mlirOperationGetNumRegions(MlirOperation op)
Returns the number of regions attached to the given operation.
MLIR_CAPI_EXPORTED MlirContext mlirLocationGetContext(MlirLocation location)
Gets the context that a location was created with.
MLIR_CAPI_EXPORTED void mlirBlockEraseArgument(MlirBlock block, unsigned index)
Erase the argument at 'index' and remove it from the argument list.
MLIR_CAPI_EXPORTED bool mlirOperationRemoveAttributeByName(MlirOperation op, MlirStringRef name)
Removes an attribute by name.
MLIR_CAPI_EXPORTED void mlirAttributeDump(MlirAttribute attr)
Prints the attribute to the standard error stream.
MLIR_CAPI_EXPORTED MlirLogicalResult mlirSymbolTableReplaceAllSymbolUses(MlirStringRef oldSymbol, MlirStringRef newSymbol, MlirOperation from)
Attempt to replace all uses that are nested within the given operation of the given symbol 'oldSymbol...
MLIR_CAPI_EXPORTED MlirAttribute mlirAttributeParseGet(MlirContext context, MlirStringRef attr)
Parses an attribute. The attribute is owned by the context.
MLIR_CAPI_EXPORTED MlirModule mlirModuleCreateParse(MlirContext context, MlirStringRef module)
Parses a module from the string and transfers ownership to the caller.
MLIR_CAPI_EXPORTED void mlirRegionAppendOwnedBlock(MlirRegion region, MlirBlock block)
Takes a block owned by the caller and appends it to the given region.
MLIR_CAPI_EXPORTED MlirOperation mlirBlockGetFirstOperation(MlirBlock block)
Returns the first operation in the block.
MLIR_CAPI_EXPORTED void mlirTypeDump(MlirType type)
Prints the type to the standard error stream.
MLIR_CAPI_EXPORTED MlirValue mlirOperationGetResult(MlirOperation op, intptr_t pos)
Returns pos-th result of the operation.
MLIR_CAPI_EXPORTED MlirBytecodeWriterConfig mlirBytecodeWriterConfigCreate(void)
Creates new printing flags with defaults, intended for customization.
MLIR_CAPI_EXPORTED MlirContext mlirAttributeGetContext(MlirAttribute attribute)
Gets the context that an attribute was created with.
MLIR_CAPI_EXPORTED MlirBlock mlirBlockArgumentGetOwner(MlirValue value)
Returns the block in which this value is defined as an argument.
static bool mlirRegionIsNull(MlirRegion region)
Checks whether a region is null.
MLIR_CAPI_EXPORTED void mlirOperationDestroy(MlirOperation op)
Takes an operation owned by the caller and destroys it.
MLIR_CAPI_EXPORTED MlirRegion mlirOperationGetRegion(MlirOperation op, intptr_t pos)
Returns pos-th region attached to the operation.
MLIR_CAPI_EXPORTED MlirDialect mlirTypeGetDialect(MlirType type)
Gets the dialect a type belongs to.
MLIR_CAPI_EXPORTED MlirIdentifier mlirIdentifierGet(MlirContext context, MlirStringRef str)
Gets an identifier with the given string value.
MLIR_CAPI_EXPORTED void mlirOperationSetSuccessor(MlirOperation op, intptr_t pos, MlirBlock block)
Set pos-th successor of the operation.
MLIR_CAPI_EXPORTED void mlirContextLoadAllAvailableDialects(MlirContext context)
Eagerly loads all available dialects registered with a context, making them available for use for IR ...
MLIR_CAPI_EXPORTED void mlirOperationStateAddOwnedRegions(MlirOperationState *state, intptr_t n, MlirRegion const *regions)
MLIR_CAPI_EXPORTED void mlirOperationStateAddSuccessors(MlirOperationState *state, intptr_t n, MlirBlock const *successors)
MLIR_CAPI_EXPORTED MlirBlock mlirModuleGetBody(MlirModule module)
Gets the body of the module, i.e. the only block it contains.
MLIR_CAPI_EXPORTED void mlirOpPrintingFlagsDestroy(MlirOpPrintingFlags flags)
Destroys printing flags created with mlirOpPrintingFlagsCreate.
MLIR_CAPI_EXPORTED MlirLocation mlirLocationNameGet(MlirContext context, MlirStringRef name, MlirLocation childLoc)
Creates a name location owned by the given context.
MLIR_CAPI_EXPORTED void mlirContextEnableMultithreading(MlirContext context, bool enable)
Set threading mode (must be set to false to mlir-print-ir-after-all).
MLIR_CAPI_EXPORTED void mlirBlockPrint(MlirBlock block, MlirStringCallback callback, void *userData)
Prints a block by sending chunks of the string representation and forwarding userData tocallback`.
MLIR_CAPI_EXPORTED void mlirBytecodeWriterConfigDesiredEmitVersion(MlirBytecodeWriterConfig flags, int64_t version)
Sets the version to emit in the writer config.
MLIR_CAPI_EXPORTED MlirStringRef mlirSymbolTableGetSymbolAttributeName(void)
Returns the name of the attribute used to store symbol names compatible with symbol tables.
MLIR_CAPI_EXPORTED MlirRegion mlirRegionCreate(void)
Creates a new empty region and transfers ownership to the caller.
MLIR_CAPI_EXPORTED MlirModule mlirModuleCreateParseFromFile(MlirContext context, MlirStringRef fileName)
Parses a module from file and transfers ownership to the caller.
MLIR_CAPI_EXPORTED void mlirBlockDetach(MlirBlock block)
Detach a block from the owning region and assume ownership.
MLIR_CAPI_EXPORTED void mlirOperationStateAddResults(MlirOperationState *state, intptr_t n, MlirType const *results)
Adds a list of components to the operation state.
MLIR_CAPI_EXPORTED void mlirOpPrintingFlagsEnableDebugInfo(MlirOpPrintingFlags flags, bool enable, bool prettyForm)
Enable or disable printing of debug information (based on enable).
MLIR_CAPI_EXPORTED MlirLocation mlirOperationGetLocation(MlirOperation op)
Gets the location of the operation.
MLIR_CAPI_EXPORTED MlirTypeID mlirAttributeGetTypeID(MlirAttribute attribute)
Gets the type id of the attribute.
MLIR_CAPI_EXPORTED void mlirOperationSetOperand(MlirOperation op, intptr_t pos, MlirValue newValue)
Sets the pos-th operand of the operation.
MLIR_CAPI_EXPORTED void mlirOperationDump(MlirOperation op)
Prints an operation to stderr.
MLIR_CAPI_EXPORTED intptr_t mlirOpResultGetResultNumber(MlirValue value)
Returns the position of the value in the list of results of the operation that produced it.
MLIR_CAPI_EXPORTED MlirOpPrintingFlags mlirOpPrintingFlagsCreate(void)
Creates new printing flags with defaults, intended for customization.
MLIR_CAPI_EXPORTED MlirAsmState mlirAsmStateCreateForValue(MlirValue value, MlirOpPrintingFlags flags)
Creates new AsmState from value.
MLIR_CAPI_EXPORTED MlirOperation mlirOperationCreate(MlirOperationState *state)
Creates an operation and transfers ownership to the caller.
static bool mlirSymbolTableIsNull(MlirSymbolTable symbolTable)
Returns true if the symbol table is null.
MLIR_CAPI_EXPORTED bool mlirContextGetAllowUnregisteredDialects(MlirContext context)
Returns whether the context allows unregistered dialects.
MLIR_CAPI_EXPORTED void mlirOperationMoveAfter(MlirOperation op, MlirOperation other)
Moves the given operation immediately after the other operation in its parent block.
MLIR_CAPI_EXPORTED intptr_t mlirOperationGetNumAttributes(MlirOperation op)
Returns the number of attributes attached to the operation.
MLIR_CAPI_EXPORTED void mlirValuePrint(MlirValue value, MlirStringCallback callback, void *userData)
Prints a value by sending chunks of the string representation and forwarding userData tocallback`.
MLIR_CAPI_EXPORTED MlirLogicalResult mlirOperationWriteBytecodeWithConfig(MlirOperation op, MlirBytecodeWriterConfig config, MlirStringCallback callback, void *userData)
Same as mlirOperationWriteBytecode but with writer config and returns failure only if desired bytecod...
MLIR_CAPI_EXPORTED void mlirValueSetType(MlirValue value, MlirType type)
Set the type of the value.
MLIR_CAPI_EXPORTED MlirType mlirValueGetType(MlirValue value)
Returns the type of the value.
MLIR_CAPI_EXPORTED void mlirContextDestroy(MlirContext context)
Takes an MLIR context owned by the caller and destroys it.
MLIR_CAPI_EXPORTED MlirOperation mlirOperationCreateParse(MlirContext context, MlirStringRef sourceStr, MlirStringRef sourceName)
Parses an operation, giving ownership to the caller.
MLIR_CAPI_EXPORTED bool mlirAttributeEqual(MlirAttribute a1, MlirAttribute a2)
Checks if two attributes are equal.
static bool mlirOperationIsNull(MlirOperation op)
Checks whether the underlying operation is null.
MLIR_CAPI_EXPORTED MlirBlock mlirRegionGetFirstBlock(MlirRegion region)
Gets the first block in the region.
static MlirStringRef mlirStringRefCreate(const char *str, size_t length)
Constructs a string reference from the pointer and length.
static MlirLogicalResult mlirLogicalResultFailure(void)
Creates a logical result representing a failure.
MLIR_CAPI_EXPORTED size_t mlirTypeIDHashValue(MlirTypeID typeID)
Returns the hash value of the type id.
static MlirLogicalResult mlirLogicalResultSuccess(void)
Creates a logical result representing a success.
static bool mlirLogicalResultIsFailure(MlirLogicalResult res)
Checks if the given logical result represents a failure.
static bool mlirTypeIDIsNull(MlirTypeID typeID)
Checks whether a type id is null.
MLIR_CAPI_EXPORTED bool mlirTypeIDEqual(MlirTypeID typeID1, MlirTypeID typeID2)
Checks if two type ids are equal.
void walk(Operation *op, function_ref< void(Region *)> callback, WalkOrder order)
Walk all of the regions, blocks, or operations nested under (and including) the given operation.
constexpr void enumerate(std::tuple< Tys... > &tuple, CallbackT &&callback)
inline ::llvm::hash_code hash_value(const PolynomialBase< D, T > &arg)
PyObjectRef< PyMlirContext > PyMlirContextRef
Wrapper around MlirContext.
PyObjectRef< PyModule > PyModuleRef
void populateIRCore(nanobind::module_ &m)
PyObjectRef< PyOperation > PyOperationRef
QueryRef parse(llvm::StringRef line, const QuerySession &qs)
Include the generated interface declarations.
const FrozenRewritePatternSet GreedyRewriteConfig config
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs,...
An opaque reference to a diagnostic, always owned by the diagnostics engine (context).
A logical result value, essentially a boolean with named states.
An auxiliary class for constructing operations.
A pointer to a sized fragment of a string, not necessarily null-terminated.
const char * data
Pointer to the first symbol.
size_t length
Length of the fragment.
static bool dunderContains(const std::string &attributeKind)
static void dunderSetItemNamed(const std::string &attributeKind, nb::callable func, bool replace)
static nb::callable dunderGetItemNamed(const std::string &attributeKind)
static void bind(nb::module_ &m)
Wrapper for the global LLVM debugging flag.
static void bind(nb::module_ &m)
static void set(nb::object &o, bool enable)
static bool get(const nb::object &)
Accumulates into a python string from a method that accepts an MlirStringCallback.
MlirStringCallback getCallback()
Custom exception that allows access to error diagnostic information.
std::vector< PyDiagnostic::DiagnosticInfo > errorDiagnostics
Materialized diagnostic information.
RAII object that captures any error diagnostics emitted to the provided context.
std::vector< PyDiagnostic::DiagnosticInfo > take()
ErrorCapture(PyMlirContextRef ctx)