diff --git a/mlir/lib/IR/SymbolTable.cpp b/mlir/lib/IR/SymbolTable.cpp index 4f8418fac7b9d..4e191e7d612ad 100644 --- a/mlir/lib/IR/SymbolTable.cpp +++ b/mlir/lib/IR/SymbolTable.cpp @@ -424,7 +424,9 @@ static LogicalResult lookupSymbolInImpl( if (!symbolOp->hasTrait()) return failure(); symbolOp = lookupSymbolFn(symbolOp, ref.getAttr()); - if (!symbolOp) + // If the nested symbol is private, lookup failed. + if (!symbolOp || SymbolTable::getSymbolVisibility(symbolOp) == + SymbolTable::Visibility::Private) return failure(); symbols.push_back(symbolOp); } diff --git a/mlir/test/Dialect/GPU/invalid.mlir b/mlir/test/Dialect/GPU/invalid.mlir index ad6ad7338ff38..9c338e06f1b26 100644 --- a/mlir/test/Dialect/GPU/invalid.mlir +++ b/mlir/test/Dialect/GPU/invalid.mlir @@ -135,7 +135,7 @@ module attributes {gpu.container_module} { module attributes {gpu.container_module} { gpu.module @kernels { // expected-note@+1 {{see the kernel definition here}} - memref.global "private" @kernel_1 : memref<4xi32> + memref.global @kernel_1 : memref<4xi32> } func.func @launch_func_undefined_function(%sz : index) { diff --git a/mlir/test/IR/test-symbol-uses.mlir b/mlir/test/IR/test-symbol-uses.mlir index 54e3ef1812510..d9d839e9fc307 100644 --- a/mlir/test/IR/test-symbol-uses.mlir +++ b/mlir/test/IR/test-symbol-uses.mlir @@ -68,3 +68,28 @@ func.func @symbol_bar() { "foo.possibly_unknown_symbol_table"() ({ }) : () -> () } + +// ----- + +module { + // expected-remark@below {{symbol has 2 uses}} + module @inner_module { + // expected-remark@below {{symbol has 1 uses}} + func.func private @private_inner() + // expected-remark@below {{symbol has 1 uses}} + func.func nested @nested_inner() + } + + + // expected-remark@below {{symbol has no uses}} + // expected-remark@below {{symbol contains 2 nested references}} + func.func @outer_caller() { + // expected-remark@below {{found use of symbol : @inner_module::@nested_inner : "inner_module"}} + // expected-remark@below {{found use of symbol : @inner_module::@nested_inner : "nested_inner"}} + "foo.op"() { use = @inner_module::@nested_inner } : () -> () + // expected-remark@below {{failed to resolve use of symbol : @inner_module::@private_inner : "inner_module"}} + // expected-remark@below {{failed to resolve use of symbol : @inner_module::@private_inner : "private_inner"}} + "foo.op"() { use = @inner_module::@private_inner } : () -> () + return + } +} diff --git a/mlir/test/lib/IR/TestSymbolUses.cpp b/mlir/test/lib/IR/TestSymbolUses.cpp index e841e142c6563..24f7d8505bebd 100644 --- a/mlir/test/lib/IR/TestSymbolUses.cpp +++ b/mlir/test/lib/IR/TestSymbolUses.cpp @@ -60,6 +60,10 @@ struct SymbolUsesPass symbolUse.getUser()->emitRemark() << "found use of symbol : " << symbolUse.getSymbolRef() << " : " << symbol.getNameAttr(); + } else { + symbolUse.getUser()->emitRemark() + << "failed to resolve use of symbol : " << symbolUse.getSymbolRef() + << " : " << symbol.getNameAttr(); } } symbol->emitRemark() << "symbol has " << llvm::size(*symbolUses) << " uses";