<alfie.richa...@arm.com> writes: > From: Alfie Richards <alfie.richa...@arm.com> > > This is similar to clone_function_name and its siblings but takes an > identifier tree node rather than a function declaration. > > This is to be used in conjunction with the identifier node stored in > cgraph_function_version_info::assembler_name to mangle FMV functions in > later patches. > > gcc/ChangeLog: > > * cgraph.h (clone_identifier): New function. > * cgraphclones.cc (clone_identifier): New function. > clone_function_name: Refactored to use clone_identifier. > --- > gcc/cgraph.h | 2 ++ > gcc/cgraphclones.cc | 58 +++++++++++++++++++++++++++++++++++++++------ > 2 files changed, 53 insertions(+), 7 deletions(-) > > diff --git a/gcc/cgraph.h b/gcc/cgraph.h > index deca564a8e3..189fa74497b 100644 > --- a/gcc/cgraph.h > +++ b/gcc/cgraph.h > @@ -2644,6 +2644,8 @@ tree clone_function_name (const char *name, const char > *suffix, > tree clone_function_name (tree decl, const char *suffix, > unsigned long number); > tree clone_function_name (tree decl, const char *suffix); > +tree clone_identifier (tree decl, const char *suffix, > + bool filter_suffix = false); > > void tree_function_versioning (tree, tree, vec<ipa_replace_map *, va_gc> *, > ipa_param_adjustments *, > diff --git a/gcc/cgraphclones.cc b/gcc/cgraphclones.cc > index c160e8b6985..998a419fac8 100644 > --- a/gcc/cgraphclones.cc > +++ b/gcc/cgraphclones.cc > @@ -570,6 +570,32 @@ clone_function_name (tree decl, const char *suffix) > /* For consistency this needs to behave the same way as > ASM_FORMAT_PRIVATE_NAME does, but without the final number > suffix. */ > + return clone_identifier (identifier, suffix); > +} > + > +/* Return true if symbol is valid in assembler name. */ > + > +static bool > +is_valid_asm_symbol (char c) > +{ > + if ('a' <= c && c <= 'z') > + return true; > + if ('A' <= c && c <= 'Z') > + return true; > + if ('0' <= c && c <= '9') > + return true; > + if (c == '_') > + return true; > + return false; > +} > + > +/* Return a new clone of ID ending with the string SUFFIX. > + If FILTER_SUFFIX is true, any illegal asm characters in the SUFFIX are > + replaced with _. */ > + > +tree > +clone_identifier (tree id, const char *suffix, bool filter_suffix) > +{ > char *separator = XALLOCAVEC (char, 2); > separator[0] = symbol_table::symbol_suffix_separator (); > separator[1] = 0; > @@ -578,14 +604,32 @@ clone_function_name (tree decl, const char *suffix) > #else > const char *prefix = ""; > #endif > - char *result = ACONCAT ((prefix, > - IDENTIFIER_POINTER (identifier), > - separator, > - suffix, > - (char*)0)); > - return get_identifier (result); > -} > + if (!suffix) > + suffix = ""; > > + if (!filter_suffix) > + { > + char *result = ACONCAT ( > + (prefix, IDENTIFIER_POINTER (id), separator, suffix, (char *) 0)); > + return get_identifier (result); > + } > + else > + { > + /* Replace any illegal chars with _. */ > + int suffix_len = strlen (suffix); > + char *converted_suffix = XALLOCAVEC (char, suffix_len);
This should be suffix_len + 1, else we'll write beyond the end of the array. OK with that change. I'm a little surprised that we use ACONCAT on user input strings, since that could blow the stack for C++ symbols on small-stack hosts. It's a pre-existing choice, though, so I agree that this patch should be consistent. Thanks, Richard > + for (int i = 0; i < suffix_len; i++) > + if (!is_valid_asm_symbol (suffix[i])) > + converted_suffix[i] = '_'; > + else > + converted_suffix[i] = suffix[i]; > + converted_suffix[suffix_len] = '\0'; > + > + char *result = ACONCAT ((prefix, IDENTIFIER_POINTER (id), separator, > + converted_suffix, (char *) 0)); > + return get_identifier (result); > + } > +} > > /* Create callgraph node clone with new declaration. The actual body will be > copied later at compilation stage. The name of the new clone will be