Skip to content

Commit 7596424

Browse files
authored
[mlir][SymbolOpInterface] Easier visibility overriding (#151036)
When overriding 'getVisibility and/or 'setVisibility' the interface methods calling them do not pick up the overriden version. Instead it is necessary to override all the other methods as well. This adjusts these interface methods to use the overriden version when available.
1 parent 3e42146 commit 7596424

File tree

4 files changed

+74
-7
lines changed

4 files changed

+74
-7
lines changed

mlir/include/mlir/IR/SymbolInterfaces.td

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,19 @@ def Symbol : OpInterface<"SymbolOpInterface"> {
5555
InterfaceMethod<"Returns true if this symbol has nested visibility.",
5656
"bool", "isNested", (ins), [{}],
5757
/*defaultImplementation=*/[{
58-
return getVisibility() == mlir::SymbolTable::Visibility::Nested;
58+
return $_op.getVisibility() == mlir::SymbolTable::Visibility::Nested;
5959
}]
6060
>,
6161
InterfaceMethod<"Returns true if this symbol has private visibility.",
6262
"bool", "isPrivate", (ins), [{}],
6363
/*defaultImplementation=*/[{
64-
return getVisibility() == mlir::SymbolTable::Visibility::Private;
64+
return $_op.getVisibility() == mlir::SymbolTable::Visibility::Private;
6565
}]
6666
>,
6767
InterfaceMethod<"Returns true if this symbol has public visibility.",
6868
"bool", "isPublic", (ins), [{}],
6969
/*defaultImplementation=*/[{
70-
return getVisibility() == mlir::SymbolTable::Visibility::Public;
70+
return $_op.getVisibility() == mlir::SymbolTable::Visibility::Public;
7171
}]
7272
>,
7373
InterfaceMethod<"Sets the visibility of this symbol.",
@@ -79,19 +79,19 @@ def Symbol : OpInterface<"SymbolOpInterface"> {
7979
InterfaceMethod<"Sets the visibility of this symbol to be nested.",
8080
"void", "setNested", (ins), [{}],
8181
/*defaultImplementation=*/[{
82-
setVisibility(mlir::SymbolTable::Visibility::Nested);
82+
$_op.setVisibility(mlir::SymbolTable::Visibility::Nested);
8383
}]
8484
>,
8585
InterfaceMethod<"Sets the visibility of this symbol to be private.",
8686
"void", "setPrivate", (ins), [{}],
8787
/*defaultImplementation=*/[{
88-
setVisibility(mlir::SymbolTable::Visibility::Private);
88+
$_op.setVisibility(mlir::SymbolTable::Visibility::Private);
8989
}]
9090
>,
9191
InterfaceMethod<"Sets the visibility of this symbol to be public.",
9292
"void", "setPublic", (ins), [{}],
9393
/*defaultImplementation=*/[{
94-
setVisibility(mlir::SymbolTable::Visibility::Public);
94+
$_op.setVisibility(mlir::SymbolTable::Visibility::Public);
9595
}]
9696
>,
9797
InterfaceMethod<[{
@@ -144,7 +144,7 @@ def Symbol : OpInterface<"SymbolOpInterface"> {
144144
// By default, base this on the visibility alone. A symbol can be
145145
// discarded as long as it is not public. Only public symbols may be
146146
// visible from outside of the IR.
147-
return getVisibility() != ::mlir::SymbolTable::Visibility::Public;
147+
return $_op.getVisibility() != ::mlir::SymbolTable::Visibility::Public;
148148
}]
149149
>,
150150
InterfaceMethod<[{

mlir/test/lib/Dialect/Test/TestOpDefs.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,32 @@
1717
using namespace mlir;
1818
using namespace test;
1919

20+
//===----------------------------------------------------------------------===//
21+
// OverridenSymbolVisibilityOp
22+
//===----------------------------------------------------------------------===//
23+
24+
SymbolTable::Visibility OverriddenSymbolVisibilityOp::getVisibility() {
25+
return SymbolTable::Visibility::Private;
26+
}
27+
28+
static StringLiteral getVisibilityString(SymbolTable::Visibility visibility) {
29+
switch (visibility) {
30+
case SymbolTable::Visibility::Private:
31+
return "private";
32+
case SymbolTable::Visibility::Nested:
33+
return "nested";
34+
case SymbolTable::Visibility::Public:
35+
return "public";
36+
}
37+
}
38+
39+
void OverriddenSymbolVisibilityOp::setVisibility(
40+
SymbolTable::Visibility visibility) {
41+
42+
emitOpError("cannot change visibility of symbol to ")
43+
<< getVisibilityString(visibility);
44+
}
45+
2046
//===----------------------------------------------------------------------===//
2147
// TestBranchOp
2248
//===----------------------------------------------------------------------===//

mlir/test/lib/Dialect/Test/TestOps.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ def SymbolOp : TEST_Op<"symbol", [NoMemoryEffect, Symbol]> {
119119
OptionalAttr<StrAttr>:$sym_visibility);
120120
}
121121

122+
def OverriddenSymbolVisibilityOp : TEST_Op<"overridden_symbol_visibility", [
123+
DeclareOpInterfaceMethods<Symbol, ["getVisibility", "setVisibility"]>,
124+
]> {
125+
let summary = "operation overridden symbol visibility accessors";
126+
let arguments = (ins StrAttr:$sym_name);
127+
}
128+
122129
def SymbolScopeOp : TEST_Op<"symbol_scope",
123130
[SymbolTable, SingleBlockImplicitTerminator<"TerminatorOp">]> {
124131
let summary = "operation which defines a new symbol table";

mlir/unittests/IR/SymbolTableTest.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,38 @@ TEST_F(ReplaceAllSymbolUsesTest, StringAttrInFuncOp) {
132132
});
133133
}
134134

135+
TEST(SymbolOpInterface, Visibility) {
136+
DialectRegistry registry;
137+
::test::registerTestDialect(registry);
138+
MLIRContext context(registry);
139+
140+
constexpr static StringLiteral kInput = R"MLIR(
141+
"test.overridden_symbol_visibility"() {sym_name = "symbol_name"} : () -> ()
142+
)MLIR";
143+
OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(kInput, &context);
144+
auto symOp = cast<SymbolOpInterface>(module->getBody()->front());
145+
146+
ASSERT_TRUE(symOp.isPrivate());
147+
ASSERT_FALSE(symOp.isPublic());
148+
ASSERT_FALSE(symOp.isNested());
149+
ASSERT_TRUE(symOp.canDiscardOnUseEmpty());
150+
151+
std::string diagStr;
152+
context.getDiagEngine().registerHandler(
153+
[&](Diagnostic &diag) { diagStr += diag.str(); });
154+
155+
std::string expectedDiag;
156+
symOp.setPublic();
157+
expectedDiag += "'test.overridden_symbol_visibility' op cannot change "
158+
"visibility of symbol to public";
159+
symOp.setNested();
160+
expectedDiag += "'test.overridden_symbol_visibility' op cannot change "
161+
"visibility of symbol to nested";
162+
symOp.setPrivate();
163+
expectedDiag += "'test.overridden_symbol_visibility' op cannot change "
164+
"visibility of symbol to private";
165+
166+
ASSERT_EQ(diagStr, expectedDiag);
167+
}
168+
135169
} // namespace

0 commit comments

Comments
 (0)