> On 17 Jun 2025, at 4:18 pm, Dhruv Chawla <[email protected]> wrote:
>
> On 17/06/25 06:10, Kugan Vivekanandarajah wrote:
>> External email: Use caution opening links or attachments
>> Hi,
>> As discusses earlier, get_original_name is used to match profile binary
>> names to
>> the symbol names in the IR during auto-profile pass.
>
> I think it could be good to add a link to the mailing list archive for this.
>
>> Hence, we want to strip the compiler added suffixes for names
>> that are generated after auto-profile pass.
>> Names we should strip:
>> * SRA clones (of the form foo.isra.0)
>> * IPA-CP clonse (in the form bar.constprop.123)
>> * Partial inlining clones (foo.part.0, foo.cold)
>> * lto_priv.0
>> * Nested function as foo.part.0
>> Others that should not be stripped:
>> * target_clones (foo.arch_x86_64_v2, foo.avx2)
>> * OpenMP related suffixes (.omp_fn.N, .omp_cpyfn.N)
>> Tested by running autoprofiledbootstrap and tree-prof check that
>> exercises auto-profile pass.
>> gcc/ChangeLog:
>> * auto-profile.cc (isAsciiDigit): New.
>> (get_original_name): Strip suffixes only for compiler generated
>> names tat happens after auto-profile.
>> Thanks,
>> Kugan
>> diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc
>> index e12b3048f20..c787bf2d220 100644
>> --- a/gcc/auto-profile.cc
>> +++ b/gcc/auto-profile.cc
>> @@ -345,16 +345,50 @@ static gcov_summary *afdo_profile_info;
>> /* Helper functions. */
>> +bool isAsciiDigit (char c)
>> +{
>> + return c >= '0' && c <= '9';
>> +}
>
> Not sure about the naming conventions, and slight nit, sorry,
> but shouldn't this be snake case, like 'is_ascii_digit'? Also,
> it looks like GCC has an `ISDIGIT` macro, could that be used
> instead?
>
>> +
>> /* Return the original name of NAME: strip the suffix that starts
>> - with '.' Caller is responsible for freeing RET. */
>> + with '.' for names that are generetad after auto-profile pass.
>> + This is to match profiled names with the names in the IR at this stage.
>> + Caller is responsible for freeing RET. */
>> static char *
>> get_original_name (const char *name)
>> {
>> char *ret = xstrdup (name);
>> - char *find = strchr (ret, '.');
>> - if (find != NULL)
>> - *find = 0;
>> + char *last_dot = strrchr (ret, '.');
>> + if (last_dot == NULL)
>> + return ret;
>> + bool only_digits = true;
>> + char *ptr = last_dot;
>> + while (*(++ptr) != 0)
>> + if (!isAsciiDigit (*ptr))
>> + {
>> + only_digits = false;
>> + break;
>> + }
>> + if (only_digits)
>> + *last_dot = 0;
>> + char *next_dot = strrchr (ret, '.');
>> + /* if nested function such as foo.0, return foo. */
>> + if (next_dot == NULL)
>> + return ret;
>> + /* Suffixes of clones that compiler generates after auto-profile. */
>> + const char *suffixes[] = {"isra", "constprop", ".lto_priv", "part",
>> "cold"};
>
> ".lto_priv" should just be "lto_priv" here.
Yes, it is a typo. Let me fix this.
>
>> + for (unsigned i = 0; i < sizeof (suffixes); ++i)
>> + {
>> + if (strncmp (next_dot + 1, suffixes[i], strlen (suffixes[i])) == 0)
>> + {
>> + *next_dot = 0;
>> + return ret;
>> + }
>> + }
>> + /* Otherwise, it is for clones such as .omp_fn.N that was done before
>> + auto-profile and should be kept as it is. */
>> + *last_dot = '.';
>> return ret;
>> }
>
> It looks like this function only strips the first suffix? I don't think this
> would work for functions with multiple suffixes like
> "bar1.constprop.0.isra.0",
> where an IPA-CP clone has an SRA clone created for it. I haven't tested the
> patch, but I think it would return "bar1.constprop.0" for the above function
> name, whereas the current implementation returns "bar1" as expected.
Good point. I think we should do it recursively. Let me fix that.
Thanks,
Kugan
>
> --
> Regards,
> Dhruv