120e0cedfSLei Zhang //===- Dialect.cpp - Dialect wrapper class --------------------------------===// 220e0cedfSLei Zhang // 330857107SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 456222a06SMehdi Amini // See https://llvm.org/LICENSE.txt for license information. 556222a06SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 620e0cedfSLei Zhang // 756222a06SMehdi Amini //===----------------------------------------------------------------------===// 820e0cedfSLei Zhang // 920e0cedfSLei Zhang // Dialect wrapper to simplify using TableGen Record defining a MLIR dialect. 1020e0cedfSLei Zhang // 1120e0cedfSLei Zhang //===----------------------------------------------------------------------===// 1220e0cedfSLei Zhang 1320e0cedfSLei Zhang #include "mlir/TableGen/Dialect.h" 1465c9907cSJacques Pienaar #include "llvm/TableGen/Error.h" 1520e0cedfSLei Zhang #include "llvm/TableGen/Record.h" 1620e0cedfSLei Zhang 1712d16de5SRahul Joshi using namespace mlir; 1812d16de5SRahul Joshi using namespace mlir::tblgen; 19f9dc2b70SMehdi Amini Dialect::Dialect(const llvm::Record *def) : def(def) { 20d867be5dSFederico Lebrón if (def == nullptr) 21d867be5dSFederico Lebrón return; 22f9dc2b70SMehdi Amini for (StringRef dialect : def->getValueAsListOfStrings("dependentDialects")) 23f9dc2b70SMehdi Amini dependentDialects.push_back(dialect); 24f9dc2b70SMehdi Amini } 2520e0cedfSLei Zhang 2612d16de5SRahul Joshi StringRef Dialect::getName() const { return def->getValueAsString("name"); } 2720e0cedfSLei Zhang 2812d16de5SRahul Joshi StringRef Dialect::getCppNamespace() const { 2927e8efedSJacques Pienaar return def->getValueAsString("cppNamespace"); 3020e0cedfSLei Zhang } 3120e0cedfSLei Zhang 3212d16de5SRahul Joshi std::string Dialect::getCppClassName() const { 33429d792fSRiver Riddle // Simply use the name and remove any '_' tokens. 34429d792fSRiver Riddle std::string cppName = def->getName().str(); 35f9306f6dSKazu Hirata llvm::erase(cppName, '_'); 36429d792fSRiver Riddle return cppName; 37429d792fSRiver Riddle } 38429d792fSRiver Riddle 3977672c97SJacques Pienaar static StringRef getAsStringOrEmpty(const llvm::Record &record, 4077672c97SJacques Pienaar StringRef fieldName) { 4102b6fb21SMehdi Amini if (auto *valueInit = record.getValueInit(fieldName)) { 42415fab6fSPaul C. Anagnostopoulos if (llvm::isa<llvm::StringInit>(valueInit)) 4377672c97SJacques Pienaar return record.getValueAsString(fieldName); 4477672c97SJacques Pienaar } 4577672c97SJacques Pienaar return ""; 4677672c97SJacques Pienaar } 4777672c97SJacques Pienaar 4812d16de5SRahul Joshi StringRef Dialect::getSummary() const { 4927e8efedSJacques Pienaar return getAsStringOrEmpty(*def, "summary"); 5077672c97SJacques Pienaar } 5177672c97SJacques Pienaar 5212d16de5SRahul Joshi StringRef Dialect::getDescription() const { 5327e8efedSJacques Pienaar return getAsStringOrEmpty(*def, "description"); 5477672c97SJacques Pienaar } 5577672c97SJacques Pienaar 56f9dc2b70SMehdi Amini ArrayRef<StringRef> Dialect::getDependentDialects() const { 57f9dc2b70SMehdi Amini return dependentDialects; 58f9dc2b70SMehdi Amini } 59f9dc2b70SMehdi Amini 603cfe412eSFangrui Song std::optional<StringRef> Dialect::getExtraClassDeclaration() const { 61429d792fSRiver Riddle auto value = def->getValueAsString("extraClassDeclaration"); 623cfe412eSFangrui Song return value.empty() ? std::optional<StringRef>() : value; 63429d792fSRiver Riddle } 64429d792fSRiver Riddle 65108ca7a7SMatthias Springer bool Dialect::hasCanonicalizer() const { 66108ca7a7SMatthias Springer return def->getValueAsBit("hasCanonicalizer"); 67108ca7a7SMatthias Springer } 68108ca7a7SMatthias Springer 6912d16de5SRahul Joshi bool Dialect::hasConstantMaterializer() const { 70429d792fSRiver Riddle return def->getValueAsBit("hasConstantMaterializer"); 71429d792fSRiver Riddle } 72429d792fSRiver Riddle 73485cc55eSStella Laurenzo bool Dialect::hasNonDefaultDestructor() const { 74485cc55eSStella Laurenzo return def->getValueAsBit("hasNonDefaultDestructor"); 75485cc55eSStella Laurenzo } 76485cc55eSStella Laurenzo 7712d16de5SRahul Joshi bool Dialect::hasOperationAttrVerify() const { 78032743e1SRiver Riddle return def->getValueAsBit("hasOperationAttrVerify"); 79032743e1SRiver Riddle } 80032743e1SRiver Riddle 8112d16de5SRahul Joshi bool Dialect::hasRegionArgAttrVerify() const { 82032743e1SRiver Riddle return def->getValueAsBit("hasRegionArgAttrVerify"); 83032743e1SRiver Riddle } 84032743e1SRiver Riddle 8512d16de5SRahul Joshi bool Dialect::hasRegionResultAttrVerify() const { 86032743e1SRiver Riddle return def->getValueAsBit("hasRegionResultAttrVerify"); 87032743e1SRiver Riddle } 88032743e1SRiver Riddle 89d905c103SMehdi Amini bool Dialect::hasOperationInterfaceFallback() const { 90d905c103SMehdi Amini return def->getValueAsBit("hasOperationInterfaceFallback"); 91d905c103SMehdi Amini } 92d905c103SMehdi Amini 93fd6b4041SMehdi Amini bool Dialect::useDefaultAttributePrinterParser() const { 94fd6b4041SMehdi Amini return def->getValueAsBit("useDefaultAttributePrinterParser"); 95fd6b4041SMehdi Amini } 96fd6b4041SMehdi Amini 97c27d85a9SMehdi Amini bool Dialect::useDefaultTypePrinterParser() const { 98c27d85a9SMehdi Amini return def->getValueAsBit("useDefaultTypePrinterParser"); 99c27d85a9SMehdi Amini } 100c27d85a9SMehdi Amini 1019e0b5533SMathieu Fehr bool Dialect::isExtensible() const { 1029e0b5533SMathieu Fehr return def->getValueAsBit("isExtensible"); 1039e0b5533SMathieu Fehr } 1049e0b5533SMathieu Fehr 1055e118f93SMehdi Amini bool Dialect::usePropertiesForAttributes() const { 1065e118f93SMehdi Amini return def->getValueAsBit("usePropertiesForAttributes"); 1075e118f93SMehdi Amini } 1085e118f93SMehdi Amini 109*e768b076SRahul Joshi const llvm::DagInit *Dialect::getDiscardableAttributes() const { 11045c226d4SMehdi Amini return def->getValueAsDag("discardableAttrs"); 11145c226d4SMehdi Amini } 11245c226d4SMehdi Amini 11377672c97SJacques Pienaar bool Dialect::operator==(const Dialect &other) const { 11427e8efedSJacques Pienaar return def == other.def; 11577672c97SJacques Pienaar } 11677672c97SJacques Pienaar 11777672c97SJacques Pienaar bool Dialect::operator<(const Dialect &other) const { 11877672c97SJacques Pienaar return getName() < other.getName(); 11977672c97SJacques Pienaar } 120