My Project
Module.h
Go to the documentation of this file.
1 //===- Module.h - MLIR Module Class -----------------------------*- C++ -*-===//
2 //
3 // Part of the MLIR 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 // Module is the top-level container for code in an MLIR program.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_IR_MODULE_H
14 #define MLIR_IR_MODULE_H
15 
16 #include "mlir/IR/SymbolTable.h"
17 
18 namespace mlir {
19 class ModuleTerminatorOp;
20 
21 //===----------------------------------------------------------------------===//
22 // Module Operation.
23 //===----------------------------------------------------------------------===//
24 
29 class ModuleOp
30  : public Op<
31  ModuleOp, OpTrait::ZeroOperands, OpTrait::ZeroResult,
32  OpTrait::IsIsolatedFromAbove, OpTrait::SymbolTable,
33  OpTrait::SingleBlockImplicitTerminator<ModuleTerminatorOp>::Impl> {
34 public:
35  using Op::Op;
36  using Op::print;
37 
38  static StringRef getOperationName() { return "module"; }
39 
40  static void build(Builder *builder, OperationState &result,
42 
45 
47  static ParseResult parse(OpAsmParser &parser, OperationState &result);
48  void print(OpAsmPrinter &p);
50 
53  Block *getBody();
54 
57 
59  void print(raw_ostream &os, OpPrintingFlags flags = llvm::None);
60  void dump();
61 
62  //===--------------------------------------------------------------------===//
63  // Body Management.
64  //===--------------------------------------------------------------------===//
65 
68 
69  iterator begin() { return getBody()->begin(); }
70  iterator end() { return getBody()->end(); }
71  Operation &front() { return *begin(); }
72 
75  template <typename T> iterator_range<Block::op_iterator<T>> getOps() {
76  return getBody()->getOps<T>();
77  }
78 
80  void push_back(Operation *op) {
81  insert(Block::iterator(getBody()->getTerminator()), op);
82  }
83 
86  void insert(Operation *insertPt, Operation *op) {
87  insert(Block::iterator(insertPt), op);
88  }
89  void insert(Block::iterator insertPt, Operation *op) {
90  auto *body = getBody();
91  if (insertPt == body->end())
92  insertPt = Block::iterator(body->getTerminator());
93  body->getOperations().insert(insertPt, op);
94  }
95 };
96 
104  : public Op<ModuleTerminatorOp, OpTrait::ZeroOperands, OpTrait::ZeroResult,
105  OpTrait::HasParent<ModuleOp>::Impl, OpTrait::IsTerminator> {
106 public:
107  using Op::Op;
108  static StringRef getOperationName() { return "module_terminator"; }
109  static void build(Builder *, OperationState &) {}
110 };
111 
115 public:
116  OwningModuleRef(std::nullptr_t = nullptr) {}
117  OwningModuleRef(ModuleOp module) : module(module) {}
118  OwningModuleRef(OwningModuleRef &&other) : module(other.release()) {}
120  if (module)
121  module.erase();
122  }
123 
124  // Assign from another module reference.
126  if (module)
127  module.erase();
128  module = other.release();
129  return *this;
130  }
131 
133  ModuleOp get() const { return module; }
134  ModuleOp operator*() const { return module; }
135  ModuleOp *operator->() { return &module; }
136  explicit operator bool() const { return module; }
137 
140  ModuleOp released;
141  std::swap(released, module);
142  return released;
143  }
144 
145 private:
146  ModuleOp module;
147 };
148 
149 } // end namespace mlir
150 
151 namespace llvm {
152 
154 template <> struct PointerLikeTypeTraits<mlir::ModuleOp> {
155 public:
156  static inline void *getAsVoidPointer(mlir::ModuleOp I) {
157  return const_cast<void *>(I.getAsOpaquePointer());
158  }
159  static inline mlir::ModuleOp getFromVoidPointer(void *P) {
161  }
162  enum { NumLowBitsAvailable = 3 };
163 };
164 
165 } // end namespace llvm
166 
167 #endif // MLIR_IR_MODULE_H
Definition: InferTypeOpInterface.cpp:20
static ParseResult parse(OpAsmParser &parser, OperationState &result)
Operation hooks.
Definition: Module.cpp:35
Definition: Region.h:23
iterator begin()
Definition: Block.h:110
Block::iterator iterator
Iteration over the operations in the module.
Definition: Module.h:67
OwningModuleRef & operator=(OwningModuleRef &&other)
Definition: Module.h:125
static void build(Builder *builder, OperationState &result, Optional< StringRef > name=llvm::None)
Definition: SPIRVOps.cpp:2225
Definition: PassRegistry.cpp:413
Definition: Operation.h:27
iterator end()
Definition: Module.h:70
void insert(Block::iterator insertPt, Operation *op)
Definition: Module.h:89
Block represents an ordered list of Operations.
Definition: Block.h:21
ModuleOp * operator->()
Definition: Module.h:135
void print(raw_ostream &os, OpPrintingFlags flags=llvm::None)
Print the operation to the given stream.
Definition: OpDefinition.h:122
~OwningModuleRef()
Definition: Module.h:119
static StringRef getOperationName()
Definition: Module.h:108
Definition: OpImplementation.h:214
Definition: LLVM.h:40
LogicalResult verify()
Definition: Module.cpp:72
Definition: Location.h:52
Optional< StringRef > getName()
Return the name of this module if present.
Definition: Module.cpp:101
Definition: Module.h:114
Definition: LogicalResult.h:18
OpListType::iterator iterator
Definition: Block.h:107
iterator begin()
Definition: Module.h:69
OwningModuleRef(OwningModuleRef &&other)
Definition: Module.h:118
ModuleOp release()
Release the referenced module.
Definition: Module.h:139
iterator end()
Definition: Block.h:111
void insert(Operation *insertPt, Operation *op)
Definition: Module.h:86
static ModuleOp create(Location loc, Optional< StringRef > name=llvm::None)
Construct a module from the given location with an optional name.
Definition: Module.cpp:28
OwningModuleRef(ModuleOp module)
Definition: Module.h:117
static void build(Builder *, OperationState &)
Definition: Module.h:109
Definition: OpImplementation.h:32
Definition: OperationSupport.h:261
Definition: Module.h:29
OwningModuleRef(std::nullptr_t=nullptr)
Definition: Module.h:116
Block * getBody()
Definition: Module.cpp:99
Operation & front()
Definition: Module.h:71
Op()
This is a public constructor. Any op can be initialized to null.
Definition: OpDefinition.h:1029
static void * getAsVoidPointer(mlir::ModuleOp I)
Definition: Module.h:156
Definition: OperationSupport.h:474
static StringRef getOperationName()
Definition: Module.h:38
Definition: Builders.h:47
static mlir::ModuleOp getFromVoidPointer(void *P)
Definition: Module.h:159
Definition: LLVM.h:50
iterator_range< op_iterator< OpT > > getOps()
Definition: Block.h:190
Definition: OpDefinition.h:949
ModuleOp operator*() const
Definition: Module.h:134
Region & getBodyRegion()
Return body of this module.
Definition: Module.cpp:98
Definition: StandardTypes.h:63
void push_back(Operation *op)
Insert the operation into the back of the body, before the terminator.
Definition: Module.h:80
Definition: Module.h:103
Definition: OpDefinition.h:36
void print(OpAsmPrinter &p)
Definition: Module.cpp:55
void dump()
Definition: AsmPrinter.cpp:2193
const void * getAsOpaquePointer() const
Methods for supporting PointerLikeTypeTraits.
Definition: OpDefinition.h:1037
iterator_range< Block::op_iterator< T > > getOps()
Definition: Module.h:75