mirror of
https://github.com/intel/llvm.git
synced 2026-01-29 04:16:38 +08:00
Currently a declaration won't be generated if the method has a default implementation. Meaning that operations that wan't to override the default have to explicitly declare the method in the extraClassDeclarations. This revision adds an optional list parameter to DeclareOpInterfaceMethods to allow for specifying a set of methods that should always have the declarations generated, even if there is a default. Differential Revision: https://reviews.llvm.org/D79030
70 lines
2.2 KiB
C++
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/OpInterfaces.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");
|
|
}
|