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; 19 Dialect::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 26 StringRef Dialect::getName() const { return def->getValueAsString("name"); } 27 28 StringRef Dialect::getCppNamespace() const { 29 return def->getValueAsString("cppNamespace"); 30 } 31 32 std::string Dialect::getCppClassName() const { 33 // Simply use the name and remove any '_' tokens. 34 std::string cppName = def->getName().str(); 35 llvm::erase(cppName, '_'); 36 return cppName; 37 } 38 39 static 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 48 StringRef Dialect::getSummary() const { 49 return getAsStringOrEmpty(*def, "summary"); 50 } 51 52 StringRef Dialect::getDescription() const { 53 return getAsStringOrEmpty(*def, "description"); 54 } 55 56 ArrayRef<StringRef> Dialect::getDependentDialects() const { 57 return dependentDialects; 58 } 59 60 std::optional<StringRef> Dialect::getExtraClassDeclaration() const { 61 auto value = def->getValueAsString("extraClassDeclaration"); 62 return value.empty() ? std::optional<StringRef>() : value; 63 } 64 65 bool Dialect::hasCanonicalizer() const { 66 return def->getValueAsBit("hasCanonicalizer"); 67 } 68 69 bool Dialect::hasConstantMaterializer() const { 70 return def->getValueAsBit("hasConstantMaterializer"); 71 } 72 73 bool Dialect::hasNonDefaultDestructor() const { 74 return def->getValueAsBit("hasNonDefaultDestructor"); 75 } 76 77 bool Dialect::hasOperationAttrVerify() const { 78 return def->getValueAsBit("hasOperationAttrVerify"); 79 } 80 81 bool Dialect::hasRegionArgAttrVerify() const { 82 return def->getValueAsBit("hasRegionArgAttrVerify"); 83 } 84 85 bool Dialect::hasRegionResultAttrVerify() const { 86 return def->getValueAsBit("hasRegionResultAttrVerify"); 87 } 88 89 bool Dialect::hasOperationInterfaceFallback() const { 90 return def->getValueAsBit("hasOperationInterfaceFallback"); 91 } 92 93 bool Dialect::useDefaultAttributePrinterParser() const { 94 return def->getValueAsBit("useDefaultAttributePrinterParser"); 95 } 96 97 bool Dialect::useDefaultTypePrinterParser() const { 98 return def->getValueAsBit("useDefaultTypePrinterParser"); 99 } 100 101 bool Dialect::isExtensible() const { 102 return def->getValueAsBit("isExtensible"); 103 } 104 105 bool Dialect::usePropertiesForAttributes() const { 106 return def->getValueAsBit("usePropertiesForAttributes"); 107 } 108 109 const llvm::DagInit *Dialect::getDiscardableAttributes() const { 110 return def->getValueAsDag("discardableAttrs"); 111 } 112 113 bool Dialect::operator==(const Dialect &other) const { 114 return def == other.def; 115 } 116 117 bool Dialect::operator<(const Dialect &other) const { 118 return getName() < other.getName(); 119 } 120