Files
clang-p2996/mlir/lib/TableGen/OpTrait.cpp
River Riddle 2e2cdd0a52 [mlir] Refactor InterfaceGen to support generating interfaces for Attributes and Types.
This revision adds support to ODS for generating interfaces for attributes and types, in addition to operations. These interfaces can be specified using `AttrInterface` and `TypeInterface` in place of `OpInterface`. All of the features of `OpInterface` are supported except for the `verify` method, which does not have a matching representation in the Attribute/Type world. Generating these interface can be done using `gen-(attr|type)-interface-(defs|decls|docs)`.

Differential Revision: https://reviews.llvm.org/D81884
2020-06-30 15:52:33 -07:00

70 lines
2.2 KiB
C++

//===- OpTrait.cpp - OpTrait class ----------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// OpTrait wrapper to simplify using TableGen Record defining a MLIR OpTrait.
//
//===----------------------------------------------------------------------===//
#include "mlir/TableGen/OpTrait.h"
#include "mlir/TableGen/Interfaces.h"
#include "mlir/TableGen/Predicate.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
using namespace mlir;
using namespace mlir::tblgen;
OpTrait OpTrait::create(const llvm::Init *init) {
auto def = cast<llvm::DefInit>(init)->getDef();
if (def->isSubClassOf("PredOpTrait"))
return OpTrait(Kind::Pred, def);
if (def->isSubClassOf("GenInternalOpTrait"))
return OpTrait(Kind::Internal, def);
if (def->isSubClassOf("OpInterface"))
return OpTrait(Kind::Interface, def);
assert(def->isSubClassOf("NativeOpTrait"));
return OpTrait(Kind::Native, def);
}
OpTrait::OpTrait(Kind kind, const llvm::Record *def) : def(def), kind(kind) {}
llvm::StringRef NativeOpTrait::getTrait() const {
return def->getValueAsString("trait");
}
llvm::StringRef InternalOpTrait::getTrait() const {
return def->getValueAsString("trait");
}
std::string PredOpTrait::getPredTemplate() const {
auto pred = tblgen::Pred(def->getValueInit("predicate"));
return pred.getCondition();
}
llvm::StringRef PredOpTrait::getDescription() const {
return def->getValueAsString("description");
}
OpInterface InterfaceOpTrait::getOpInterface() const {
return OpInterface(def);
}
llvm::StringRef InterfaceOpTrait::getTrait() const {
return def->getValueAsString("trait");
}
bool InterfaceOpTrait::shouldDeclareMethods() const {
return def->isSubClassOf("DeclareOpInterfaceMethods");
}
std::vector<StringRef> InterfaceOpTrait::getAlwaysDeclaredMethods() const {
return def->getValueAsListOfStrings("alwaysOverriddenMethods");
}