//===- Interfaces.cpp - Interface classes ---------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #include "Interfaces.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; //===----------------------------------------------------------------------===// // InterfaceMethod //===----------------------------------------------------------------------===// InterfaceMethod::InterfaceMethod(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(args->getArg(i))->getValue(), args->getArgNameStr(i)}); } } StringRef InterfaceMethod::getReturnType() const { return def->getValueAsString("returnType"); } // Return the name of this method. StringRef InterfaceMethod::getName() const { return def->getValueAsString("name"); } // Return if this method is static. bool InterfaceMethod::isStatic() const { return def->isSubClassOf("StaticInterfaceMethod"); } // Return the body for this method if it has one. llvm::Optional InterfaceMethod::getBody() const { auto value = def->getValueAsString("body"); return value.empty() ? llvm::Optional() : value; } // Return the default implementation for this method if it has one. llvm::Optional InterfaceMethod::getDefaultImplementation() const { auto value = def->getValueAsString("defaultBody"); return value.empty() ? llvm::Optional() : value; } // Return the description of this method if it has one. llvm::Optional InterfaceMethod::getDescription() const { auto value = def->getValueAsString("description"); return value.empty() ? llvm::Optional() : value; } ArrayRef InterfaceMethod::getArguments() const { return arguments; } bool InterfaceMethod::arg_empty() const { return arguments.empty(); } //===----------------------------------------------------------------------===// // Interface //===----------------------------------------------------------------------===// Interface::Interface(const llvm::Record *def) : def(def) { assert(def->isSubClassOf("Interface") && "must be subclass of TableGen 'Interface' class"); auto *listInit = dyn_cast(def->getValueInit("methods")); for (llvm::Init *init : listInit->getValues()) methods.emplace_back(cast(init)->getDef()); } // Return the name of this interface. StringRef Interface::getName() const { return def->getValueAsString("cppClassName"); } // Return the C++ namespace of this interface. StringRef Interface::getCppNamespace() const { return def->getValueAsString("cppNamespace"); } // Return the methods of this interface. ArrayRef Interface::getMethods() const { return methods; } // Return the description of this method if it has one. llvm::Optional Interface::getDescription() const { auto value = def->getValueAsString("description"); return value.empty() ? llvm::Optional() : value; } // Return the interfaces extra class declaration code. llvm::Optional Interface::getExtraClassDeclaration() const { auto value = def->getValueAsString("extraClassDeclaration"); return value.empty() ? llvm::Optional() : value; } // Return the traits extra class declaration code. llvm::Optional Interface::getExtraTraitClassDeclaration() const { auto value = def->getValueAsString("extraTraitClassDeclaration"); return value.empty() ? llvm::Optional() : value; } // Return the body for this method if it has one. llvm::Optional Interface::getVerify() const { // Only OpInterface supports the verify method. if (!isa(this)) return llvm::None; auto value = def->getValueAsString("verify"); return value.empty() ? llvm::Optional() : value; } //===----------------------------------------------------------------------===// // AttrInterface //===----------------------------------------------------------------------===// bool AttrInterface::classof(const Interface *interface) { return interface->getDef().isSubClassOf("AttrInterface"); } //===----------------------------------------------------------------------===// // OpInterface //===----------------------------------------------------------------------===// bool OpInterface::classof(const Interface *interface) { return interface->getDef().isSubClassOf("OpInterface"); } //===----------------------------------------------------------------------===// // TypeInterface //===----------------------------------------------------------------------===// bool TypeInterface::classof(const Interface *interface) { return interface->getDef().isSubClassOf("TypeInterface"); }