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; Dialect(const llvm::Record * def)19f9dc2b70SMehdi AminiDialect::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 getName() const2612d16de5SRahul JoshiStringRef Dialect::getName() const { return def->getValueAsString("name"); } 2720e0cedfSLei Zhang getCppNamespace() const2812d16de5SRahul JoshiStringRef Dialect::getCppNamespace() const { 2927e8efedSJacques Pienaar return def->getValueAsString("cppNamespace"); 3020e0cedfSLei Zhang } 3120e0cedfSLei Zhang getCppClassName() const3212d16de5SRahul Joshistd::string Dialect::getCppClassName() const { 33429d792fSRiver Riddle // Simply use the name and remove any '_' tokens. 34429d792fSRiver Riddle std::string cppName = def->getName().str(); 35b33c2118SKazu Hirata llvm::erase_value(cppName, '_'); 36429d792fSRiver Riddle return cppName; 37429d792fSRiver Riddle } 38429d792fSRiver Riddle getAsStringOrEmpty(const llvm::Record & record,StringRef fieldName)3977672c97SJacques Pienaarstatic 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 getSummary() const4812d16de5SRahul JoshiStringRef Dialect::getSummary() const { 4927e8efedSJacques Pienaar return getAsStringOrEmpty(*def, "summary"); 5077672c97SJacques Pienaar } 5177672c97SJacques Pienaar getDescription() const5212d16de5SRahul JoshiStringRef Dialect::getDescription() const { 5327e8efedSJacques Pienaar return getAsStringOrEmpty(*def, "description"); 5477672c97SJacques Pienaar } 5577672c97SJacques Pienaar getDependentDialects() const56f9dc2b70SMehdi AminiArrayRef<StringRef> Dialect::getDependentDialects() const { 57f9dc2b70SMehdi Amini return dependentDialects; 58f9dc2b70SMehdi Amini } 59f9dc2b70SMehdi Amini getExtraClassDeclaration() const6012d16de5SRahul Joshillvm::Optional<StringRef> Dialect::getExtraClassDeclaration() const { 61429d792fSRiver Riddle auto value = def->getValueAsString("extraClassDeclaration"); 62429d792fSRiver Riddle return value.empty() ? llvm::Optional<StringRef>() : value; 63429d792fSRiver Riddle } 64429d792fSRiver Riddle hasCanonicalizer() const65108ca7a7SMatthias Springerbool Dialect::hasCanonicalizer() const { 66108ca7a7SMatthias Springer return def->getValueAsBit("hasCanonicalizer"); 67108ca7a7SMatthias Springer } 68108ca7a7SMatthias Springer hasConstantMaterializer() const6912d16de5SRahul Joshibool Dialect::hasConstantMaterializer() const { 70429d792fSRiver Riddle return def->getValueAsBit("hasConstantMaterializer"); 71429d792fSRiver Riddle } 72429d792fSRiver Riddle hasNonDefaultDestructor() const73485cc55eSStella Laurenzobool Dialect::hasNonDefaultDestructor() const { 74485cc55eSStella Laurenzo return def->getValueAsBit("hasNonDefaultDestructor"); 75485cc55eSStella Laurenzo } 76485cc55eSStella Laurenzo hasOperationAttrVerify() const7712d16de5SRahul Joshibool Dialect::hasOperationAttrVerify() const { 78032743e1SRiver Riddle return def->getValueAsBit("hasOperationAttrVerify"); 79032743e1SRiver Riddle } 80032743e1SRiver Riddle hasRegionArgAttrVerify() const8112d16de5SRahul Joshibool Dialect::hasRegionArgAttrVerify() const { 82032743e1SRiver Riddle return def->getValueAsBit("hasRegionArgAttrVerify"); 83032743e1SRiver Riddle } 84032743e1SRiver Riddle hasRegionResultAttrVerify() const8512d16de5SRahul Joshibool Dialect::hasRegionResultAttrVerify() const { 86032743e1SRiver Riddle return def->getValueAsBit("hasRegionResultAttrVerify"); 87032743e1SRiver Riddle } 88032743e1SRiver Riddle hasOperationInterfaceFallback() const89d905c103SMehdi Aminibool Dialect::hasOperationInterfaceFallback() const { 90d905c103SMehdi Amini return def->getValueAsBit("hasOperationInterfaceFallback"); 91d905c103SMehdi Amini } 92d905c103SMehdi Amini useDefaultAttributePrinterParser() const93fd6b4041SMehdi Aminibool Dialect::useDefaultAttributePrinterParser() const { 94fd6b4041SMehdi Amini return def->getValueAsBit("useDefaultAttributePrinterParser"); 95fd6b4041SMehdi Amini } 96fd6b4041SMehdi Amini useDefaultTypePrinterParser() const97c27d85a9SMehdi Aminibool Dialect::useDefaultTypePrinterParser() const { 98c27d85a9SMehdi Amini return def->getValueAsBit("useDefaultTypePrinterParser"); 99c27d85a9SMehdi Amini } 100c27d85a9SMehdi Amini getEmitAccessorPrefix() const10165c9907cSJacques PienaarDialect::EmitPrefix Dialect::getEmitAccessorPrefix() const { 10265c9907cSJacques Pienaar int prefix = def->getValueAsInt("emitAccessorPrefix"); 10365c9907cSJacques Pienaar if (prefix < 0 || prefix > static_cast<int>(EmitPrefix::Both)) 10465c9907cSJacques Pienaar PrintFatalError(def->getLoc(), "Invalid accessor prefix value"); 105*9e0b5533SMathieu Fehr 10665c9907cSJacques Pienaar return static_cast<EmitPrefix>(prefix); 10765c9907cSJacques Pienaar } 10865c9907cSJacques Pienaar isExtensible() const109*9e0b5533SMathieu Fehrbool Dialect::isExtensible() const { 110*9e0b5533SMathieu Fehr return def->getValueAsBit("isExtensible"); 111*9e0b5533SMathieu Fehr } 112*9e0b5533SMathieu Fehr operator ==(const Dialect & other) const11377672c97SJacques Pienaarbool Dialect::operator==(const Dialect &other) const { 11427e8efedSJacques Pienaar return def == other.def; 11577672c97SJacques Pienaar } 11677672c97SJacques Pienaar operator <(const Dialect & other) const11777672c97SJacques Pienaarbool Dialect::operator<(const Dialect &other) const { 11877672c97SJacques Pienaar return getName() < other.getName(); 11977672c97SJacques Pienaar } 120