[Mlir-commits] [mlir] 95956c1 - [MLIR] ODS typedef gen fixes & improvements

John Demme llvmlistbot at llvm.org
Sun Nov 22 16:15:14 PST 2020


Author: John Demme
Date: 2020-11-22T16:06:14-08:00
New Revision: 95956c1c9aae7ea21c2b2f7a21e0901d549bd190

URL: https://github.com/llvm/llvm-project/commit/95956c1c9aae7ea21c2b2f7a21e0901d549bd190
DIFF: https://github.com/llvm/llvm-project/commit/95956c1c9aae7ea21c2b2f7a21e0901d549bd190.diff

LOG: [MLIR] ODS typedef gen fixes & improvements

- Fixes bug 48242 point 3 crash.
- Makes the improvments from points 1 & 2.

https://bugs.llvm.org/show_bug.cgi?id=48262

```
   def RTLValueType : Type<CPred<"isRTLValueType($_self)">, "Type"> {
     string cppType = "::mlir::Type";
   }
```
Works now, but merely by happenstance. Parameters expects a `TypeParameter` class def or a string representing a c++ type but doesn't enforce it.

Reviewed By: lattner

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

Added: 
    

Modified: 
    mlir/lib/TableGen/TypeDef.cpp
    mlir/test/mlir-tblgen/typedefs.td
    mlir/tools/mlir-tblgen/TypeDefGen.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/lib/TableGen/TypeDef.cpp b/mlir/lib/TableGen/TypeDef.cpp
