1f406adf1SMehdi Amini //===- Unit.cpp - Support for manipulating IR Unit ------------------------===//
2f406adf1SMehdi Amini //
3f406adf1SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f406adf1SMehdi Amini // See https://llvm.org/LICENSE.txt for license information.
5f406adf1SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f406adf1SMehdi Amini //
7f406adf1SMehdi Amini //===----------------------------------------------------------------------===//
8f406adf1SMehdi Amini
9f406adf1SMehdi Amini #include "mlir/IR/Unit.h"
10f406adf1SMehdi Amini #include "mlir/IR/Operation.h"
11f406adf1SMehdi Amini #include "mlir/IR/OperationSupport.h"
12f406adf1SMehdi Amini #include "mlir/IR/Region.h"
13f406adf1SMehdi Amini #include "llvm/Support/raw_ostream.h"
14f406adf1SMehdi Amini #include <iterator>
15f406adf1SMehdi Amini #include <sstream>
16f406adf1SMehdi Amini
17f406adf1SMehdi Amini using namespace mlir;
18f406adf1SMehdi Amini
printOp(llvm::raw_ostream & os,Operation * op,OpPrintingFlags & flags)19f406adf1SMehdi Amini static void printOp(llvm::raw_ostream &os, Operation *op,
20f406adf1SMehdi Amini OpPrintingFlags &flags) {
21f406adf1SMehdi Amini if (!op) {
22f406adf1SMehdi Amini os << "<Operation:nullptr>";
23f406adf1SMehdi Amini return;
24f406adf1SMehdi Amini }
25f406adf1SMehdi Amini op->print(os, flags);
26f406adf1SMehdi Amini }
27f406adf1SMehdi Amini
printRegion(llvm::raw_ostream & os,Region * region,OpPrintingFlags & flags)28f406adf1SMehdi Amini static void printRegion(llvm::raw_ostream &os, Region *region,
29f406adf1SMehdi Amini OpPrintingFlags &flags) {
30f406adf1SMehdi Amini if (!region) {
31f406adf1SMehdi Amini os << "<Region:nullptr>";
32f406adf1SMehdi Amini return;
33f406adf1SMehdi Amini }
34f406adf1SMehdi Amini os << "Region #" << region->getRegionNumber() << " for op ";
35f406adf1SMehdi Amini printOp(os, region->getParentOp(), flags);
36f406adf1SMehdi Amini }
37f406adf1SMehdi Amini
printBlock(llvm::raw_ostream & os,Block * block,OpPrintingFlags & flags)38f406adf1SMehdi Amini static void printBlock(llvm::raw_ostream &os, Block *block,
39f406adf1SMehdi Amini OpPrintingFlags &flags) {
40f406adf1SMehdi Amini Region *region = block->getParent();
41f406adf1SMehdi Amini Block *entry = ®ion->front();
42f406adf1SMehdi Amini int blockId = std::distance(entry->getIterator(), block->getIterator());
43f406adf1SMehdi Amini os << "Block #" << blockId << " for ";
44f406adf1SMehdi Amini bool shouldSkipRegions = flags.shouldSkipRegions();
45f406adf1SMehdi Amini printRegion(os, region, flags.skipRegions());
46f406adf1SMehdi Amini if (!shouldSkipRegions)
47f406adf1SMehdi Amini block->print(os);
48f406adf1SMehdi Amini }
49f406adf1SMehdi Amini
print(llvm::raw_ostream & os,OpPrintingFlags flags) const50f406adf1SMehdi Amini void mlir::IRUnit::print(llvm::raw_ostream &os, OpPrintingFlags flags) const {
51*68f58812STres Popp if (auto *op = llvm::dyn_cast_if_present<Operation *>(*this))
52f406adf1SMehdi Amini return printOp(os, op, flags);
53*68f58812STres Popp if (auto *region = llvm::dyn_cast_if_present<Region *>(*this))
54f406adf1SMehdi Amini return printRegion(os, region, flags);
55*68f58812STres Popp if (auto *block = llvm::dyn_cast_if_present<Block *>(*this))
56f406adf1SMehdi Amini return printBlock(os, block, flags);
57f406adf1SMehdi Amini llvm_unreachable("unknown IRUnit");
58f406adf1SMehdi Amini }
59f406adf1SMehdi Amini
operator <<(llvm::raw_ostream & os,const IRUnit & unit)60f406adf1SMehdi Amini llvm::raw_ostream &mlir::operator<<(llvm::raw_ostream &os, const IRUnit &unit) {
61f406adf1SMehdi Amini unit.print(os);
62f406adf1SMehdi Amini return os;
63f406adf1SMehdi Amini }
64