63 lines · cpp
1//===- Unit.cpp - Support for manipulating IR Unit ------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "mlir/IR/Unit.h"10#include "mlir/IR/Operation.h"11#include "mlir/IR/OperationSupport.h"12#include "mlir/IR/Region.h"13#include "llvm/Support/raw_ostream.h"14#include <iterator>15 16using namespace mlir;17 18static void printOp(llvm::raw_ostream &os, Operation *op,19 OpPrintingFlags &flags) {20 if (!op) {21 os << "<Operation:nullptr>";22 return;23 }24 op->print(os, flags);25}26 27static void printRegion(llvm::raw_ostream &os, Region *region,28 OpPrintingFlags &flags) {29 if (!region) {30 os << "<Region:nullptr>";31 return;32 }33 os << "Region #" << region->getRegionNumber() << " for op ";34 printOp(os, region->getParentOp(), flags);35}36 37static void printBlock(llvm::raw_ostream &os, Block *block,38 OpPrintingFlags &flags) {39 Region *region = block->getParent();40 Block *entry = ®ion->front();41 int blockId = std::distance(entry->getIterator(), block->getIterator());42 os << "Block #" << blockId << " for ";43 bool shouldSkipRegions = flags.shouldSkipRegions();44 printRegion(os, region, flags.skipRegions());45 if (!shouldSkipRegions)46 block->print(os);47}48 49void mlir::IRUnit::print(llvm::raw_ostream &os, OpPrintingFlags flags) const {50 if (auto *op = llvm::dyn_cast_if_present<Operation *>(*this))51 return printOp(os, op, flags);52 if (auto *region = llvm::dyn_cast_if_present<Region *>(*this))53 return printRegion(os, region, flags);54 if (auto *block = llvm::dyn_cast_if_present<Block *>(*this))55 return printBlock(os, block, flags);56 llvm_unreachable("unknown IRUnit");57}58 59llvm::raw_ostream &mlir::operator<<(llvm::raw_ostream &os, const IRUnit &unit) {60 unit.print(os);61 return os;62}63