//===- AttrOrTypeDef.cpp - AttrOrTypeDef wrapper 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 "mlir/TableGen/AttrOrTypeDef.h" #include "mlir/TableGen/Dialect.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/StringExtras.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" using namespace mlir; using namespace mlir::tblgen; //===----------------------------------------------------------------------===// // AttrOrTypeBuilder //===----------------------------------------------------------------------===// /// Returns true if this builder is able to infer the MLIRContext parameter. bool AttrOrTypeBuilder::hasInferredContextParameter() const { return def->getValueAsBit("hasInferredContextParam"); } //===----------------------------------------------------------------------===// // AttrOrTypeDef //===----------------------------------------------------------------------===// AttrOrTypeDef::AttrOrTypeDef(const llvm::Record *def) : def(def) { // Populate the builders. auto *builderList = dyn_cast_or_null(def->getValueInit("builders")); if (builderList && !builderList->empty()) { for (llvm::Init *init : builderList->getValues()) { AttrOrTypeBuilder builder(cast(init)->getDef(), def->getLoc()); // Ensure that all parameters have names. for (const AttrOrTypeBuilder::Parameter ¶m : builder.getParameters()) { if (!param.getName()) PrintFatalError(def->getLoc(), "builder parameters must have a name"); } builders.emplace_back(builder); } } // Populate the traits. if (auto *traitList = def->getValueAsListInit("traits")) { SmallPtrSet traitSet; traits.reserve(traitSet.size()); for (auto *traitInit : *traitList) if (traitSet.insert(traitInit).second) traits.push_back(Trait::create(traitInit)); } // Populate the parameters. if (auto *parametersDag = def->getValueAsDag("parameters")) { for (unsigned i = 0, e = parametersDag->getNumArgs(); i < e; ++i) parameters.push_back(AttrOrTypeParameter(parametersDag, i)); } } Dialect AttrOrTypeDef::getDialect() const { auto *dialect = dyn_cast(def->getValue("dialect")->getValue()); return Dialect(dialect ? dialect->getDef() : nullptr); } StringRef AttrOrTypeDef::getName() const { return def->getName(); } StringRef AttrOrTypeDef::getCppClassName() const { return def->getValueAsString("cppClassName"); } StringRef AttrOrTypeDef::getCppBaseClassName() const { return def->getValueAsString("cppBaseClassName"); } bool AttrOrTypeDef::hasDescription() const { const llvm::RecordVal *desc = def->getValue("description"); return desc && isa(desc->getValue()); } StringRef AttrOrTypeDef::getDescription() const { return def->getValueAsString("description"); } bool AttrOrTypeDef::hasSummary() const { const llvm::RecordVal *summary = def->getValue("summary"); return summary && isa(summary->getValue()); } StringRef AttrOrTypeDef::getSummary() const { return def->getValueAsString("summary"); } StringRef AttrOrTypeDef::getStorageClassName() const { return def->getValueAsString("storageClass"); } StringRef AttrOrTypeDef::getStorageNamespace() const { return def->getValueAsString("storageNamespace"); } bool AttrOrTypeDef::genStorageClass() const { return def->getValueAsBit("genStorageClass"); } bool AttrOrTypeDef::hasStorageCustomConstructor() const { return def->getValueAsBit("hasStorageCustomConstructor"); } unsigned AttrOrTypeDef::getNumParameters() const { auto *parametersDag = def->getValueAsDag("parameters"); return parametersDag ? parametersDag->getNumArgs() : 0; } Optional AttrOrTypeDef::getMnemonic() const { return def->getValueAsOptionalString("mnemonic"); } Optional AttrOrTypeDef::getPrinterCode() const { return def->getValueAsOptionalString("printer"); } Optional AttrOrTypeDef::getParserCode() const { return def->getValueAsOptionalString("parser"); } Optional AttrOrTypeDef::getAssemblyFormat() const { return def->getValueAsOptionalString("assemblyFormat"); } bool AttrOrTypeDef::genAccessors() const { return def->getValueAsBit("genAccessors"); } bool AttrOrTypeDef::genVerifyDecl() const { return def->getValueAsBit("genVerifyDecl"); } Optional AttrOrTypeDef::getExtraDecls() const { auto value = def->getValueAsString("extraClassDeclaration"); return value.empty() ? Optional() : value; } ArrayRef AttrOrTypeDef::getLoc() const { return def->getLoc(); } bool AttrOrTypeDef::skipDefaultBuilders() const { return def->getValueAsBit("skipDefaultBuilders"); } bool AttrOrTypeDef::operator==(const AttrOrTypeDef &other) const { return def == other.def; } bool AttrOrTypeDef::operator<(const AttrOrTypeDef &other) const { return getName() < other.getName(); } //===----------------------------------------------------------------------===// // AttrDef //===----------------------------------------------------------------------===// Optional AttrDef::getTypeBuilder() const { return def->getValueAsOptionalString("typeBuilder"); } bool AttrDef::classof(const AttrOrTypeDef *def) { return def->getDef()->isSubClassOf("AttrDef"); } //===----------------------------------------------------------------------===// // AttrOrTypeParameter //===----------------------------------------------------------------------===// template auto AttrOrTypeParameter::getDefValue(StringRef name) const { Optional().getValue())> result; if (auto *param = dyn_cast(getDef())) if (auto *init = param->getDef()->getValue(name)) if (auto *value = dyn_cast_or_null(init->getValue())) result = value->getValue(); return result; } bool AttrOrTypeParameter::isAnonymous() const { return !def->getArgName(index); } StringRef AttrOrTypeParameter::getName() const { return def->getArgName(index)->getValue(); } Optional AttrOrTypeParameter::getAllocator() const { return getDefValue("allocator"); } StringRef AttrOrTypeParameter::getComparator() const { return getDefValue("comparator") .getValueOr("$_lhs == $_rhs"); } StringRef AttrOrTypeParameter::getCppType() const { llvm::Init *parameterType = getDef(); if (auto *stringType = dyn_cast(parameterType)) return stringType->getValue(); if (auto *param = dyn_cast(parameterType)) return param->getDef()->getValueAsString("cppType"); llvm::PrintFatalError( "Parameters DAG arguments must be either strings or defs " "which inherit from AttrOrTypeParameter\n"); } StringRef AttrOrTypeParameter::getCppAccessorType() const { return getDefValue("cppAccessorType") .getValueOr(getCppType()); } StringRef AttrOrTypeParameter::getCppStorageType() const { return getDefValue("cppStorageType") .getValueOr(getCppType()); } Optional AttrOrTypeParameter::getParser() const { return getDefValue("parser"); } Optional AttrOrTypeParameter::getPrinter() const { return getDefValue("printer"); } Optional AttrOrTypeParameter::getSummary() const { return getDefValue("summary"); } StringRef AttrOrTypeParameter::getSyntax() const { if (auto *stringType = dyn_cast(getDef())) return stringType->getValue(); return getDefValue("syntax").getValueOr(getCppType()); } bool AttrOrTypeParameter::isOptional() const { // Parameters with default values are automatically optional. return getDefValue("isOptional").getValueOr(false) || getDefaultValue().hasValue(); } Optional AttrOrTypeParameter::getDefaultValue() const { return getDefValue("defaultValue"); } llvm::Init *AttrOrTypeParameter::getDef() const { return def->getArg(index); } //===----------------------------------------------------------------------===// // AttributeSelfTypeParameter //===----------------------------------------------------------------------===// bool AttributeSelfTypeParameter::classof(const AttrOrTypeParameter *param) { llvm::Init *paramDef = param->getDef(); if (auto *paramDefInit = dyn_cast(paramDef)) return paramDefInit->getDef()->isSubClassOf("AttributeSelfTypeParameter"); return false; }