https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120229

            Bug ID: 120229
           Summary: [GCOV] AutoFDO cannot distinguish privatized functions
                    of different LTO partitions
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: gcov-profile
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dhruvc at nvidia dot com
  Target Milestone: ---

The GCOV file format as used by the AutoFDO tools does not track source file
information for functions. This means that when resolving functions by
stripping
the suffixes from the profile information, the auto-profile pass ends up
using only the first instance of a function for all `function_instance's with
the same base name.

Example:

=== a.cpp
__attribute__((noinline)) static void effect_1() {}

void global() { effect_1(); }
===

=== b.cpp
__attribute__((noinline)) static void effect_1() {}

extern void global();
int main() {
  /* ... for-loop ... */
  global();
  effect_1();
  /* } */
}
===

This example will create `effect_1.lto_priv.0' and `effect_1.lto_priv.1' if
both functions are assigned to the same LTO partition. If the indices in the
string table are 1 and 2, auto-profile will track these as: 1 -> `effect_1',
2 -> `effect_1' after stripping the suffixes. When annotating these functions,
it will end up picking 1 -> `effect_1' for both of them, using the incorrect
profile information for the second function.

The solution for this problem is to track the source-file name in GCOV, by
pairing each function-name entry with the name of the source file it came from.

TODO: The downside to this solution is that different directories having source
files with the same name containing static functions with the same name,
assigned to the same LTO partition will exhibit the old, broken behaviour.

We are currently working on a prototype patch that fixes this bug.

Reply via email to