[llvm] [Transforms] Allow non-regex Source in SymbolRewriter in case of using ExplicitRewriteDescriptor (PR #154319)

Dmitry Vasilyev via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 25 11:00:07 PDT 2025


https://github.com/slydiman updated https://github.com/llvm/llvm-project/pull/154319

>From 6345fb6947690b718074ad81b83bd2aee89ec544 Mon Sep 17 00:00:00 2001
From: Dmitry Vasilyev <dvassiliev at accesssoftek.com>
Date: Tue, 19 Aug 2025 15:45:35 +0400
Subject: [PATCH 1/3] [Transforms] Allow non-regex Source in SymbolRewriter in
 case of using ExplicitRewriteDescriptor

ExplicitRewriteDescriptor expects a non-regex Source.
But unconditional verification that Source is a valid regex breaks this logic if the Source contains $ in the middle or some other special characters.
---
 llvm/lib/Transforms/Utils/SymbolRewriter.cpp | 72 ++++++++++++--------
 1 file changed, 42 insertions(+), 30 deletions(-)

diff --git a/llvm/lib/Transforms/Utils/SymbolRewriter.cpp b/llvm/lib/Transforms/Utils/SymbolRewriter.cpp
index d52d52a9b7d3e..6319fd524ff0f 100644
--- a/llvm/lib/Transforms/Utils/SymbolRewriter.cpp
+++ b/llvm/lib/Transforms/Utils/SymbolRewriter.cpp
@@ -349,13 +349,7 @@ parseRewriteFunctionDescriptor(yaml::Stream &YS, yaml::ScalarNode *K,
 
     KeyValue = Key->getValue(KeyStorage);
     if (KeyValue == "source") {
-      std::string Error;
-
       Source = std::string(Value->getValue(ValueStorage));
-      if (!Regex(Source).isValid(Error)) {
-        YS.printError(Field.getKey(), "invalid regex: " + Error);
-        return false;
-      }
     } else if (KeyValue == "target") {
       Target = std::string(Value->getValue(ValueStorage));
     } else if (KeyValue == "transform") {
@@ -379,12 +373,22 @@ parseRewriteFunctionDescriptor(yaml::Stream &YS, yaml::ScalarNode *K,
 
   // TODO see if there is a more elegant solution to selecting the rewrite
   // descriptor type
-  if (!Target.empty())
+  if (!Target.empty()) {
     DL->push_back(std::make_unique<ExplicitRewriteFunctionDescriptor>(
         Source, Target, Naked));
-  else
-    DL->push_back(
-        std::make_unique<PatternRewriteFunctionDescriptor>(Source, Transform));
+    return true;
+  }
+
+  {
+    std::string Error;
+    if (!Regex(Source).isValid(Error)) {
+      YS.printError(Descriptor, "invalid Source regex: " + Error);
+      return false;
+    }
+  }
+
+  DL->push_back(
+      std::make_unique<PatternRewriteFunctionDescriptor>(Source, Transform));
 
   return true;
 }
@@ -418,13 +422,7 @@ parseRewriteGlobalVariableDescriptor(yaml::Stream &YS, yaml::ScalarNode *K,
 
     KeyValue = Key->getValue(KeyStorage);
     if (KeyValue == "source") {
-      std::string Error;
-
       Source = std::string(Value->getValue(ValueStorage));
-      if (!Regex(Source).isValid(Error)) {
-        YS.printError(Field.getKey(), "invalid regex: " + Error);
-        return false;
-      }
     } else if (KeyValue == "target") {
       Target = std::string(Value->getValue(ValueStorage));
     } else if (KeyValue == "transform") {
@@ -441,13 +439,23 @@ parseRewriteGlobalVariableDescriptor(yaml::Stream &YS, yaml::ScalarNode *K,
     return false;
   }
 
-  if (!Target.empty())
+  if (!Target.empty()) {
     DL->push_back(std::make_unique<ExplicitRewriteGlobalVariableDescriptor>(
         Source, Target,
         /*Naked*/ false));
-  else
-    DL->push_back(std::make_unique<PatternRewriteGlobalVariableDescriptor>(
-        Source, Transform));
+    return true;
+  }
+
+  {
+    std::string Error;
+    if (!Regex(Source).isValid(Error)) {
+      YS.printError(Descriptor, "invalid Source regex: " + Error);
+      return false;
+    }
+  }
+
+  DL->push_back(std::make_unique<PatternRewriteGlobalVariableDescriptor>(
+      Source, Transform));
 
   return true;
 }
@@ -481,13 +489,7 @@ parseRewriteGlobalAliasDescriptor(yaml::Stream &YS, yaml::ScalarNode *K,
 
     KeyValue = Key->getValue(KeyStorage);
     if (KeyValue == "source") {
-      std::string Error;
-
       Source = std::string(Value->getValue(ValueStorage));
-      if (!Regex(Source).isValid(Error)) {
-        YS.printError(Field.getKey(), "invalid regex: " + Error);
-        return false;
-      }
     } else if (KeyValue == "target") {
       Target = std::string(Value->getValue(ValueStorage));
     } else if (KeyValue == "transform") {
@@ -504,13 +506,23 @@ parseRewriteGlobalAliasDescriptor(yaml::Stream &YS, yaml::ScalarNode *K,
     return false;
   }
 
-  if (!Target.empty())
+  if (!Target.empty()) {
     DL->push_back(std::make_unique<ExplicitRewriteNamedAliasDescriptor>(
         Source, Target,
         /*Naked*/ false));
-  else
-    DL->push_back(std::make_unique<PatternRewriteNamedAliasDescriptor>(
-        Source, Transform));
+    return true;
+  }
+
+  {
+    std::string Error;
+    if (!Regex(Source).isValid(Error)) {
+      YS.printError(Descriptor, "invalid Source regex: " + Error);
+      return false;
+    }
+  }
+
+  DL->push_back(
+      std::make_unique<PatternRewriteNamedAliasDescriptor>(Source, Transform));
 
   return true;
 }

>From ad6884ffba2a0f17f5cddccc35f220eea0b14266 Mon Sep 17 00:00:00 2001
From: Dmitry Vassiliev <dvassiliev at accesssoftek.com>
Date: Thu, 21 Aug 2025 12:00:35 +0400
Subject: [PATCH 2/3] Added the test.

---
 llvm/test/SymbolRewriter/rewrite.ll  | 4 ++++
 llvm/test/SymbolRewriter/rewrite.map | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/llvm/test/SymbolRewriter/rewrite.ll b/llvm/test/SymbolRewriter/rewrite.ll
index 9f7b3cbde39bf..b665e4e193e5b 100644
--- a/llvm/test/SymbolRewriter/rewrite.ll
+++ b/llvm/test/SymbolRewriter/rewrite.ll
@@ -46,6 +46,8 @@ $source_comdat_variable = comdat largest
 $source_comdat_variable_1 = comdat nodeduplicate
 @source_comdat_variable_1 = global i32 64, comdat($source_comdat_variable_1)
 
+declare void @"?source_bad.$regex_function"()
+
 ; CHECK: $target_comdat_function = comdat any
 ; CHECK: $target_comdat_function_1 = comdat exactmatch
 ; CHECK: $target_comdat_variable = comdat largest
@@ -90,3 +92,5 @@ $source_comdat_variable_1 = comdat nodeduplicate
 ; CHECK: define dllexport void @target_comdat_function_1() comdat
 ; CHECK-NOT: define dllexport void @source_comdat_function_1() comdat
 
+; CHECK: declare void @target_bad_regex_function()
+; CHECK-NOT: declare void @"?source_bad.$regex_function"()
diff --git a/llvm/test/SymbolRewriter/rewrite.map b/llvm/test/SymbolRewriter/rewrite.map
index 8094939d088d1..0cb3183d3326c 100644
--- a/llvm/test/SymbolRewriter/rewrite.map
+++ b/llvm/test/SymbolRewriter/rewrite.map
@@ -64,3 +64,7 @@ global variable: {
   transform: target_comdat_variable_\1,
 }
 
+function: {
+  source: ?source_bad.$regex_function,
+  target: target_bad_regex_function,
+}

>From 794bf48148a820caded47435e4da9d8d48f42e87 Mon Sep 17 00:00:00 2001
From: Dmitry Vasilyev <dvassiliev at accesssoftek.com>
Date: Mon, 25 Aug 2025 21:59:14 +0400
Subject: [PATCH 3/3] Added more tests.

---
 llvm/test/SymbolRewriter/rewrite.ll  | 14 ++++++++++++--
 llvm/test/SymbolRewriter/rewrite.map | 12 +++++++++++-
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/llvm/test/SymbolRewriter/rewrite.ll b/llvm/test/SymbolRewriter/rewrite.ll
index b665e4e193e5b..f5e36c42b0fa5 100644
--- a/llvm/test/SymbolRewriter/rewrite.ll
+++ b/llvm/test/SymbolRewriter/rewrite.ll
@@ -46,7 +46,11 @@ $source_comdat_variable = comdat largest
 $source_comdat_variable_1 = comdat nodeduplicate
 @source_comdat_variable_1 = global i32 64, comdat($source_comdat_variable_1)
 
-declare void @"?source_bad.$regex_function"()
+declare void @"?source_bad_regex_function"()
+
+@"?source_bad_regex_variable" = external global i32
+
+@"?source_bad_regex_alias" = alias void (ptr), ptr @_ZN1SC2Ev
 
 ; CHECK: $target_comdat_function = comdat any
 ; CHECK: $target_comdat_function_1 = comdat exactmatch
@@ -64,6 +68,12 @@ declare void @"?source_bad.$regex_function"()
 ; CHECK: @target_comdat_variable_1 = global i32 64, comdat
 ; CHECK-NOT: @source_comdat_variable_1 = global i32 64, comdat
 
+; CHECK: @target_bad_regex_variable = external global i32
+; CHECK-NOT: @"?source_bad_regex_variable" = external global i32
+
+; CHECK: @target_bad_regex_alias = alias void (ptr), ptr @_ZN1SC2Ev
+; CHECK-NOT: @"?source_bad_regex_alias" = alias void (ptr), ptr @_ZN1SC2Ev
+
 ; CHECK: declare void @target_function()
 ; CHECK-NOT: declare void @source_function()
 ; CHECK: declare void @target_pattern_function()
@@ -93,4 +103,4 @@ declare void @"?source_bad.$regex_function"()
 ; CHECK-NOT: define dllexport void @source_comdat_function_1() comdat
 
 ; CHECK: declare void @target_bad_regex_function()
-; CHECK-NOT: declare void @"?source_bad.$regex_function"()
+; CHECK-NOT: declare void @"?source_bad_regex_function"()
diff --git a/llvm/test/SymbolRewriter/rewrite.map b/llvm/test/SymbolRewriter/rewrite.map
index 0cb3183d3326c..872916d09bac7 100644
--- a/llvm/test/SymbolRewriter/rewrite.map
+++ b/llvm/test/SymbolRewriter/rewrite.map
@@ -65,6 +65,16 @@ global variable: {
 }
 
 function: {
-  source: ?source_bad.$regex_function,
+  source: ?source_bad_regex_function,
   target: target_bad_regex_function,
 }
+
+global variable: {
+  source: ?source_bad_regex_variable,
+  target: target_bad_regex_variable,
+}
+
+global alias: {
+  source: ?source_bad_regex_alias,
+  target: target_bad_regex_alias,
+}



More information about the llvm-commits mailing list