public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: [google/gcc-4_9] Minor changes to -ftwo-level-line-tables
       [not found] <20150303192507.A4818160C68@ccoutant.mtv.corp.google.com>
@ 2015-03-03 19:45 ` Dehao Chen
  2015-03-03 20:27   ` Cary Coutant
  0 siblings, 1 reply; 3+ messages in thread
From: Dehao Chen @ 2015-03-03 19:45 UTC (permalink / raw)
  To: Cary Coutant; +Cc: GCC Patches

On Tue, Mar 3, 2015 at 11:25 AM, Cary Coutant <ccoutant@google.com> wrote:
> This patch is for the google/gcc-4_9 branch.
>
> With this patch, we output an empty name for non-inlined functions,
> and change the -ftwo-level-all-subprogs option to override this
> behavior to output linkage names instead. The consumer can obtain
> the linkage name for non-inlined functions from the ELF symbol table,
> so we can save quite a bit of space in the line tables by omitting
> those names.
>
> This patch also fixes a case where we output the linkage name for
> a clone rather than for the ultimate origin.
>
> OK for google/gcc-4_9?
>
> -cary
>
>
> 2015-03-03  Cary Coutant  <ccoutant@google.com>
>
>         * common.opt (ftwo-level-all-subprogs): Default to off;
>         update help text.
>         * dwarf2out.c (add_subprog_entry): Clear subprog_num if the
>         subprogram is inlined, but was already output as non-inlined.
>         (out_subprog_directive): Get name from decl_ultimate_origin.
>         Output empty name for non-inlined subprograms.
>         (out_logical_entry): Output subprog entries for all subprograms.
>
> Index: common.opt
> ===================================================================
> --- common.opt  (revision 221069)
> +++ common.opt  (working copy)
> @@ -1214,9 +1214,9 @@ Common Report Var(flag_dwarf2_cfi_asm) I
>  Enable CFI tables via GAS assembler directives.
>
>  ftwo-level-all-subprogs
> -Common Report Var(flag_two_level_all_subprogs) Init(1)
> +Common Report Var(flag_two_level_all_subprogs) Init(0)
>  When generating two-level line tables in DWARF (experimental),
> -generate subprogram table entries for all functions.
> +add linkage names for all functions (not just inlined functions).
>
>  ftwo-level-line-tables
>  Common Report Var(flag_two_level_line_tables) Init(0)
> Index: dwarf2out.c
> ===================================================================
> --- dwarf2out.c (revision 221069)
> +++ dwarf2out.c (working copy)
> @@ -21506,8 +21506,14 @@ add_subprog_entry (tree decl, bool is_in
>        entry->subprog_num = 0;
>        *slot = entry;
>      }
> -  else if (is_inlined)
> -    (*slot)->is_inlined = true;
> +  else if (is_inlined && !(*slot)->is_inlined)
> +    {
> +      /* If we've already output this subprogram entry as a non-inlined
> +         subprogram, make sure it gets output again, so that we include
> +         its linkage name.  */
> +      (*slot)->is_inlined = true;
> +      (*slot)->subprog_num = 0;
> +    }
>    return *slot;
>  }
>
> @@ -21817,22 +21823,39 @@ out_subprog_directive (subprog_entry *su
>  {
>    tree decl = subprog->decl;
>    tree decl_name = DECL_NAME (decl);
> -  const char *name;
> +  tree origin;

Explicitly initialize origin to NULL_TREE;

> +  const char *name = NULL;
>    unsigned int file_num = 0;
>    unsigned int line_num = 0;
>
>    if (decl_name == NULL || IDENTIFIER_POINTER (decl_name) == NULL)
>      return;
>
> -  /* For inlined subroutines, use the linkage name.  */
> -  if (subprog->is_inlined && DECL_ASSEMBLER_NAME (decl))
> +  origin = decl_ultimate_origin (decl);
> +  if (origin == NULL_TREE)
> +    origin = decl;
> +
> +  /* For inlined subroutines, use the linkage name.
> +     If -ftwo-level-all-subprogs is set, use the linkage name
> +     for all subroutines.  */
> +  if (subprog->is_inlined || flag_two_level_all_subprogs)
>      {
> -      name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
> -      if (name[0] == '*')
> -        name++;
> +      if (DECL_ASSEMBLER_NAME (origin))
> +       {
> +         name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (origin));
> +         if (name[0] == '*')
> +           name++;
> +       }
> +      else
> +       name = dwarf2_name (origin, 0);
>      }
>    else
> -    name = dwarf2_name (decl, 0);
> +    {
> +      /* To save space, we don't emit the name for non-inlined
> +         subroutines, whose linkage names are available from the
> +         object file's symbol table.  */

flag_two_level_all_subprogs will be 1 by default. This mean "else"
branch is not the default behavior?

Dehao

> +      name = "";
> +    }
>
>    if (LOCATION_LOCUS (DECL_SOURCE_LOCATION (decl)) != UNKNOWN_LOCATION)
>      {
> @@ -21881,8 +21904,7 @@ out_logical_entry (dw_line_info_table *t
>    /* Declare the subprogram if it hasn't already been declared.  */
>    if (block != NULL)
>      subprog = block->subprog;
> -  if (subprog != NULL && subprog->subprog_num == 0
> -      && (context != NULL || flag_two_level_all_subprogs))
> +  if (subprog != NULL && subprog->subprog_num == 0)
>      out_subprog_directive (subprog);
>    if (subprog != NULL)
>      subprog_num = subprog->subprog_num;

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [google/gcc-4_9] Minor changes to -ftwo-level-line-tables
  2015-03-03 19:45 ` [google/gcc-4_9] Minor changes to -ftwo-level-line-tables Dehao Chen
@ 2015-03-03 20:27   ` Cary Coutant
  2015-03-03 20:59     ` Dehao Chen
  0 siblings, 1 reply; 3+ messages in thread
From: Cary Coutant @ 2015-03-03 20:27 UTC (permalink / raw)
  To: Dehao Chen; +Cc: GCC Patches

>> @@ -21817,22 +21823,39 @@ out_subprog_directive (subprog_entry *su
>>  {
>>    tree decl = subprog->decl;
>>    tree decl_name = DECL_NAME (decl);
>> -  const char *name;
>> +  tree origin;
>
> Explicitly initialize origin to NULL_TREE;

Done.

>> +  /* For inlined subroutines, use the linkage name.
>> +     If -ftwo-level-all-subprogs is set, use the linkage name
>> +     for all subroutines.  */
>> +  if (subprog->is_inlined || flag_two_level_all_subprogs)
>>      {
>> -      name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
>> -      if (name[0] == '*')
>> -        name++;
>> +      if (DECL_ASSEMBLER_NAME (origin))
>> +       {
>> +         name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (origin));
>> +         if (name[0] == '*')
>> +           name++;
>> +       }
>> +      else
>> +       name = dwarf2_name (origin, 0);
>>      }
>>    else
>> -    name = dwarf2_name (decl, 0);
>> +    {
>> +      /* To save space, we don't emit the name for non-inlined
>> +         subroutines, whose linkage names are available from the
>> +         object file's symbol table.  */
>
> flag_two_level_all_subprogs will be 1 by default. This mean "else"
> branch is not the default behavior?

No, I changed the default in common.opt:

 ftwo-level-all-subprogs
-Common Report Var(flag_two_level_all_subprogs) Init(1)
+Common Report Var(flag_two_level_all_subprogs) Init(0)
 When generating two-level line tables in DWARF (experimental),
-generate subprogram table entries for all functions.
+add linkage names for all functions (not just inlined functions).

-cary

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [google/gcc-4_9] Minor changes to -ftwo-level-line-tables
  2015-03-03 20:27   ` Cary Coutant
@ 2015-03-03 20:59     ` Dehao Chen
  0 siblings, 0 replies; 3+ messages in thread
From: Dehao Chen @ 2015-03-03 20:59 UTC (permalink / raw)
  To: Cary Coutant; +Cc: GCC Patches

ok for google branch.

Dehao

On Tue, Mar 3, 2015 at 12:26 PM, Cary Coutant <ccoutant@google.com> wrote:
>>> @@ -21817,22 +21823,39 @@ out_subprog_directive (subprog_entry *su
>>>  {
>>>    tree decl = subprog->decl;
>>>    tree decl_name = DECL_NAME (decl);
>>> -  const char *name;
>>> +  tree origin;
>>
>> Explicitly initialize origin to NULL_TREE;
>
> Done.
>
>>> +  /* For inlined subroutines, use the linkage name.
>>> +     If -ftwo-level-all-subprogs is set, use the linkage name
>>> +     for all subroutines.  */
>>> +  if (subprog->is_inlined || flag_two_level_all_subprogs)
>>>      {
>>> -      name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
>>> -      if (name[0] == '*')
>>> -        name++;
>>> +      if (DECL_ASSEMBLER_NAME (origin))
>>> +       {
>>> +         name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (origin));
>>> +         if (name[0] == '*')
>>> +           name++;
>>> +       }
>>> +      else
>>> +       name = dwarf2_name (origin, 0);
>>>      }
>>>    else
>>> -    name = dwarf2_name (decl, 0);
>>> +    {
>>> +      /* To save space, we don't emit the name for non-inlined
>>> +         subroutines, whose linkage names are available from the
>>> +         object file's symbol table.  */
>>
>> flag_two_level_all_subprogs will be 1 by default. This mean "else"
>> branch is not the default behavior?
>
> No, I changed the default in common.opt:
>
>  ftwo-level-all-subprogs
> -Common Report Var(flag_two_level_all_subprogs) Init(1)
> +Common Report Var(flag_two_level_all_subprogs) Init(0)
>  When generating two-level line tables in DWARF (experimental),
> -generate subprogram table entries for all functions.
> +add linkage names for all functions (not just inlined functions).
>
> -cary

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-03-03 20:59 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20150303192507.A4818160C68@ccoutant.mtv.corp.google.com>
2015-03-03 19:45 ` [google/gcc-4_9] Minor changes to -ftwo-level-line-tables Dehao Chen
2015-03-03 20:27   ` Cary Coutant
2015-03-03 20:59     ` Dehao Chen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).