blob: 7c00cd039a9c2874b1c6522ef6f5911f761916fe [file] [log] [blame]
Chris Lattnere2259872018-06-21 15:22:42 -07001//===- Function.h - MLIR Function Class -------------------------*- C++ -*-===//
Chris Lattnerc0c5e0f2018-06-21 09:49:33 -07002//
3// Copyright 2019 The MLIR Authors.
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16// =============================================================================
17//
Chris Lattnere2259872018-06-21 15:22:42 -070018// Functions are the basic unit of composition in MLIR. There are three
19// different kinds of functions: external functions, CFG functions, and ML
20// functions.
Chris Lattnerc0c5e0f2018-06-21 09:49:33 -070021//
22//===----------------------------------------------------------------------===//
23
24#ifndef MLIR_IR_FUNCTION_H
25#define MLIR_IR_FUNCTION_H
26
Chris Lattnere2259872018-06-21 15:22:42 -070027#include "mlir/Support/LLVM.h"
Chris Lattnerc0c5e0f2018-06-21 09:49:33 -070028
Chris Lattnere2259872018-06-21 15:22:42 -070029namespace mlir {
Chris Lattnerff0d5902018-07-05 09:12:11 -070030class FunctionType;
31class MLIRContext;
Chris Lattnerf7e22732018-06-22 22:03:48 -070032
Chris Lattner4c95a502018-06-23 16:03:42 -070033/// This is the base class for all of the MLIR function types.
34class Function {
35public:
Chris Lattnerff0d5902018-07-05 09:12:11 -070036 enum class Kind { ExtFunc, CFGFunc, MLFunc };
Chris Lattner4c95a502018-06-23 16:03:42 -070037
38 Kind getKind() const { return kind; }
39
40 /// Return the name of this function, without the @.
41 const std::string &getName() const { return name; }
42
43 /// Return the type of this function.
Chris Lattnerff0d5902018-07-05 09:12:11 -070044 FunctionType *getType() const { return type; }
45
46 MLIRContext *getContext() const;
Chris Lattner4c95a502018-06-23 16:03:42 -070047
Chris Lattner21e67f62018-07-06 10:46:19 -070048 /// Perform (potentially expensive) checks of invariants, used to detect
49 /// compiler bugs. This aborts on failure.
50 void verify() const;
51
Chris Lattner4c95a502018-06-23 16:03:42 -070052 void print(raw_ostream &os) const;
53 void dump() const;
54
55protected:
56 Function(StringRef name, FunctionType *type, Kind kind);
57 ~Function() {}
Chris Lattnerff0d5902018-07-05 09:12:11 -070058
Chris Lattner4c95a502018-06-23 16:03:42 -070059private:
60 Kind kind;
61 std::string name;
62 FunctionType *const type;
63
Chris Lattnerff0d5902018-07-05 09:12:11 -070064 void operator=(const Function &) = delete;
Chris Lattner4c95a502018-06-23 16:03:42 -070065};
66
67/// An extfunc declaration is a declaration of a function signature that is
68/// defined in some other module.
69class ExtFunction : public Function {
70public:
71 ExtFunction(StringRef name, FunctionType *type);
72
73 /// Methods for support type inquiry through isa, cast, and dyn_cast.
74 static bool classof(const Function *func) {
75 return func->getKind() == Kind::ExtFunc;
76 }
Chris Lattner4c95a502018-06-23 16:03:42 -070077};
78
79
Chris Lattnerc0c5e0f2018-06-21 09:49:33 -070080} // end namespace mlir
81
82#endif // MLIR_IR_FUNCTION_H