[mlir][AttrTypeGen] Add support for specifying a "accessor" type of a parameter

This allows for using a different type when accessing a parameter than the
one used for storage. This allows for returning parameters by reference,
enables using more optimized/convient reference results, and more.

Differential Revision: https://reviews.llvm.org/D108593
This commit is contained in:
River Riddle 2021-08-25 09:26:56 +00:00
parent 9658b061dd
commit c8d9e1ce43
5 changed files with 33 additions and 5 deletions

View File

@ -2836,20 +2836,24 @@ class TypeDef<Dialect dialect, string name, list<Trait> traits = [],
// 'Parameters' should be subclasses of this or simple strings (which is a
// shorthand for AttrOrTypeParameter<"C++Type">).
class AttrOrTypeParameter<string type, string desc> {
class AttrOrTypeParameter<string type, string desc, string accessorType = ""> {
// Custom memory allocation code for storage constructor.
code allocator = ?;
// Custom comparator used to compare two instances for equality.
code comparator = ?;
// The C++ type of this parameter.
string cppType = type;
// The C++ type of the accessor for this parameter.
string cppAccessorType = !if(!empty(accessorType), type, accessorType);
// One-line human-readable description of the argument.
string summary = desc;
// The format string for the asm syntax (documentation only).
string syntax = ?;
}
class AttrParameter<string type, string desc> : AttrOrTypeParameter<type, desc>;
class TypeParameter<string type, string desc> : AttrOrTypeParameter<type, desc>;
class AttrParameter<string type, string desc, string accessorType = "">
: AttrOrTypeParameter<type, desc, accessorType>;
class TypeParameter<string type, string desc, string accessorType = "">
: AttrOrTypeParameter<type, desc, accessorType>;
// For StringRefs, which require allocation.
class StringRefParameter<string desc = ""> :

View File

@ -196,6 +196,9 @@ public:
// Get the C++ type of this parameter.
StringRef getCppType() const;
// Get the C++ accessor type of this parameter.
StringRef getCppAccessorType() const;
// Get a description of this parameter for documentation purposes.
Optional<StringRef> getSummary() const;

View File

@ -210,6 +210,15 @@ StringRef AttrOrTypeParameter::getCppType() const {
"which inherit from AttrOrTypeParameter\n");
}
StringRef AttrOrTypeParameter::getCppAccessorType() const {
if (auto *param = dyn_cast<llvm::DefInit>(def->getArg(index))) {
if (Optional<StringRef> type =
param->getDef()->getValueAsOptionalString("cppAccessorType"))
return *type;
}
return getCppType();
}
Optional<StringRef> AttrOrTypeParameter::getSummary() const {
auto *parameterType = def->getArg(index);
if (auto *param = dyn_cast<llvm::DefInit>(parameterType)) {

View File

@ -135,3 +135,14 @@ def E_AttrWithTypeBuilder : TestAttr<"AttrWithTypeBuilder"> {
// DEF-LABEL: struct AttrWithTypeBuilderAttrStorage
// DEF: AttrWithTypeBuilderAttrStorage (::mlir::IntegerAttr attr)
// DEF-NEXT: : ::mlir::AttributeStorage(attr.getType()), attr(attr)
def F_ParamWithAccessorTypeAttr : TestAttr<"ParamWithAccessorType"> {
let parameters = (ins AttrParameter<"std::string", "", "StringRef">:$param);
}
// DECL-LABEL: class ParamWithAccessorTypeAttr
// DECL: StringRef getParam()
// DEF: ParamWithAccessorTypeAttrStorage
// DEF-NEXT: ParamWithAccessorTypeAttrStorage (std::string param)
// DEF: StringRef ParamWithAccessorTypeAttr::getParam()

View File

@ -413,7 +413,8 @@ void DefGenerator::emitDefDecl(const AttrOrTypeDef &def) {
for (AttrOrTypeParameter &parameter : parameters) {
SmallString<16> name = parameter.getName();
name[0] = llvm::toUpper(name[0]);
os << formatv(" {0} get{1}() const;\n", parameter.getCppType(), name);
os << formatv(" {0} get{1}() const;\n", parameter.getCppAccessorType(),
name);
}
}
@ -859,7 +860,7 @@ void DefGenerator::emitDefDef(const AttrOrTypeDef &def) {
SmallString<16> name = param.getName();
name[0] = llvm::toUpper(name[0]);
os << formatv("{0} {3}::get{1}() const {{ return getImpl()->{2}; }\n",
param.getCppType(), name, paramStorageName,
param.getCppAccessorType(), name, paramStorageName,
def.getCppClassName());
}
}