//===-- PassBase.td - Base pass definition file ------------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains definitions for defining pass registration and other
// mechanisms.
//
//===----------------------------------------------------------------------===//

#ifndef MLIR_PASS_PASSBASE
#define MLIR_PASS_PASSBASE

//===----------------------------------------------------------------------===//
// Options
//===----------------------------------------------------------------------===//

class Option<string varName, string arg, string valueType, string default,
             string desc, string additionalFlags = ""> {
  // The name for the C++ option variable.
  string cppName = varName;

  // The command line argument to use for this option.
  string argument = arg;

  // The C++ type of the option.
  string type = valueType;

  // The default value of the option. "" corresponds to no default.
  string defaultValue = default;

  // A description for this option.
  string description = desc;

  // A set of additional flags to pass along to the option constructor.
  string additionalOptFlags = additionalFlags;
}

class ListOption<string varName, string arg, string valueType,
                 string desc, string additionalFlags = "">
  : Option<varName, arg, valueType, /*default=*/"", desc, additionalFlags> {}

//===----------------------------------------------------------------------===//
// Statistics
//===----------------------------------------------------------------------===//

class Statistic<string varName, string statName, string desc> {
  // The C++ variable name for the statistic.
  string cppName = varName;

  // The displayed name of the statistic, similar to the argument of an option.
  string name = statName;

  // The description of the statistic.
  string description = desc;
}

//===----------------------------------------------------------------------===//
// Pass
//===----------------------------------------------------------------------===//

class PassBase<string passArg, string base> {
  // The command line argument of the pass.
  string argument = passArg;

  // The C++ base class for the pass.
  string baseClass = base;

  // A short 1-line summary of the pass.
  string summary = "";

  // A human readable description of the pass.
  string description = "";

  // A C++ constructor call to create an instance of this pass.
  code constructor = [{}];

  // A list of dialects this pass may produce entities in.
  list<string> dependentDialects = [];

  // A set of options provided by this pass.
  list<Option> options = [];

  // A set of statistics provided by this pass.
  list<Statistic> statistics = [];
}

// This class represents an mlir::OperationPass.
class Pass<string passArg, string operation = "">
  : PassBase<passArg, "::mlir::OperationPass<" # operation # ">">;

// This class represents an mlir::FunctionPass.
class FunctionPass<string passArg> : PassBase<passArg, "::mlir::FunctionPass">;

#endif // MLIR_PASS_PASSBASE
