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

source code of mlir/lib/TableGen/Dialect.cpp