From a31a1219a83f85cfeb9bb8fbf502835fb9e70572 Mon Sep 17 00:00:00 2001 From: Erik Eckstein Date: Tue, 23 Sep 2025 11:37:58 +0200 Subject: [PATCH] GenericSpecializationMangler: don't assume a SIL function name can always be demangled Demangling can fail if the user provides a custom not-demangable `@_silgen_name` (but still containing the "$s" mangling prefix). --- .../Utils/GenericSpecializationMangler.cpp | 4 +++- test/SILOptimizer/specialize_ossa.sil | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/SIL/Utils/GenericSpecializationMangler.cpp b/lib/SIL/Utils/GenericSpecializationMangler.cpp index 27cf65e1b8cc5..c2ce5017ec17d 100644 --- a/lib/SIL/Utils/GenericSpecializationMangler.cpp +++ b/lib/SIL/Utils/GenericSpecializationMangler.cpp @@ -63,8 +63,10 @@ std::string SpecializationMangler::finalize() { StringRef FuncName = Function ? Function->getName() : StringRef(FunctionName); NodePointer FuncTopLevel = nullptr; if (FuncName.starts_with(MANGLING_PREFIX_STR)) { + // Demangling can fail, i.e. FuncTopLevel == nullptr, if the user provides + // a custom not-demangable `@_silgen_name` (but still containing the "$s" + // mangling prefix). FuncTopLevel = D.demangleSymbol(FuncName); - assert(FuncTopLevel); } else if (FuncName.starts_with(MANGLING_PREFIX_EMBEDDED_STR)) { FuncTopLevel = D.demangleSymbol(FuncName); diff --git a/test/SILOptimizer/specialize_ossa.sil b/test/SILOptimizer/specialize_ossa.sil index 72de52e5b8661..3a15dac511c06 100644 --- a/test/SILOptimizer/specialize_ossa.sil +++ b/test/SILOptimizer/specialize_ossa.sil @@ -1665,3 +1665,22 @@ bb0(%0 : $Int): dealloc_stack %1 return %11 } + + +sil hidden [ossa] @$s_custom_not_demangable_name : $@convention(thin) (@thick T.Type) -> () { +bb0(%0 : $@thick T.Type): + %8 = tuple () + return %8 : $() +} + +// CHECK-LABEL: sil [ossa] @call_custom_name : +// CHECK: function_ref @$s29$s_custom_not_demangable_nameSi_Ttg5 : $@convention(thin) () -> () +// CHECK: } // end sil function 'call_custom_name' +sil [ossa] @call_custom_name : $@convention(thin) () -> () { +bb0: + %2 = function_ref @$s_custom_not_demangable_name : $@convention(thin) <τ_0_0> (@thick τ_0_0.Type) -> () + %3 = metatype $@thick Int.Type + %4 = apply %2(%3) : $@convention(thin) <τ_0_0> (@thick τ_0_0.Type) -> () + %5 = tuple () + return %5 : $() +}