aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Dietz <will.dietz@sifive.com>2024-06-10 19:12:34 -0500
committerGitHub <noreply@github.com>2024-06-10 19:12:34 -0500
commit46e41c8631bd6c1a6c91d6cc4a5e4f1671078ccd (patch)
tree6db395b586fcb63f8af4c6892fb3ae7114057747
parent48aebd4cf88b3632e8c3ed6b976287c973628e14 (diff)
downloadllvm-46e41c8631bd6c1a6c91d6cc4a5e4f1671078ccd.zip
llvm-46e41c8631bd6c1a6c91d6cc4a5e4f1671078ccd.tar.gz
llvm-46e41c8631bd6c1a6c91d6cc4a5e4f1671078ccd.tar.bz2
[mlir] Sanitize identifiers with leading symbol. (#94795)
Presently, if name starts with a symbol it's converted to hex which may cause the result to be invalid by starting with a digit. Address this and add a small test. Co-authored-by: Will Dietz <w@wdtz.org>
-rw-r--r--mlir/lib/IR/AsmPrinter.cpp10
-rw-r--r--mlir/test/IR/print-attr-type-aliases.mlir3
-rw-r--r--mlir/test/lib/Dialect/Test/TestDialectInterfaces.cpp1
3 files changed, 11 insertions, 3 deletions
diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp
index 6a362af..2c43a6f 100644
--- a/mlir/lib/IR/AsmPrinter.cpp
+++ b/mlir/lib/IR/AsmPrinter.cpp
@@ -999,9 +999,13 @@ static StringRef sanitizeIdentifier(StringRef name, SmallString<16> &buffer,
bool allowTrailingDigit = true) {
assert(!name.empty() && "Shouldn't have an empty name here");
+ auto validChar = [&](char ch) {
+ return llvm::isAlnum(ch) || allowedPunctChars.contains(ch);
+ };
+
auto copyNameToBuffer = [&] {
for (char ch : name) {
- if (llvm::isAlnum(ch) || allowedPunctChars.contains(ch))
+ if (validChar(ch))
buffer.push_back(ch);
else if (ch == ' ')
buffer.push_back('_');
@@ -1013,7 +1017,7 @@ static StringRef sanitizeIdentifier(StringRef name, SmallString<16> &buffer,
// Check to see if this name is valid. If it starts with a digit, then it
// could conflict with the autogenerated numeric ID's, so add an underscore
// prefix to avoid problems.
- if (isdigit(name[0])) {
+ if (isdigit(name[0]) || (!validChar(name[0]) && name[0] != ' ')) {
buffer.push_back('_');
copyNameToBuffer();
return buffer;
@@ -1029,7 +1033,7 @@ static StringRef sanitizeIdentifier(StringRef name, SmallString<16> &buffer,
// Check to see that the name consists of only valid identifier characters.
for (char ch : name) {
- if (!llvm::isAlnum(ch) && !allowedPunctChars.contains(ch)) {
+ if (!validChar(ch)) {
copyNameToBuffer();
return buffer;
}
diff --git a/mlir/test/IR/print-attr-type-aliases.mlir b/mlir/test/IR/print-attr-type-aliases.mlir
index 162eacd..27c5a75 100644
--- a/mlir/test/IR/print-attr-type-aliases.mlir
+++ b/mlir/test/IR/print-attr-type-aliases.mlir
@@ -11,6 +11,9 @@
// CHECK-DAG: #_0_test_alias = "alias_test:prefixed_digit"
"test.op"() {alias_test = "alias_test:prefixed_digit"} : () -> ()
+// CHECK-DAG: #_25test = "alias_test:prefixed_symbol"
+"test.op"() {alias_test = "alias_test:prefixed_symbol"} : () -> ()
+
// CHECK-DAG: #test_alias_conflict0_ = "alias_test:sanitize_conflict_a"
// CHECK-DAG: #test_alias_conflict0_1 = "alias_test:sanitize_conflict_b"
"test.op"() {alias_test = ["alias_test:sanitize_conflict_a", "alias_test:sanitize_conflict_b"]} : () -> ()
diff --git a/mlir/test/lib/Dialect/Test/TestDialectInterfaces.cpp b/mlir/test/lib/Dialect/Test/TestDialectInterfaces.cpp
index a3a8913..64add8c 100644
--- a/mlir/test/lib/Dialect/Test/TestDialectInterfaces.cpp
+++ b/mlir/test/lib/Dialect/Test/TestDialectInterfaces.cpp
@@ -188,6 +188,7 @@ struct TestOpAsmInterface : public OpAsmDialectInterface {
.Case("alias_test:dot_in_name", StringRef("test.alias"))
.Case("alias_test:trailing_digit", StringRef("test_alias0"))
.Case("alias_test:prefixed_digit", StringRef("0_test_alias"))
+ .Case("alias_test:prefixed_symbol", StringRef("%test"))
.Case("alias_test:sanitize_conflict_a",
StringRef("test_alias_conflict0"))
.Case("alias_test:sanitize_conflict_b",