Resending in plain text mode so that it goes through to mailing list...

On Wed, Jul 25, 2012 at 11:32 AM, Teresa Johnson <tejohn...@google.com> wrote:
>
>
>
>
> On Tue, Jul 24, 2012 at 3:03 PM, Chris Manghane <cm...@google.com> wrote:
>>
>> This patch modifies pmu-profile to allow gooda_feedback access to
>>
>>
> Needs some more context about perf.data -> gcda conversion.
>
>>
>> important gcov to gcda conversion functions and also
>
>
> Not really gcov to gcda conversion functions, but gcov io functions.
>
>> modifies the gcov pmu format store indices
>
> "format to store indices into a..."
>
>>
>> in a string table of filenames as opposed to storing the filename inside of 
>> every pmu entry. This reduces the amount of size bloat in gcda, especially 
>> since the gcda files do a per asm line analysis and this leads to many 
>> entries sharing the same filename data anyways. gooda_feedback considers 
>> this and outputs the string following the load latency and branch 
>> misprediction information.
>>
>> The changes made belong to one of the following categories:
>>     1. Removing static declaration/defition of certain function that are 
>> needed by gooda_feedback (pmu-profile.c)
>>     2. Modifying the gcov format to use indices instead of string for the 
>> filename (gcov-io.h)
>>     3. Modifying gcda writing functions to write the index instead of the 
>> filename (pmu-profile.c)
>>     4. Removing references to filename (gcov-io.c, pmu-profile.c)
>>
>> This was tested by using crosstool-validate with --testers=crosstool. No 
>> other testcases seemed necessary since this patch only modifies data that is 
>> relevant to pfmon, which is considered dead now.
>
>
> Needs more testing (discussed with Chris offline).
>
>>
>>
>> The patch should be applied to google/gcc-4_7
>>
>> The CL for gooda_feedback can be found at Google ref c/31972005
>>
>>
>> 2012-07-24  Chris Manghane  <cm...@google.com>
>>
>>         * libgcc/pmu-profile.c (static int parse_pfmon_load_latency): 
>> filename field no longer exists
>
>
> Also mention the removal of "static" from the declarations.
>
>>
>>         (parse_load_latency_line): filename field no longer exists
>>         (parse_branch_mispredict_line): filename field no longer exists
>
>
> For repeating descriptions use or "Ditto." or "Likewise."
>
>>         (__gcov_stop_pmu_profiler): filename field no longer exists
>>         (gcov_write_ll_line): now writes string table index instead of 
>> filename
>>         (gcov_write_branch_mispredict_line): now writes string table index 
>> instead of filename
>>         (gcov_write_load_latency_infos): filename field no longer exists
>>         (gcov_write_branch_mispredict_infos): filename field no longer exists
>>         (gcov_tag_pmu_tool_header_length): filename field no longer exists
>>         (gcov_write_tool_header): filename field no longer exists
>>         * gcc/gcov.c (release_structures): filename field no longer exists
>>         (filter_pmu_data_lines): filename field no longer exists
>>         * gcc/gcov-io.c (gcov_read_pmu_load_latency_info): removed filename 
>> field and added string table index
>>         (gcov_read_pmu_branch_mispredict_info): removed filename field and 
>> added string table index
>>         (print_load_latency_line): filename field no longer exists
>>         (print_branch_mispredict_line): filename field no longer exists
>>         * gcc/gcov-io.h: added new tag for string table printing
>>         * gcc/gcov-dump.c (tag_pmu_load_latency_info): filename field no 
>> longer exists
>>         (tag_pmu_branch_mispredict_info): filename field no longer exists
>>
>> Index: libgcc/pmu-profile.c
>> ===================================================================
>> --- libgcc/pmu-profile.c        (revision 189823)
>> +++ libgcc/pmu-profile.c        (working copy)
>> @@ -232,11 +232,11 @@ static int parse_pfmon_load_latency (char *filenam
>>  static int parse_pfmon_branch_mispredicts (char *filename, void *pmu_data);
>>  static gcov_unsigned_t gcov_tag_pmu_tool_header_length 
>> (gcov_pmu_tool_header_t
>>                                                          *header);
>> -static void gcov_write_tool_header (gcov_pmu_tool_header_t *header);
>> -static void gcov_write_load_latency_infos (void *info);
>> -static void gcov_write_branch_mispredict_infos (void *info);
>> -static void gcov_write_ll_line (const gcov_pmu_ll_info_t *ll_info);
>> -static void gcov_write_branch_mispredict_line (const gcov_pmu_brm_info_t
>> +void gcov_write_tool_header (gcov_pmu_tool_header_t *header);
>> +void gcov_write_load_latency_infos (void *info);
>> +void gcov_write_branch_mispredict_infos (void *info);
>> +void gcov_write_ll_line (const gcov_pmu_ll_info_t *ll_info);
>> +void gcov_write_branch_mispredict_line (const gcov_pmu_brm_info_t
>>                                                 *brm_info);
>
>
> They should be moved to gcov-io.h with linkage GCOV_LINKAGE which will pick 
> extern when building libgcov (see examples in gcov-io.h).
>
>>
>>  static int start_addr2line_symbolizer (pid_t pid);
>>  static void end_addr2line_symbolizer (void);
>> @@ -749,14 +749,12 @@ parse_load_latency_line (char *line, gcov_pmu_ll_i
>
>
> I think it would be cleaner just to remove all the pfmon specific handling as 
> part of this checkin, since that is obsolete and wouldn't work with your 
> changes anyway.
>
>>
>>        if (!sep)
>>          {
>>            /* Assume entire string is srcfile.  */
>> -          ll_info->filename = (char *)sym_info;
>>            ll_info->line = 0;
>>          }
>>        else
>>          {
>>            /* Terminate the filename string at the separator.  */
>>            *sep = 0;
>> -          ll_info->filename = (char *)sym_info;
>>            /* Convert rest of the sym info to a line number.  */
>>            ll_info->line = atol (sep+1);
>>          }
>> @@ -765,7 +763,6 @@ parse_load_latency_line (char *line, gcov_pmu_ll_i
>>    else
>>      {
>>        /* No symbolizer available.  */
>> -      ll_info->filename = NULL;
>>        ll_info->line = 0;
>>        ll_info->discriminator = 0;
>>      }
>> @@ -815,14 +812,12 @@ parse_branch_mispredict_line (char *line, gcov_pmu
>>        if (!sep)
>>          {
>>            /* Assume entire string is srcfile.  */
>> -          brm_info->filename = sym_info;
>>            brm_info->line = 0;
>>          }
>>        else
>>          {
>>            /* Terminate the filename string at the separator.  */
>>            *sep = 0;
>> -          brm_info->filename = sym_info;
>>            /* Convert rest of the sym info to a line number.  */
>>            brm_info->line = atol (sep+1);
>>          }
>> @@ -831,7 +826,6 @@ parse_branch_mispredict_line (char *line, gcov_pmu
>>    else
>>      {
>>        /* No symbolizer available.  */
>> -      brm_info->filename = NULL;
>>        brm_info->line = 0;
>>        brm_info->discriminator = 0;
>>      }
>> @@ -1361,11 +1355,10 @@ __gcov_stop_pmu_profiler (void)
>>
>>  /* Write the load latency information LL_INFO into the gcda file.  */
>>
>> -static void
>> +void
>>  gcov_write_ll_line (const gcov_pmu_ll_info_t *ll_info)
>>  {
>> -  gcov_unsigned_t len = GCOV_TAG_PMU_LOAD_LATENCY_LENGTH 
>> (ll_info->filename);
>> -  gcov_write_tag_length (GCOV_TAG_PMU_LOAD_LATENCY_INFO, len);
>> +  gcov_write_tag_length (GCOV_TAG_PMU_LOAD_LATENCY_INFO, 1);
>
>
> The length of 1 isn't correct - it should be the length of the data 
> associated with this tag. See  GCOV_TAG_PMU_LOAD_LATENCY_LENGTH for how it is 
> computing this (and you can just modify that to remove the filename parameter 
> and add 1 for your new tag).
>
>>    gcov_write_unsigned (ll_info->counts);
>>    gcov_write_unsigned (ll_info->self);
>>    gcov_write_unsigned (ll_info->cum);
>> @@ -1379,31 +1372,29 @@ gcov_write_ll_line (const gcov_pmu_ll_info_t *ll_i
>>    gcov_write_counter (ll_info->code_addr);
>>    gcov_write_unsigned (ll_info->line);
>>    gcov_write_unsigned (ll_info->discriminator);
>> -  gcov_write_string (ll_info->filename);
>> +  gcov_write_unsigned (ll_info->filetag);
>>  }
>>
>>
>>  /* Write the branch mispredict information BRM_INFO into the gcda file.  */
>>
>> -static void
>> +void
>>  gcov_write_branch_mispredict_line (const gcov_pmu_brm_info_t *brm_info)
>>  {
>> -  gcov_unsigned_t len = GCOV_TAG_PMU_BRANCH_MISPREDICT_LENGTH (
>> -      brm_info->filename);
>> -  gcov_write_tag_length (GCOV_TAG_PMU_BRANCH_MISPREDICT_INFO, len);
>> +  gcov_write_tag_length (GCOV_TAG_PMU_BRANCH_MISPREDICT_INFO, 1);
>
>
> Same thing here with the length computation (see above comment).
>
>>
>>    gcov_write_unsigned (brm_info->counts);
>>    gcov_write_unsigned (brm_info->self);
>>    gcov_write_unsigned (brm_info->cum);
>>    gcov_write_counter (brm_info->code_addr);
>>    gcov_write_unsigned (brm_info->line);
>>    gcov_write_unsigned (brm_info->discriminator);
>> -  gcov_write_string (brm_info->filename);
>> +  gcov_write_unsigned (brm_info->filetag);
>>  }
>>
>>  /* Write load latency information INFO into the gcda file.  The gcda
>>     file has already been opened and is available for writing.  */
>>
>> -static void
>> +void
>>  gcov_write_load_latency_infos (void *info)
>>  {
>>    unsigned i;
>> @@ -1429,7 +1420,7 @@ gcov_write_load_latency_infos (void *info)
>>  /* Write branch mispredict information INFO into the gcda file.  The
>>     gcda file has already been opened and is available for writing.  */
>>
>> -static void
>> +void
>>  gcov_write_branch_mispredict_infos (void *info)
>>  {
>>    unsigned i;
>> @@ -1470,7 +1461,7 @@ gcov_tag_pmu_tool_header_length (gcov_pmu_tool_hea
>>  /* Write tool header into the gcda file. It assumes that the gcda file
>>     has already been opened and is available for writing.  */
>>
>> -static void
>> +void
>>  gcov_write_tool_header (gcov_pmu_tool_header_t *header)
>>  {
>>    gcov_unsigned_t len = gcov_tag_pmu_tool_header_length (header);
>> Index: gcc/gcov.c
>> ===================================================================
>> --- gcc/gcov.c  (revision 189823)
>> +++ gcc/gcov.c  (working copy)
>> @@ -1008,8 +1008,6 @@ release_structures (void)
>>        /* delete each element */
>>        for (i = 0; i < ll_infos->ll_count; ++i)
>>          {
>> -          if (ll_infos->ll_array[i]->filename)
>> -            XDELETE (ll_infos->ll_array[i]->filename);
>>            XDELETE (ll_infos->ll_array[i]);
>>          }
>>        /* delete the array itself */
>> @@ -1026,8 +1024,6 @@ release_structures (void)
>>        /* delete each element */
>>        for (i = 0; i < brm_infos->brm_count; ++i)
>>          {
>> -          if (brm_infos->brm_array[i]->filename)
>> -            XDELETE (brm_infos->brm_array[i]->filename);
>>            XDELETE (brm_infos->brm_array[i]);
>>          }
>>        /* delete the array itself */
>> @@ -2277,58 +2273,6 @@ filter_pmu_data_lines (source_t *src)
>>    ll_infos->ll_array = 0;
>>    brm_infos->brm_array = 0;
>>
>> -  /* Go over all the load latency entries and save the ones
>> -     corresponding to this source file.  */
>
>
> Don't want to remove this handling, as it is doing the job of deciding which 
> pmu data matches the current file being compiled. You just need to change the 
> handling of how to access the filename.
>
>>
>> -  for (i = 0; i < pmu_global_info.ll_infos.ll_count; ++i)
>> -    {
>> -      gcov_pmu_ll_info_t *ll_info = pmu_global_info.ll_infos.ll_array[i];
>> -      if (0 == strcmp (src->name, ll_info->filename))
>> -        {
>> -          if (!ll_infos->ll_array)
>> -            {
>> -              ll_infos->ll_count = 0;
>> -              ll_infos->alloc_ll_count = 64;
>> -              ll_infos->ll_array = XCNEWVEC (gcov_pmu_ll_info_t *,
>> -                                             ll_infos->alloc_ll_count);
>> -            }
>> -          /* Found a matching entry, save it.  */
>> -          ll_infos->ll_count++;
>> -          if (ll_infos->ll_count >= ll_infos->alloc_ll_count)
>> -            {
>> -              /* need to realloc */
>> -              ll_infos->ll_array = (gcov_pmu_ll_info_t **)
>> -                xrealloc (ll_infos->ll_array, 2 * ll_infos->alloc_ll_count);
>> -            }
>> -          ll_infos->ll_array[ll_infos->ll_count - 1] = ll_info;
>> -        }
>> -    }
>> -
>> -  /* Go over all the branch mispredict entries and save the ones
>> -     corresponding to this source file.  */
>> -  for (i = 0; i < pmu_global_info.brm_infos.brm_count; ++i)
>> -    {
>> -      gcov_pmu_brm_info_t *brm_info = 
>> pmu_global_info.brm_infos.brm_array[i];
>> -      if (0 == strcmp (src->name, brm_info->filename))
>> -        {
>> -          if (!brm_infos->brm_array)
>> -            {
>> -              brm_infos->brm_count = 0;
>> -              brm_infos->alloc_brm_count = 64;
>> -              brm_infos->brm_array = XCNEWVEC (gcov_pmu_brm_info_t *,
>> -                                               brm_infos->alloc_brm_count);
>> -            }
>> -          /* Found a matching entry, save it.  */
>> -          brm_infos->brm_count++;
>> -          if (brm_infos->brm_count >= brm_infos->alloc_brm_count)
>> -            {
>> -              /* need to realloc */
>> -              brm_infos->brm_array = (gcov_pmu_brm_info_t **)
>> -                xrealloc (brm_infos->brm_array, 2 * 
>> brm_infos->alloc_brm_count);
>> -            }
>> -          brm_infos->brm_array[brm_infos->brm_count - 1] = brm_info;
>> -        }
>> -    }
>> -
>>    /* Sort the load latency data according to the line numbers because
>>       we later iterate over sources in line number order. Normally we
>>       expect the PMU tool to provide sorted data, but a few entries can
>> Index: gcc/gcov-io.c
>> ===================================================================
>> --- gcc/gcov-io.c       (revision 189823)
>> +++ gcc/gcov-io.c       (working copy)
>> @@ -242,7 +242,6 @@ GCOV_LINKAGE void
>>  gcov_read_pmu_load_latency_info (gcov_pmu_ll_info_t *ll_info,
>>                                   gcov_unsigned_t len ATTRIBUTE_UNUSED)
>>  {
>> -  const char *filename;
>>    ll_info->counts = gcov_read_unsigned ();
>>    ll_info->self = gcov_read_unsigned ();
>>    ll_info->cum = gcov_read_unsigned ();
>> @@ -256,11 +255,7 @@ gcov_read_pmu_load_latency_info (gcov_pmu_ll_info_
>>    ll_info->code_addr = gcov_read_counter ();
>>    ll_info->line = gcov_read_unsigned ();
>>    ll_info->discriminator = gcov_read_unsigned ();
>> -  filename = gcov_read_string ();
>> -  if (filename)
>> -    ll_info->filename = gcov_canonical_filename (xstrdup (filename));
>> -  else
>> -    ll_info->filename = 0;
>> +  ll_info->filetag = gcov_read_unsigned ();
>>  }
>>
>>  /* Read LEN words and construct branch mispredict info BRM_INFO.  */
>> @@ -269,18 +264,13 @@ GCOV_LINKAGE void
>>  gcov_read_pmu_branch_mispredict_info (gcov_pmu_brm_info_t *brm_info,
>>                                        gcov_unsigned_t len ATTRIBUTE_UNUSED)
>>  {
>> -  const char *filename;
>>    brm_info->counts = gcov_read_unsigned ();
>>    brm_info->self = gcov_read_unsigned ();
>>    brm_info->cum = gcov_read_unsigned ();
>>    brm_info->code_addr = gcov_read_counter ();
>>    brm_info->line = gcov_read_unsigned ();
>>    brm_info->discriminator = gcov_read_unsigned ();
>> -  filename = gcov_read_string ();
>> -  if (filename)
>> -    brm_info->filename = gcov_canonical_filename (xstrdup (filename));
>> -  else
>> -    brm_info->filename = 0;
>> +  brm_info->filetag = gcov_read_unsigned ();
>>  }
>>
>>  /* Read LEN words from an open gcov file and construct data into pmu
>> @@ -779,7 +769,7 @@ print_load_latency_line (FILE *fp, const gcov_pmu_
>>    if (!ll_info)
>>      return;
>>    fprintf (fp, " %u %.2f%% %.2f%% %.2f%% %.2f%% %.2f%% %.2f%% %.2f%% "
>> -           "%.2f%% %.2f%% " HOST_WIDEST_INT_PRINT_HEX " %s %d %d",
>> +           "%.2f%% %.2f%% " HOST_WIDEST_INT_PRINT_HEX " %d %d %d",
>
>
> Instead of changing this to print the tag, it would be useful to print both 
> the tag and the filename (as accessed via your string table). Ditto below for 
> the branch mispredict info.
>
>>
>>             ll_info->counts,
>>             convert_unsigned_to_pct (ll_info->self),
>>             convert_unsigned_to_pct (ll_info->cum),
>> @@ -791,7 +781,7 @@ print_load_latency_line (FILE *fp, const gcov_pmu_
>>             convert_unsigned_to_pct (ll_info->gt_1024),
>>             convert_unsigned_to_pct (ll_info->wself),
>>             ll_info->code_addr,
>> -           ll_info->filename,
>> +           ll_info->filetag,
>>             ll_info->line,
>>             ll_info->discriminator);
>>    if (newline == add_newline)
>> @@ -807,12 +797,12 @@ print_branch_mispredict_line (FILE *fp, const gcov
>>  {
>>    if (!brm_info)
>>      return;
>> -  fprintf (fp, " %u %.2f%% %.2f%% " HOST_WIDEST_INT_PRINT_HEX " %s %d %d",
>> +  fprintf (fp, " %u %.2f%% %.2f%% " HOST_WIDEST_INT_PRINT_HEX " %d %d %d",
>>             brm_info->counts,
>>             convert_unsigned_to_pct (brm_info->self),
>>             convert_unsigned_to_pct (brm_info->cum),
>>             brm_info->code_addr,
>> -           brm_info->filename,
>> +           brm_info->filetag,
>>             brm_info->line,
>>             brm_info->discriminator);
>>    if (newline == add_newline)
>
>
> Need to add i/o handling of new string table.
>
>> Index: gcc/gcov-io.h
>> ===================================================================
>> --- gcc/gcov-io.h       (revision 189823)
>> +++ gcc/gcov-io.h       (working copy)
>> @@ -449,6 +449,7 @@ typedef HOST_WIDEST_INT gcov_type;
>>    (gcov_string_length (filename) + 5 + 2)
>>  #define GCOV_TAG_PMU_TOOL_HEADER ((gcov_unsigned_t)0xa9000000)
>>  #define GCOV_TAG_MODULE_INFO ((gcov_unsigned_t)0xab000000)
>> +#define GCOV_TAG_PMU_STRING_TABLE_ENTRY ((gcov_unsigned_t)0xad000000)
>>
>>  /* Counters that are collected.  */
>>  #define GCOV_COUNTER_ARCS      0  /* Arc transitions.  */
>> @@ -635,7 +636,7 @@ typedef struct gcov_pmu_load_latency_info
>>    gcov_type code_addr;        /* the actual miss address (pc+1 for Intel) */
>>    gcov_unsigned_t line;       /* line number corresponding to this miss */
>>    gcov_unsigned_t discriminator;   /* discriminator information for this 
>> miss */
>> -  char *filename;       /* filename corresponding to this miss */
>> +  gcov_unsigned_t filetag;       /* location in string table of filename 
>> corresponding to event */
>>  } gcov_pmu_ll_info_t;
>>
>>  /* This structure is used during runtime as well as in gcov.  */
>> @@ -665,7 +666,7 @@ typedef struct gcov_pmu_branch_mispredict_info
>>    gcov_type code_addr;        /* the actual mispredict address */
>>    gcov_unsigned_t line;       /* line number corresponding to this event */
>>    gcov_unsigned_t discriminator;   /* discriminator for this event */
>> -  char *filename;       /* filename corresponding to this event */
>> +  gcov_unsigned_t filetag;       /* location in string table of filename 
>> corresponding to event */
>>  } gcov_pmu_brm_info_t;
>>
>>  /* This structure is used during runtime as well as in gcov.  */
>> Index: gcc/gcov-dump.c
>> ===================================================================
>> --- gcc/gcov-dump.c     (revision 189823)
>> +++ gcc/gcov-dump.c     (working copy)
>> @@ -573,7 +573,6 @@ tag_pmu_load_latency_info (const char *filename AT
>>
>>    gcov_pmu_ll_info_t ll_info;
>>    gcov_read_pmu_load_latency_info (&ll_info, length);
>>    print_load_latency_line (stdout, &ll_info, no_newline);
>> -  free (ll_info.filename);
>>  }
>>
>>  /* Read gcov tag GCOV_TAG_PMU_BRANCH_MISPREDICT_INFO from the gcda
>> @@ -586,7 +585,6 @@ tag_pmu_branch_mispredict_info (const char *filena
>>    gcov_pmu_brm_info_t brm_info;
>>    gcov_read_pmu_branch_mispredict_info (&brm_info, length);
>>    print_branch_mispredict_line (stdout, &brm_info, no_newline);
>> -  free (brm_info.filename);
>>  }
>
>
> Need to add printing of new string table.
>
> Teresa
>>
>>
>>
>>
>> --
>> This patch is available for review at http://codereview.appspot.com/6427063
>
>
>
>
> --
> Teresa Johnson | Software Engineer |  tejohn...@google.com |  408-460-2413
>



--
Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413

Reply via email to