> ===================================================================
> --- gcc/builtins.c (revision 210019)
> +++ gcc/builtins.c (working copy)
> @@ -87,6 +87,9 @@ static rtx result_vector (int, rtx);
> #endif
> static void expand_builtin_update_setjmp_buf (rtx);
> static void expand_builtin_prefetch (tree);
> +static rtx expand_builtin_profile_invoke (tree);
> +static rtx expand_builtin_profile_register_handler (tree);
It might be more general to support handler invocation with some data
-- basically let handler to take a 'void*' as type of the data.
> +/* Expand a call to __builtin_profile_invoke. Passed a pointer to
> + a routine that should be called on -fprofile-generate compiles
> + and the profile counter address and data to pass to the routine. */
> +
> +static rtx
> +expand_builtin_profile_invoke (tree exp)
> +{
> + tree func, ctr, data, fndecl;
Expanding late is ok for now. It might be better to support expansion
of builin_invoke before ipa inlining (after early inline). This may
allow more efficient code gen (i.e., when the update function is
defined inline ..)
> +
> +/* Expand a call to __builtin_profile_register_handler. Passed a pointer to
> + a routine that should be called atexit in -fprofile-generate binaries. */
> +
> +static rtx
> +expand_builtin_profile_register_handler (tree exp)
> +{
> + tree fn, fndecl;
> +
See comment about supporting one parameter.
> + gcc_assert (alloc < GCOV_BLOCK_SIZE);
> + return alloc;
> +}
> #if !IN_GCOV
> /* Write out the current block, if needs be. */
>
> @@ -292,12 +308,11 @@ gcov_write_words (unsigned words)
> #if IN_LIBGCOV
> if (gcov_var.offset >= GCOV_BLOCK_SIZE)
> {
> - gcov_write_block (GCOV_BLOCK_SIZE);
> - if (gcov_var.offset)
> - {
> - gcc_assert (gcov_var.offset == 1);
> - memcpy (gcov_var.buffer, gcov_var.buffer + GCOV_BLOCK_SIZE, 4);
> - }
> + // Strings will cause offset to go above GCOV_BLOCK_SIZE
> + // by a variable amount, so we no longer assert that any
> + // offset be 1.
> + gcov_write_block (gcov_var.offset);
> + gcc_assert (!gcov_var.offset);
This part needs more explanation.
> +/* Write parameter values to the gcov file. These should be applied
> + to profile-use compiles as macro definitions by the compiler. */
> +
> +GCOV_LINKAGE void
> +gcov_write_parameters (struct gcov_parameter_value *parameters)
> +{
> + gcov_unsigned_t len = 0;
> + struct gcov_parameter_value *curr_parm;
> +
> + if (!parameters)
> + return;
> +
> + for (curr_parm = parameters; curr_parm;
> + curr_parm = curr_parm->next)
> + {
Maybe comment here -- string followed by 2 word counter value.
> + struct gcov_parameter_value *cur_new_parm, *cur_merge_parm, *merged_parms;
> +
> + merged_parms = saved_parms;
> +
> + for (cur_new_parm = new_parms; cur_new_parm;
> + cur_new_parm = cur_new_parm->next)
> + {
> + cur_merge_parm = find_parameter (saved_parms,
> cur_new_parm->macro_name);
> +
> + if (cur_merge_parm)
> + {
> + // Simply average them for now. The best merge strategy will
> + // depend on how they were computed in the first place.
> + cur_merge_parm->value
> + = (cur_merge_parm->value + cur_new_parm->value) / 2;
Some parmeters may have value set that is not averageable. When
recording parameters, maybe record the parmeter type of some sort (by
default it is avaragble).
> + struct gcov_parameter_value **merged_parameters)
> {
> gcov_unsigned_t tag, length, version, stamp;
> unsigned t_ix, f_ix;
> @@ -418,6 +490,15 @@ gcov_exit_merge_gcda (struct gcov_info *gi_ptr,
> next_summary:;
> }
>
> + if (tag == GCOV_TAG_PARAMETERS)
> + {
> + length = gcov_read_unsigned ();
> + *merged_parameters = gcov_read_parameters (length);
> + *merged_parameters = merge_parameters (*merged_parameters,
> + gcov_parameter_values);
> + }
> + tag = gcov_read_unsigned ();
> +
Should the tag reading be inside the previous guard?
David
81,1 98%
On Fri, May 9, 2014 at 1:50 PM, Teresa Johnson <[email protected]> wrote:
> The attached patch adds support for user-guided feedback-directed
> library optimization, for google/gcc-4_8 initially (to be ported to
> google/gcc-4_9).
>
> Cc'ing Honza for any comments since I would eventually like to send
> this and follow-on work to trunk.
>
> Patch to add support for user-guided feedback-directed library optimization.
>
> Contains support for builtins and attributes for specifying user-supplied
> routines for initializing, updating and analyzing profile counters during
> profile collection runs, and for feeding back macro values via a new
> parameter section in the gcda file.
>
> Passes regression tests. Ok for google branches?
>
> Thanks,
> Teresa
>
> --
> Teresa Johnson | Software Engineer | [email protected] | 408-460-2413