Right now constraint/predicate traits/etc. use their "description" field as a one line human readable string. This breaks the current convention, by which a "description" may be multi-line. This revision renames the "description" field in these cases to "summary" which matches what the string is actually used as. This also unbreaks the use of TypeDefs(and eventually AttrDefs) in conjunction with existing type constraint facilities like `Optional`. Differential Revision: https://reviews.llvm.org/D94133
73 lines
2.4 KiB
C++
73 lines
2.4 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("OpInterfaceTrait"))
|
|
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 = Pred(def->getValueInit("predicate"));
|
|
return pred.getCondition();
|
|
}
|
|
|
|
llvm::StringRef PredOpTrait::getSummary() const {
|
|
return def->getValueAsString("summary");
|
|
}
|
|
|
|
OpInterface InterfaceOpTrait::getOpInterface() const {
|
|
return OpInterface(def);
|
|
}
|
|
|
|
std::string InterfaceOpTrait::getTrait() const {
|
|
llvm::StringRef trait = def->getValueAsString("trait");
|
|
llvm::StringRef cppNamespace = def->getValueAsString("cppNamespace");
|
|
return cppNamespace.empty() ? trait.str()
|
|
: (cppNamespace + "::" + trait).str();
|
|
}
|
|
|
|
bool InterfaceOpTrait::shouldDeclareMethods() const {
|
|
return def->isSubClassOf("DeclareOpInterfaceMethods");
|
|
}
|
|
|
|
std::vector<StringRef> InterfaceOpTrait::getAlwaysDeclaredMethods() const {
|
|
return def->getValueAsListOfStrings("alwaysOverriddenMethods");
|
|
}
|