Hi.

Target clones have DECL_ARTIFICIAL set to 1, but we want to
provide --coverage for that. With patched GCC on can see:

        -:    0:Source:pr85370.c
        -:    0:Graph:pr85370.gcno
        -:    0:Data:pr85370.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:__attribute__((target_clones("arch=slm","default")))
        1:    2:int foo1 (int a, int b) { // executed #### wrongly
        1:    3:  return a + b;
        -:    4:}
------------------
foo1.arch_slm.0:
        0:    2:int foo1 (int a, int b) { // executed #### wrongly
        0:    3:  return a + b;
        -:    4:}
------------------
foo1.default.1:
        1:    2:int foo1 (int a, int b) { // executed #### wrongly
        1:    3:  return a + b;
        -:    4:}
------------------
        -:    5:
        1:    6:int foo2 (int a, int b) {
        1:    7:  return a + b;
        -:    8:}
        -:    9:
        1:   10:int main() {
        1:   11:  foo1(1, 1);
        1:   12:  foo2(1, 1);
        1:   13:  return 1;
        -:   14:}

Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
Will install in couple of days if no objection.

Martin

gcc/ChangeLog:

2018-07-25  Martin Liska  <mli...@suse.cz>

        PR gcov-profile/85370
        * coverage.c (coverage_begin_function): Do not mark target
        clones as artificial functions.
---
 gcc/coverage.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)


diff --git a/gcc/coverage.c b/gcc/coverage.c
index da171c84d3c..bae6f5cafac 100644
--- a/gcc/coverage.c
+++ b/gcc/coverage.c
@@ -656,7 +656,8 @@ coverage_begin_function (unsigned lineno_checksum, unsigned cfg_checksum)
   gcov_write_unsigned (cfg_checksum);
   gcov_write_string (IDENTIFIER_POINTER
 		     (DECL_ASSEMBLER_NAME (current_function_decl)));
-  gcov_write_unsigned (DECL_ARTIFICIAL (current_function_decl));
+  gcov_write_unsigned (DECL_ARTIFICIAL (current_function_decl)
+		       && !DECL_FUNCTION_VERSIONED (current_function_decl));
   gcov_write_filename (xloc.file);
   gcov_write_unsigned (xloc.line);
   gcov_write_unsigned (xloc.column);

Reply via email to