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