[mlir] ODS: require DefaultValuedAttr to be const-buildable
authorAlex Zinenko <zinenko@google.com>
Mon, 7 Feb 2022 09:27:07 +0000 (10:27 +0100)
committerAlex Zinenko <zinenko@google.com>
Tue, 8 Feb 2022 08:31:09 +0000 (09:31 +0100)
ODS provides a mechanism for defalut-valued attributes based on a wrapper
TableGen class that is recognized by mlir-tblgen. Such attributes, if not set
on the operaiton, can be construted on-the-fly in their getter given a constant
value. In order for this construction to work, the attribute specificaiton in
ODS must set the constBuilderCall field correctly. This has not been verified,
which could lead to invalid C++ code being generated by mlir-tblgen.

Closes #53588.

Reviewed By: rriddle, mehdi_amini

Differential Revision: https://reviews.llvm.org/D119113

mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp

index 7060fdf..6a45e1f 100644 (file)
@@ -739,6 +739,10 @@ static void emitAttrGetterWithReturnType(FmtContext &fctx,
     // Returns the default value if not set.
     // TODO: this is inefficient, we are recreating the attribute for every
     // call. This should be set instead.
+    if (!attr.isConstBuildable()) {
+      PrintFatalError("DefaultValuedAttr of type " + attr.getAttrDefName() +
+                      " must have a constBuilder");
+    }
     std::string defaultValue = std::string(
         tgfmt(attr.getConstBuilderTemplate(), &fctx, attr.getDefaultValue()));
     body << "    if (!attr)\n      return "