This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Improve DW_AT_const_value with early_dwarf


On Tue, 19 Sep 2017, Jakub Jelinek wrote:

> On Tue, Sep 19, 2017 at 04:11:52PM +0200, Jakub Jelinek wrote:
> > Will try now following plus testcase, the rest of constants I believe end up
> > being DW_FORM_block encoded and so is pretty much what we emit even for the
> > initializer_constant_valid_p tree fallback case.
> 
> I've bootstrapped/regtested this on x86_64-linux and i686-linux, ok for
> trunk?  Most of the testcase changes are then to make sure newlines don't
> match where they shouldn't, because this regression would be actually caught
> by the testsuite otherwise.
> 
> .debug_info is ~ 28KB smaller.
> On previous bootstrap from earlier today I saw:
> readelf -wa obj96/gcc/cc1plus | grep DW_AT_const_value | sort | uniq -c | sort -n
>       1     DW_AT_const_value  DW_FORM_block2
>       3     DW_AT_const_value  DW_FORM_data8
>      71     DW_AT_const_value  DW_FORM_string
>     311     DW_AT_const_value  DW_FORM_strp
>     472     DW_AT_const_value  DW_FORM_sdata
>     656     DW_AT_const_value  DW_FORM_data4
>     787     DW_AT_const_value  DW_FORM_data2
>    2182     DW_AT_const_value  DW_FORM_block1
>    2598     DW_AT_const_value  DW_FORM_data1
> and with this patch:
> readelf -wa obj98/gcc/cc1plus | grep DW_AT_const_value | sort | uniq -c | sort -n
>       1     DW_AT_const_value  DW_FORM_block2
>      71     DW_AT_const_value  DW_FORM_string
>     311     DW_AT_const_value  DW_FORM_strp
>     346     DW_AT_const_value  DW_FORM_data8
>     478     DW_AT_const_value  DW_FORM_block1
>     495     DW_AT_const_value  DW_FORM_sdata
>    1123     DW_AT_const_value  DW_FORM_data2
>    1362     DW_AT_const_value  DW_FORM_data4
>    4089     DW_AT_const_value  DW_FORM_data1
> so the number of these attributes with constant class significantly increased
> over block class and the number of attributes increased too.

Ok.

Thanks,
Richard.

