diff mbox

Change DWARF5 .debug_loclists location description sizes from 2-byte length to uleb128 lengths

Message ID 20170103231547.GE21933@tucnak
State New
Headers show

Commit Message

Jakub Jelinek Jan. 3, 2017, 11:15 p.m. UTC
Hi!

http://dwarfstd.org/ShowIssue.php?issue=161102.1
got accepted today, so DWARF5 is going to use uleb128 sizes instead of
2-byte sizes in .debug_loclists section.
On a randomly chosen *.i file I had around, this results in shrinking
of .debug_loclists section size from 0xef7df to 0xddd65, so around 7.5%
saving, not too bad.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Jan/Mark, are you going to adjust the consumers accordingly?  Thanks.

2017-01-03  Jakub Jelinek  <jakub@redhat.com>

	* dwarf2out.c (output_loc_list): Don't throw away 64K+ location
	descriptions for -gdwarf-5 and emit them as uleb128 instead of
	2-byte data.


	Jakub

Comments

Jason Merrill Jan. 4, 2017, 7:49 p.m. UTC | #1
OK.

On Tue, Jan 3, 2017 at 6:15 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> http://dwarfstd.org/ShowIssue.php?issue=161102.1
> got accepted today, so DWARF5 is going to use uleb128 sizes instead of
> 2-byte sizes in .debug_loclists section.
> On a randomly chosen *.i file I had around, this results in shrinking
> of .debug_loclists section size from 0xef7df to 0xddd65, so around 7.5%
> saving, not too bad.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> Jan/Mark, are you going to adjust the consumers accordingly?  Thanks.
>
> 2017-01-03  Jakub Jelinek  <jakub@redhat.com>
>
>         * dwarf2out.c (output_loc_list): Don't throw away 64K+ location
>         descriptions for -gdwarf-5 and emit them as uleb128 instead of
>         2-byte data.
>
> --- gcc/dwarf2out.c.jj  2017-01-03 19:41:45.000000000 +0100
> +++ gcc/dwarf2out.c     2017-01-03 20:58:21.304628767 +0100
> @@ -9590,7 +9590,7 @@ output_loc_list (dw_loc_list_ref list_he
>          perhaps put it into DW_TAG_dwarf_procedure and refer to that
>          in the expression, but >= 64KB expressions for a single value
>          in a single range are unlikely very useful.  */
> -      if (size > 0xffff)
> +      if (dwarf_version < 5 && size > 0xffff)
>         continue;
>        if (dwarf_version >= 5)
>         {
> @@ -9642,8 +9642,6 @@ output_loc_list (dw_loc_list_ref list_he
>                       if (strcmp (curr2->begin, curr2->end) == 0
>                           && !curr2->force)
>                         continue;
> -                     if ((unsigned long) size_of_locs (curr2->expr) > 0xffff)
> -                       continue;
>                       break;
>                     }
>                   if (curr2 == NULL || curr->section != curr2->section)
> @@ -9744,8 +9742,13 @@ output_loc_list (dw_loc_list_ref list_he
>         }
>
>        /* Output the block length for this list of location operations.  */
> -      gcc_assert (size <= 0xffff);
> -      dw2_asm_output_data (2, size, "%s", "Location expression size");
> +      if (dwarf_version >= 5)
> +       dw2_asm_output_data_uleb128 (size, "Location expression size");
> +      else
> +       {
> +         gcc_assert (size <= 0xffff);
> +         dw2_asm_output_data (2, size, "Location expression size");
> +       }
>
>        output_loc_sequence (curr->expr, -1);
>      }
>
>         Jakub
diff mbox

Patch

--- gcc/dwarf2out.c.jj	2017-01-03 19:41:45.000000000 +0100
+++ gcc/dwarf2out.c	2017-01-03 20:58:21.304628767 +0100
@@ -9590,7 +9590,7 @@  output_loc_list (dw_loc_list_ref list_he
 	 perhaps put it into DW_TAG_dwarf_procedure and refer to that
 	 in the expression, but >= 64KB expressions for a single value
 	 in a single range are unlikely very useful.  */
-      if (size > 0xffff)
+      if (dwarf_version < 5 && size > 0xffff)
 	continue;
       if (dwarf_version >= 5)
 	{
@@ -9642,8 +9642,6 @@  output_loc_list (dw_loc_list_ref list_he
 		      if (strcmp (curr2->begin, curr2->end) == 0
 			  && !curr2->force)
 			continue;
-		      if ((unsigned long) size_of_locs (curr2->expr) > 0xffff)
-			continue;
 		      break;
 		    }
 		  if (curr2 == NULL || curr->section != curr2->section)
@@ -9744,8 +9742,13 @@  output_loc_list (dw_loc_list_ref list_he
 	}
 
       /* Output the block length for this list of location operations.  */
-      gcc_assert (size <= 0xffff);
-      dw2_asm_output_data (2, size, "%s", "Location expression size");
+      if (dwarf_version >= 5)
+	dw2_asm_output_data_uleb128 (size, "Location expression size");
+      else
+	{
+	  gcc_assert (size <= 0xffff);
+	  dw2_asm_output_data (2, size, "Location expression size");
+	}
 
       output_loc_sequence (curr->expr, -1);
     }