diff --git a/mlir/include/mlir/IR/BuiltinOps.td b/mlir/include/mlir/IR/BuiltinOps.td --- a/mlir/include/mlir/IR/BuiltinOps.td +++ b/mlir/include/mlir/IR/BuiltinOps.td @@ -263,4 +263,10 @@ let hasFolder = 1; } +def PlaceholderOp : Builtin_Op<"placeholder"> { + let summary = "This op is internal to the parser and shouldn't exist " + "otherwise"; +} + + #endif // BUILTIN_OPS diff --git a/mlir/lib/IR/Operation.cpp b/mlir/lib/IR/Operation.cpp --- a/mlir/lib/IR/Operation.cpp +++ b/mlir/lib/IR/Operation.cpp @@ -176,6 +176,14 @@ numRegions(numRegions), hasOperandStorage(hasOperandStorage), name(name), attrs(attributes) { assert(attributes && "unexpected null attribute dictionary"); +#ifndef NDEBUG + if (!getDialect() && !getContext()->allowsUnregisteredDialects()) + llvm::report_fatal_error( + name.getStringRef() + + " created with unregistered dialect. If this is intended, please call " + "allowUnregisteredDialects() on the MLIRContext, or use " + "-allow-unregistered-dialect with mlir-opt"); +#endif } // Operations are deleted through the destroy() member because they are diff --git a/mlir/test/CAPI/ir.c b/mlir/test/CAPI/ir.c --- a/mlir/test/CAPI/ir.c +++ b/mlir/test/CAPI/ir.c @@ -479,6 +479,7 @@ /// block/operation-relative API and their final order is checked. static void buildWithInsertionsAndPrint(MlirContext ctx) { MlirLocation loc = mlirLocationUnknownGet(ctx); + mlirContextSetAllowUnregisteredDialects(ctx, true); MlirRegion owningRegion = mlirRegionCreate(); MlirBlock nullBlock = mlirRegionGetFirstBlock(owningRegion); @@ -542,6 +543,7 @@ mlirOperationDump(op); mlirOperationDestroy(op); + mlirContextSetAllowUnregisteredDialects(ctx, false); // clang-format off // CHECK-LABEL: "insertion.order.test" // CHECK: ^{{.*}}(%{{.*}}: i1 @@ -1561,6 +1563,8 @@ // CHECK-LABEL: @testOperands MlirContext ctx = mlirContextCreate(); + mlirRegisterAllDialects(ctx); + mlirContextGetOrLoadDialect(ctx, mlirStringRefCreateFromCString("test")); MlirLocation loc = mlirLocationUnknownGet(ctx); MlirType indexType = mlirIndexTypeGet(ctx); @@ -1590,6 +1594,7 @@ MlirValue constOneValue = mlirOperationGetResult(constOne, 0); // Create the operation under test. + mlirContextSetAllowUnregisteredDialects(ctx, true); MlirOperationState opState = mlirOperationStateGet(mlirStringRefCreateFromCString("dummy.op"), loc); MlirValue initialOperands[] = {constZeroValue}; @@ -1604,13 +1609,13 @@ MlirValue opOperand = mlirOperationGetOperand(op, 0); fprintf(stderr, "Original operand: "); mlirValuePrint(opOperand, printToStderr, NULL); - // CHECK: Original operand: {{.+}} {value = 0 : index} + // CHECK: Original operand: {{.+}} constant 0 : index mlirOperationSetOperand(op, 0, constOneValue); opOperand = mlirOperationGetOperand(op, 0); fprintf(stderr, "Updated operand: "); mlirValuePrint(opOperand, printToStderr, NULL); - // CHECK: Updated operand: {{.+}} {value = 1 : index} + // CHECK: Updated operand: {{.+}} constant 1 : index mlirOperationDestroy(op); mlirOperationDestroy(constZero); @@ -1626,6 +1631,8 @@ // CHECK-LABEL: @testClone MlirContext ctx = mlirContextCreate(); + mlirRegisterAllDialects(ctx); + mlirContextGetOrLoadDialect(ctx, mlirStringRefCreateFromCString("std")); MlirLocation loc = mlirLocationUnknownGet(ctx); MlirType indexType = mlirIndexTypeGet(ctx); MlirStringRef valueStringRef = mlirStringRefCreateFromCString("value"); @@ -1646,8 +1653,8 @@ mlirOperationPrint(constZero, printToStderr, NULL); mlirOperationPrint(constOne, printToStderr, NULL); - // CHECK: %0 = "std.constant"() {value = 0 : index} : () -> index - // CHECK: %0 = "std.constant"() {value = 1 : index} : () -> index + // CHECK: constant 0 : index + // CHECK: constant 1 : index return 0; } diff --git a/mlir/test/Dialect/PDL/invalid.mlir b/mlir/test/Dialect/PDL/invalid.mlir --- a/mlir/test/Dialect/PDL/invalid.mlir +++ b/mlir/test/Dialect/PDL/invalid.mlir @@ -167,7 +167,7 @@ // expected-error@below {{expected only `pdl` operations within the pattern body}} pdl.pattern : benefit(1) { // expected-note@below {{see non-`pdl` operation defined here}} - "foo.other_op"() : () -> () + "test.foo.other_op"() : () -> () %root = pdl.operation "foo.op" pdl.rewrite %root with "foo" diff --git a/mlir/test/IR/invalid-module-op.mlir b/mlir/test/IR/invalid-module-op.mlir --- a/mlir/test/IR/invalid-module-op.mlir +++ b/mlir/test/IR/invalid-module-op.mlir @@ -6,9 +6,9 @@ // expected-error@+1 {{Operations with a 'SymbolTable' must have exactly one block}} module { ^bb1: - "module_terminator"() : () -> () + "test.dummy"() : () -> () ^bb2: - "module_terminator"() : () -> () + "test.dummy"() : () -> () } return } diff --git a/mlir/test/IR/invalid-unregistered.mlir b/mlir/test/IR/invalid-unregistered.mlir --- a/mlir/test/IR/invalid-unregistered.mlir +++ b/mlir/test/IR/invalid-unregistered.mlir @@ -1,5 +1,7 @@ // RUN: mlir-opt %s -split-input-file -verify-diagnostics +// REQUIRES: noasserts + // expected-error @below {{op created with unregistered dialect}} "unregistered_dialect.op"() : () -> () diff --git a/mlir/test/lit.cfg.py b/mlir/test/lit.cfg.py --- a/mlir/test/lit.cfg.py +++ b/mlir/test/lit.cfg.py @@ -111,3 +111,8 @@ # lib/Bindings/Python/CMakeLists.txt for where this is set up. os.path.join(config.llvm_obj_root, 'python'), ], append_path=True) + +if config.enable_assertions: + config.available_features.add('asserts') +else: + config.available_features.add('noasserts') diff --git a/mlir/unittests/Pass/PassManagerTest.cpp b/mlir/unittests/Pass/PassManagerTest.cpp --- a/mlir/unittests/Pass/PassManagerTest.cpp +++ b/mlir/unittests/Pass/PassManagerTest.cpp @@ -91,6 +91,7 @@ TEST(PassManagerTest, InvalidPass) { MLIRContext context; + context.allowUnregisteredDialects(); // Create a module OwningModuleRef module(ModuleOp::create(UnknownLoc::get(&context)));