From ca8115a7dcd81732c0174849d48865a959a9ebfb Mon Sep 17 00:00:00 2001 From: Egor Shamshura Date: Tue, 1 Apr 2025 19:50:32 +0000 Subject: [PATCH 1/5] replaced command line options with pass parameters for MetaRenamer --- .../llvm/Transforms/Utils/MetaRenamer.h | 26 +++++++++++ llvm/lib/Passes/PassBuilder.cpp | 27 +++++++++++ llvm/lib/Passes/PassRegistry.def | 8 +++- llvm/lib/Transforms/Utils/MetaRenamer.cpp | 45 ++++--------------- .../Transforms/MetaRenamer/exclude-names.ll | 2 +- llvm/test/Transforms/MetaRenamer/only-inst.ll | 2 +- 6 files changed, 69 insertions(+), 41 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/MetaRenamer.h b/llvm/include/llvm/Transforms/Utils/MetaRenamer.h index fff3dff75837e..be2c66b8cdaed 100644 --- a/llvm/include/llvm/Transforms/Utils/MetaRenamer.h +++ b/llvm/include/llvm/Transforms/Utils/MetaRenamer.h @@ -18,7 +18,33 @@ #include "llvm/IR/PassManager.h" namespace llvm { + +struct MetaRenamerOptions { + /// Prefixes for functions that don't need to be renamed, separated by a comma + std::string RenameExcludeFunctionPrefixes; + + /// Prefixes for aliases that don't need to be renamed, separated by a comma + std::string RenameExcludeAliasPrefixes; + + /// Prefixes for global values that don't need to be renamed, separated by a + /// comma + std::string RenameExcludeGlobalPrefixes; + + /// Prefixes for structs that don't need to be renamed, separated by a comma + std::string RenameExcludeStructPrefixes; + + /// Only rename the instructions in the function + bool RenameOnlyInst = false; +}; + struct MetaRenamerPass : PassInfoMixin { +private: + const MetaRenamerOptions Options; + +public: + MetaRenamerPass(MetaRenamerOptions Options = MetaRenamerOptions()) + : Options(Options) {} + PreservedAnalyses run(Module &, ModuleAnalysisManager &); }; } // namespace llvm diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 5cda1517e127d..52c403c5ff0ba 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -176,6 +176,7 @@ #include "llvm/Passes/OptimizationLevel.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/Error.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Regex.h" @@ -947,6 +948,32 @@ parseLowerAllowCheckPassOptions(StringRef Params) { return Result; } +Expected parseMetaRenamerPassOptions(StringRef Params) { + MetaRenamerOptions Result; + while (!Params.empty()) { + StringRef ParamName; + std::tie(ParamName, Params) = Params.split(';'); + bool Enable = !ParamName.consume_front("no-"); + if (ParamName == "rename-only-inst") { + Result.RenameOnlyInst = Enable; + } else if (ParamName.consume_front("rename-exclude-struct-prefixes=")) { + Result.RenameExcludeStructPrefixes = ParamName; + } else if (ParamName.consume_front("rename-exclude-global-prefixes=")) { + Result.RenameExcludeGlobalPrefixes = ParamName; + } else if (ParamName.consume_front("rename-exclude-alias-prefixes=")) { + Result.RenameExcludeAliasPrefixes = ParamName; + } else if (ParamName.consume_front("rename-exclude-function-prefixes=")) { + Result.RenameExcludeFunctionPrefixes = ParamName; + } else { + return make_error( + formatv("invalid MetaRenamer pass parameter '{0}' ", ParamName) + .str(), + inconvertibleErrorCode()); + } + } + return Result; +} + Expected parseMSanPassOptions(StringRef Params) { MemorySanitizerOptions Result; while (!Params.empty()) { diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 510a505995304..8eead4f5cdc6e 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -103,7 +103,6 @@ MODULE_PASS("pgo-force-function-attrs", PGOForceFunctionAttrsPass(PGOOpt ? PGOOp MODULE_PASS("memprof-context-disambiguation", MemProfContextDisambiguation()) MODULE_PASS("memprof-module", ModuleMemProfilerPass()) MODULE_PASS("mergefunc", MergeFunctionsPass()) -MODULE_PASS("metarenamer", MetaRenamerPass()) MODULE_PASS("module-inline", ModuleInlinerPass()) MODULE_PASS("name-anon-globals", NameAnonGlobalPass()) MODULE_PASS("no-op-module", NoOpModulePass()) @@ -233,7 +232,12 @@ MODULE_PASS_WITH_PARAMS( return StructuralHashPrinterPass(errs(), Options); }, parseStructuralHashPrinterPassOptions, "detailed;call-target-ignored") - +MODULE_PASS_WITH_PARAMS("metarenamer", "MetaRenamerPass", + [](MetaRenamerOptions Options) { + return MetaRenamerPass(Options); + }, + parseMetaRenamerPassOptions, + "rename-exclude-function-prefixes=S;rename-exclude-alias-prefixes=S;rename-exclude-global-prefixes=S;rename-exclude-struct-prefixes=S;no-rename-only-inst;rename-only-inst") #undef MODULE_PASS_WITH_PARAMS #ifndef CGSCC_ANALYSIS diff --git a/llvm/lib/Transforms/Utils/MetaRenamer.cpp b/llvm/lib/Transforms/Utils/MetaRenamer.cpp index fd0112ae529cc..6c47ec2f47e14 100644 --- a/llvm/lib/Transforms/Utils/MetaRenamer.cpp +++ b/llvm/lib/Transforms/Utils/MetaRenamer.cpp @@ -35,36 +35,6 @@ using namespace llvm; -static cl::opt RenameExcludeFunctionPrefixes( - "rename-exclude-function-prefixes", - cl::desc("Prefixes for functions that don't need to be renamed, separated " - "by a comma"), - cl::Hidden); - -static cl::opt RenameExcludeAliasPrefixes( - "rename-exclude-alias-prefixes", - cl::desc("Prefixes for aliases that don't need to be renamed, separated " - "by a comma"), - cl::Hidden); - -static cl::opt RenameExcludeGlobalPrefixes( - "rename-exclude-global-prefixes", - cl::desc( - "Prefixes for global values that don't need to be renamed, separated " - "by a comma"), - cl::Hidden); - -static cl::opt RenameExcludeStructPrefixes( - "rename-exclude-struct-prefixes", - cl::desc("Prefixes for structs that don't need to be renamed, separated " - "by a comma"), - cl::Hidden); - -static cl::opt - RenameOnlyInst("rename-only-inst", cl::init(false), - cl::desc("only rename the instructions in the function"), - cl::Hidden); - static const char *const metaNames[] = { // See http://en.wikipedia.org/wiki/Metasyntactic_variable "foo", "bar", "baz", "quux", "barney", "snork", "zot", "blam", "hoge", @@ -129,7 +99,8 @@ void MetaRename(Function &F) { } void MetaRename(Module &M, - function_ref GetTLI) { + function_ref GetTLI, + MetaRenamerOptions const& Options) { // Seed our PRNG with simple additive sum of ModuleID. We're looking to // simply avoid always having the same function names, and we need to // remain deterministic. @@ -143,10 +114,10 @@ void MetaRename(Module &M, SmallVector ExcludedGlobalsPrefixes; SmallVector ExcludedStructsPrefixes; SmallVector ExcludedFuncPrefixes; - parseExcludedPrefixes(RenameExcludeAliasPrefixes, ExcludedAliasesPrefixes); - parseExcludedPrefixes(RenameExcludeGlobalPrefixes, ExcludedGlobalsPrefixes); - parseExcludedPrefixes(RenameExcludeStructPrefixes, ExcludedStructsPrefixes); - parseExcludedPrefixes(RenameExcludeFunctionPrefixes, ExcludedFuncPrefixes); + parseExcludedPrefixes(Options.RenameExcludeAliasPrefixes, ExcludedAliasesPrefixes); + parseExcludedPrefixes(Options.RenameExcludeGlobalPrefixes, ExcludedGlobalsPrefixes); + parseExcludedPrefixes(Options.RenameExcludeStructPrefixes, ExcludedStructsPrefixes); + parseExcludedPrefixes(Options.RenameExcludeFunctionPrefixes, ExcludedFuncPrefixes); auto IsNameExcluded = [](StringRef &Name, SmallVectorImpl &ExcludedPrefixes) { @@ -164,7 +135,7 @@ void MetaRename(Module &M, IsNameExcluded(Name, ExcludedFuncPrefixes); }; - if (RenameOnlyInst) { + if (Options.RenameOnlyInst) { // Rename all functions for (auto &F : M) { if (ExcludeLibFuncs(F)) @@ -230,7 +201,7 @@ PreservedAnalyses MetaRenamerPass::run(Module &M, ModuleAnalysisManager &AM) { auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & { return FAM.getResult(F); }; - MetaRename(M, GetTLI); + MetaRename(M, GetTLI, Options); return PreservedAnalyses::all(); } diff --git a/llvm/test/Transforms/MetaRenamer/exclude-names.ll b/llvm/test/Transforms/MetaRenamer/exclude-names.ll index 6e088ef7f4190..d53a0f96a51fe 100644 --- a/llvm/test/Transforms/MetaRenamer/exclude-names.ll +++ b/llvm/test/Transforms/MetaRenamer/exclude-names.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=metarenamer -rename-exclude-function-prefixes=my_func -rename-exclude-global-prefixes=my_global -rename-exclude-struct-prefixes=my_struct -rename-exclude-alias-prefixes=my_alias -S %s | FileCheck %s +; RUN: opt -passes='metarenamer' -S %s | FileCheck %s ; Check that excluded names don't get renamed while all the other ones do diff --git a/llvm/test/Transforms/MetaRenamer/only-inst.ll b/llvm/test/Transforms/MetaRenamer/only-inst.ll index f13371519682f..c423bab08e301 100644 --- a/llvm/test/Transforms/MetaRenamer/only-inst.ll +++ b/llvm/test/Transforms/MetaRenamer/only-inst.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=metarenamer -rename-only-inst=1 -S < %s | FileCheck %s +; RUN: opt -passes='metarenamer' -S < %s | FileCheck %s target triple = "x86_64-pc-linux-gnu" ; CHECK: %struct.foo_xxx = type { i32, float, %struct.bar_xxx } From 21e2a364bfb8783d17669dccb42d2d34e9f40abc Mon Sep 17 00:00:00 2001 From: Egor Shamshura Date: Wed, 2 Apr 2025 04:53:30 +0000 Subject: [PATCH 2/5] changed std::string to StringRef, changed error message, sorted by alphabetical order in PassRegistry --- llvm/include/llvm/Transforms/Utils/MetaRenamer.h | 8 ++++---- llvm/lib/Passes/PassBuilder.cpp | 2 +- llvm/lib/Passes/PassRegistry.def | 2 +- llvm/lib/Transforms/Utils/MetaRenamer.cpp | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/MetaRenamer.h b/llvm/include/llvm/Transforms/Utils/MetaRenamer.h index be2c66b8cdaed..4434fb4ac89a5 100644 --- a/llvm/include/llvm/Transforms/Utils/MetaRenamer.h +++ b/llvm/include/llvm/Transforms/Utils/MetaRenamer.h @@ -21,17 +21,17 @@ namespace llvm { struct MetaRenamerOptions { /// Prefixes for functions that don't need to be renamed, separated by a comma - std::string RenameExcludeFunctionPrefixes; + StringRef RenameExcludeFunctionPrefixes; /// Prefixes for aliases that don't need to be renamed, separated by a comma - std::string RenameExcludeAliasPrefixes; + StringRef RenameExcludeAliasPrefixes; /// Prefixes for global values that don't need to be renamed, separated by a /// comma - std::string RenameExcludeGlobalPrefixes; + StringRef RenameExcludeGlobalPrefixes; /// Prefixes for structs that don't need to be renamed, separated by a comma - std::string RenameExcludeStructPrefixes; + StringRef RenameExcludeStructPrefixes; /// Only rename the instructions in the function bool RenameOnlyInst = false; diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 52c403c5ff0ba..62e038e1e53f2 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -966,7 +966,7 @@ Expected parseMetaRenamerPassOptions(StringRef Params) { Result.RenameExcludeFunctionPrefixes = ParamName; } else { return make_error( - formatv("invalid MetaRenamer pass parameter '{0}' ", ParamName) + formatv("invalid metarenamer pass parameter '{0}' ", ParamName) .str(), inconvertibleErrorCode()); } diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 8eead4f5cdc6e..ffe2f2ab34d53 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -237,7 +237,7 @@ MODULE_PASS_WITH_PARAMS("metarenamer", "MetaRenamerPass", return MetaRenamerPass(Options); }, parseMetaRenamerPassOptions, - "rename-exclude-function-prefixes=S;rename-exclude-alias-prefixes=S;rename-exclude-global-prefixes=S;rename-exclude-struct-prefixes=S;no-rename-only-inst;rename-only-inst") + "rename-exclude-alias-prefixes=S;rename-exclude-function-prefixes=S;rename-exclude-global-prefixes=S;rename-exclude-struct-prefixes=S;no-rename-only-inst;rename-only-inst") #undef MODULE_PASS_WITH_PARAMS #ifndef CGSCC_ANALYSIS diff --git a/llvm/lib/Transforms/Utils/MetaRenamer.cpp b/llvm/lib/Transforms/Utils/MetaRenamer.cpp index 6c47ec2f47e14..205236955c12c 100644 --- a/llvm/lib/Transforms/Utils/MetaRenamer.cpp +++ b/llvm/lib/Transforms/Utils/MetaRenamer.cpp @@ -100,7 +100,7 @@ void MetaRename(Function &F) { void MetaRename(Module &M, function_ref GetTLI, - MetaRenamerOptions const& Options) { + const MetaRenamerOptions &Options) { // Seed our PRNG with simple additive sum of ModuleID. We're looking to // simply avoid always having the same function names, and we need to // remain deterministic. From 61327d753114e6b3ad5d57a59811ab163818d6a2 Mon Sep 17 00:00:00 2001 From: Egor Shamshura Date: Wed, 2 Apr 2025 05:59:48 +0000 Subject: [PATCH 3/5] added invalid pass parameter test, added semicolon substr test, added quote test; updated parser --- llvm/lib/Passes/PassBuilder.cpp | 43 ++++++++++++++++--- .../Transforms/MetaRenamer/exclude-names.ll | 1 + .../MetaRenamer/invalid-pass-parameter.ll | 9 ++++ .../MetaRenamer/semicolon-substr.ll | 8 ++++ 4 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 llvm/test/Transforms/MetaRenamer/invalid-pass-parameter.ll create mode 100644 llvm/test/Transforms/MetaRenamer/semicolon-substr.ll diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 62e038e1e53f2..2951959602afc 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -950,20 +950,51 @@ parseLowerAllowCheckPassOptions(StringRef Params) { Expected parseMetaRenamerPassOptions(StringRef Params) { MetaRenamerOptions Result; + bool InQuotes = false; + while (!Params.empty()) { StringRef ParamName; - std::tie(ParamName, Params) = Params.split(';'); + size_t SplitPos = 0; + + for (size_t I = 0; I < Params.size(); ++I) { + if (Params[I] == '"') { + InQuotes = !InQuotes; + } else if (Params[I] == ';' && !InQuotes) { + SplitPos = I; + break; + } + } + + if (SplitPos == 0) { + ParamName = Params; + Params = ""; + } else { + ParamName = Params.substr(0, SplitPos); + Params = Params.substr(SplitPos + 1); + } + bool Enable = !ParamName.consume_front("no-"); + + auto ExtractValue = [](StringRef Str) -> StringRef { + if (Str.starts_with("\"")) { + Str = Str.drop_front(); + if (Str.ends_with("\"")) { + Str = Str.drop_back(); + } + } + return Str; + }; + if (ParamName == "rename-only-inst") { Result.RenameOnlyInst = Enable; } else if (ParamName.consume_front("rename-exclude-struct-prefixes=")) { - Result.RenameExcludeStructPrefixes = ParamName; + Result.RenameExcludeStructPrefixes = ExtractValue(ParamName); } else if (ParamName.consume_front("rename-exclude-global-prefixes=")) { - Result.RenameExcludeGlobalPrefixes = ParamName; + Result.RenameExcludeGlobalPrefixes = ExtractValue(ParamName); } else if (ParamName.consume_front("rename-exclude-alias-prefixes=")) { - Result.RenameExcludeAliasPrefixes = ParamName; + Result.RenameExcludeAliasPrefixes = ExtractValue(ParamName); } else if (ParamName.consume_front("rename-exclude-function-prefixes=")) { - Result.RenameExcludeFunctionPrefixes = ParamName; + Result.RenameExcludeFunctionPrefixes = ExtractValue(ParamName); } else { return make_error( formatv("invalid metarenamer pass parameter '{0}' ", ParamName) @@ -971,9 +1002,11 @@ Expected parseMetaRenamerPassOptions(StringRef Params) { inconvertibleErrorCode()); } } + return Result; } + Expected parseMSanPassOptions(StringRef Params) { MemorySanitizerOptions Result; while (!Params.empty()) { diff --git a/llvm/test/Transforms/MetaRenamer/exclude-names.ll b/llvm/test/Transforms/MetaRenamer/exclude-names.ll index d53a0f96a51fe..1002216f632ac 100644 --- a/llvm/test/Transforms/MetaRenamer/exclude-names.ll +++ b/llvm/test/Transforms/MetaRenamer/exclude-names.ll @@ -1,4 +1,5 @@ ; RUN: opt -passes='metarenamer' -S %s | FileCheck %s +; RUN: opt -passes='metarenamer' -S %s | FileCheck %s ; Check that excluded names don't get renamed while all the other ones do diff --git a/llvm/test/Transforms/MetaRenamer/invalid-pass-parameter.ll b/llvm/test/Transforms/MetaRenamer/invalid-pass-parameter.ll new file mode 100644 index 0000000000000..2e672f9409b12 --- /dev/null +++ b/llvm/test/Transforms/MetaRenamer/invalid-pass-parameter.ll @@ -0,0 +1,9 @@ +; RUN: not opt -S -passes='metarenamer' %s 2>&1 | FileCheck -check-prefix=ERR %s + +; ERR: invalid metarenamer pass parameter 'invalid' + +define i32 @0(i32, i32) { + %3 = add i32 %0, %1 + ret i32 %3 +} + diff --git a/llvm/test/Transforms/MetaRenamer/semicolon-substr.ll b/llvm/test/Transforms/MetaRenamer/semicolon-substr.ll new file mode 100644 index 0000000000000..ca76316189e01 --- /dev/null +++ b/llvm/test/Transforms/MetaRenamer/semicolon-substr.ll @@ -0,0 +1,8 @@ +; RUN: opt -passes='metarenamer' -S %s | FileCheck %s + +; CHECK: define i32 @"my_fu;nc"( +define i32 @"my_fu;nc"(i32, i32) { + %3 = add i32 %0, %1 + ret i32 %3 +} + From bbfaafc52dd0a3d9cfc85f2f7625b93947ac66f7 Mon Sep 17 00:00:00 2001 From: Egor Shamshura Date: Wed, 2 Apr 2025 08:40:24 +0000 Subject: [PATCH 4/5] clang-formatted PassRegistry.def, changed syntax to be the same as internalize pass, changed tests --- .../llvm/Transforms/Utils/MetaRenamer.h | 17 ++++---- llvm/lib/Passes/PassBuilder.cpp | 39 +++---------------- llvm/lib/Passes/PassRegistry.def | 13 ++++--- llvm/lib/Transforms/Utils/MetaRenamer.cpp | 31 +++------------ .../Transforms/MetaRenamer/exclude-names.ll | 1 - .../MetaRenamer/semicolon-substr.ll | 12 ++++-- 6 files changed, 34 insertions(+), 79 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/MetaRenamer.h b/llvm/include/llvm/Transforms/Utils/MetaRenamer.h index 4434fb4ac89a5..165940428b158 100644 --- a/llvm/include/llvm/Transforms/Utils/MetaRenamer.h +++ b/llvm/include/llvm/Transforms/Utils/MetaRenamer.h @@ -20,18 +20,17 @@ namespace llvm { struct MetaRenamerOptions { - /// Prefixes for functions that don't need to be renamed, separated by a comma - StringRef RenameExcludeFunctionPrefixes; + /// Prefixes for functions that don't need to be renamed + SmallVector ExcludedFunctionsPrefixes; - /// Prefixes for aliases that don't need to be renamed, separated by a comma - StringRef RenameExcludeAliasPrefixes; + /// Prefixes for aliases that don't need to be renamed + SmallVector ExcludedAliasesPrefixes; - /// Prefixes for global values that don't need to be renamed, separated by a - /// comma - StringRef RenameExcludeGlobalPrefixes; + /// Prefixes for global values that don't need to be renamed + SmallVector ExcludedGlobalsPrefixes; - /// Prefixes for structs that don't need to be renamed, separated by a comma - StringRef RenameExcludeStructPrefixes; + /// Prefixes for structs that don't need to be renamed + SmallVector ExcludedStructsPrefixes; /// Only rename the instructions in the function bool RenameOnlyInst = false; diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 2951959602afc..00e512250282d 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -950,51 +950,22 @@ parseLowerAllowCheckPassOptions(StringRef Params) { Expected parseMetaRenamerPassOptions(StringRef Params) { MetaRenamerOptions Result; - bool InQuotes = false; while (!Params.empty()) { StringRef ParamName; - size_t SplitPos = 0; - - for (size_t I = 0; I < Params.size(); ++I) { - if (Params[I] == '"') { - InQuotes = !InQuotes; - } else if (Params[I] == ';' && !InQuotes) { - SplitPos = I; - break; - } - } - - if (SplitPos == 0) { - ParamName = Params; - Params = ""; - } else { - ParamName = Params.substr(0, SplitPos); - Params = Params.substr(SplitPos + 1); - } - + std::tie(ParamName, Params) = Params.split(';'); bool Enable = !ParamName.consume_front("no-"); - auto ExtractValue = [](StringRef Str) -> StringRef { - if (Str.starts_with("\"")) { - Str = Str.drop_front(); - if (Str.ends_with("\"")) { - Str = Str.drop_back(); - } - } - return Str; - }; - if (ParamName == "rename-only-inst") { Result.RenameOnlyInst = Enable; } else if (ParamName.consume_front("rename-exclude-struct-prefixes=")) { - Result.RenameExcludeStructPrefixes = ExtractValue(ParamName); + Result.ExcludedStructsPrefixes.push_back(ParamName); } else if (ParamName.consume_front("rename-exclude-global-prefixes=")) { - Result.RenameExcludeGlobalPrefixes = ExtractValue(ParamName); + Result.ExcludedGlobalsPrefixes.push_back(ParamName); } else if (ParamName.consume_front("rename-exclude-alias-prefixes=")) { - Result.RenameExcludeAliasPrefixes = ExtractValue(ParamName); + Result.ExcludedAliasesPrefixes.push_back(ParamName); } else if (ParamName.consume_front("rename-exclude-function-prefixes=")) { - Result.RenameExcludeFunctionPrefixes = ExtractValue(ParamName); + Result.ExcludedFunctionsPrefixes.push_back(ParamName); } else { return make_error( formatv("invalid metarenamer pass parameter '{0}' ", ParamName) diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index ffe2f2ab34d53..7d5be4a6af2a5 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -232,12 +232,13 @@ MODULE_PASS_WITH_PARAMS( return StructuralHashPrinterPass(errs(), Options); }, parseStructuralHashPrinterPassOptions, "detailed;call-target-ignored") -MODULE_PASS_WITH_PARAMS("metarenamer", "MetaRenamerPass", - [](MetaRenamerOptions Options) { - return MetaRenamerPass(Options); - }, - parseMetaRenamerPassOptions, - "rename-exclude-alias-prefixes=S;rename-exclude-function-prefixes=S;rename-exclude-global-prefixes=S;rename-exclude-struct-prefixes=S;no-rename-only-inst;rename-only-inst") +MODULE_PASS_WITH_PARAMS( + "metarenamer", "MetaRenamerPass", + [](MetaRenamerOptions Options) { return MetaRenamerPass(Options); }, + parseMetaRenamerPassOptions, + "rename-exclude-function-prefixes=S;rename-exclude-alias-prefixes=S;rename-" + "exclude-global-prefixes=S;rename-exclude-struct-prefixes=S;no-rename-only-" + "inst;rename-only-inst") #undef MODULE_PASS_WITH_PARAMS #ifndef CGSCC_ANALYSIS diff --git a/llvm/lib/Transforms/Utils/MetaRenamer.cpp b/llvm/lib/Transforms/Utils/MetaRenamer.cpp index 205236955c12c..6f694c4467031 100644 --- a/llvm/lib/Transforms/Utils/MetaRenamer.cpp +++ b/llvm/lib/Transforms/Utils/MetaRenamer.cpp @@ -66,18 +66,6 @@ struct Renamer { PRNG prng; }; -static void -parseExcludedPrefixes(StringRef PrefixesStr, - SmallVectorImpl &ExcludedPrefixes) { - for (;;) { - auto PrefixesSplit = PrefixesStr.split(','); - if (PrefixesSplit.first.empty()) - break; - ExcludedPrefixes.push_back(PrefixesSplit.first); - PrefixesStr = PrefixesSplit.second; - } -} - void MetaRenameOnlyInstructions(Function &F) { for (auto &I : instructions(F)) if (!I.getType()->isVoidTy() && I.getName().empty()) @@ -110,17 +98,8 @@ void MetaRename(Module &M, Renamer renamer(randSeed); - SmallVector ExcludedAliasesPrefixes; - SmallVector ExcludedGlobalsPrefixes; - SmallVector ExcludedStructsPrefixes; - SmallVector ExcludedFuncPrefixes; - parseExcludedPrefixes(Options.RenameExcludeAliasPrefixes, ExcludedAliasesPrefixes); - parseExcludedPrefixes(Options.RenameExcludeGlobalPrefixes, ExcludedGlobalsPrefixes); - parseExcludedPrefixes(Options.RenameExcludeStructPrefixes, ExcludedStructsPrefixes); - parseExcludedPrefixes(Options.RenameExcludeFunctionPrefixes, ExcludedFuncPrefixes); - auto IsNameExcluded = [](StringRef &Name, - SmallVectorImpl &ExcludedPrefixes) { + const SmallVectorImpl &ExcludedPrefixes) { return any_of(ExcludedPrefixes, [&Name](auto &Prefix) { return Name.starts_with(Prefix); }); }; @@ -132,7 +111,7 @@ void MetaRename(Module &M, StringRef Name = F.getName(); return Name.starts_with("llvm.") || (!Name.empty() && Name[0] == 1) || GetTLI(F).getLibFunc(F, Tmp) || - IsNameExcluded(Name, ExcludedFuncPrefixes); + IsNameExcluded(Name, Options.ExcludedFunctionsPrefixes); }; if (Options.RenameOnlyInst) { @@ -149,7 +128,7 @@ void MetaRename(Module &M, for (GlobalAlias &GA : M.aliases()) { StringRef Name = GA.getName(); if (Name.starts_with("llvm.") || (!Name.empty() && Name[0] == 1) || - IsNameExcluded(Name, ExcludedAliasesPrefixes)) + IsNameExcluded(Name, Options.ExcludedAliasesPrefixes)) continue; GA.setName("alias"); @@ -159,7 +138,7 @@ void MetaRename(Module &M, for (GlobalVariable &GV : M.globals()) { StringRef Name = GV.getName(); if (Name.starts_with("llvm.") || (!Name.empty() && Name[0] == 1) || - IsNameExcluded(Name, ExcludedGlobalsPrefixes)) + IsNameExcluded(Name, Options.ExcludedGlobalsPrefixes)) continue; GV.setName("global"); @@ -171,7 +150,7 @@ void MetaRename(Module &M, for (StructType *STy : StructTypes) { StringRef Name = STy->getName(); if (STy->isLiteral() || Name.empty() || - IsNameExcluded(Name, ExcludedStructsPrefixes)) + IsNameExcluded(Name, Options.ExcludedStructsPrefixes)) continue; SmallString<128> NameStorage; diff --git a/llvm/test/Transforms/MetaRenamer/exclude-names.ll b/llvm/test/Transforms/MetaRenamer/exclude-names.ll index 1002216f632ac..d53a0f96a51fe 100644 --- a/llvm/test/Transforms/MetaRenamer/exclude-names.ll +++ b/llvm/test/Transforms/MetaRenamer/exclude-names.ll @@ -1,5 +1,4 @@ ; RUN: opt -passes='metarenamer' -S %s | FileCheck %s -; RUN: opt -passes='metarenamer' -S %s | FileCheck %s ; Check that excluded names don't get renamed while all the other ones do diff --git a/llvm/test/Transforms/MetaRenamer/semicolon-substr.ll b/llvm/test/Transforms/MetaRenamer/semicolon-substr.ll index ca76316189e01..131a03cebefca 100644 --- a/llvm/test/Transforms/MetaRenamer/semicolon-substr.ll +++ b/llvm/test/Transforms/MetaRenamer/semicolon-substr.ll @@ -1,7 +1,13 @@ -; RUN: opt -passes='metarenamer' -S %s | FileCheck %s +; RUN: opt -passes='metarenamer' -S %s | FileCheck %s -; CHECK: define i32 @"my_fu;nc"( -define i32 @"my_fu;nc"(i32, i32) { +; CHECK: define i32 @my_func( +define i32 @my_func(i32, i32) { + %3 = add i32 %0, %1 + ret i32 %3 +} + +; CHECK: define i32 @some_func( +define i32 @some_func(i32, i32) { %3 = add i32 %0, %1 ret i32 %3 } From e1c3ba78b59c43e92fe95067cec8433efe25cbd8 Mon Sep 17 00:00:00 2001 From: Egor Shamshura Date: Thu, 3 Apr 2025 06:39:00 +0000 Subject: [PATCH 5/5] removed extra newline --- llvm/lib/Passes/PassBuilder.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 00e512250282d..ffa91f1f766ad 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -977,7 +977,6 @@ Expected parseMetaRenamerPassOptions(StringRef Params) { return Result; } - Expected parseMSanPassOptions(StringRef Params) { MemorySanitizerOptions Result; while (!Params.empty()) {