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;
Dialect(const llvm::Record * def)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 
getName() const2612d16de5SRahul Joshi StringRef Dialect::getName() const { return def->getValueAsString("name"); }
2720e0cedfSLei Zhang 
getCppNamespace() const2812d16de5SRahul Joshi StringRef Dialect::getCppNamespace() const {
2927e8efedSJacques Pienaar   return def->getValueAsString("cppNamespace");
3020e0cedfSLei Zhang }
3120e0cedfSLei Zhang 
getCppClassName() const3212d16de5SRahul Joshi std::string Dialect::getCppClassName() const {
33429d792fSRiver Riddle   // Simply use the name and remove any '_' tokens.
34429d792fSRiver Riddle   std::string cppName = def->getName().str();
35b33c2118SKazu Hirata   llvm::erase_value(cppName, '_');
36429d792fSRiver Riddle   return cppName;
37429d792fSRiver Riddle }
38429d792fSRiver Riddle 
getAsStringOrEmpty(const llvm::Record & record,StringRef fieldName)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 
getSummary() const4812d16de5SRahul Joshi StringRef Dialect::getSummary() const {
4927e8efedSJacques Pienaar   return getAsStringOrEmpty(*def, "summary");
5077672c97SJacques Pienaar }
5177672c97SJacques Pienaar 
getDescription() const5212d16de5SRahul Joshi StringRef Dialect::getDescription() const {
5327e8efedSJacques Pienaar   return getAsStringOrEmpty(*def, "description");
5477672c97SJacques Pienaar }
5577672c97SJacques Pienaar 
getDependentDialects() const56f9dc2b70SMehdi Amini ArrayRef<StringRef> Dialect::getDependentDialects() const {
57f9dc2b70SMehdi Amini   return dependentDialects;
58f9dc2b70SMehdi Amini }
59f9dc2b70SMehdi Amini 
getExtraClassDeclaration() const6012d16de5SRahul Joshi llvm::Optional<StringRef> Dialect::getExtraClassDeclaration() const {
61429d792fSRiver Riddle   auto value = def->getValueAsString("extraClassDeclaration");
62429d792fSRiver Riddle   return value.empty() ? llvm::Optional<StringRef>() : value;
63429d792fSRiver Riddle }
64429d792fSRiver Riddle 
hasCanonicalizer() const65108ca7a7SMatthias Springer bool Dialect::hasCanonicalizer() const {
66108ca7a7SMatthias Springer   return def->getValueAsBit("hasCanonicalizer");
67108ca7a7SMatthias Springer }
68108ca7a7SMatthias Springer 
hasConstantMaterializer() const6912d16de5SRahul Joshi bool Dialect::hasConstantMaterializer() const {
70429d792fSRiver Riddle   return def->getValueAsBit("hasConstantMaterializer");
71429d792fSRiver Riddle }
72429d792fSRiver Riddle 
hasNonDefaultDestructor() const73485cc55eSStella Laurenzo bool Dialect::hasNonDefaultDestructor() const {
74485cc55eSStella Laurenzo   return def->getValueAsBit("hasNonDefaultDestructor");
75485cc55eSStella Laurenzo }
76485cc55eSStella Laurenzo 
hasOperationAttrVerify() const7712d16de5SRahul Joshi bool Dialect::hasOperationAttrVerify() const {
78032743e1SRiver Riddle   return def->getValueAsBit("hasOperationAttrVerify");
79032743e1SRiver Riddle }
80032743e1SRiver Riddle 
hasRegionArgAttrVerify() const8112d16de5SRahul Joshi bool Dialect::hasRegionArgAttrVerify() const {
82032743e1SRiver Riddle   return def->getValueAsBit("hasRegionArgAttrVerify");
83032743e1SRiver Riddle }
84032743e1SRiver Riddle 
hasRegionResultAttrVerify() const8512d16de5SRahul Joshi bool Dialect::hasRegionResultAttrVerify() const {
86032743e1SRiver Riddle   return def->getValueAsBit("hasRegionResultAttrVerify");
87032743e1SRiver Riddle }
88032743e1SRiver Riddle 
hasOperationInterfaceFallback() const89d905c103SMehdi Amini bool Dialect::hasOperationInterfaceFallback() const {
90d905c103SMehdi Amini   return def->getValueAsBit("hasOperationInterfaceFallback");
91d905c103SMehdi Amini }
92d905c103SMehdi Amini 
useDefaultAttributePrinterParser() const93fd6b4041SMehdi Amini bool Dialect::useDefaultAttributePrinterParser() const {
94fd6b4041SMehdi Amini   return def->getValueAsBit("useDefaultAttributePrinterParser");
95fd6b4041SMehdi Amini }
96fd6b4041SMehdi Amini 
useDefaultTypePrinterParser() const97c27d85a9SMehdi Amini bool Dialect::useDefaultTypePrinterParser() const {
98c27d85a9SMehdi Amini   return def->getValueAsBit("useDefaultTypePrinterParser");
99c27d85a9SMehdi Amini }
100c27d85a9SMehdi Amini 
getEmitAccessorPrefix() const10165c9907cSJacques Pienaar Dialect::EmitPrefix Dialect::getEmitAccessorPrefix() const {
10265c9907cSJacques Pienaar   int prefix = def->getValueAsInt("emitAccessorPrefix");
10365c9907cSJacques Pienaar   if (prefix < 0 || prefix > static_cast<int>(EmitPrefix::Both))
10465c9907cSJacques Pienaar     PrintFatalError(def->getLoc(), "Invalid accessor prefix value");
105*9e0b5533SMathieu Fehr 
10665c9907cSJacques Pienaar   return static_cast<EmitPrefix>(prefix);
10765c9907cSJacques Pienaar }
10865c9907cSJacques Pienaar 
isExtensible() const109*9e0b5533SMathieu Fehr bool Dialect::isExtensible() const {
110*9e0b5533SMathieu Fehr   return def->getValueAsBit("isExtensible");
111*9e0b5533SMathieu Fehr }
112*9e0b5533SMathieu Fehr 
operator ==(const Dialect & other) const11377672c97SJacques Pienaar bool Dialect::operator==(const Dialect &other) const {
11427e8efedSJacques Pienaar   return def == other.def;
11577672c97SJacques Pienaar }
11677672c97SJacques Pienaar 
operator <(const Dialect & other) const11777672c97SJacques Pienaar bool Dialect::operator<(const Dialect &other) const {
11877672c97SJacques Pienaar   return getName() < other.getName();
11977672c97SJacques Pienaar }
120