1 //===- Dialect.cpp - Dialect wrapper class --------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // Dialect wrapper to simplify using TableGen Record defining a MLIR dialect.
11 //===----------------------------------------------------------------------===//
13 #include "mlir/TableGen/Dialect.h"
14 #include "llvm/TableGen/Error.h"
15 #include "llvm/TableGen/Record.h"
18 using namespace mlir::tblgen
;
19 Dialect::Dialect(const llvm::Record
*def
) : def(def
) {
22 for (StringRef dialect
: def
->getValueAsListOfStrings("dependentDialects"))
23 dependentDialects
.push_back(dialect
);
26 StringRef
Dialect::getName() const { return def
->getValueAsString("name"); }
28 StringRef
Dialect::getCppNamespace() const {
29 return def
->getValueAsString("cppNamespace");
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
, '_');
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
);
48 StringRef
Dialect::getSummary() const {
49 return getAsStringOrEmpty(*def
, "summary");
52 StringRef
Dialect::getDescription() const {
53 return getAsStringOrEmpty(*def
, "description");
56 ArrayRef
<StringRef
> Dialect::getDependentDialects() const {
57 return dependentDialects
;
60 std::optional
<StringRef
> Dialect::getExtraClassDeclaration() const {
61 auto value
= def
->getValueAsString("extraClassDeclaration");
62 return value
.empty() ? std::optional
<StringRef
>() : value
;
65 bool Dialect::hasCanonicalizer() const {
66 return def
->getValueAsBit("hasCanonicalizer");
69 bool Dialect::hasConstantMaterializer() const {
70 return def
->getValueAsBit("hasConstantMaterializer");
73 bool Dialect::hasNonDefaultDestructor() const {
74 return def
->getValueAsBit("hasNonDefaultDestructor");
77 bool Dialect::hasOperationAttrVerify() const {
78 return def
->getValueAsBit("hasOperationAttrVerify");
81 bool Dialect::hasRegionArgAttrVerify() const {
82 return def
->getValueAsBit("hasRegionArgAttrVerify");
85 bool Dialect::hasRegionResultAttrVerify() const {
86 return def
->getValueAsBit("hasRegionResultAttrVerify");
89 bool Dialect::hasOperationInterfaceFallback() const {
90 return def
->getValueAsBit("hasOperationInterfaceFallback");
93 bool Dialect::useDefaultAttributePrinterParser() const {
94 return def
->getValueAsBit("useDefaultAttributePrinterParser");
97 bool Dialect::useDefaultTypePrinterParser() const {
98 return def
->getValueAsBit("useDefaultTypePrinterParser");
101 bool Dialect::isExtensible() const {
102 return def
->getValueAsBit("isExtensible");
105 bool Dialect::usePropertiesForAttributes() const {
106 return def
->getValueAsBit("usePropertiesForAttributes");
109 const llvm::DagInit
*Dialect::getDiscardableAttributes() const {
110 return def
->getValueAsDag("discardableAttrs");
113 bool Dialect::operator==(const Dialect
&other
) const {
114 return def
== other
.def
;
117 bool Dialect::operator<(const Dialect
&other
) const {
118 return getName() < other
.getName();