blob: 09294c2fa808113490896e0de7c7297b87d7febf [file] [log] [blame]
//===-- AttrOrTypeDef.h - Wrapper for attr and type definitions -*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// AttrOrTypeDef, AttrDef, and TypeDef wrappers to simplify using TableGen
// Record defining a MLIR attributes and types.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_TABLEGEN_ATTRORTYPEDEF_H
#define MLIR_TABLEGEN_ATTRORTYPEDEF_H
#include "mlir/Support/LLVM.h"
#include "mlir/TableGen/Builder.h"
#include "mlir/TableGen/Trait.h"
namespace llvm {
class DagInit;
class Record;
class SMLoc;
} // namespace llvm
namespace mlir {
namespace tblgen {
class Dialect;
class AttrOrTypeParameter;
//===----------------------------------------------------------------------===//
// AttrOrTypeBuilder
//===----------------------------------------------------------------------===//
/// Wrapper class that represents a Tablegen AttrOrTypeBuilder.
class AttrOrTypeBuilder : public Builder {
public:
using Builder::Builder;
/// Returns true if this builder is able to infer the MLIRContext parameter.
bool hasInferredContextParameter() const;
};
//===----------------------------------------------------------------------===//
// AttrOrTypeDef
//===----------------------------------------------------------------------===//
/// Wrapper class that contains a TableGen AttrOrTypeDef's record and provides
/// helper methods for accessing them.
class AttrOrTypeDef {
public:
explicit AttrOrTypeDef(const llvm::Record *def);
// Get the dialect for which this def belongs.
Dialect getDialect() const;
// Returns the name of this AttrOrTypeDef record.
StringRef getName() const;
// Query functions for the documentation of the def.
bool hasDescription() const;
StringRef getDescription() const;
bool hasSummary() const;
StringRef getSummary() const;
// Returns the name of the C++ class to generate.
StringRef getCppClassName() const;
// Returns the name of the C++ base class to use when generating this def.
StringRef getCppBaseClassName() const;
// Returns the name of the storage class for this def.
StringRef getStorageClassName() const;
// Returns the C++ namespace for this def's storage class.
StringRef getStorageNamespace() const;
// Returns true if we should generate the storage class.
bool genStorageClass() const;
// Indicates whether or not to generate the storage class constructor.
bool hasStorageCustomConstructor() const;
// Fill a list with this def's parameters. See AttrOrTypeDef in OpBase.td for
// documentation of parameter usage.
void getParameters(SmallVectorImpl<AttrOrTypeParameter> &) const;
// Return the number of parameters
unsigned getNumParameters() const;
// Return the keyword/mnemonic to use in the printer/parser methods if we are
// supposed to auto-generate them.
Optional<StringRef> getMnemonic() const;
// Returns the code to use as the types printer method. If not specified,
// return a non-value. Otherwise, return the contents of that code block.
Optional<StringRef> getPrinterCode() const;
// Returns the code to use as the parser method. If not specified, returns
// None. Otherwise, returns the contents of that code block.
Optional<StringRef> getParserCode() const;
// Returns the custom assembly format, if one was specified.
Optional<StringRef> getAssemblyFormat() const;
// Returns true if the accessors based on the parameters should be generated.
bool genAccessors() const;
// Return true if we need to generate the verify declaration and getChecked
// method.
bool genVerifyDecl() const;
// Returns the def's extra class declaration code.
Optional<StringRef> getExtraDecls() const;
// Get the code location (for error printing).
ArrayRef<llvm::SMLoc> getLoc() const;
// Returns true if the default get/getChecked methods should be skipped during
// generation.
bool skipDefaultBuilders() const;
// Returns the builders of this def.
ArrayRef<AttrOrTypeBuilder> getBuilders() const { return builders; }
// Returns the traits of this def.
ArrayRef<Trait> getTraits() const { return traits; }
// Returns whether two AttrOrTypeDefs are equal by checking the equality of
// the underlying record.
bool operator==(const AttrOrTypeDef &other) const;
// Compares two AttrOrTypeDefs by comparing the names of the dialects.
bool operator<(const AttrOrTypeDef &other) const;
// Returns whether the AttrOrTypeDef is defined.
operator bool() const { return def != nullptr; }
// Return the underlying def.
const llvm::Record *getDef() const { return def; }
protected:
const llvm::Record *def;
// The builders of this definition.
SmallVector<AttrOrTypeBuilder> builders;
// The traits of this definition.
SmallVector<Trait> traits;
};
//===----------------------------------------------------------------------===//
// AttrDef
//===----------------------------------------------------------------------===//
/// This class represents a wrapper around a tablegen AttrDef record.
class AttrDef : public AttrOrTypeDef {
public:
using AttrOrTypeDef::AttrOrTypeDef;
// Returns the attributes value type builder code block, or None if it doesn't
// have one.
Optional<StringRef> getTypeBuilder() const;
static bool classof(const AttrOrTypeDef *def);
};
//===----------------------------------------------------------------------===//
// TypeDef
//===----------------------------------------------------------------------===//
/// This class represents a wrapper around a tablegen TypeDef record.
class TypeDef : public AttrOrTypeDef {
public:
using AttrOrTypeDef::AttrOrTypeDef;
};
//===----------------------------------------------------------------------===//
// AttrOrTypeParameter
//===----------------------------------------------------------------------===//
// A wrapper class for tblgen AttrOrTypeParameter, arrays of which belong to
// AttrOrTypeDefs to parameterize them.
class AttrOrTypeParameter {
public:
explicit AttrOrTypeParameter(const llvm::DagInit *def, unsigned index)
: def(def), index(index) {}
// Get the parameter name.
StringRef getName() const;
// If specified, get the custom allocator code for this parameter.
Optional<StringRef> getAllocator() const;
// If specified, get the custom comparator code for this parameter.
Optional<StringRef> getComparator() const;
// Get the C++ type of this parameter.
StringRef getCppType() const;
// Get the C++ accessor type of this parameter.
StringRef getCppAccessorType() const;
// Get the C++ storage type of this parameter.
StringRef getCppStorageType() const;
// Get an optional C++ parameter parser.
Optional<StringRef> getParser() const;
// Get an optional C++ parameter printer.
Optional<StringRef> getPrinter() const;
// Get a description of this parameter for documentation purposes.
Optional<StringRef> getSummary() const;
// Get the assembly syntax documentation.
StringRef getSyntax() const;
// Return the underlying def of this parameter.
const llvm::Init *getDef() const;
private:
/// The underlying tablegen parameter list this parameter is a part of.
const llvm::DagInit *def;
/// The index of the parameter within the parameter list (`def`).
unsigned index;
};
//===----------------------------------------------------------------------===//
// AttributeSelfTypeParameter
//===----------------------------------------------------------------------===//
// A wrapper class for the AttributeSelfTypeParameter tblgen class. This
// represents a parameter of mlir::Type that is the value type of an AttrDef.
class AttributeSelfTypeParameter : public AttrOrTypeParameter {
public:
static bool classof(const AttrOrTypeParameter *param);
};
} // end namespace tblgen
} // end namespace mlir
#endif // MLIR_TABLEGEN_ATTRORTYPEDEF_H