index 86373a481239..aa7f36a3626b 100644
--- a/mlir/lib/TableGen/TypeDef.cpp
+++ b/mlir/lib/TableGen/TypeDef.cpp
@@ -112,6 +112,8 @@ llvm::Optional<StringRef> TypeParameter::getAllocator() const {
 
   if (auto *typeParameter = dyn_cast<llvm::DefInit>(parameterType)) {
     llvm::RecordVal *code = typeParameter->getDef()->getValue("allocator");
+    if (!code)
+      return llvm::Optional<StringRef>();
     if (llvm::CodeInit *ci = dyn_cast<llvm::CodeInit>(code->getValue()))
       return ci->getValue();
     if (isa<llvm::UnsetInit>(code->getValue()))

diff  --git a/mlir/test/mlir-tblgen/typedefs.td b/mlir/test/mlir-tblgen/typedefs.td
index ae459df4934d..6db866a10c8d 100644
--- a/mlir/test/mlir-tblgen/typedefs.td
+++ b/mlir/test/mlir-tblgen/typedefs.td
@@ -6,6 +6,11 @@ include "mlir/IR/OpBase.td"
 // DECL: #ifdef GET_TYPEDEF_CLASSES
 // DECL: #undef GET_TYPEDEF_CLASSES
 
+// DECL: namespace mlir {
+// DECL: class DialectAsmParser;
+// DECL: class DialectAsmPrinter;
+// DECL: } // namespace mlir
+
 // DECL: ::mlir::Type generatedTypeParser(::mlir::MLIRContext* ctxt, ::mlir::DialectAsmParser& parser, ::llvm::StringRef mnenomic);
 // DECL: ::mlir::LogicalResult generatedTypePrinter(::mlir::Type type, ::mlir::DialectAsmPrinter& printer);
 
@@ -34,6 +39,10 @@ def A_SimpleTypeA : TestType<"SimpleA"> {
 // DECL: class SimpleAType: public ::mlir::Type
 }
 
+def RTLValueType : Type<CPred<"isRTLValueType($_self)">, "Type"> {
+  string cppType = "::mlir::Type";
+}
+
 // A more complex parameterized type
 def B_CompoundTypeA : TestType<"CompoundA"> {
   let summary = "A more complex parameterized type";
@@ -44,14 +53,15 @@ def B_CompoundTypeA : TestType<"CompoundA"> {
       "int":$widthOfSomething,
       "::mlir::test::SimpleTypeA": $exampleTdType,
       "SomeCppStruct": $exampleCppType,
-      ArrayRefParameter<"int", "Matrix dimensions">:$dims
+      ArrayRefParameter<"int", "Matrix dimensions">:$dims,
+      RTLValueType:$inner
   );
 
   let genVerifyInvariantsDecl = 1;
 
 // DECL-LABEL: class CompoundAType: public ::mlir::Type
-// DECL: static ::mlir::LogicalResult verifyConstructionInvariants(Location loc, int widthOfSomething, ::mlir::test::SimpleTypeA exampleTdType, SomeCppStruct exampleCppType, ::llvm::ArrayRef<int> dims);
-// DECL: static ::mlir::Type getChecked(Location loc, int widthOfSomething, ::mlir::test::SimpleTypeA exampleTdType, SomeCppStruct exampleCppType, ::llvm::ArrayRef<int> dims);
+// DECL: static ::mlir::LogicalResult verifyConstructionInvariants(::mlir::Location loc, int widthOfSomething, ::mlir::test::SimpleTypeA exampleTdType, SomeCppStruct exampleCppType, ::llvm::ArrayRef<int> dims, ::mlir::Type inner);
+// DECL: static ::mlir::Type getChecked(::mlir::Location loc, int widthOfSomething, ::mlir::test::SimpleTypeA exampleTdType, SomeCppStruct exampleCppType, ::llvm::ArrayRef<int> dims, ::mlir::Type inner);
 // DECL: static ::llvm::StringRef getMnemonic() { return "cmpnd_a"; }
 // DECL: static ::mlir::Type parse(::mlir::MLIRContext* ctxt, ::mlir::DialectAsmParser& parser);
 // DECL: void print(::mlir::DialectAsmPrinter& printer) const;

diff  --git a/mlir/tools/mlir-tblgen/TypeDefGen.cpp b/mlir/tools/mlir-tblgen/TypeDefGen.cpp
index 4473f629f3f1..0990a5afb884 100644
--- a/mlir/tools/mlir-tblgen/TypeDefGen.cpp
+++ b/mlir/tools/mlir-tblgen/TypeDefGen.cpp
@@ -133,6 +133,15 @@ class TypeParamCommaFormatter : public llvm::detail::format_adapter {
 // GEN: TypeDef declarations
 //===----------------------------------------------------------------------===//
 
+/// Print this above all the other declarations. Contains type declarations used
+/// later on.
+static const char *const typeDefDeclHeader = R"(
+namespace mlir {
+class DialectAsmParser;
+class DialectAsmPrinter;
+} // namespace mlir
+)";
+
 /// The code block for the start of a typeDef class declaration -- singleton
 /// case.
 ///
@@ -174,8 +183,8 @@ static const char *const typeDefParsePrint = R"(
 ///
 /// {0}: List of parameters, parameters style.
 static const char *const typeDefDeclVerifyStr = R"(
-    static ::mlir::LogicalResult verifyConstructionInvariants(Location loc{0});
-    static ::mlir::Type getChecked(Location loc{0});
+    static ::mlir::LogicalResult verifyConstructionInvariants(::mlir::Location loc{0});
+    static ::mlir::Type getChecked(::mlir::Location loc{0});
 )";
 
 /// Generate the declaration for the given typeDef class.
@@ -239,6 +248,10 @@ static bool emitTypeDefDecls(const llvm::RecordKeeper &recordKeeper,
   findAllTypeDefs(recordKeeper, typeDefs);
 
   IfDefScope scope("GET_TYPEDEF_CLASSES", os);
+
+  // Output the common "header".
+  os << typeDefDeclHeader;
+
   if (typeDefs.size() > 0) {
     NamespaceEmitter nsEmitter(os, typeDefs.begin()->getDialect());
 


        


More information about the Mlir-commits mailing list