1 //===- Dialect.cpp - Dialect wrapper class --------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Dialect wrapper to simplify using TableGen Record defining a MLIR dialect. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "mlir/TableGen/Dialect.h" 14 #include "llvm/TableGen/Error.h" 15 #include "llvm/TableGen/Record.h" 16 17 using namespace mlir; 18 using namespace mlir::tblgen; Dialect(const llvm::Record * def)19Dialect::Dialect(const llvm::Record *def) : def(def) { 20 if (def == nullptr) 21 return; 22 for (StringRef dialect : def->getValueAsListOfStrings("dependentDialects")) 23 dependentDialects.push_back(dialect); 24 } 25 getName() const26StringRef Dialect::getName() const { return def->getValueAsString("name"); } 27 getCppNamespace() const28StringRef Dialect::getCppNamespace() const { 29 return def->getValueAsString("cppNamespace"); 30 } 31 getCppClassName() const32std::string Dialect::getCppClassName() const { 33 // Simply use the name and remove any '_' tokens. 34 std::string cppName = def->getName().str(); 35 llvm::erase_value(cppName, '_'); 36 return cppName; 37 } 38 getAsStringOrEmpty(const llvm::Record & record,StringRef fieldName)39static StringRef getAsStringOrEmpty(const llvm::Record &record, 40 StringRef fieldName) { 41 if (auto *valueInit = record.getValueInit(fieldName)) { 42 if (llvm::isa<llvm::StringInit>(valueInit)) 43 return record.getValueAsString(fieldName); 44 } 45 return ""; 46 } 47 getSummary() const48StringRef Dialect::getSummary() const { 49 return getAsStringOrEmpty(*def, "summary"); 50 } 51 getDescription() const52StringRef Dialect::getDescription() const { 53 return getAsStringOrEmpty(*def, "description"); 54 } 55 getDependentDialects() const56ArrayRef<StringRef> Dialect::getDependentDialects() const { 57 return dependentDialects; 58 } 59 getExtraClassDeclaration() const60llvm::Optional<StringRef> Dialect::getExtraClassDeclaration() const { 61 auto value = def->getValueAsString("extraClassDeclaration"); 62 return value.empty() ? llvm::Optional<StringRef>() : value; 63 } 64 hasCanonicalizer() const65bool Dialect::hasCanonicalizer() const { 66 return def->getValueAsBit("hasCanonicalizer"); 67 } 68 hasConstantMaterializer() const69bool Dialect::hasConstantMaterializer() const { 70 return def->getValueAsBit("hasConstantMaterializer"); 71 } 72 hasNonDefaultDestructor() const73bool Dialect::hasNonDefaultDestructor() const { 74 return def->getValueAsBit("hasNonDefaultDestructor"); 75 } 76 hasOperationAttrVerify() const77bool Dialect::hasOperationAttrVerify() const { 78 return def->getValueAsBit("hasOperationAttrVerify"); 79 } 80 hasRegionArgAttrVerify() const81bool Dialect::hasRegionArgAttrVerify() const { 82 return def->getValueAsBit("hasRegionArgAttrVerify"); 83 } 84 hasRegionResultAttrVerify() const85bool Dialect::hasRegionResultAttrVerify() const { 86 return def->getValueAsBit("hasRegionResultAttrVerify"); 87 } 88 hasOperationInterfaceFallback() const89bool Dialect::hasOperationInterfaceFallback() const { 90 return def->getValueAsBit("hasOperationInterfaceFallback"); 91 } 92 useDefaultAttributePrinterParser() const93bool Dialect::useDefaultAttributePrinterParser() const { 94 return def->getValueAsBit("useDefaultAttributePrinterParser"); 95 } 96 useDefaultTypePrinterParser() const97bool Dialect::useDefaultTypePrinterParser() const { 98 return def->getValueAsBit("useDefaultTypePrinterParser"); 99 } 100 getEmitAccessorPrefix() const101Dialect::EmitPrefix Dialect::getEmitAccessorPrefix() const { 102 int prefix = def->getValueAsInt("emitAccessorPrefix"); 103 if (prefix < 0 || prefix > static_cast<int>(EmitPrefix::Both)) 104 PrintFatalError(def->getLoc(), "Invalid accessor prefix value"); 105 106 return static_cast<EmitPrefix>(prefix); 107 } 108 isExtensible() const109bool Dialect::isExtensible() const { 110 return def->getValueAsBit("isExtensible"); 111 } 112 operator ==(const Dialect & other) const113bool Dialect::operator==(const Dialect &other) const { 114 return def == other.def; 115 } 116 operator <(const Dialect & other) const117bool Dialect::operator<(const Dialect &other) const { 118 return getName() < other.getName(); 119 } 120