> 2017-09-19  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* dwarf2out.c (tree_add_const_value_attribute): For INTEGER_CST
> 	that fits into uhwi or shwi, add DW_AT_const_value regardless
> 	of early_dwarf without going through RTL, using add_AT_unsigned
> 	or add_AT_int.
> 
> 	* g++.dg/debug/dwarf2/template-params-13.C: New test.
> 	* g++.dg/debug/dwarf2/template-params-5.C: Adjust regexps so that
> 	it doesn't match newlines.
> 	* g++.dg/debug/dwarf2/template-params-3.C: Likewise.
> 	* g++.dg/debug/dwarf2/template-func-params-3.C: Likewise.
> 	* g++.dg/debug/dwarf2/lang-cpp98.C: Likewise.
> 	* g++.dg/debug/dwarf2/template-func-params-2.C: Likewise.
> 	* g++.dg/debug/dwarf2/template-func-params-1.C: Likewise.
> 	* g++.dg/debug/dwarf2/template-func-params-5.C: Likewise.
> 	* g++.dg/debug/dwarf2/template-params-1.C: Likewise.
> 	* g++.dg/debug/dwarf2/template-params-2.C: Likewise.
> 	* g++.dg/debug/dwarf2/lang-cpp14.C: Likewise.
> 	* g++.dg/debug/dwarf2/lang-cpp11.C: Likewise.
> 
> --- gcc/dwarf2out.c.jj	2017-09-15 18:11:03.000000000 +0200
> +++ gcc/dwarf2out.c	2017-09-19 16:03:27.678337475 +0200
> @@ -19440,6 +19440,19 @@ tree_add_const_value_attribute (dw_die_r
>    init = t;
>    gcc_assert (!DECL_P (init));
>  
> +  if (TREE_CODE (init) == INTEGER_CST)
> +    {
> +      if (tree_fits_uhwi_p (init))
> +	{
> +	  add_AT_unsigned (die, DW_AT_const_value, tree_to_uhwi (init));
> +	  return true;
> +	}
> +      if (tree_fits_shwi_p (init))
> +	{
> +	  add_AT_int (die, DW_AT_const_value, tree_to_shwi (init));
> +	  return true;
> +	}
> +    }
>    if (! early_dwarf)
>      {
>        rtl = rtl_for_decl_init (init, type);
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C	2017-09-19 16:29:48.828668182 +0200
> @@ -2,7 +2,7 @@
>  // Origin PR debug/30161
>  // { dg-options "-gdwarf-2 -dA" }
>  // { dg-final { scan-assembler "DW_TAG_template_type_param" } }
> -// { dg-final { scan-assembler "T.*DW_AT_name" } }
> +// { dg-final { scan-assembler "T\[^\n\r]* DW_AT_name" } }
>  
>  template <class T>
>  struct vector
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C	2017-09-19 16:29:33.812855410 +0200
> @@ -2,7 +2,7 @@
>  // Origin PR debug/30161
>  // { dg-options "-gdwarf-2 -dA -gno-strict-dwarf -fno-merge-debug-strings" }
>  // { dg-final { scan-assembler "DW_TAG_template_value_param" } }
> -// { dg-final { scan-assembler "f.*DW_AT_name" } }
> +// { dg-final { scan-assembler "f\[^\n\r]* DW_AT_name" } }
>  // { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
>  
>  typedef void (*func_ptr) ();
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C	2017-09-19 16:27:59.886026562 +0200
> @@ -2,7 +2,7 @@
>  // Origin PR debug/30161
>  // { dg-options "-gdwarf-2 -dA -gno-strict-dwarf -fno-merge-debug-strings" }
>  // { dg-final { scan-assembler "DW_TAG_template_value_param" } }
> -// { dg-final { scan-assembler "f.*DW_AT_name" } }
> +// { dg-final { scan-assembler "f\[^\n\r]* DW_AT_name" } }
>  // { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
>  
>  typedef void (*func_ptr)();
> --- gcc/testsuite/g++.dg/debug/dwarf2/lang-cpp98.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/lang-cpp98.C	2017-09-19 16:26:57.169808555 +0200
> @@ -1,6 +1,6 @@
>  // { dg-do compile }
>  // { dg-options "-O -std=c++98 -gdwarf-2 -dA" }
>  // DW_LANG_C_plus_plus = 0x0004
> -// { dg-final { scan-assembler "0x4.*DW_AT_language" } } */
> +// { dg-final { scan-assembler "0x4\[^\n\r]* DW_AT_language" } } */
>  
>  int version;
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C	2017-09-19 16:27:40.141272754 +0200
> @@ -3,8 +3,8 @@
>  // { dg-options "-gdwarf-2 -dA" }
>  // { dg-do compile }
>  // { dg-final { scan-assembler "DW_TAG_template_value_param" } }
> -// { dg-final { scan-assembler "i.*DW_AT_name" } }
> -// { dg-final { scan-assembler "3.*DW_AT_const_value" } }
> +// { dg-final { scan-assembler "i\[^\n\r]* DW_AT_name" } }
> +// { dg-final { scan-assembler "3\[^\n\r]* DW_AT_const_value" } }
>  
>  
>  template <int i>
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C	2017-09-19 16:27:29.347407340 +0200
> @@ -3,7 +3,7 @@
>  // { dg-options "-gdwarf-2 -dA" }
>  // { dg-do compile }
>  // { dg-final { scan-assembler "DW_TAG_template_type_param" } }
> -// { dg-final { scan-assembler "U.*DW_AT_name" } }
> +// { dg-final { scan-assembler "U\[^\n\r]* DW_AT_name" } }
>  
>  template <class U>
>  U
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C	2017-09-19 16:28:17.138811441 +0200
> @@ -2,7 +2,7 @@
>  // Origin PR debug/30161
>  // { dg-options "-gdwarf-2 -dA" }
>  // { dg-final { scan-assembler "DW_TAG_template_type_param" } }
> -// { dg-final { scan-assembler "T.*DW_AT_name" } }
> +// { dg-final { scan-assembler "T\[^\n\r]* DW_AT_name" } }
>  
>  template <class T>
>  struct vector
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C	2017-09-19 16:28:40.967514326 +0200
> @@ -3,7 +3,7 @@
>  // { dg-options "-gdwarf-2 -dA" }
>  // { dg-do compile }
>  // { dg-final { scan-assembler "DW_TAG_template_type_param" } }
> -// { dg-final { scan-assembler "U.*DW_AT_name" } }
> +// { dg-final { scan-assembler "U\[^\n\r]* DW_AT_name" } }
>  
>  template <class U>
>  class A
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C.jj	2015-07-09 11:07:21.000000000 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C	2017-09-19 16:29:21.326011106 +0200
> @@ -3,8 +3,8 @@
>  // { dg-options "-gdwarf-2 -dA" }
>  // { dg-do compile }
>  // { dg-final { scan-assembler "DW_TAG_template_value_param" } }
> -// { dg-final { scan-assembler "i.*DW_AT_name" } }
> -// { dg-final { scan-assembler "3.*DW_AT_const_value" } }
> +// { dg-final { scan-assembler "i\[^\n\r]* DW_AT_name" } }
> +// { dg-final { scan-assembler "3\[^\n\r]* DW_AT_const_value" } }
>  
>  template <int i>
>  struct A
> --- gcc/testsuite/g++.dg/debug/dwarf2/template-params-13.C.jj	2017-09-19 16:21:47.069675119 +0200
> +++ gcc/testsuite/g++.dg/debug/dwarf2/template-params-13.C	2017-09-19 16:24:54.425339027 +0200
> @@ -0,0 +1,10 @@
> +// { dg-options "-gdwarf-2 -dA" }
> +// { dg-do compile }
> +// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
> +// { dg-final { scan-assembler "N\[^\n\r]* DW_AT_name" } }
> +// { dg-final { scan-assembler "9\[^\n\r]* DW_AT_const_value" } }
> +
> +template <int N> class C {};
> +template <typename T> struct E {};
> +E<struct A> f;
> +struct A { C<9> g; };
> --- gcc/testsuite/g++.dg/debug/dwarf2/lang-cpp14.C.jj	2014-11-26 20:35:03.000000000 +0100
> +++ gcc/testsuite/g++.dg/debug/dwarf2/lang-cpp14.C	2017-09-19 16:26:49.329906309 +0200
> @@ -1,6 +1,6 @@
>  // { dg-do compile }
>  // { dg-options "-O -std=c++14 -gdwarf-5 -dA" }
>  // DW_LANG_C_plus_plus_14 = 0x0021
> -// { dg-final { scan-assembler "0x21.*DW_AT_language" } } */
> +// { dg-final { scan-assembler "0x21\[^\n\r]* DW_AT_language" } } */
>  
>  int version;
> --- gcc/testsuite/g++.dg/debug/dwarf2/lang-cpp11.C.jj	2014-11-26 20:35:03.000000000 +0100
> +++ gcc/testsuite/g++.dg/debug/dwarf2/lang-cpp11.C	2017-09-19 16:26:40.939010933 +0200
> @@ -1,6 +1,6 @@
>  // { dg-do compile }
>  // { dg-options "-O -std=c++11 -gdwarf-5 -dA" }
>  // DW_LANG_C_plus_plus_11 = 0x001a
> -// { dg-final { scan-assembler "0x1a.*DW_AT_language" } } */
> +// { dg-final { scan-assembler "0x1a\[^\n\r]* DW_AT_language" } } */
>  
>  int version;
> 
> 
> 	Jakub
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]