xref: /llvm-project/mlir/lib/TableGen/Dialect.cpp (revision e768b076e3b7ed38485a29244a0b989076e4b131)
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;
19f9dc2b70SMehdi Amini Dialect::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 
2612d16de5SRahul Joshi StringRef Dialect::getName() const { return def->getValueAsString("name"); }
2720e0cedfSLei Zhang 
2812d16de5SRahul Joshi StringRef Dialect::getCppNamespace() const {
2927e8efedSJacques Pienaar   return def->getValueAsString("cppNamespace");
3020e0cedfSLei Zhang }
3120e0cedfSLei Zhang 
3212d16de5SRahul Joshi std::string Dialect::getCppClassName() const {
33429d792fSRiver Riddle   // Simply use the name and remove any '_' tokens.
34429d792fSRiver Riddle   std::string cppName = def->getName().str();
35f9306f6dSKazu Hirata   llvm::erase(cppName, '_');
36429d792fSRiver Riddle   return cppName;
37429d792fSRiver Riddle }
38429d792fSRiver Riddle 
3977672c97SJacques Pienaar static 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 
4812d16de5SRahul Joshi StringRef Dialect::getSummary() const {
4927e8efedSJacques Pienaar   return getAsStringOrEmpty(*def, "summary");
5077672c97SJacques Pienaar }
5177672c97SJacques Pienaar 
5212d16de5SRahul Joshi StringRef Dialect::getDescription() const {
5327e8efedSJacques Pienaar   return getAsStringOrEmpty(*def, "description");
5477672c97SJacques Pienaar }
5577672c97SJacques Pienaar 
56f9dc2b70SMehdi Amini ArrayRef<StringRef> Dialect::getDependentDialects() const {
57f9dc2b70SMehdi Amini   return dependentDialects;
58f9dc2b70SMehdi Amini }
59f9dc2b70SMehdi Amini 
603cfe412eSFangrui Song std::optional<StringRef> Dialect::getExtraClassDeclaration() const {
61429d792fSRiver Riddle   auto value = def->getValueAsString("extraClassDeclaration");
623cfe412eSFangrui Song   return value.empty() ? std::optional<StringRef>() : value;
63429d792fSRiver Riddle }
64429d792fSRiver Riddle 
65108ca7a7SMatthias Springer bool Dialect::hasCanonicalizer() const {
66108ca7a7SMatthias Springer   return def->getValueAsBit("hasCanonicalizer");
67108ca7a7SMatthias Springer }
68108ca7a7SMatthias Springer 
6912d16de5SRahul Joshi bool Dialect::hasConstantMaterializer() const {
70429d792fSRiver Riddle   return def->getValueAsBit("hasConstantMaterializer");
71429d792fSRiver Riddle }
72429d792fSRiver Riddle 
73485cc55eSStella Laurenzo bool Dialect::hasNonDefaultDestructor() const {
74485cc55eSStella Laurenzo   return def->getValueAsBit("hasNonDefaultDestructor");
75485cc55eSStella Laurenzo }
76485cc55eSStella Laurenzo 
7712d16de5SRahul Joshi bool Dialect::hasOperationAttrVerify() const {
78032743e1SRiver Riddle   return def->getValueAsBit("hasOperationAttrVerify");
79032743e1SRiver Riddle }
80032743e1SRiver Riddle 
8112d16de5SRahul Joshi bool Dialect::hasRegionArgAttrVerify() const {
82032743e1SRiver Riddle   return def->getValueAsBit("hasRegionArgAttrVerify");
83032743e1SRiver Riddle }
84032743e1SRiver Riddle 
8512d16de5SRahul Joshi bool Dialect::hasRegionResultAttrVerify() const {
86032743e1SRiver Riddle   return def->getValueAsBit("hasRegionResultAttrVerify");
87032743e1SRiver Riddle }
88032743e1SRiver Riddle 
89d905c103SMehdi Amini bool Dialect::hasOperationInterfaceFallback() const {
90d905c103SMehdi Amini   return def->getValueAsBit("hasOperationInterfaceFallback");
91d905c103SMehdi Amini }
92d905c103SMehdi Amini 
93fd6b4041SMehdi Amini bool Dialect::useDefaultAttributePrinterParser() const {
94fd6b4041SMehdi Amini   return def->getValueAsBit("useDefaultAttributePrinterParser");
95fd6b4041SMehdi Amini }
96fd6b4041SMehdi Amini 
97c27d85a9SMehdi Amini bool Dialect::useDefaultTypePrinterParser() const {
98c27d85a9SMehdi Amini   return def->getValueAsBit("useDefaultTypePrinterParser");
99c27d85a9SMehdi Amini }
100c27d85a9SMehdi Amini 
1019e0b5533SMathieu Fehr bool Dialect::isExtensible() const {
1029e0b5533SMathieu Fehr   return def->getValueAsBit("isExtensible");
1039e0b5533SMathieu Fehr }
1049e0b5533SMathieu Fehr 
1055e118f93SMehdi Amini bool Dialect::usePropertiesForAttributes() const {
1065e118f93SMehdi Amini   return def->getValueAsBit("usePropertiesForAttributes");
1075e118f93SMehdi Amini }
1085e118f93SMehdi Amini 
109*e768b076SRahul Joshi const llvm::DagInit *Dialect::getDiscardableAttributes() const {
11045c226d4SMehdi Amini   return def->getValueAsDag("discardableAttrs");
11145c226d4SMehdi Amini }
11245c226d4SMehdi Amini 
11377672c97SJacques Pienaar bool Dialect::operator==(const Dialect &other) const {
11427e8efedSJacques Pienaar   return def == other.def;
11577672c97SJacques Pienaar }
11677672c97SJacques Pienaar 
11777672c97SJacques Pienaar bool Dialect::operator<(const Dialect &other) const {
11877672c97SJacques Pienaar   return getName() < other.getName();
11977672c97SJacques Pienaar }
120