MLIR 22.0.0git
IR.cpp
Go to the documentation of this file.
1//===- IR.cpp - C Interface for Core MLIR APIs ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "mlir-c/IR.h"
10#include "mlir-c/Support.h"
11
14#include "mlir/CAPI/IR.h"
15#include "mlir/CAPI/Support.h"
16#include "mlir/CAPI/Utils.h"
17#include "mlir/IR/Attributes.h"
19#include "mlir/IR/BuiltinOps.h"
20#include "mlir/IR/Diagnostics.h"
21#include "mlir/IR/Dialect.h"
22#include "mlir/IR/Location.h"
23#include "mlir/IR/Operation.h"
25#include "mlir/IR/OwningOpRef.h"
26#include "mlir/IR/Types.h"
27#include "mlir/IR/Value.h"
28#include "mlir/IR/Verifier.h"
29#include "mlir/IR/Visitors.h"
31#include "mlir/Parser/Parser.h"
32#include "llvm/ADT/SmallPtrSet.h"
33#include "llvm/Support/ThreadPool.h"
34
35#include <cstddef>
36#include <memory>
37#include <optional>
38
39using namespace mlir;
40
41//===----------------------------------------------------------------------===//
42// Context API.
43//===----------------------------------------------------------------------===//
44
45MlirContext mlirContextCreate() {
46 auto *context = new MLIRContext;
47 return wrap(context);
48}
49
50static inline MLIRContext::Threading toThreadingEnum(bool threadingEnabled) {
51 return threadingEnabled ? MLIRContext::Threading::ENABLED
53}
54
55MlirContext mlirContextCreateWithThreading(bool threadingEnabled) {
56 auto *context = new MLIRContext(toThreadingEnum(threadingEnabled));
57 return wrap(context);
58}
59
60MlirContext mlirContextCreateWithRegistry(MlirDialectRegistry registry,
61 bool threadingEnabled) {
62 auto *context =
63 new MLIRContext(*unwrap(registry), toThreadingEnum(threadingEnabled));
64 return wrap(context);
65}
66
67bool mlirContextEqual(MlirContext ctx1, MlirContext ctx2) {
68 return unwrap(ctx1) == unwrap(ctx2);
69}
70
71void mlirContextDestroy(MlirContext context) { delete unwrap(context); }
72
73void mlirContextSetAllowUnregisteredDialects(MlirContext context, bool allow) {
74 unwrap(context)->allowUnregisteredDialects(allow);
75}
76
77bool mlirContextGetAllowUnregisteredDialects(MlirContext context) {
78 return unwrap(context)->allowsUnregisteredDialects();
79}
80intptr_t mlirContextGetNumRegisteredDialects(MlirContext context) {
81 return static_cast<intptr_t>(unwrap(context)->getAvailableDialects().size());
82}
83
85 MlirDialectRegistry registry) {
86 unwrap(ctx)->appendDialectRegistry(*unwrap(registry));
87}
88
89// TODO: expose a cheaper way than constructing + sorting a vector only to take
90// its size.
91intptr_t mlirContextGetNumLoadedDialects(MlirContext context) {
92 return static_cast<intptr_t>(unwrap(context)->getLoadedDialects().size());
93}
94
95MlirDialect mlirContextGetOrLoadDialect(MlirContext context,
96 MlirStringRef name) {
97 return wrap(unwrap(context)->getOrLoadDialect(unwrap(name)));
98}
99
100bool mlirContextIsRegisteredOperation(MlirContext context, MlirStringRef name) {
101 return unwrap(context)->isOperationRegistered(unwrap(name));
102}
103
104void mlirContextEnableMultithreading(MlirContext context, bool enable) {
105 return unwrap(context)->enableMultithreading(enable);
106}
107
108void mlirContextLoadAllAvailableDialects(MlirContext context) {
109 unwrap(context)->loadAllAvailableDialects();
110}
111
112void mlirContextSetThreadPool(MlirContext context,
113 MlirLlvmThreadPool threadPool) {
114 unwrap(context)->setThreadPool(*unwrap(threadPool));
115}
116
117unsigned mlirContextGetNumThreads(MlirContext context) {
118 return unwrap(context)->getNumThreads();
119}
120
121MlirLlvmThreadPool mlirContextGetThreadPool(MlirContext context) {
122 return wrap(&unwrap(context)->getThreadPool());
123}
124
125//===----------------------------------------------------------------------===//
126// Dialect API.
127//===----------------------------------------------------------------------===//
128
129MlirContext mlirDialectGetContext(MlirDialect dialect) {
130 return wrap(unwrap(dialect)->getContext());
131}
132
133bool mlirDialectEqual(MlirDialect dialect1, MlirDialect dialect2) {
134 return unwrap(dialect1) == unwrap(dialect2);
135}
136
138 return wrap(unwrap(dialect)->getNamespace());
139}
140
141//===----------------------------------------------------------------------===//
142// DialectRegistry API.
143//===----------------------------------------------------------------------===//
144
145MlirDialectRegistry mlirDialectRegistryCreate() {
146 return wrap(new DialectRegistry());
147}
148
149void mlirDialectRegistryDestroy(MlirDialectRegistry registry) {
150 delete unwrap(registry);
151}
152
153//===----------------------------------------------------------------------===//
154// AsmState API.
155//===----------------------------------------------------------------------===//
156
157MlirAsmState mlirAsmStateCreateForOperation(MlirOperation op,
158 MlirOpPrintingFlags flags) {
159 return wrap(new AsmState(unwrap(op), *unwrap(flags)));
160}
161
162static Operation *findParent(Operation *op, bool shouldUseLocalScope) {
163 do {
164 // If we are printing local scope, stop at the first operation that is
165 // isolated from above.
166 if (shouldUseLocalScope && op->hasTrait<OpTrait::IsIsolatedFromAbove>())
167 break;
168
169 // Otherwise, traverse up to the next parent.
170 Operation *parentOp = op->getParentOp();
171 if (!parentOp)
172 break;
173 op = parentOp;
174 } while (true);
175 return op;
176}
177
178MlirAsmState mlirAsmStateCreateForValue(MlirValue value,
179 MlirOpPrintingFlags flags) {
180 Operation *op;
181 mlir::Value val = unwrap(value);
182 if (auto result = llvm::dyn_cast<OpResult>(val)) {
183 op = result.getOwner();
184 } else {
185 op = llvm::cast<BlockArgument>(val).getOwner()->getParentOp();
186 if (!op) {
187 emitError(val.getLoc()) << "<<UNKNOWN SSA VALUE>>";
188 return {nullptr};
189 }
190 }
191 op = findParent(op, unwrap(flags)->shouldUseLocalScope());
192 return wrap(new AsmState(op, *unwrap(flags)));
193}
194
195/// Destroys printing flags created with mlirAsmStateCreate.
196void mlirAsmStateDestroy(MlirAsmState state) { delete unwrap(state); }
197
198//===----------------------------------------------------------------------===//
199// Printing flags API.
200//===----------------------------------------------------------------------===//
201
202MlirOpPrintingFlags mlirOpPrintingFlagsCreate() {
203 return wrap(new OpPrintingFlags());
204}
205
206void mlirOpPrintingFlagsDestroy(MlirOpPrintingFlags flags) {
207 delete unwrap(flags);
208}
209
210void mlirOpPrintingFlagsElideLargeElementsAttrs(MlirOpPrintingFlags flags,
211 intptr_t largeElementLimit) {
212 unwrap(flags)->elideLargeElementsAttrs(largeElementLimit);
213}
214
215void mlirOpPrintingFlagsElideLargeResourceString(MlirOpPrintingFlags flags,
216 intptr_t largeResourceLimit) {
217 unwrap(flags)->elideLargeResourceString(largeResourceLimit);
218}
219
220void mlirOpPrintingFlagsEnableDebugInfo(MlirOpPrintingFlags flags, bool enable,
221 bool prettyForm) {
222 unwrap(flags)->enableDebugInfo(enable, /*prettyForm=*/prettyForm);
223}
224
225void mlirOpPrintingFlagsPrintGenericOpForm(MlirOpPrintingFlags flags) {
226 unwrap(flags)->printGenericOpForm();
227}
228
229void mlirOpPrintingFlagsPrintNameLocAsPrefix(MlirOpPrintingFlags flags) {
230 unwrap(flags)->printNameLocAsPrefix();
231}
232
233void mlirOpPrintingFlagsUseLocalScope(MlirOpPrintingFlags flags) {
234 unwrap(flags)->useLocalScope();
235}
236
237void mlirOpPrintingFlagsAssumeVerified(MlirOpPrintingFlags flags) {
238 unwrap(flags)->assumeVerified();
239}
240
241void mlirOpPrintingFlagsSkipRegions(MlirOpPrintingFlags flags) {
242 unwrap(flags)->skipRegions();
243}
244//===----------------------------------------------------------------------===//
245// Bytecode printing flags API.
246//===----------------------------------------------------------------------===//
247
248MlirBytecodeWriterConfig mlirBytecodeWriterConfigCreate() {
249 return wrap(new BytecodeWriterConfig());
250}
251
252void mlirBytecodeWriterConfigDestroy(MlirBytecodeWriterConfig config) {
253 delete unwrap(config);
254}
255
256void mlirBytecodeWriterConfigDesiredEmitVersion(MlirBytecodeWriterConfig flags,
257 int64_t version) {
258 unwrap(flags)->setDesiredBytecodeVersion(version);
259}
260
261//===----------------------------------------------------------------------===//
262// Location API.
263//===----------------------------------------------------------------------===//
264
265MlirAttribute mlirLocationGetAttribute(MlirLocation location) {
266 return wrap(LocationAttr(unwrap(location)));
267}
268
269MlirLocation mlirLocationFromAttribute(MlirAttribute attribute) {
270 return wrap(Location(llvm::dyn_cast<LocationAttr>(unwrap(attribute))));
271}
272
273MlirLocation mlirLocationFileLineColGet(MlirContext context,
274 MlirStringRef filename, unsigned line,
275 unsigned col) {
276 return wrap(Location(
277 FileLineColLoc::get(unwrap(context), unwrap(filename), line, col)));
278}
279
280MlirLocation
281mlirLocationFileLineColRangeGet(MlirContext context, MlirStringRef filename,
282 unsigned startLine, unsigned startCol,
283 unsigned endLine, unsigned endCol) {
284 return wrap(
285 Location(FileLineColRange::get(unwrap(context), unwrap(filename),
286 startLine, startCol, endLine, endCol)));
287}
288
289MlirIdentifier mlirLocationFileLineColRangeGetFilename(MlirLocation location) {
290 return wrap(llvm::dyn_cast<FileLineColRange>(unwrap(location)).getFilename());
291}
292
294 if (auto loc = llvm::dyn_cast<FileLineColRange>(unwrap(location)))
295 return loc.getStartLine();
296 return -1;
297}
298
300 if (auto loc = llvm::dyn_cast<FileLineColRange>(unwrap(location)))
301 return loc.getStartColumn();
302 return -1;
303}
304
305int mlirLocationFileLineColRangeGetEndLine(MlirLocation location) {
306 if (auto loc = llvm::dyn_cast<FileLineColRange>(unwrap(location)))
307 return loc.getEndLine();
308 return -1;
309}
310
312 if (auto loc = llvm::dyn_cast<FileLineColRange>(unwrap(location)))
313 return loc.getEndColumn();
314 return -1;
315}
316
318 return wrap(FileLineColRange::getTypeID());
319}
320
321bool mlirLocationIsAFileLineColRange(MlirLocation location) {
322 return isa<FileLineColRange>(unwrap(location));
323}
324
325MlirLocation mlirLocationCallSiteGet(MlirLocation callee, MlirLocation caller) {
326 return wrap(Location(CallSiteLoc::get(unwrap(callee), unwrap(caller))));
327}
328
329MlirLocation mlirLocationCallSiteGetCallee(MlirLocation location) {
330 return wrap(
331 Location(llvm::dyn_cast<CallSiteLoc>(unwrap(location)).getCallee()));
332}
333
334MlirLocation mlirLocationCallSiteGetCaller(MlirLocation location) {
335 return wrap(
336 Location(llvm::dyn_cast<CallSiteLoc>(unwrap(location)).getCaller()));
337}
338
340 return wrap(CallSiteLoc::getTypeID());
341}
342
343bool mlirLocationIsACallSite(MlirLocation location) {
344 return isa<CallSiteLoc>(unwrap(location));
345}
346
347MlirLocation mlirLocationFusedGet(MlirContext ctx, intptr_t nLocations,
348 MlirLocation const *locations,
349 MlirAttribute metadata) {
351 ArrayRef<Location> unwrappedLocs = unwrapList(nLocations, locations, locs);
352 return wrap(FusedLoc::get(unwrappedLocs, unwrap(metadata), unwrap(ctx)));
353}
354
355unsigned mlirLocationFusedGetNumLocations(MlirLocation location) {
356 if (auto locationsArrRef = llvm::dyn_cast<FusedLoc>(unwrap(location)))
357 return locationsArrRef.getLocations().size();
358 return 0;
359}
360
361void mlirLocationFusedGetLocations(MlirLocation location,
362 MlirLocation *locationsCPtr) {
363 if (auto locationsArrRef = llvm::dyn_cast<FusedLoc>(unwrap(location))) {
364 for (auto [i, location] : llvm::enumerate(locationsArrRef.getLocations()))
365 locationsCPtr[i] = wrap(location);
366 }
367}
368
369MlirAttribute mlirLocationFusedGetMetadata(MlirLocation location) {
370 return wrap(llvm::dyn_cast<FusedLoc>(unwrap(location)).getMetadata());
371}
372
373MlirTypeID mlirLocationFusedGetTypeID() { return wrap(FusedLoc::getTypeID()); }
374
375bool mlirLocationIsAFused(MlirLocation location) {
376 return isa<FusedLoc>(unwrap(location));
377}
378
379MlirLocation mlirLocationNameGet(MlirContext context, MlirStringRef name,
380 MlirLocation childLoc) {
381 if (mlirLocationIsNull(childLoc))
382 return wrap(
383 Location(NameLoc::get(StringAttr::get(unwrap(context), unwrap(name)))));
384 return wrap(Location(NameLoc::get(
385 StringAttr::get(unwrap(context), unwrap(name)), unwrap(childLoc))));
386}
387
388MlirIdentifier mlirLocationNameGetName(MlirLocation location) {
389 return wrap((llvm::dyn_cast<NameLoc>(unwrap(location)).getName()));
390}
391
392MlirLocation mlirLocationNameGetChildLoc(MlirLocation location) {
393 return wrap(
394 Location(llvm::dyn_cast<NameLoc>(unwrap(location)).getChildLoc()));
395}
396
397MlirTypeID mlirLocationNameGetTypeID() { return wrap(NameLoc::getTypeID()); }
398
399bool mlirLocationIsAName(MlirLocation location) {
400 return isa<NameLoc>(unwrap(location));
401}
402
403MlirLocation mlirLocationUnknownGet(MlirContext context) {
404 return wrap(Location(UnknownLoc::get(unwrap(context))));
405}
406
407bool mlirLocationEqual(MlirLocation l1, MlirLocation l2) {
408 return unwrap(l1) == unwrap(l2);
409}
410
411MlirContext mlirLocationGetContext(MlirLocation location) {
412 return wrap(unwrap(location).getContext());
413}
414
415void mlirLocationPrint(MlirLocation location, MlirStringCallback callback,
416 void *userData) {
417 detail::CallbackOstream stream(callback, userData);
418 unwrap(location).print(stream);
419}
420
421//===----------------------------------------------------------------------===//
422// Module API.
423//===----------------------------------------------------------------------===//
424
425MlirModule mlirModuleCreateEmpty(MlirLocation location) {
426 return wrap(ModuleOp::create(unwrap(location)));
427}
428
429MlirModule mlirModuleCreateParse(MlirContext context, MlirStringRef module) {
430 OwningOpRef<ModuleOp> owning =
431 parseSourceString<ModuleOp>(unwrap(module), unwrap(context));
432 if (!owning)
433 return MlirModule{nullptr};
434 return MlirModule{owning.release().getOperation()};
435}
436
437MlirModule mlirModuleCreateParseFromFile(MlirContext context,
438 MlirStringRef fileName) {
439 OwningOpRef<ModuleOp> owning =
440 parseSourceFile<ModuleOp>(unwrap(fileName), unwrap(context));
441 if (!owning)
442 return MlirModule{nullptr};
443 return MlirModule{owning.release().getOperation()};
444}
445
446MlirContext mlirModuleGetContext(MlirModule module) {
447 return wrap(unwrap(module).getContext());
448}
449
450MlirBlock mlirModuleGetBody(MlirModule module) {
451 return wrap(unwrap(module).getBody());
452}
453
454void mlirModuleDestroy(MlirModule module) {
455 // Transfer ownership to an OwningOpRef<ModuleOp> so that its destructor is
456 // called.
458}
459
460MlirOperation mlirModuleGetOperation(MlirModule module) {
461 return wrap(unwrap(module).getOperation());
462}
463
464MlirModule mlirModuleFromOperation(MlirOperation op) {
465 return wrap(dyn_cast<ModuleOp>(unwrap(op)));
466}
467
468bool mlirModuleEqual(MlirModule lhs, MlirModule rhs) {
469 return unwrap(lhs) == unwrap(rhs);
470}
471
472size_t mlirModuleHashValue(MlirModule mod) {
473 return OperationEquivalence::computeHash(unwrap(mod).getOperation());
474}
475
476//===----------------------------------------------------------------------===//
477// Operation state API.
478//===----------------------------------------------------------------------===//
479
480MlirOperationState mlirOperationStateGet(MlirStringRef name, MlirLocation loc) {
481 MlirOperationState state;
482 state.name = name;
483 state.location = loc;
484 state.nResults = 0;
485 state.results = nullptr;
486 state.nOperands = 0;
487 state.operands = nullptr;
488 state.nRegions = 0;
489 state.regions = nullptr;
490 state.nSuccessors = 0;
491 state.successors = nullptr;
492 state.nAttributes = 0;
493 state.attributes = nullptr;
494 state.enableResultTypeInference = false;
495 return state;
496}
497
498#define APPEND_ELEMS(type, sizeName, elemName) \
499 state->elemName = \
500 (type *)realloc(state->elemName, (state->sizeName + n) * sizeof(type)); \
501 memcpy(state->elemName + state->sizeName, elemName, n * sizeof(type)); \
502 state->sizeName += n;
503
504void mlirOperationStateAddResults(MlirOperationState *state, intptr_t n,
505 MlirType const *results) {
506 APPEND_ELEMS(MlirType, nResults, results);
507}
508
509void mlirOperationStateAddOperands(MlirOperationState *state, intptr_t n,
510 MlirValue const *operands) {
511 APPEND_ELEMS(MlirValue, nOperands, operands);
512}
513void mlirOperationStateAddOwnedRegions(MlirOperationState *state, intptr_t n,
514 MlirRegion const *regions) {
515 APPEND_ELEMS(MlirRegion, nRegions, regions);
516}
517void mlirOperationStateAddSuccessors(MlirOperationState *state, intptr_t n,
518 MlirBlock const *successors) {
519 APPEND_ELEMS(MlirBlock, nSuccessors, successors);
520}
521void mlirOperationStateAddAttributes(MlirOperationState *state, intptr_t n,
522 MlirNamedAttribute const *attributes) {
523 APPEND_ELEMS(MlirNamedAttribute, nAttributes, attributes);
524}
525
526void mlirOperationStateEnableResultTypeInference(MlirOperationState *state) {
527 state->enableResultTypeInference = true;
528}
529
530//===----------------------------------------------------------------------===//
531// Operation API.
532//===----------------------------------------------------------------------===//
533
534static LogicalResult inferOperationTypes(OperationState &state) {
535 MLIRContext *context = state.getContext();
536 std::optional<RegisteredOperationName> info = state.name.getRegisteredInfo();
537 if (!info) {
538 emitError(state.location)
539 << "type inference was requested for the operation " << state.name
540 << ", but the operation was not registered; ensure that the dialect "
541 "containing the operation is linked into MLIR and registered with "
542 "the context";
543 return failure();
544 }
545
546 auto *inferInterface = info->getInterface<InferTypeOpInterface>();
547 if (!inferInterface) {
548 emitError(state.location)
549 << "type inference was requested for the operation " << state.name
550 << ", but the operation does not support type inference; result "
551 "types must be specified explicitly";
552 return failure();
553 }
554
555 DictionaryAttr attributes = state.attributes.getDictionary(context);
556 OpaqueProperties properties = state.getRawProperties();
557
558 if (!properties && info->getOpPropertyByteSize() > 0 && !attributes.empty()) {
559 auto prop = std::make_unique<char[]>(info->getOpPropertyByteSize());
560 properties = OpaqueProperties(prop.get());
561 if (properties) {
562 auto emitError = [&]() {
563 return mlir::emitError(state.location)
564 << " failed properties conversion while building "
565 << state.name.getStringRef() << " with `" << attributes << "`: ";
566 };
567 if (failed(info->setOpPropertiesFromAttribute(state.name, properties,
568 attributes, emitError)))
569 return failure();
570 }
571 if (succeeded(inferInterface->inferReturnTypes(
572 context, state.location, state.operands, attributes, properties,
573 state.regions, state.types))) {
574 return success();
575 }
576 // Diagnostic emitted by interface.
577 return failure();
578 }
579
580 if (succeeded(inferInterface->inferReturnTypes(
581 context, state.location, state.operands, attributes, properties,
582 state.regions, state.types)))
583 return success();
584
585 // Diagnostic emitted by interface.
586 return failure();
587}
588
589MlirOperation mlirOperationCreate(MlirOperationState *state) {
590 assert(state);
591 OperationState cppState(unwrap(state->location), unwrap(state->name));
592 SmallVector<Type, 4> resultStorage;
593 SmallVector<Value, 8> operandStorage;
594 SmallVector<Block *, 2> successorStorage;
595 cppState.addTypes(unwrapList(state->nResults, state->results, resultStorage));
596 cppState.addOperands(
597 unwrapList(state->nOperands, state->operands, operandStorage));
598 cppState.addSuccessors(
599 unwrapList(state->nSuccessors, state->successors, successorStorage));
600
601 cppState.attributes.reserve(state->nAttributes);
602 for (intptr_t i = 0; i < state->nAttributes; ++i)
603 cppState.addAttribute(unwrap(state->attributes[i].name),
604 unwrap(state->attributes[i].attribute));
605
606 for (intptr_t i = 0; i < state->nRegions; ++i)
607 cppState.addRegion(std::unique_ptr<Region>(unwrap(state->regions[i])));
608
609 free(state->results);
610 free(state->operands);
611 free(state->successors);
612 free(state->regions);
613 free(state->attributes);
614
615 // Infer result types.
616 if (state->enableResultTypeInference) {
617 assert(cppState.types.empty() &&
618 "result type inference enabled and result types provided");
619 if (failed(inferOperationTypes(cppState)))
620 return {nullptr};
621 }
622
623 return wrap(Operation::create(cppState));
624}
625
626MlirOperation mlirOperationCreateParse(MlirContext context,
627 MlirStringRef sourceStr,
628 MlirStringRef sourceName) {
629
630 return wrap(
631 parseSourceString(unwrap(sourceStr), unwrap(context), unwrap(sourceName))
632 .release());
633}
634
635MlirOperation mlirOperationClone(MlirOperation op) {
636 return wrap(unwrap(op)->clone());
637}
638
639void mlirOperationDestroy(MlirOperation op) { unwrap(op)->erase(); }
640
641void mlirOperationRemoveFromParent(MlirOperation op) { unwrap(op)->remove(); }
642
643bool mlirOperationEqual(MlirOperation op, MlirOperation other) {
644 return unwrap(op) == unwrap(other);
645}
646
647size_t mlirOperationHashValue(MlirOperation op) {
649}
650
651MlirContext mlirOperationGetContext(MlirOperation op) {
652 return wrap(unwrap(op)->getContext());
653}
654
655MlirLocation mlirOperationGetLocation(MlirOperation op) {
656 return wrap(unwrap(op)->getLoc());
657}
658
659void mlirOperationSetLocation(MlirOperation op, MlirLocation loc) {
660 unwrap(op)->setLoc(unwrap(loc));
661}
662
663MlirTypeID mlirOperationGetTypeID(MlirOperation op) {
664 if (auto info = unwrap(op)->getRegisteredInfo())
665 return wrap(info->getTypeID());
666 return {nullptr};
667}
668
669MlirIdentifier mlirOperationGetName(MlirOperation op) {
670 return wrap(unwrap(op)->getName().getIdentifier());
671}
672
673MlirBlock mlirOperationGetBlock(MlirOperation op) {
674 return wrap(unwrap(op)->getBlock());
675}
676
677MlirOperation mlirOperationGetParentOperation(MlirOperation op) {
678 return wrap(unwrap(op)->getParentOp());
679}
680
681intptr_t mlirOperationGetNumRegions(MlirOperation op) {
682 return static_cast<intptr_t>(unwrap(op)->getNumRegions());
683}
684
685MlirRegion mlirOperationGetRegion(MlirOperation op, intptr_t pos) {
686 return wrap(&unwrap(op)->getRegion(static_cast<unsigned>(pos)));
687}
688
689MlirRegion mlirOperationGetFirstRegion(MlirOperation op) {
690 Operation *cppOp = unwrap(op);
691 if (cppOp->getNumRegions() == 0)
692 return wrap(static_cast<Region *>(nullptr));
693 return wrap(&cppOp->getRegion(0));
694}
695
696MlirRegion mlirRegionGetNextInOperation(MlirRegion region) {
697 Region *cppRegion = unwrap(region);
698 Operation *parent = cppRegion->getParentOp();
699 intptr_t next = cppRegion->getRegionNumber() + 1;
700 if (parent->getNumRegions() > next)
701 return wrap(&parent->getRegion(next));
702 return wrap(static_cast<Region *>(nullptr));
703}
704
705MlirOperation mlirOperationGetNextInBlock(MlirOperation op) {
706 return wrap(unwrap(op)->getNextNode());
707}
708
709intptr_t mlirOperationGetNumOperands(MlirOperation op) {
710 return static_cast<intptr_t>(unwrap(op)->getNumOperands());
711}
712
713MlirValue mlirOperationGetOperand(MlirOperation op, intptr_t pos) {
714 return wrap(unwrap(op)->getOperand(static_cast<unsigned>(pos)));
715}
716
717void mlirOperationSetOperand(MlirOperation op, intptr_t pos,
718 MlirValue newValue) {
719 unwrap(op)->setOperand(static_cast<unsigned>(pos), unwrap(newValue));
720}
721
722void mlirOperationSetOperands(MlirOperation op, intptr_t nOperands,
723 MlirValue const *operands) {
725 unwrap(op)->setOperands(unwrapList(nOperands, operands, ops));
726}
727
728intptr_t mlirOperationGetNumResults(MlirOperation op) {
729 return static_cast<intptr_t>(unwrap(op)->getNumResults());
730}
731
732MlirValue mlirOperationGetResult(MlirOperation op, intptr_t pos) {
733 return wrap(unwrap(op)->getResult(static_cast<unsigned>(pos)));
734}
735
736intptr_t mlirOperationGetNumSuccessors(MlirOperation op) {
737 return static_cast<intptr_t>(unwrap(op)->getNumSuccessors());
738}
739
740MlirBlock mlirOperationGetSuccessor(MlirOperation op, intptr_t pos) {
741 return wrap(unwrap(op)->getSuccessor(static_cast<unsigned>(pos)));
742}
743
746 std::optional<Attribute> attr = unwrap(op)->getInherentAttr(unwrap(name));
747 return attr.has_value();
748}
749
750MlirAttribute mlirOperationGetInherentAttributeByName(MlirOperation op,
751 MlirStringRef name) {
752 std::optional<Attribute> attr = unwrap(op)->getInherentAttr(unwrap(name));
753 if (attr.has_value())
754 return wrap(*attr);
755 return {};
756}
757
759 MlirStringRef name,
760 MlirAttribute attr) {
761 unwrap(op)->setInherentAttr(
762 StringAttr::get(unwrap(op)->getContext(), unwrap(name)), unwrap(attr));
763}
764
766 return static_cast<intptr_t>(
767 llvm::range_size(unwrap(op)->getDiscardableAttrs()));
768}
769
771 intptr_t pos) {
772 NamedAttribute attr =
773 *std::next(unwrap(op)->getDiscardableAttrs().begin(), pos);
774 return MlirNamedAttribute{wrap(attr.getName()), wrap(attr.getValue())};
775}
776
777MlirAttribute mlirOperationGetDiscardableAttributeByName(MlirOperation op,
778 MlirStringRef name) {
779 return wrap(unwrap(op)->getDiscardableAttr(unwrap(name)));
780}
781
783 MlirStringRef name,
784 MlirAttribute attr) {
785 unwrap(op)->setDiscardableAttr(unwrap(name), unwrap(attr));
786}
787
789 MlirStringRef name) {
790 return !!unwrap(op)->removeDiscardableAttr(unwrap(name));
791}
792
793void mlirOperationSetSuccessor(MlirOperation op, intptr_t pos,
794 MlirBlock block) {
795 unwrap(op)->setSuccessor(unwrap(block), static_cast<unsigned>(pos));
796}
797
798intptr_t mlirOperationGetNumAttributes(MlirOperation op) {
799 return static_cast<intptr_t>(unwrap(op)->getAttrs().size());
800}
801
802MlirNamedAttribute mlirOperationGetAttribute(MlirOperation op, intptr_t pos) {
803 NamedAttribute attr = unwrap(op)->getAttrs()[pos];
804 return MlirNamedAttribute{wrap(attr.getName()), wrap(attr.getValue())};
805}
806
807MlirAttribute mlirOperationGetAttributeByName(MlirOperation op,
808 MlirStringRef name) {
809 return wrap(unwrap(op)->getAttr(unwrap(name)));
810}
811
813 MlirAttribute attr) {
814 unwrap(op)->setAttr(unwrap(name), unwrap(attr));
815}
816
818 return !!unwrap(op)->removeAttr(unwrap(name));
819}
820
821void mlirOperationPrint(MlirOperation op, MlirStringCallback callback,
822 void *userData) {
823 detail::CallbackOstream stream(callback, userData);
824 unwrap(op)->print(stream);
825}
826
827void mlirOperationPrintWithFlags(MlirOperation op, MlirOpPrintingFlags flags,
828 MlirStringCallback callback, void *userData) {
829 detail::CallbackOstream stream(callback, userData);
830 unwrap(op)->print(stream, *unwrap(flags));
831}
832
833void mlirOperationPrintWithState(MlirOperation op, MlirAsmState state,
834 MlirStringCallback callback, void *userData) {
835 detail::CallbackOstream stream(callback, userData);
836 if (state.ptr)
837 unwrap(op)->print(stream, *unwrap(state));
838 unwrap(op)->print(stream);
839}
840
841void mlirOperationWriteBytecode(MlirOperation op, MlirStringCallback callback,
842 void *userData) {
843 detail::CallbackOstream stream(callback, userData);
844 // As no desired version is set, no failure can occur.
845 (void)writeBytecodeToFile(unwrap(op), stream);
846}
847
849 MlirOperation op, MlirBytecodeWriterConfig config,
850 MlirStringCallback callback, void *userData) {
851 detail::CallbackOstream stream(callback, userData);
852 return wrap(writeBytecodeToFile(unwrap(op), stream, *unwrap(config)));
853}
854
855void mlirOperationDump(MlirOperation op) { return unwrap(op)->dump(); }
856
857bool mlirOperationVerify(MlirOperation op) {
858 return succeeded(verify(unwrap(op)));
859}
860
861void mlirOperationMoveAfter(MlirOperation op, MlirOperation other) {
862 return unwrap(op)->moveAfter(unwrap(other));
863}
864
865void mlirOperationMoveBefore(MlirOperation op, MlirOperation other) {
866 return unwrap(op)->moveBefore(unwrap(other));
867}
868
869bool mlirOperationIsBeforeInBlock(MlirOperation op, MlirOperation other) {
870 return unwrap(op)->isBeforeInBlock(unwrap(other));
871}
872
874 switch (result) {
877
880
882 return mlir::WalkResult::skip();
883 }
884 llvm_unreachable("unknown result in WalkResult::unwrap");
885}
886
887void mlirOperationWalk(MlirOperation op, MlirOperationWalkCallback callback,
888 void *userData, MlirWalkOrder walkOrder) {
889 switch (walkOrder) {
890
891 case MlirWalkPreOrder:
893 [callback, userData](Operation *op) {
894 return unwrap(callback(wrap(op), userData));
895 });
896 break;
899 [callback, userData](Operation *op) {
900 return unwrap(callback(wrap(op), userData));
901 });
902 }
903}
904
905void mlirOperationReplaceUsesOfWith(MlirOperation op, MlirValue oldValue,
906 MlirValue newValue) {
907 unwrap(op)->replaceUsesOfWith(unwrap(oldValue), unwrap(newValue));
908}
909
910//===----------------------------------------------------------------------===//
911// Region API.
912//===----------------------------------------------------------------------===//
913
914MlirRegion mlirRegionCreate() { return wrap(new Region); }
915
916bool mlirRegionEqual(MlirRegion region, MlirRegion other) {
917 return unwrap(region) == unwrap(other);
918}
919
920MlirBlock mlirRegionGetFirstBlock(MlirRegion region) {
921 Region *cppRegion = unwrap(region);
922 if (cppRegion->empty())
923 return wrap(static_cast<Block *>(nullptr));
924 return wrap(&cppRegion->front());
925}
926
927void mlirRegionAppendOwnedBlock(MlirRegion region, MlirBlock block) {
928 unwrap(region)->push_back(unwrap(block));
929}
930
931void mlirRegionInsertOwnedBlock(MlirRegion region, intptr_t pos,
932 MlirBlock block) {
933 auto &blockList = unwrap(region)->getBlocks();
934 blockList.insert(std::next(blockList.begin(), pos), unwrap(block));
935}
936
937void mlirRegionInsertOwnedBlockAfter(MlirRegion region, MlirBlock reference,
938 MlirBlock block) {
939 Region *cppRegion = unwrap(region);
940 if (mlirBlockIsNull(reference)) {
941 cppRegion->getBlocks().insert(cppRegion->begin(), unwrap(block));
942 return;
943 }
944
945 assert(unwrap(reference)->getParent() == unwrap(region) &&
946 "expected reference block to belong to the region");
947 cppRegion->getBlocks().insertAfter(Region::iterator(unwrap(reference)),
948 unwrap(block));
949}
950
951void mlirRegionInsertOwnedBlockBefore(MlirRegion region, MlirBlock reference,
952 MlirBlock block) {
953 if (mlirBlockIsNull(reference))
954 return mlirRegionAppendOwnedBlock(region, block);
955
956 assert(unwrap(reference)->getParent() == unwrap(region) &&
957 "expected reference block to belong to the region");
958 unwrap(region)->getBlocks().insert(Region::iterator(unwrap(reference)),
959 unwrap(block));
960}
961
962void mlirRegionDestroy(MlirRegion region) {
963 delete static_cast<Region *>(region.ptr);
964}
965
966void mlirRegionTakeBody(MlirRegion target, MlirRegion source) {
967 unwrap(target)->takeBody(*unwrap(source));
968}
969
970//===----------------------------------------------------------------------===//
971// Block API.
972//===----------------------------------------------------------------------===//
973
974MlirBlock mlirBlockCreate(intptr_t nArgs, MlirType const *args,
975 MlirLocation const *locs) {
976 Block *b = new Block;
977 for (intptr_t i = 0; i < nArgs; ++i)
978 b->addArgument(unwrap(args[i]), unwrap(locs[i]));
979 return wrap(b);
980}
981
982bool mlirBlockEqual(MlirBlock block, MlirBlock other) {
983 return unwrap(block) == unwrap(other);
984}
985
986MlirOperation mlirBlockGetParentOperation(MlirBlock block) {
987 return wrap(unwrap(block)->getParentOp());
988}
989
990MlirRegion mlirBlockGetParentRegion(MlirBlock block) {
991 return wrap(unwrap(block)->getParent());
992}
993
994MlirBlock mlirBlockGetNextInRegion(MlirBlock block) {
995 return wrap(unwrap(block)->getNextNode());
996}
997
998MlirOperation mlirBlockGetFirstOperation(MlirBlock block) {
999 Block *cppBlock = unwrap(block);
1000 if (cppBlock->empty())
1001 return wrap(static_cast<Operation *>(nullptr));
1002 return wrap(&cppBlock->front());
1003}
1004
1005MlirOperation mlirBlockGetTerminator(MlirBlock block) {
1006 Block *cppBlock = unwrap(block);
1007 if (cppBlock->empty())
1008 return wrap(static_cast<Operation *>(nullptr));
1009 Operation &back = cppBlock->back();
1010 if (!back.hasTrait<OpTrait::IsTerminator>())
1011 return wrap(static_cast<Operation *>(nullptr));
1012 return wrap(&back);
1013}
1014
1015void mlirBlockAppendOwnedOperation(MlirBlock block, MlirOperation operation) {
1016 unwrap(block)->push_back(unwrap(operation));
1017}
1018
1019void mlirBlockInsertOwnedOperation(MlirBlock block, intptr_t pos,
1020 MlirOperation operation) {
1021 auto &opList = unwrap(block)->getOperations();
1022 opList.insert(std::next(opList.begin(), pos), unwrap(operation));
1023}
1024
1026 MlirOperation reference,
1027 MlirOperation operation) {
1028 Block *cppBlock = unwrap(block);
1029 if (mlirOperationIsNull(reference)) {
1030 cppBlock->getOperations().insert(cppBlock->begin(), unwrap(operation));
1031 return;
1032 }
1033
1034 assert(unwrap(reference)->getBlock() == unwrap(block) &&
1035 "expected reference operation to belong to the block");
1036 cppBlock->getOperations().insertAfter(Block::iterator(unwrap(reference)),
1037 unwrap(operation));
1038}
1039
1041 MlirOperation reference,
1042 MlirOperation operation) {
1043 if (mlirOperationIsNull(reference))
1044 return mlirBlockAppendOwnedOperation(block, operation);
1045
1046 assert(unwrap(reference)->getBlock() == unwrap(block) &&
1047 "expected reference operation to belong to the block");
1048 unwrap(block)->getOperations().insert(Block::iterator(unwrap(reference)),
1049 unwrap(operation));
1050}
1051
1052void mlirBlockDestroy(MlirBlock block) { delete unwrap(block); }
1053
1054void mlirBlockDetach(MlirBlock block) {
1055 Block *b = unwrap(block);
1056 b->getParent()->getBlocks().remove(b);
1057}
1058
1059intptr_t mlirBlockGetNumArguments(MlirBlock block) {
1060 return static_cast<intptr_t>(unwrap(block)->getNumArguments());
1061}
1062
1063MlirValue mlirBlockAddArgument(MlirBlock block, MlirType type,
1064 MlirLocation loc) {
1065 return wrap(unwrap(block)->addArgument(unwrap(type), unwrap(loc)));
1066}
1067
1068void mlirBlockEraseArgument(MlirBlock block, unsigned index) {
1069 return unwrap(block)->eraseArgument(index);
1070}
1071
1072MlirValue mlirBlockInsertArgument(MlirBlock block, intptr_t pos, MlirType type,
1073 MlirLocation loc) {
1074 return wrap(unwrap(block)->insertArgument(pos, unwrap(type), unwrap(loc)));
1075}
1076
1077MlirValue mlirBlockGetArgument(MlirBlock block, intptr_t pos) {
1078 return wrap(unwrap(block)->getArgument(static_cast<unsigned>(pos)));
1079}
1080
1081void mlirBlockPrint(MlirBlock block, MlirStringCallback callback,
1082 void *userData) {
1083 detail::CallbackOstream stream(callback, userData);
1084 unwrap(block)->print(stream);
1085}
1086
1087intptr_t mlirBlockGetNumSuccessors(MlirBlock block) {
1088 return static_cast<intptr_t>(unwrap(block)->getNumSuccessors());
1089}
1090
1091MlirBlock mlirBlockGetSuccessor(MlirBlock block, intptr_t pos) {
1092 return wrap(unwrap(block)->getSuccessor(static_cast<unsigned>(pos)));
1093}
1094
1095intptr_t mlirBlockGetNumPredecessors(MlirBlock block) {
1096 Block *b = unwrap(block);
1097 return static_cast<intptr_t>(std::distance(b->pred_begin(), b->pred_end()));
1098}
1099
1100MlirBlock mlirBlockGetPredecessor(MlirBlock block, intptr_t pos) {
1101 Block *b = unwrap(block);
1102 Block::pred_iterator it = b->pred_begin();
1103 std::advance(it, pos);
1104 return wrap(*it);
1105}
1106
1107//===----------------------------------------------------------------------===//
1108// Value API.
1109//===----------------------------------------------------------------------===//
1110
1111bool mlirValueEqual(MlirValue value1, MlirValue value2) {
1112 return unwrap(value1) == unwrap(value2);
1113}
1114
1115bool mlirValueIsABlockArgument(MlirValue value) {
1116 return llvm::isa<BlockArgument>(unwrap(value));
1117}
1118
1119bool mlirValueIsAOpResult(MlirValue value) {
1120 return llvm::isa<OpResult>(unwrap(value));
1121}
1122
1123MlirBlock mlirBlockArgumentGetOwner(MlirValue value) {
1124 return wrap(llvm::dyn_cast<BlockArgument>(unwrap(value)).getOwner());
1125}
1126
1127intptr_t mlirBlockArgumentGetArgNumber(MlirValue value) {
1128 return static_cast<intptr_t>(
1129 llvm::dyn_cast<BlockArgument>(unwrap(value)).getArgNumber());
1130}
1131
1132void mlirBlockArgumentSetType(MlirValue value, MlirType type) {
1133 if (auto blockArg = llvm::dyn_cast<BlockArgument>(unwrap(value)))
1134 blockArg.setType(unwrap(type));
1135}
1136
1137void mlirBlockArgumentSetLocation(MlirValue value, MlirLocation loc) {
1138 if (auto blockArg = llvm::dyn_cast<BlockArgument>(unwrap(value)))
1139 blockArg.setLoc(unwrap(loc));
1140}
1141
1142MlirOperation mlirOpResultGetOwner(MlirValue value) {
1143 return wrap(llvm::dyn_cast<OpResult>(unwrap(value)).getOwner());
1144}
1145
1146intptr_t mlirOpResultGetResultNumber(MlirValue value) {
1147 return static_cast<intptr_t>(
1148 llvm::dyn_cast<OpResult>(unwrap(value)).getResultNumber());
1149}
1150
1151MlirType mlirValueGetType(MlirValue value) {
1152 return wrap(unwrap(value).getType());
1153}
1154
1155void mlirValueSetType(MlirValue value, MlirType type) {
1156 unwrap(value).setType(unwrap(type));
1157}
1158
1159void mlirValueDump(MlirValue value) { unwrap(value).dump(); }
1160
1161void mlirValuePrint(MlirValue value, MlirStringCallback callback,
1162 void *userData) {
1163 detail::CallbackOstream stream(callback, userData);
1164 unwrap(value).print(stream);
1165}
1166
1167void mlirValuePrintAsOperand(MlirValue value, MlirAsmState state,
1168 MlirStringCallback callback, void *userData) {
1169 detail::CallbackOstream stream(callback, userData);
1170 Value cppValue = unwrap(value);
1171 cppValue.printAsOperand(stream, *unwrap(state));
1172}
1173
1174MlirOpOperand mlirValueGetFirstUse(MlirValue value) {
1175 Value cppValue = unwrap(value);
1176 if (cppValue.use_empty())
1177 return {};
1178
1179 OpOperand *opOperand = cppValue.use_begin().getOperand();
1180
1181 return wrap(opOperand);
1182}
1183
1184void mlirValueReplaceAllUsesOfWith(MlirValue oldValue, MlirValue newValue) {
1185 unwrap(oldValue).replaceAllUsesWith(unwrap(newValue));
1186}
1187
1188void mlirValueReplaceAllUsesExcept(MlirValue oldValue, MlirValue newValue,
1189 intptr_t numExceptions,
1190 MlirOperation *exceptions) {
1191 Value oldValueCpp = unwrap(oldValue);
1192 Value newValueCpp = unwrap(newValue);
1193
1195 for (intptr_t i = 0; i < numExceptions; ++i) {
1196 exceptionSet.insert(unwrap(exceptions[i]));
1197 }
1198
1199 oldValueCpp.replaceAllUsesExcept(newValueCpp, exceptionSet);
1200}
1201
1202MlirLocation mlirValueGetLocation(MlirValue v) {
1203 return wrap(unwrap(v).getLoc());
1204}
1205
1206MlirContext mlirValueGetContext(MlirValue v) {
1207 return wrap(unwrap(v).getContext());
1208}
1209
1210//===----------------------------------------------------------------------===//
1211// OpOperand API.
1212//===----------------------------------------------------------------------===//
1213
1214bool mlirOpOperandIsNull(MlirOpOperand opOperand) { return !opOperand.ptr; }
1215
1216MlirOperation mlirOpOperandGetOwner(MlirOpOperand opOperand) {
1217 return wrap(unwrap(opOperand)->getOwner());
1218}
1219
1220MlirValue mlirOpOperandGetValue(MlirOpOperand opOperand) {
1221 return wrap(unwrap(opOperand)->get());
1222}
1223
1224unsigned mlirOpOperandGetOperandNumber(MlirOpOperand opOperand) {
1225 return unwrap(opOperand)->getOperandNumber();
1226}
1227
1228MlirOpOperand mlirOpOperandGetNextUse(MlirOpOperand opOperand) {
1229 if (mlirOpOperandIsNull(opOperand))
1230 return {};
1231
1232 OpOperand *nextOpOperand = static_cast<OpOperand *>(
1233 unwrap(opOperand)->getNextOperandUsingThisValue());
1234
1235 if (!nextOpOperand)
1236 return {};
1237
1238 return wrap(nextOpOperand);
1239}
1240
1241//===----------------------------------------------------------------------===//
1242// Type API.
1243//===----------------------------------------------------------------------===//
1244
1245MlirType mlirTypeParseGet(MlirContext context, MlirStringRef type) {
1246 return wrap(mlir::parseType(unwrap(type), unwrap(context)));
1247}
1248
1249MlirContext mlirTypeGetContext(MlirType type) {
1250 return wrap(unwrap(type).getContext());
1251}
1252
1253MlirTypeID mlirTypeGetTypeID(MlirType type) {
1254 return wrap(unwrap(type).getTypeID());
1255}
1256
1257MlirDialect mlirTypeGetDialect(MlirType type) {
1258 return wrap(&unwrap(type).getDialect());
1259}
1260
1261bool mlirTypeEqual(MlirType t1, MlirType t2) {
1262 return unwrap(t1) == unwrap(t2);
1263}
1264
1265void mlirTypePrint(MlirType type, MlirStringCallback callback, void *userData) {
1266 detail::CallbackOstream stream(callback, userData);
1267 unwrap(type).print(stream);
1268}
1269
1270void mlirTypeDump(MlirType type) { unwrap(type).dump(); }
1271
1272//===----------------------------------------------------------------------===//
1273// Attribute API.
1274//===----------------------------------------------------------------------===//
1275
1276MlirAttribute mlirAttributeParseGet(MlirContext context, MlirStringRef attr) {
1277 return wrap(mlir::parseAttribute(unwrap(attr), unwrap(context)));
1278}
1279
1280MlirContext mlirAttributeGetContext(MlirAttribute attribute) {
1281 return wrap(unwrap(attribute).getContext());
1282}
1283
1284MlirType mlirAttributeGetType(MlirAttribute attribute) {
1285 Attribute attr = unwrap(attribute);
1286 if (auto typedAttr = llvm::dyn_cast<TypedAttr>(attr))
1287 return wrap(typedAttr.getType());
1288 return wrap(NoneType::get(attr.getContext()));
1289}
1290
1291MlirTypeID mlirAttributeGetTypeID(MlirAttribute attr) {
1292 return wrap(unwrap(attr).getTypeID());
1293}
1294
1295MlirDialect mlirAttributeGetDialect(MlirAttribute attr) {
1296 return wrap(&unwrap(attr).getDialect());
1297}
1298
1299bool mlirAttributeEqual(MlirAttribute a1, MlirAttribute a2) {
1300 return unwrap(a1) == unwrap(a2);
1301}
1302
1303void mlirAttributePrint(MlirAttribute attr, MlirStringCallback callback,
1304 void *userData) {
1305 detail::CallbackOstream stream(callback, userData);
1306 unwrap(attr).print(stream);
1307}
1308
1309void mlirAttributeDump(MlirAttribute attr) { unwrap(attr).dump(); }
1310
1312 MlirAttribute attr) {
1313 return MlirNamedAttribute{name, attr};
1314}
1315
1316//===----------------------------------------------------------------------===//
1317// Identifier API.
1318//===----------------------------------------------------------------------===//
1319
1320MlirIdentifier mlirIdentifierGet(MlirContext context, MlirStringRef str) {
1321 return wrap(StringAttr::get(unwrap(context), unwrap(str)));
1322}
1323
1324MlirContext mlirIdentifierGetContext(MlirIdentifier ident) {
1325 return wrap(unwrap(ident).getContext());
1326}
1327
1328bool mlirIdentifierEqual(MlirIdentifier ident, MlirIdentifier other) {
1329 return unwrap(ident) == unwrap(other);
1330}
1331
1332MlirStringRef mlirIdentifierStr(MlirIdentifier ident) {
1333 return wrap(unwrap(ident).strref());
1334}
1335
1336//===----------------------------------------------------------------------===//
1337// Symbol and SymbolTable API.
1338//===----------------------------------------------------------------------===//
1339
1343
1347
1348MlirSymbolTable mlirSymbolTableCreate(MlirOperation operation) {
1349 if (!unwrap(operation)->hasTrait<OpTrait::SymbolTable>())
1350 return wrap(static_cast<SymbolTable *>(nullptr));
1351 return wrap(new SymbolTable(unwrap(operation)));
1352}
1353
1354void mlirSymbolTableDestroy(MlirSymbolTable symbolTable) {
1355 delete unwrap(symbolTable);
1356}
1357
1358MlirOperation mlirSymbolTableLookup(MlirSymbolTable symbolTable,
1359 MlirStringRef name) {
1360 return wrap(unwrap(symbolTable)->lookup(StringRef(name.data, name.length)));
1361}
1362
1363MlirAttribute mlirSymbolTableInsert(MlirSymbolTable symbolTable,
1364 MlirOperation operation) {
1365 return wrap((Attribute)unwrap(symbolTable)->insert(unwrap(operation)));
1366}
1367
1368void mlirSymbolTableErase(MlirSymbolTable symbolTable,
1369 MlirOperation operation) {
1370 unwrap(symbolTable)->erase(unwrap(operation));
1371}
1372
1374 MlirStringRef newSymbol,
1375 MlirOperation from) {
1376 auto *cppFrom = unwrap(from);
1377 auto *context = cppFrom->getContext();
1378 auto oldSymbolAttr = StringAttr::get(context, unwrap(oldSymbol));
1379 auto newSymbolAttr = StringAttr::get(context, unwrap(newSymbol));
1380 return wrap(SymbolTable::replaceAllSymbolUses(oldSymbolAttr, newSymbolAttr,
1381 unwrap(from)));
1382}
1383
1384void mlirSymbolTableWalkSymbolTables(MlirOperation from, bool allSymUsesVisible,
1385 void (*callback)(MlirOperation, bool,
1386 void *userData),
1387 void *userData) {
1388 SymbolTable::walkSymbolTables(unwrap(from), allSymUsesVisible,
1389 [&](Operation *foundOpCpp, bool isVisible) {
1390 callback(wrap(foundOpCpp), isVisible,
1391 userData);
1392 });
1393}
return success()
lhs
unsigned mlirOpOperandGetOperandNumber(MlirOpOperand opOperand)
Returns the operand number of an op operand.
Definition IR.cpp:1224
MlirLocation mlirValueGetLocation(MlirValue v)
Gets the location of the value.
Definition IR.cpp:1202
void mlirContextDestroy(MlirContext context)
Takes an MLIR context owned by the caller and destroys it.
Definition IR.cpp:71
void mlirOperationDump(MlirOperation op)
Prints an operation to stderr.
Definition IR.cpp:855
MlirAttribute mlirOperationGetDiscardableAttributeByName(MlirOperation op, MlirStringRef name)
Definition IR.cpp:777
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...
Definition IR.cpp:1358
MlirRegion mlirRegionCreate()
Creates a new empty region and transfers ownership to the caller.
Definition IR.cpp:914
void mlirOperationPrint(MlirOperation op, MlirStringCallback callback, void *userData)
Prints a location by sending chunks of the string representation and forwarding userData to callback`...
Definition IR.cpp:821
MlirContext mlirModuleGetContext(MlirModule module)
Definition IR.cpp:446
void mlirValuePrint(MlirValue value, MlirStringCallback callback, void *userData)
Prints a block by sending chunks of the string representation and forwarding userData to callback`.
Definition IR.cpp:1161
MlirContext mlirLocationGetContext(MlirLocation location)
Gets the context that a location was created with.
Definition IR.cpp:411
size_t mlirModuleHashValue(MlirModule mod)
Definition IR.cpp:472
intptr_t mlirBlockGetNumPredecessors(MlirBlock block)
Definition IR.cpp:1095
bool mlirLocationIsAName(MlirLocation location)
Checks whether the given location is an Name.
Definition IR.cpp:399
MlirOperation mlirOpOperandGetOwner(MlirOpOperand opOperand)
Returns the owner operation of an op operand.
Definition IR.cpp:1216
bool mlirDialectEqual(MlirDialect dialect1, MlirDialect dialect2)
Checks if two dialects that belong to the same context are equal.
Definition IR.cpp:133
MlirRegion mlirRegionGetNextInOperation(MlirRegion region)
Returns the region immediately following the given region in its parent operation.
Definition IR.cpp:696
MlirLogicalResult mlirOperationWriteBytecodeWithConfig(MlirOperation op, MlirBytecodeWriterConfig config, MlirStringCallback callback, void *userData)
Same as mlirOperationWriteBytecode but with writer config and returns failure only if desired bytecod...
Definition IR.cpp:848
MlirIdentifier mlirOperationGetName(MlirOperation op)
Definition IR.cpp:669
void mlirDialectRegistryDestroy(MlirDialectRegistry registry)
Takes a dialect registry owned by the caller and destroys it.
Definition IR.cpp:149
bool mlirIdentifierEqual(MlirIdentifier ident, MlirIdentifier other)
Checks whether two identifiers are the same.
Definition IR.cpp:1328
void mlirOperationPrintWithFlags(MlirOperation op, MlirOpPrintingFlags flags, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but accepts flags controlling the printing behavior.
Definition IR.cpp:827
bool mlirValueIsABlockArgument(MlirValue value)
Definition IR.cpp:1115
MlirTypeID mlirTypeGetTypeID(MlirType type)
Gets the type ID of the type.
Definition IR.cpp:1253
void mlirValueReplaceAllUsesOfWith(MlirValue oldValue, MlirValue newValue)
Replace all uses of 'of' value with the 'with' value, updating anything in the IR that uses 'of' to u...
Definition IR.cpp:1184
MlirValue mlirBlockAddArgument(MlirBlock block, MlirType type, MlirLocation loc)
Appends an argument of the specified type to the block.
Definition IR.cpp:1063
intptr_t mlirOperationGetNumRegions(MlirOperation op)
Definition IR.cpp:681
MlirBlock mlirOperationGetBlock(MlirOperation op)
Definition IR.cpp:673
void mlirContextAppendDialectRegistry(MlirContext ctx, MlirDialectRegistry registry)
Append the contents of the given dialect registry to the registry associated with the context.
Definition IR.cpp:84
MlirIdentifier mlirIdentifierGet(MlirContext context, MlirStringRef str)
Gets an identifier with the given string value.
Definition IR.cpp:1320
void mlirBlockArgumentSetType(MlirValue value, MlirType type)
Definition IR.cpp:1132
MlirLocation mlirLocationFileLineColGet(MlirContext context, MlirStringRef filename, unsigned line, unsigned col)
Creates an File/Line/Column location owned by the given context.
Definition IR.cpp:273
intptr_t mlirContextGetNumLoadedDialects(MlirContext context)
Returns the number of dialects loaded by the context.
Definition IR.cpp:91
MlirNamedAttribute mlirNamedAttributeGet(MlirIdentifier name, MlirAttribute attr)
Associates an attribute with the name. Takes ownership of neither.
Definition IR.cpp:1311
MlirStringRef mlirSymbolTableGetVisibilityAttributeName()
Returns the name of the attribute used to store symbol visibility.
Definition IR.cpp:1344
void mlirOperationStateAddAttributes(MlirOperationState *state, intptr_t n, MlirNamedAttribute const *attributes)
Definition IR.cpp:521
MlirValue mlirOperationGetResult(MlirOperation op, intptr_t pos)
Definition IR.cpp:732
bool mlirLocationIsACallSite(MlirLocation location)
Checks whether the given location is an CallSite.
Definition IR.cpp:343
void mlirSymbolTableWalkSymbolTables(MlirOperation from, bool allSymUsesVisible, void(*callback)(MlirOperation, bool, void *userData), void *userData)
Walks all symbol table operations nested within, and including, op.
Definition IR.cpp:1384
void mlirContextLoadAllAvailableDialects(MlirContext context)
Eagerly loads all available dialects registered with a context, making them available for use for IR ...
Definition IR.cpp:108
MlirModule mlirModuleCreateParseFromFile(MlirContext context, MlirStringRef fileName)
Definition IR.cpp:437
void mlirAttributePrint(MlirAttribute attr, MlirStringCallback callback, void *userData)
Prints a location by sending chunks of the string representation and forwarding userData to callback`...
Definition IR.cpp:1303
MlirBlock mlirRegionGetFirstBlock(MlirRegion region)
Gets the first block in the region.
Definition IR.cpp:920
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...
Definition IR.cpp:1373
MlirLocation mlirLocationFusedGet(MlirContext ctx, intptr_t nLocations, MlirLocation const *locations, MlirAttribute metadata)
Creates a fused location with an array of locations and metadata.
Definition IR.cpp:347
MlirAsmState mlirAsmStateCreateForValue(MlirValue value, MlirOpPrintingFlags flags)
Definition IR.cpp:178
intptr_t mlirOperationGetNumResults(MlirOperation op)
Definition IR.cpp:728
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...
Definition IR.cpp:1174
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...
Definition IR.cpp:937
void mlirOperationDestroy(MlirOperation op)
Definition IR.cpp:639
void mlirValueReplaceAllUsesExcept(MlirValue oldValue, MlirValue newValue, intptr_t numExceptions, MlirOperation *exceptions)
Replace all uses of 'of' value with 'with' value, updating anything in the IR that uses 'of' to use '...
Definition IR.cpp:1188
void mlirBlockAppendOwnedOperation(MlirBlock block, MlirOperation operation)
Takes an operation owned by the caller and appends it to the block.
Definition IR.cpp:1015
MlirRegion mlirOperationGetFirstRegion(MlirOperation op)
Returns first region attached to the operation.
Definition IR.cpp:689
MlirAttribute mlirOperationGetInherentAttributeByName(MlirOperation op, MlirStringRef name)
Definition IR.cpp:750
MlirDialect mlirContextGetOrLoadDialect(MlirContext context, MlirStringRef name)
Gets the dialect instance owned by the given context using the dialect namespace to identify it,...
Definition IR.cpp:95
MlirContext mlirAttributeGetContext(MlirAttribute attribute)
Definition IR.cpp:1280
MlirStringRef mlirSymbolTableGetSymbolAttributeName()
Returns the name of the attribute used to store symbol names compatible with symbol tables.
Definition IR.cpp:1340
void mlirBlockInsertOwnedOperation(MlirBlock block, intptr_t pos, MlirOperation operation)
Takes an operation owned by the caller and inserts it as pos to the block.
Definition IR.cpp:1019
MlirRegion mlirBlockGetParentRegion(MlirBlock block)
Returns the region that contains this block.
Definition IR.cpp:990
MlirType mlirValueGetType(MlirValue value)
Definition IR.cpp:1151
void mlirOperationMoveAfter(MlirOperation op, MlirOperation other)
Moves the given operation immediately after the other operation in its parent block.
Definition IR.cpp:861
void mlirRegionAppendOwnedBlock(MlirRegion region, MlirBlock block)
Takes a block owned by the caller and appends it to the given region.
Definition IR.cpp:927
void mlirBlockPrint(MlirBlock block, MlirStringCallback callback, void *userData)
Definition IR.cpp:1081
void mlirOperationSetDiscardableAttributeByName(MlirOperation op, MlirStringRef name, MlirAttribute attr)
Definition IR.cpp:782
MlirOpPrintingFlags mlirOpPrintingFlagsCreate()
Definition IR.cpp:202
bool mlirModuleEqual(MlirModule lhs, MlirModule rhs)
Definition IR.cpp:468
void mlirOpPrintingFlagsElideLargeElementsAttrs(MlirOpPrintingFlags flags, intptr_t largeElementLimit)
Definition IR.cpp:210
MlirBlock mlirBlockGetNextInRegion(MlirBlock block)
Returns the block immediately following the given block in its parent region.
Definition IR.cpp:994
void mlirOperationSetSuccessor(MlirOperation op, intptr_t pos, MlirBlock block)
Definition IR.cpp:793
MlirValue mlirOpOperandGetValue(MlirOpOperand opOperand)
Returns the value of an op operand.
Definition IR.cpp:1220
#define APPEND_ELEMS(type, sizeName, elemName)
Definition IR.cpp:498
bool mlirContextIsRegisteredOperation(MlirContext context, MlirStringRef name)
Returns whether the given fully-qualified operation (i.e.
Definition IR.cpp:100
MlirOperation mlirOperationGetNextInBlock(MlirOperation op)
Definition IR.cpp:705
void mlirOpPrintingFlagsEnableDebugInfo(MlirOpPrintingFlags flags, bool enable, bool prettyForm)
Definition IR.cpp:220
MlirOperation mlirModuleGetOperation(MlirModule module)
Definition IR.cpp:460
static mlir::WalkResult unwrap(MlirWalkResult result)
Definition IR.cpp:873
void mlirOpPrintingFlagsElideLargeResourceString(MlirOpPrintingFlags flags, intptr_t largeResourceLimit)
Definition IR.cpp:215
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 ...
Definition IR.cpp:951
MlirValue mlirBlockGetArgument(MlirBlock block, intptr_t pos)
Returns pos-th argument of the block.
Definition IR.cpp:1077
unsigned mlirLocationFusedGetNumLocations(MlirLocation location)
Getter for number of locations fused together.
Definition IR.cpp:355
MlirStringRef mlirDialectGetNamespace(MlirDialect dialect)
Returns the namespace of the given dialect.
Definition IR.cpp:137
void mlirOpPrintingFlagsUseLocalScope(MlirOpPrintingFlags flags)
Definition IR.cpp:233
MlirTypeID mlirOperationGetTypeID(MlirOperation op)
Definition IR.cpp:663
intptr_t mlirBlockArgumentGetArgNumber(MlirValue value)
Definition IR.cpp:1127
void mlirOperationWalk(MlirOperation op, MlirOperationWalkCallback callback, void *userData, MlirWalkOrder walkOrder)
Walks operation op in walkOrder and calls callback on that operation.
Definition IR.cpp:887
MlirBlock mlirOperationGetSuccessor(MlirOperation op, intptr_t pos)
Definition IR.cpp:740
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...
Definition IR.cpp:1040
bool mlirAttributeEqual(MlirAttribute a1, MlirAttribute a2)
Definition IR.cpp:1299
MlirAsmState mlirAsmStateCreateForOperation(MlirOperation op, MlirOpPrintingFlags flags)
Definition IR.cpp:157
bool mlirOperationEqual(MlirOperation op, MlirOperation other)
Definition IR.cpp:643
void mlirOperationSetInherentAttributeByName(MlirOperation op, MlirStringRef name, MlirAttribute attr)
Definition IR.cpp:758
void mlirOpPrintingFlagsAssumeVerified(MlirOpPrintingFlags flags)
Definition IR.cpp:237
bool mlirValueEqual(MlirValue value1, MlirValue value2)
Definition IR.cpp:1111
MlirContext mlirIdentifierGetContext(MlirIdentifier ident)
Returns the context associated with this identifier.
Definition IR.cpp:1324
void mlirBytecodeWriterConfigDestroy(MlirBytecodeWriterConfig config)
Definition IR.cpp:252
MlirBlock mlirBlockGetSuccessor(MlirBlock block, intptr_t pos)
Definition IR.cpp:1091
void mlirModuleDestroy(MlirModule module)
Definition IR.cpp:454
MlirModule mlirModuleCreateEmpty(MlirLocation location)
Definition IR.cpp:425
void mlirOpPrintingFlagsPrintGenericOpForm(MlirOpPrintingFlags flags)
Definition IR.cpp:225
MlirOperation mlirOperationGetParentOperation(MlirOperation op)
Definition IR.cpp:677
void mlirRegionTakeBody(MlirRegion target, MlirRegion source)
Moves the entire content of the source region to the target region.
Definition IR.cpp:966
MlirLlvmThreadPool mlirContextGetThreadPool(MlirContext context)
Gets the thread pool of the context when enabled multithreading, otherwise an assertion is raised.
Definition IR.cpp:121
MlirValue mlirBlockInsertArgument(MlirBlock block, intptr_t pos, MlirType type, MlirLocation loc)
Inserts an argument of the specified type at a specified index to the block.
Definition IR.cpp:1072
void mlirValueSetType(MlirValue value, MlirType type)
Definition IR.cpp:1155
intptr_t mlirOperationGetNumSuccessors(MlirOperation op)
Definition IR.cpp:736
MlirDialect mlirAttributeGetDialect(MlirAttribute attr)
Definition IR.cpp:1295
void mlirLocationPrint(MlirLocation location, MlirStringCallback callback, void *userData)
Definition IR.cpp:415
void mlirOperationSetAttributeByName(MlirOperation op, MlirStringRef name, MlirAttribute attr)
Definition IR.cpp:812
void mlirBlockDestroy(MlirBlock block)
Takes a block owned by the caller and destroys it.
Definition IR.cpp:1052
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.
Definition IR.cpp:931
void mlirOperationSetOperand(MlirOperation op, intptr_t pos, MlirValue newValue)
Definition IR.cpp:717
intptr_t mlirBlockGetNumArguments(MlirBlock block)
Returns the number of arguments of the block.
Definition IR.cpp:1059
MlirTypeID mlirLocationFileLineColRangeGetTypeID()
TypeID Getter for FileLineColRange.
Definition IR.cpp:317
MlirOperation mlirOpResultGetOwner(MlirValue value)
Definition IR.cpp:1142
void mlirBlockEraseArgument(MlirBlock block, unsigned index)
Erase the argument at 'index' and remove it from the argument list.
Definition IR.cpp:1068
bool mlirOpOperandIsNull(MlirOpOperand opOperand)
Returns whether the op operand is null.
Definition IR.cpp:1214
MlirDialect mlirTypeGetDialect(MlirType type)
Gets the dialect a type belongs to.
Definition IR.cpp:1257
MlirModule mlirModuleCreateParse(MlirContext context, MlirStringRef module)
Definition IR.cpp:429
MlirContext mlirContextCreateWithRegistry(MlirDialectRegistry registry, bool threadingEnabled)
Creates an MLIR context, setting the multithreading setting explicitly and pre-loading the dialects f...
Definition IR.cpp:60
size_t mlirOperationHashValue(MlirOperation op)
Definition IR.cpp:647
void mlirContextSetAllowUnregisteredDialects(MlirContext context, bool allow)
Sets whether unregistered dialects are allowed in this context.
Definition IR.cpp:73
void mlirOperationStateAddResults(MlirOperationState *state, intptr_t n, MlirType const *results)
Definition IR.cpp:504
void mlirOperationMoveBefore(MlirOperation op, MlirOperation other)
Moves the given operation immediately before the other operation in its parent block.
Definition IR.cpp:865
static LogicalResult inferOperationTypes(OperationState &state)
Definition IR.cpp:534
MlirOperation mlirOperationClone(MlirOperation op)
Definition IR.cpp:635
void mlirValuePrintAsOperand(MlirValue value, MlirAsmState state, MlirStringCallback callback, void *userData)
Prints a value as an operand (i.e., the ValueID).
Definition IR.cpp:1167
MlirBlock mlirBlockArgumentGetOwner(MlirValue value)
Definition IR.cpp:1123
void mlirBlockArgumentSetLocation(MlirValue value, MlirLocation loc)
Definition IR.cpp:1137
MlirDialectRegistry mlirDialectRegistryCreate()
Creates a dialect registry and transfers its ownership to the caller.
Definition IR.cpp:145
MlirValue mlirOperationGetOperand(MlirOperation op, intptr_t pos)
Definition IR.cpp:713
bool mlirContextGetAllowUnregisteredDialects(MlirContext context)
Returns whether the context allows unregistered dialects.
Definition IR.cpp:77
MlirAttribute mlirLocationGetAttribute(MlirLocation location)
Returns the underlying location attribute of this location.
Definition IR.cpp:265
MlirModule mlirModuleFromOperation(MlirOperation op)
Definition IR.cpp:464
MlirTypeID mlirLocationNameGetTypeID()
TypeID Getter for Name.
Definition IR.cpp:397
MlirLocation mlirOperationGetLocation(MlirOperation op)
Definition IR.cpp:655
bool mlirTypeEqual(MlirType t1, MlirType t2)
Checks if two types are equal.
Definition IR.cpp:1261
bool mlirContextEqual(MlirContext ctx1, MlirContext ctx2)
Checks if two contexts are equal.
Definition IR.cpp:67
MlirAttribute mlirOperationGetAttributeByName(MlirOperation op, MlirStringRef name)
Definition IR.cpp:807
bool mlirOperationIsBeforeInBlock(MlirOperation op, MlirOperation other)
Given an operation 'other' that is within the same parent block, return whether the current operation...
Definition IR.cpp:869
MlirTypeID mlirAttributeGetTypeID(MlirAttribute attr)
Definition IR.cpp:1291
MlirAttribute mlirSymbolTableInsert(MlirSymbolTable symbolTable, MlirOperation operation)
Inserts the given operation into the given symbol table.
Definition IR.cpp:1363
bool mlirLocationIsAFileLineColRange(MlirLocation location)
Checks whether the given location is an FileLineColRange.
Definition IR.cpp:321
intptr_t mlirOperationGetNumDiscardableAttributes(MlirOperation op)
Definition IR.cpp:765
MlirSymbolTable mlirSymbolTableCreate(MlirOperation operation)
Creates a symbol table for the given operation.
Definition IR.cpp:1348
void mlirOperationStateAddOwnedRegions(MlirOperationState *state, intptr_t n, MlirRegion const *regions)
Definition IR.cpp:513
void mlirOperationSetLocation(MlirOperation op, MlirLocation loc)
Definition IR.cpp:659
MlirLocation mlirLocationUnknownGet(MlirContext context)
Creates a location with unknown position owned by the given context.
Definition IR.cpp:403
MlirLocation mlirLocationCallSiteGetCallee(MlirLocation location)
Getter for callee of CallSite.
Definition IR.cpp:329
static Operation * findParent(Operation *op, bool shouldUseLocalScope)
Definition IR.cpp:162
MlirOperation mlirBlockGetFirstOperation(MlirBlock block)
Returns the first operation in the block.
Definition IR.cpp:998
MlirType mlirAttributeGetType(MlirAttribute attribute)
Definition IR.cpp:1284
bool mlirOperationRemoveDiscardableAttributeByName(MlirOperation op, MlirStringRef name)
Definition IR.cpp:788
void mlirRegionDestroy(MlirRegion region)
Takes a region owned by the caller and destroys it.
Definition IR.cpp:962
bool mlirOperationRemoveAttributeByName(MlirOperation op, MlirStringRef name)
Definition IR.cpp:817
bool mlirValueIsAOpResult(MlirValue value)
Definition IR.cpp:1119
MLIR_CAPI_EXPORTED bool mlirOperationHasInherentAttributeByName(MlirOperation op, MlirStringRef name)
Definition IR.cpp:745
MlirContext mlirContextCreateWithThreading(bool threadingEnabled)
Creates an MLIR context with an explicit setting of the multithreading setting and transfers its owne...
Definition IR.cpp:55
MlirTypeID mlirLocationCallSiteGetTypeID()
TypeID Getter for CallSite.
Definition IR.cpp:339
MlirBlock mlirBlockGetPredecessor(MlirBlock block, intptr_t pos)
Definition IR.cpp:1100
MlirOperation mlirBlockGetTerminator(MlirBlock block)
Returns the terminator operation in the block or null if no terminator.
Definition IR.cpp:1005
bool mlirLocationEqual(MlirLocation l1, MlirLocation l2)
Checks if two locations are equal.
Definition IR.cpp:407
MlirRegion mlirOperationGetRegion(MlirOperation op, intptr_t pos)
Definition IR.cpp:685
void mlirOperationReplaceUsesOfWith(MlirOperation op, MlirValue oldValue, MlirValue newValue)
Replace uses of 'of' value with the 'with' value inside the 'op' operation.
Definition IR.cpp:905
int mlirLocationFileLineColRangeGetEndColumn(MlirLocation location)
Getter for end_column of FileLineColRange.
Definition IR.cpp:311
MlirOperation mlirOperationCreate(MlirOperationState *state)
Definition IR.cpp:589
unsigned mlirContextGetNumThreads(MlirContext context)
Gets the number of threads of the thread pool of the context when multithreading is enabled.
Definition IR.cpp:117
void mlirBytecodeWriterConfigDesiredEmitVersion(MlirBytecodeWriterConfig flags, int64_t version)
Definition IR.cpp:256
int mlirLocationFileLineColRangeGetStartColumn(MlirLocation location)
Getter for start_column of FileLineColRange.
Definition IR.cpp:299
MlirAttribute mlirAttributeParseGet(MlirContext context, MlirStringRef attr)
Definition IR.cpp:1276
void mlirLocationFusedGetLocations(MlirLocation location, MlirLocation *locationsCPtr)
Getter for locations of Fused.
Definition IR.cpp:361
void mlirOperationRemoveFromParent(MlirOperation op)
Definition IR.cpp:641
void mlirSymbolTableDestroy(MlirSymbolTable symbolTable)
Destroys the symbol table created with mlirSymbolTableCreate.
Definition IR.cpp:1354
intptr_t mlirBlockGetNumSuccessors(MlirBlock block)
Definition IR.cpp:1087
MlirContext mlirContextCreate()
Creates an MLIR context and transfers its ownership to the caller.
Definition IR.cpp:45
void mlirOperationPrintWithState(MlirOperation op, MlirAsmState state, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but accepts AsmState controlling the printing behavior as well as caching ...
Definition IR.cpp:833
bool mlirOperationVerify(MlirOperation op)
Verify the operation and return true if it passes, false if it fails.
Definition IR.cpp:857
void mlirBlockDetach(MlirBlock block)
Detach a block from the owning region and assume ownership.
Definition IR.cpp:1054
int mlirLocationFileLineColRangeGetEndLine(MlirLocation location)
Getter for end_line of FileLineColRange.
Definition IR.cpp:305
MlirNamedAttribute mlirOperationGetAttribute(MlirOperation op, intptr_t pos)
Definition IR.cpp:802
void mlirOpPrintingFlagsDestroy(MlirOpPrintingFlags flags)
Definition IR.cpp:206
MlirLocation mlirLocationCallSiteGet(MlirLocation callee, MlirLocation caller)
Creates a call site location with a callee and a caller.
Definition IR.cpp:325
void mlirOperationWriteBytecode(MlirOperation op, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but writing the bytecode format.
Definition IR.cpp:841
void mlirValueDump(MlirValue value)
Definition IR.cpp:1159
void mlirBlockInsertOwnedOperationAfter(MlirBlock block, MlirOperation reference, MlirOperation operation)
Takes an operation owned by the caller and inserts it after the (non-owned) reference operation in th...
Definition IR.cpp:1025
intptr_t mlirContextGetNumRegisteredDialects(MlirContext context)
Returns the number of dialects registered with the given context.
Definition IR.cpp:80
MlirTypeID mlirLocationFusedGetTypeID()
TypeID Getter for Fused.
Definition IR.cpp:373
void mlirOperationSetOperands(MlirOperation op, intptr_t nOperands, MlirValue const *operands)
Definition IR.cpp:722
static MLIRContext::Threading toThreadingEnum(bool threadingEnabled)
Definition IR.cpp:50
MlirIdentifier mlirLocationFileLineColRangeGetFilename(MlirLocation location)
Getter for filename of FileLineColRange.
Definition IR.cpp:289
MlirContext mlirTypeGetContext(MlirType type)
Gets the context that a type was created with.
Definition IR.cpp:1249
void mlirTypePrint(MlirType type, MlirStringCallback callback, void *userData)
Definition IR.cpp:1265
MlirBlock mlirModuleGetBody(MlirModule module)
Definition IR.cpp:450
MlirContext mlirDialectGetContext(MlirDialect dialect)
Returns the context that owns the dialect.
Definition IR.cpp:129
bool mlirRegionEqual(MlirRegion region, MlirRegion other)
Checks whether two region handles point to the same region.
Definition IR.cpp:916
int mlirLocationFileLineColRangeGetStartLine(MlirLocation location)
Getter for start_line of FileLineColRange.
Definition IR.cpp:293
MlirOperation mlirOperationCreateParse(MlirContext context, MlirStringRef sourceStr, MlirStringRef sourceName)
Definition IR.cpp:626
MlirLocation mlirLocationCallSiteGetCaller(MlirLocation location)
Getter for caller of CallSite.
Definition IR.cpp:334
void mlirAsmStateDestroy(MlirAsmState state)
Destroys printing flags created with mlirAsmStateCreate.
Definition IR.cpp:196
MlirContext mlirOperationGetContext(MlirOperation op)
Definition IR.cpp:651
intptr_t mlirOpResultGetResultNumber(MlirValue value)
Definition IR.cpp:1146
MlirLocation mlirLocationNameGet(MlirContext context, MlirStringRef name, MlirLocation childLoc)
Creates a name location owned by the given context.
Definition IR.cpp:379
MlirLocation mlirLocationFileLineColRangeGet(MlirContext context, MlirStringRef filename, unsigned startLine, unsigned startCol, unsigned endLine, unsigned endCol)
Creates an File/Line/Column range location owned by the given context.
Definition IR.cpp:281
bool mlirBlockEqual(MlirBlock block, MlirBlock other)
Checks whether two blocks handles point to the same block.
Definition IR.cpp:982
bool mlirLocationIsAFused(MlirLocation location)
Checks whether the given location is an Fused.
Definition IR.cpp:375
MlirAttribute mlirLocationFusedGetMetadata(MlirLocation location)
Getter for metadata of Fused.
Definition IR.cpp:369
void mlirSymbolTableErase(MlirSymbolTable symbolTable, MlirOperation operation)
Removes the given operation from the symbol table and erases it.
Definition IR.cpp:1368
MlirLocation mlirLocationNameGetChildLoc(MlirLocation location)
Getter for childLoc of Name.
Definition IR.cpp:392
MlirNamedAttribute mlirOperationGetDiscardableAttribute(MlirOperation op, intptr_t pos)
Definition IR.cpp:770
void mlirOperationStateEnableResultTypeInference(MlirOperationState *state)
Definition IR.cpp:526
void mlirOperationStateAddSuccessors(MlirOperationState *state, intptr_t n, MlirBlock const *successors)
Definition IR.cpp:517
MlirBytecodeWriterConfig mlirBytecodeWriterConfigCreate()
Definition IR.cpp:248
void mlirAttributeDump(MlirAttribute attr)
Prints the attribute to the standard error stream.
Definition IR.cpp:1309
void mlirOpPrintingFlagsPrintNameLocAsPrefix(MlirOpPrintingFlags flags)
Definition IR.cpp:229
MlirIdentifier mlirLocationNameGetName(MlirLocation location)
Getter for name of Name.
Definition IR.cpp:388
MlirStringRef mlirIdentifierStr(MlirIdentifier ident)
Gets the string value of the identifier.
Definition IR.cpp:1332
void mlirOpPrintingFlagsSkipRegions(MlirOpPrintingFlags flags)
Definition IR.cpp:241
void mlirOperationStateAddOperands(MlirOperationState *state, intptr_t n, MlirValue const *operands)
Definition IR.cpp:509
MlirOperationState mlirOperationStateGet(MlirStringRef name, MlirLocation loc)
Definition IR.cpp:480
MlirLocation mlirLocationFromAttribute(MlirAttribute attribute)
Creates a location from a location attribute.
Definition IR.cpp:269
MlirOperation mlirBlockGetParentOperation(MlirBlock block)
Returns the closest surrounding operation that contains this block.
Definition IR.cpp:986
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...
Definition IR.cpp:1228
intptr_t mlirOperationGetNumOperands(MlirOperation op)
Definition IR.cpp:709
void mlirContextSetThreadPool(MlirContext context, MlirLlvmThreadPool threadPool)
Sets the thread pool of the context explicitly, enabling multithreading in the process.
Definition IR.cpp:112
MlirType mlirTypeParseGet(MlirContext context, MlirStringRef type)
Parses a type. The type is owned by the context.
Definition IR.cpp:1245
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.
Definition IR.cpp:974
void mlirContextEnableMultithreading(MlirContext context, bool enable)
Set threading mode (must be set to false to mlir-print-ir-after-all).
Definition IR.cpp:104
void mlirTypeDump(MlirType type)
Definition IR.cpp:1270
intptr_t mlirOperationGetNumAttributes(MlirOperation op)
Definition IR.cpp:798
MlirContext mlirValueGetContext(MlirValue v)
Gets the context that a value was created with.
Definition IR.cpp:1206
b
Return true if permutation is a valid permutation of the outer_dims_perm (case OuterOrInnerPerm::Oute...
b getContext())
static llvm::ArrayRef< CppTy > unwrapList(size_t size, CTy *first, llvm::SmallVectorImpl< CppTy > &storage)
Definition Wrap.h:40
This class provides management for the lifetime of the state used when printing the IR.
Definition AsmState.h:542
Attributes are known-constant values of operations.
Definition Attributes.h:25
MLIRContext * getContext() const
Return the context this attribute belongs to.
Block represents an ordered list of Operations.
Definition Block.h:33
OpListType::iterator iterator
Definition Block.h:140
bool empty()
Definition Block.h:148
OpListType & getOperations()
Definition Block.h:137
Operation & front()
Definition Block.h:153
Operation & back()
Definition Block.h:152
PredecessorIterator pred_iterator
Definition Block.h:235
iterator begin()
Definition Block.h:143
This class contains the configuration used for the bytecode writer.
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
static FileLineColLoc get(StringAttr filename, unsigned line, unsigned column)
Definition Location.cpp:157
Location objects represent source locations information in MLIR.
Definition Location.h:32
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Definition Location.h:76
MLIRContext is the top-level object for a collection of MLIR operations.
Definition MLIRContext.h:63
DictionaryAttr getDictionary(MLIRContext *context) const
Return a dictionary attribute for the underlying dictionary.
void reserve(size_type N)
NamedAttribute represents a combination of a name and an Attribute value.
Definition Attributes.h:164
StringAttr getName() const
Return the name of the attribute.
Attribute getValue() const
Return the value of the attribute.
Definition Attributes.h:179
This class represents an operand of an operation.
Definition Value.h:257
Set of flags used to control the behavior of the various IR print methods (e.g.
This class provides the API for ops that are known to be isolated from above.
This class provides the API for ops that are known to be terminators.
Simple wrapper around a void* in order to express generically how to pass in op properties through AP...
StringRef getStringRef() const
Return the name of this operation. This always succeeds.
std::optional< RegisteredOperationName > getRegisteredInfo() const
If this operation is registered, returns the registered information, std::nullopt otherwise.
Operation is the basic unit of execution within MLIR.
Definition Operation.h:88
Region & getRegion(unsigned index)
Returns the region held by this operation at position 'index'.
Definition Operation.h:686
bool hasTrait()
Returns true if the operation was registered with a particular trait, e.g.
Definition Operation.h:749
unsigned getNumRegions()
Returns the number of regions held by this operation.
Definition Operation.h:674
Operation * getParentOp()
Returns the closest surrounding operation that contains this operation or nullptr if this is a top-le...
Definition Operation.h:234
static Operation * create(Location location, OperationName name, TypeRange resultTypes, ValueRange operands, NamedAttrList &&attributes, OpaqueProperties properties, BlockRange successors, unsigned numRegions)
Create a new Operation with the specific fields.
Definition Operation.cpp:67
This class acts as an owning reference to an op, and will automatically destroy the held op on destru...
Definition OwningOpRef.h:29
OpTy release()
Release the referenced op.
Definition OwningOpRef.h:67
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Definition Region.h:26
Block & front()
Definition Region.h:65
unsigned getRegionNumber()
Return the number of this region in the parent operation.
Definition Region.cpp:62
bool empty()
Definition Region.h:60
iterator begin()
Definition Region.h:55
Operation * getParentOp()
Return the parent operation this region is attached to.
Definition Region.h:200
BlockListType & getBlocks()
Definition Region.h:45
BlockListType::iterator iterator
Definition Region.h:52
This class allows for representing and managing the symbol table used by operations with the 'SymbolT...
Definition SymbolTable.h:24
static StringRef getSymbolAttrName()
Return the name of the attribute used for symbol names.
Definition SymbolTable.h:76
static LogicalResult replaceAllSymbolUses(StringAttr oldSymbol, StringAttr newSymbol, Operation *from)
Attempt to replace all uses of the given symbol 'oldSymbol' with the provided symbol 'newSymbol' that...
static StringRef getVisibilityAttrName()
Return the name of the attribute used for symbol visibility.
Definition SymbolTable.h:82
static void walkSymbolTables(Operation *op, bool allSymUsesVisible, function_ref< void(Operation *, bool)> callback)
Walks all symbol table operations nested within, and including, op.
OperandType * getOperand() const
Returns the current operands.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Definition Value.h:96
bool use_empty() const
Returns true if this value has no uses.
Definition Value.h:208
void replaceAllUsesExcept(Value newValue, const SmallPtrSetImpl< Operation * > &exceptions)
Replace all uses of 'this' value with 'newValue', updating anything in the IR that uses 'this' to use...
Definition Value.cpp:71
void printAsOperand(raw_ostream &os, AsmState &state) const
Print this value as if it were an operand.
Location getLoc() const
Return the location of this value.
Definition Value.cpp:24
use_iterator use_begin() const
Definition Value.h:184
A utility result that is used to signal how to proceed with an ongoing walk:
Definition WalkResult.h:29
static WalkResult skip()
Definition WalkResult.h:48
static WalkResult advance()
Definition WalkResult.h:47
static WalkResult interrupt()
Definition WalkResult.h:46
A simple raw ostream subclass that forwards write_impl calls to the user-supplied callback together w...
Definition Utils.h:30
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
Definition Diagnostics.h:24
mlir::Diagnostic & unwrap(MlirDiagnostic diagnostic)
Definition Diagnostics.h:19
MlirWalkResult(* MlirOperationWalkCallback)(MlirOperation, void *userData)
Operation walker type.
Definition IR.h:851
MlirWalkOrder
Traversal order for operation walk.
Definition IR.h:844
@ MlirWalkPreOrder
Definition IR.h:845
@ MlirWalkPostOrder
Definition IR.h:846
MlirWalkResult
Operation walk result.
Definition IR.h:837
@ MlirWalkResultInterrupt
Definition IR.h:839
@ MlirWalkResultSkip
Definition IR.h:840
@ MlirWalkResultAdvance
Definition IR.h:838
static bool mlirBlockIsNull(MlirBlock block)
Checks whether a block is null.
Definition IR.h:937
static bool mlirLocationIsNull(MlirLocation location)
Checks if the location is null.
Definition IR.h:370
#define MLIR_CAPI_EXPORTED
Definition Support.h:46
void(* MlirStringCallback)(MlirStringRef, void *)
A callback for returning string references.
Definition Support.h:105
Include the generated interface declarations.
Type getType(OpFoldResult ofr)
Returns the int type of the integer in ofr.
Definition Utils.cpp:304
const FrozenRewritePatternSet GreedyRewriteConfig config
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
Attribute parseAttribute(llvm::StringRef attrStr, MLIRContext *context, Type type={}, size_t *numRead=nullptr, bool isKnownNullTerminated=false)
This parses a single MLIR attribute to an MLIR context if it was valid.
LogicalResult parseSourceString(llvm::StringRef sourceStr, Block *block, const ParserConfig &config, StringRef sourceName="", LocationAttr *sourceFileLoc=nullptr)
This parses the IR string and appends parsed operations to the given block.
Definition Parser.cpp:108
Operation * clone(OpBuilder &b, Operation *op, TypeRange newResultTypes, ValueRange newOperands)
LogicalResult parseSourceFile(const llvm::SourceMgr &sourceMgr, Block *block, const ParserConfig &config, LocationAttr *sourceFileLoc=nullptr)
This parses the file specified by the indicated SourceMgr and appends parsed operations to the given ...
Definition Parser.cpp:38
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
Type parseType(llvm::StringRef typeStr, MLIRContext *context, size_t *numRead=nullptr, bool isKnownNullTerminated=false)
This parses a single MLIR type to an MLIR context if it was valid.
LogicalResult writeBytecodeToFile(Operation *op, raw_ostream &os, const BytecodeWriterConfig &config={})
Write the bytecode for the given operation to the provided output stream.
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs,...
Definition Verifier.cpp:423
A logical result value, essentially a boolean with named states.
Definition Support.h:116
Named MLIR attribute.
Definition IR.h:76
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition Support.h:73
const char * data
Pointer to the first symbol.
Definition Support.h:74
size_t length
Length of the fragment.
Definition Support.h:75
static llvm::hash_code computeHash(Operation *op, function_ref< llvm::hash_code(Value)> hashOperands=[](Value v) { return hash_value(v);}, function_ref< llvm::hash_code(Value)> hashResults=[](Value v) { return hash_value(v);}, Flags flags=Flags::None)
Compute a hash for the given operation.
This represents an operation in an abstracted form, suitable for use with the builder APIs.
OpaqueProperties getRawProperties()
SmallVector< Value, 4 > operands
void addOperands(ValueRange newOperands)
void addAttribute(StringRef name, Attribute attr)
Add an attribute with the specified name.
void addSuccessors(Block *successor)
Adds a successor to the operation sate. successor must not be null.
void addTypes(ArrayRef< Type > newTypes)
MLIRContext * getContext() const
Get the context held by this operation state.
SmallVector< std::unique_ptr< Region >, 1 > regions
Regions that the op will hold.
SmallVector< Type, 4 > types
Types of the results of this operation.
Region * addRegion()
Create a region that should be attached to the operation.