xref: /llvm-project/mlir/lib/TableGen/Property.cpp (revision d8399d5dd6a5a7025621eddd97fc0fa1f494bad8)
15e118f93SMehdi Amini //===- Property.cpp - Property wrapper class ----------------------------===//
25e118f93SMehdi Amini //
35e118f93SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45e118f93SMehdi Amini // See https://llvm.org/LICENSE.txt for license information.
55e118f93SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65e118f93SMehdi Amini //
75e118f93SMehdi Amini //===----------------------------------------------------------------------===//
85e118f93SMehdi Amini //
95e118f93SMehdi Amini // Property wrapper to simplify using TableGen Record defining a MLIR
105e118f93SMehdi Amini // Property.
115e118f93SMehdi Amini //
125e118f93SMehdi Amini //===----------------------------------------------------------------------===//
135e118f93SMehdi Amini 
145e118f93SMehdi Amini #include "mlir/TableGen/Property.h"
155e118f93SMehdi Amini #include "mlir/TableGen/Format.h"
165e118f93SMehdi Amini #include "mlir/TableGen/Operator.h"
17*d8399d5dSKrzysztof Drewniak #include "mlir/TableGen/Predicate.h"
185e118f93SMehdi Amini #include "llvm/TableGen/Record.h"
195e118f93SMehdi Amini 
205e118f93SMehdi Amini using namespace mlir;
215e118f93SMehdi Amini using namespace mlir::tblgen;
225e118f93SMehdi Amini 
235e118f93SMehdi Amini using llvm::DefInit;
245e118f93SMehdi Amini using llvm::Init;
255e118f93SMehdi Amini using llvm::Record;
265e118f93SMehdi Amini using llvm::StringInit;
275e118f93SMehdi Amini 
285e118f93SMehdi Amini // Returns the initializer's value as string if the given TableGen initializer
295e118f93SMehdi Amini // is a code or string initializer. Returns the empty StringRef otherwise.
305e118f93SMehdi Amini static StringRef getValueAsString(const Init *init) {
315e118f93SMehdi Amini   if (const auto *str = dyn_cast<StringInit>(init))
325e118f93SMehdi Amini     return str->getValue().trim();
335e118f93SMehdi Amini   return {};
345e118f93SMehdi Amini }
355e118f93SMehdi Amini 
369ea6b30aSMehdi Amini Property::Property(const Record *def)
378955e285SKrzysztof Drewniak     : Property(
388955e285SKrzysztof Drewniak           getValueAsString(def->getValueInit("summary")),
398955e285SKrzysztof Drewniak           getValueAsString(def->getValueInit("description")),
408955e285SKrzysztof Drewniak           getValueAsString(def->getValueInit("storageType")),
419ea6b30aSMehdi Amini           getValueAsString(def->getValueInit("interfaceType")),
429ea6b30aSMehdi Amini           getValueAsString(def->getValueInit("convertFromStorage")),
439ea6b30aSMehdi Amini           getValueAsString(def->getValueInit("assignToStorage")),
449ea6b30aSMehdi Amini           getValueAsString(def->getValueInit("convertToAttribute")),
459ea6b30aSMehdi Amini           getValueAsString(def->getValueInit("convertFromAttribute")),
468955e285SKrzysztof Drewniak           getValueAsString(def->getValueInit("parser")),
478955e285SKrzysztof Drewniak           getValueAsString(def->getValueInit("optionalParser")),
488955e285SKrzysztof Drewniak           getValueAsString(def->getValueInit("printer")),
499ea6b30aSMehdi Amini           getValueAsString(def->getValueInit("readFromMlirBytecode")),
509ea6b30aSMehdi Amini           getValueAsString(def->getValueInit("writeToMlirBytecode")),
519ea6b30aSMehdi Amini           getValueAsString(def->getValueInit("hashProperty")),
528955e285SKrzysztof Drewniak           getValueAsString(def->getValueInit("defaultValue")),
538955e285SKrzysztof Drewniak           getValueAsString(def->getValueInit("storageTypeValueOverride"))) {
549ea6b30aSMehdi Amini   this->def = def;
559ea6b30aSMehdi Amini   assert((def->isSubClassOf("Property") || def->isSubClassOf("Attr")) &&
565e118f93SMehdi Amini          "must be subclass of TableGen 'Property' class");
575e118f93SMehdi Amini }
585e118f93SMehdi Amini 
595e118f93SMehdi Amini Property::Property(const DefInit *init) : Property(init->getDef()) {}
605e118f93SMehdi Amini 
618955e285SKrzysztof Drewniak Property::Property(StringRef summary, StringRef description,
628955e285SKrzysztof Drewniak                    StringRef storageType, StringRef interfaceType,
639ea6b30aSMehdi Amini                    StringRef convertFromStorageCall,
649ea6b30aSMehdi Amini                    StringRef assignToStorageCall,
659ea6b30aSMehdi Amini                    StringRef convertToAttributeCall,
668955e285SKrzysztof Drewniak                    StringRef convertFromAttributeCall, StringRef parserCall,
678955e285SKrzysztof Drewniak                    StringRef optionalParserCall, StringRef printerCall,
689ea6b30aSMehdi Amini                    StringRef readFromMlirBytecodeCall,
699ea6b30aSMehdi Amini                    StringRef writeToMlirBytecodeCall,
708955e285SKrzysztof Drewniak                    StringRef hashPropertyCall, StringRef defaultValue,
718955e285SKrzysztof Drewniak                    StringRef storageTypeValueOverride)
72*d8399d5dSKrzysztof Drewniak     : def(nullptr), summary(summary), description(description),
73*d8399d5dSKrzysztof Drewniak       storageType(storageType), interfaceType(interfaceType),
749ea6b30aSMehdi Amini       convertFromStorageCall(convertFromStorageCall),
759ea6b30aSMehdi Amini       assignToStorageCall(assignToStorageCall),
769ea6b30aSMehdi Amini       convertToAttributeCall(convertToAttributeCall),
779ea6b30aSMehdi Amini       convertFromAttributeCall(convertFromAttributeCall),
788955e285SKrzysztof Drewniak       parserCall(parserCall), optionalParserCall(optionalParserCall),
798955e285SKrzysztof Drewniak       printerCall(printerCall),
809ea6b30aSMehdi Amini       readFromMlirBytecodeCall(readFromMlirBytecodeCall),
819ea6b30aSMehdi Amini       writeToMlirBytecodeCall(writeToMlirBytecodeCall),
828955e285SKrzysztof Drewniak       hashPropertyCall(hashPropertyCall), defaultValue(defaultValue),
838955e285SKrzysztof Drewniak       storageTypeValueOverride(storageTypeValueOverride) {
849ea6b30aSMehdi Amini   if (storageType.empty())
859ea6b30aSMehdi Amini     storageType = "Property";
865e118f93SMehdi Amini }
878955e285SKrzysztof Drewniak 
888955e285SKrzysztof Drewniak StringRef Property::getPropertyDefName() const {
898955e285SKrzysztof Drewniak   if (def->isAnonymous()) {
908955e285SKrzysztof Drewniak     return getBaseProperty().def->getName();
918955e285SKrzysztof Drewniak   }
928955e285SKrzysztof Drewniak   return def->getName();
938955e285SKrzysztof Drewniak }
948955e285SKrzysztof Drewniak 
95*d8399d5dSKrzysztof Drewniak Pred Property::getPredicate() const {
96*d8399d5dSKrzysztof Drewniak   if (!def)
97*d8399d5dSKrzysztof Drewniak     return Pred();
98*d8399d5dSKrzysztof Drewniak   const llvm::RecordVal *maybePred = def->getValue("predicate");
99*d8399d5dSKrzysztof Drewniak   if (!maybePred || !maybePred->getValue())
100*d8399d5dSKrzysztof Drewniak     return Pred();
101*d8399d5dSKrzysztof Drewniak   return Pred(maybePred->getValue());
102*d8399d5dSKrzysztof Drewniak }
103*d8399d5dSKrzysztof Drewniak 
1048955e285SKrzysztof Drewniak Property Property::getBaseProperty() const {
1058955e285SKrzysztof Drewniak   if (const auto *defInit =
1068955e285SKrzysztof Drewniak           llvm::dyn_cast<llvm::DefInit>(def->getValueInit("baseProperty"))) {
1078955e285SKrzysztof Drewniak     return Property(defInit).getBaseProperty();
1088955e285SKrzysztof Drewniak   }
1098955e285SKrzysztof Drewniak   return *this;
1108955e285SKrzysztof Drewniak }
111