mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 03:25:54 -04:00

Summary: Add method in ODS to specify verification for operations implementing a OpInterface. Use this with infer type op interface to verify that the inferred type matches the return type and remove special case in TestPatterns. This could also have been achieved by using OpInterfaceMethod but verify seems pretty common and it is not an arbitrary method that just happened to be named verifyTrait, so having it be defined in special way seems appropriate/better documenting. Differential Revision: https://reviews.llvm.org/D73122
94 lines
3.2 KiB
C++
94 lines
3.2 KiB
C++
//===- OpInterfaces.cpp - OpInterfaces class ------------------------------===//
|
|
//
|
|
// Part of the MLIR 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// OpInterfaces wrapper to simplify using TableGen OpInterfaces.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/TableGen/OpInterfaces.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;
|
|
|
|
OpInterfaceMethod::OpInterfaceMethod(const llvm::Record *def) : def(def) {
|
|
llvm::DagInit *args = def->getValueAsDag("arguments");
|
|
for (unsigned i = 0, e = args->getNumArgs(); i != e; ++i) {
|
|
arguments.push_back(
|
|
{llvm::cast<llvm::StringInit>(args->getArg(i))->getValue(),
|
|
args->getArgNameStr(i)});
|
|
}
|
|
}
|
|
|
|
StringRef OpInterfaceMethod::getReturnType() const {
|
|
return def->getValueAsString("returnType");
|
|
}
|
|
|
|
// Return the name of this method.
|
|
StringRef OpInterfaceMethod::getName() const {
|
|
return def->getValueAsString("name");
|
|
}
|
|
|
|
// Return if this method is static.
|
|
bool OpInterfaceMethod::isStatic() const {
|
|
return def->isSubClassOf("StaticInterfaceMethod");
|
|
}
|
|
|
|
// Return the body for this method if it has one.
|
|
llvm::Optional<StringRef> OpInterfaceMethod::getBody() const {
|
|
auto value = def->getValueAsString("body");
|
|
return value.empty() ? llvm::Optional<StringRef>() : value;
|
|
}
|
|
|
|
// Return the default implementation for this method if it has one.
|
|
llvm::Optional<StringRef> OpInterfaceMethod::getDefaultImplementation() const {
|
|
auto value = def->getValueAsString("defaultBody");
|
|
return value.empty() ? llvm::Optional<StringRef>() : value;
|
|
}
|
|
|
|
// Return the description of this method if it has one.
|
|
llvm::Optional<StringRef> OpInterfaceMethod::getDescription() const {
|
|
auto value = def->getValueAsString("description");
|
|
return value.empty() ? llvm::Optional<StringRef>() : value;
|
|
}
|
|
|
|
ArrayRef<OpInterfaceMethod::Argument> OpInterfaceMethod::getArguments() const {
|
|
return arguments;
|
|
}
|
|
|
|
bool OpInterfaceMethod::arg_empty() const { return arguments.empty(); }
|
|
|
|
OpInterface::OpInterface(const llvm::Record *def) : def(def) {
|
|
auto *listInit = dyn_cast<llvm::ListInit>(def->getValueInit("methods"));
|
|
for (llvm::Init *init : listInit->getValues())
|
|
methods.emplace_back(cast<llvm::DefInit>(init)->getDef());
|
|
}
|
|
|
|
// Return the name of this interface.
|
|
StringRef OpInterface::getName() const {
|
|
return def->getValueAsString("cppClassName");
|
|
}
|
|
|
|
// Return the methods of this interface.
|
|
ArrayRef<OpInterfaceMethod> OpInterface::getMethods() const { return methods; }
|
|
|
|
// Return the description of this method if it has one.
|
|
llvm::Optional<StringRef> OpInterface::getDescription() const {
|
|
auto value = def->getValueAsString("description");
|
|
return value.empty() ? llvm::Optional<StringRef>() : value;
|
|
}
|
|
|
|
// Return the body for this method if it has one.
|
|
llvm::Optional<StringRef> OpInterface::getVerify() const {
|
|
auto value = def->getValueAsString("verify");
|
|
return value.empty() ? llvm::Optional<StringRef>() : value;
|
|
}
|