[Google] Use line offset instead of absolute lineno to represent AutoFDO profile

Xinliang David Li davidxl@google.com
Thu Apr 11 21:57:00 GMT 2013


Ok.

As followup, the profile generation tool should be moved into compiler
space to avoid format mismatch.

David

On Wed, Apr 10, 2013 at 4:47 PM, Dehao Chen <dehao@google.com> wrote:
> Hi,
>
> This patch
> 1. Uses relative line offset (lineno - start_lineno_of_function) to
> represent AutoFDO profile. This ensures profile still work for
> modified source code.
> 2. When matching the profile, add function name (bfd_name) to match
> the inline stack.
>
> Bootstrapped and passed regression tests.
>
> Is it okay for google branches?
>
> Thanks,
> Dehao
>
> diff --git a/gcc/auto-profile.c b/gcc/auto-profile.c
> index d0ab1dc..07125e1 100644
> --- a/gcc/auto-profile.c
> +++ b/gcc/auto-profile.c
> @@ -267,7 +267,9 @@ afdo_stack_hash (const void *stack)
>    for (i = 0; i < s->size; i++) {
>      const struct gcov_callsite_pos *p = s->stack + i;
>      const char *file = afdo_get_filename (p->file);
> +    const char *func = afdo_get_bfd_name (p->func);
>      h = iterative_hash (file, strlen (file), h);
> +    h = iterative_hash (func, strlen (func), h);
>      h = iterative_hash (&p->line, sizeof (p->line), h);
>      if (i == 0)
>        h = iterative_hash (&p->discr, sizeof (p->discr), h);
> @@ -311,6 +313,7 @@ afdo_stack_eq (const void *p, const void *q)
>        const struct gcov_callsite_pos *p1 = s1->stack + i;
>        const struct gcov_callsite_pos *p2 = s2->stack + i;
>        if (strcmp (afdo_get_filename(p1->file), afdo_get_filename(p2->file))
> +  || strcmp (afdo_get_bfd_name(p1->func), afdo_get_bfd_name (p2->func))
>    || p1->line != p2->line || (i== 0 && p1->discr != p2->discr))
>   return 0;
>      }
> @@ -538,10 +541,10 @@ get_inline_stack_size_by_edge (struct cgraph_edge *edge)
>    return size;
>  }
>
> -/* Return the function name of a given lexical BLOCK.  */
> +/* Return the function decl of a given lexical BLOCK.  */
>
> -static const char *
> -get_function_name_from_block (tree block)
> +static tree
> +get_function_decl_from_block (tree block)
>  {
>    tree decl;
>    for (decl = BLOCK_ABSTRACT_ORIGIN (block);
> @@ -549,7 +552,7 @@ get_function_name_from_block (tree block)
>         decl = BLOCK_ABSTRACT_ORIGIN (decl))
>      if (TREE_CODE (decl) == FUNCTION_DECL)
>        break;
> -  return decl ? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)) : NULL;
> +  return decl;
>  }
>
>  /* Store the inline stack of STMT to POS_STACK, return the size of the
> @@ -583,16 +586,22 @@ get_inline_stack_by_stmt (gimple stmt, tree decl,
>         block && (TREE_CODE (block) == BLOCK);
>         block = BLOCK_SUPERCONTEXT (block))
>      {
> +      tree decl = get_function_decl_from_block (block);
>        if (LOCATION_LOCUS (BLOCK_SOURCE_LOCATION (block)) == UNKNOWN_LOCATION)
>   continue;
>        loc = BLOCK_SOURCE_LOCATION (block);
>        pos_stack[idx].file = expand_location (loc).file;
>        pos_stack[idx].line = expand_location (loc).line;
> -      pos_stack[idx - 1].func = get_function_name_from_block (block);
> +      pos_stack[idx - 1].func =
> +          decl ? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)) : NULL;
> +      pos_stack[idx - 1].line -= decl ? DECL_SOURCE_LINE (decl) : 0;
>        pos_stack[idx++].discr = 0;
>      }
>    if (decl)
> -    pos_stack[idx - 1].func = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
> +    {
> +      pos_stack[idx - 1].func = IDENTIFIER_POINTER
> (DECL_ASSEMBLER_NAME (decl));
> +      pos_stack[idx - 1].line -= DECL_SOURCE_LINE (decl);
> +    }
>    return idx;
>  }
>
> @@ -1064,12 +1073,15 @@ read_profile (void)
>       * sizeof (struct gcov_callsite_pos));
>    for (k = 0; k < gcov_functions[i].stacks[j].size; k++)
>      {
> +      gcov_unsigned_t line, start_line;
>        gcov_functions[i].stacks[j].stack[k].func =
>   file_names[gcov_read_unsigned ()];
>        gcov_functions[i].stacks[j].stack[k].file =
>   file_names[gcov_read_unsigned ()];
> +      line = gcov_read_unsigned ();
> +      start_line = gcov_read_unsigned ();
>        gcov_functions[i].stacks[j].stack[k].line =
> - gcov_read_unsigned ();
> + line > start_line ? line - start_line : 0;
>        gcov_functions[i].stacks[j].stack[k].discr =
>   gcov_read_unsigned ();
>      }



More information about the Gcc-patches mailing list