Re: Turn DECL_SECTION_NAME into string

2014-06-17 Thread Thomas Schwinge
Hi!

On Thu, 12 Jun 2014 06:33:25 +0200, Jan Hubicka hubi...@ucw.cz wrote:
 this lenghtly patch makes the legwork to put section names out of tree 
 representation.
 Originally they were STRING_CST. I ended up implementing on-side reference 
 counted
 string voclabulary that is done in bit baroque way to be GGC and PCH safe 
 (uff).

As reported in https://gcc.gnu.org/PR61508, this causes a build failure
with --enable-checking=fold:

/home/dimhen/src/gcc_current/gcc/fold-const.c: In function 'void 
fold_checksum_tree(const_tree, md5_ctx*, hash_tablepointer_hashtree_node)':
/home/dimhen/src/gcc_current/gcc/fold-const.c:14863:55: error: cannot 
convert 'const char*' to 'const_tree {aka const tree_node*}' for argument '1' 
to 'void fold_checksum_tree(const_tree, md5_ctx*, 
hash_tablepointer_hashtree_node )'
  fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);

From light testing the following seems to get around this -- is it the
appropriate fix?

diff --git gcc/fold-const.c gcc/fold-const.c
index 24daaa3..978b854 100644
--- gcc/fold-const.c
+++ gcc/fold-const.c
@@ -14859,8 +14859,6 @@ fold_checksum_tree (const_tree expr, struct md5_ctx 
*ctx,
  fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
  fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
}
-  if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
-   fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
 
   if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
{


Grüße,
 Thomas


pgpPJBK1qw1Im.pgp
Description: PGP signature


Re: Turn DECL_SECTION_NAME into string

2014-06-17 Thread Richard Biener
On Tue, Jun 17, 2014 at 8:40 AM, Thomas Schwinge
tho...@codesourcery.com wrote:
 Hi!

 On Thu, 12 Jun 2014 06:33:25 +0200, Jan Hubicka hubi...@ucw.cz wrote:
 this lenghtly patch makes the legwork to put section names out of tree 
 representation.
 Originally they were STRING_CST. I ended up implementing on-side reference 
 counted
 string voclabulary that is done in bit baroque way to be GGC and PCH safe 
 (uff).

 As reported in https://gcc.gnu.org/PR61508, this causes a build failure
 with --enable-checking=fold:

 /home/dimhen/src/gcc_current/gcc/fold-const.c: In function 'void 
 fold_checksum_tree(const_tree, md5_ctx*, hash_tablepointer_hashtree_node)':
 /home/dimhen/src/gcc_current/gcc/fold-const.c:14863:55: error: cannot 
 convert 'const char*' to 'const_tree {aka const tree_node*}' for argument '1' 
 to 'void fold_checksum_tree(const_tree, md5_ctx*, 
 hash_tablepointer_hashtree_node )'
   fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);

 From light testing the following seems to get around this -- is it the
 appropriate fix?

Yes.  This is ok.

Thanks,
Richard.

 diff --git gcc/fold-const.c gcc/fold-const.c
 index 24daaa3..978b854 100644
 --- gcc/fold-const.c
 +++ gcc/fold-const.c
 @@ -14859,8 +14859,6 @@ fold_checksum_tree (const_tree expr, struct md5_ctx 
 *ctx,
   fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
   fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
 }
 -  if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
 -   fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);

if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
 {


 Grüße,
  Thomas


Re: Turn DECL_SECTION_NAME into string

2014-06-12 Thread Richard Biener
On Thu, Jun 12, 2014 at 6:33 AM, Jan Hubicka hubi...@ucw.cz wrote:
 Hi,
 this lenghtly patch makes the legwork to put section names out of tree 
 representation.
 Originally they were STRING_CST. I ended up implementing on-side reference 
 counted
 string voclabulary that is done in bit baroque way to be GGC and PCH safe 
 (uff).
 The memory savings on Firefox are about 60MB, becuase while reading symbol 
 table we
 now unify the many duplicated comdat group strings and also we free them 
 after we bring
 those local.

 The old representation probably made sense when most of string came via 
 __section__
 attribute where they was readily parsed as string constants.

I wonder why you didn't use IDENTIFIER_NODEs?  (ok, still trees ...)
At least those are already GGC and PCH safe.

Richard.

 Bootstrapped/regtested x86_64-linux, comitted.

 Honza

 * symtab.c (section_hash): New hash.
 (symtab_unregister_node): Clear section before freeing.
 (hash_section_hash_entry): New haser.
 (eq_sections): New function.
 (symtab_node::set_section_for_node): New method.
 (set_section_1): Update.
 (symtab_node::set_section): Take string instead of tree as parameter.
 (symtab_resolve_alias): Update.
 * cgraph.h (section_hash_entry_d): New structure.
 (section_hash_entry): New typedef.
 (cgraph_node): Change comdat_group_ to x_comdat_group,
 change section_ to x_section and turn into section_hash_entry;
 update accestors; put set_section_for_node offline.
 * tree.c (decl_section_name): Turn into string.
 (set_decl_section_name): Change parameter to be string.
 * tree.h (decl_section_name, set_decl_section_name): Update 
 prototypes.
 * sdbout.c (sdbout_one_type): Update.
 * tree-vect-data-refs.c (vect_can_force_dr_alignment_p): Update.
 * varasm.c (IN_NAMED_SECTION, get_named_section, 
 resolve_unique_section,
 hot_function_section, get_named_text_section, 
 USE_SELECT_SECTION_FOR_FUNCTIONS,
 default_function_rodata_section, make_decl_rtl, 
 default_unique_section):
 Update.
 * config/c6x/c6x.c (c6x_in_small_data_p): Update.
 (c6x_elf_unique_section): Update.
 * config/nios2/nios2.c (nios2_in_small_data_p): Update.
 * config/pa/pa.c (pa_function_section): Update.
 * config/pa/pa.h (IN_NAMED_SECTION_P): Update.
 * config/ia64/ia64.c (ia64_in_small_data_p): Update.
 * config/arc/arc.c (arc_in_small_data_p): Update.
 * config/arm/unknown-elf.h (IN_NAMED_SECTION_P): Update.
 * config/mcore/mcore.c (mcore_unique_section): Update.
 * config/mips/mips.c (mips16_build_function_stub): Update.
 (mips16_build_call_stub): Update.
 (mips_function_rodata_section): Update.
 (mips_in_small_data_p): Update.
 * config/score/score.c (score_in_small_data_p): Update.
 * config/rx/rx.c (rx_in_small_data): Update.
 * config/rs6000/rs6000.c (rs6000_elf_in_small_data_p): Update.
 (rs6000_xcoff_asm_named_section): Update.
 (rs6000_xcoff_unique_section): Update.
 * config/frv/frv.c (frv_string_begins_with): Update.
 (frv_in_small_data_p): Update.
 * config/v850/v850.c (v850_encode_data_area): Update.
 * config/bfin/bfin.c (DECL_SECTION_NAME): Update.
 (bfin_handle_l1_data_attribute): Update.
 (bfin_handle_l2_attribute): Update.
 * config/mep/mep.c (mep_unique_section): Update.
 * config/microblaze/microblaze.c (microblaze_elf_in_small_data_p): 
 Update.
 * config/h8300/h8300.c (h8300_handle_eightbit_data_attribute): Update.
 (h8300_handle_tiny_data_attribute): Update.
 * config/m32r/m32r.c (m32r_in_small_data_p): Update.
 (m32r_in_small_data_p): Update.
 * config/alpha/alpha.c (alpha_in_small_data_p): Update.
 * config/i386/i386.c (ix86_in_large_data_p): Update.
 * config/i386/winnt.c (i386_pe_unique_section): Update.
 * config/darwin.c (darwin_function_section): Update.
 * config/lm32/lm32.c (lm32_in_small_data_p): Update.
 * tree-emutls.c (get_emutls_init_templ_addr): Update.
 (new_emutls_decl): Update.
 * lto-cgraph.c (lto_output_node, input_node, input_varpool_node,
 input_varpool_node): Update.
 (ead_string_cst): Turn to ...
 (read_string): ... this one.
 * dwarf2out.c (secname_for_decl): Update.
 * asan.c (asan_protect_global): Update.

 * c-family/c-common.c (handle_section_attribute): Update handling for
 section names that are no longer trees.

 * java/class.c (build_utf8_ref): Update handling for section names
 that are no longer trees.
 (emit_register_classes_in_jcr_section): Update.

 * vtable-class-hierarchy.c: Update handling for section names
 that are no longer trees.
  

Re: Turn DECL_SECTION_NAME into string

2014-06-12 Thread Jan Hubicka
 On Thu, Jun 12, 2014 at 6:33 AM, Jan Hubicka hubi...@ucw.cz wrote:
  Hi,
  this lenghtly patch makes the legwork to put section names out of tree 
  representation.
  Originally they were STRING_CST. I ended up implementing on-side reference 
  counted
  string voclabulary that is done in bit baroque way to be GGC and PCH safe 
  (uff).
  The memory savings on Firefox are about 60MB, becuase while reading symbol 
  table we
  now unify the many duplicated comdat group strings and also we free them 
  after we bring
  those local.
 
  The old representation probably made sense when most of string came via 
  __section__
  attribute where they was readily parsed as string constants.
 
 I wonder why you didn't use IDENTIFIER_NODEs?  (ok, still trees ...)
 At least those are already GGC and PCH safe.

To be able to discard it effectively during LTO by ref counting.
IDENTIFIER_NODEs makes sense for assembler names (sorta) since they may match
identifier and thus also to COMDAT_GROUPS that are taken from assembler names.
Section names do not match those, so having a separate pool for them seemed to 
work
best.

What happens is at LTO is that we read all the sections for comdat groups and 
then
ipa-visibility dismantles them.

Anyway, it is now hidden by the API, so we can change it easily.

Honza
 
 Richard.
 
  Bootstrapped/regtested x86_64-linux, comitted.
 
  Honza
 
  * symtab.c (section_hash): New hash.
  (symtab_unregister_node): Clear section before freeing.
  (hash_section_hash_entry): New haser.
  (eq_sections): New function.
  (symtab_node::set_section_for_node): New method.
  (set_section_1): Update.
  (symtab_node::set_section): Take string instead of tree as 
  parameter.
  (symtab_resolve_alias): Update.
  * cgraph.h (section_hash_entry_d): New structure.
  (section_hash_entry): New typedef.
  (cgraph_node): Change comdat_group_ to x_comdat_group,
  change section_ to x_section and turn into section_hash_entry;
  update accestors; put set_section_for_node offline.
  * tree.c (decl_section_name): Turn into string.
  (set_decl_section_name): Change parameter to be string.
  * tree.h (decl_section_name, set_decl_section_name): Update 
  prototypes.
  * sdbout.c (sdbout_one_type): Update.
  * tree-vect-data-refs.c (vect_can_force_dr_alignment_p): Update.
  * varasm.c (IN_NAMED_SECTION, get_named_section, 
  resolve_unique_section,
  hot_function_section, get_named_text_section, 
  USE_SELECT_SECTION_FOR_FUNCTIONS,
  default_function_rodata_section, make_decl_rtl, 
  default_unique_section):
  Update.
  * config/c6x/c6x.c (c6x_in_small_data_p): Update.
  (c6x_elf_unique_section): Update.
  * config/nios2/nios2.c (nios2_in_small_data_p): Update.
  * config/pa/pa.c (pa_function_section): Update.
  * config/pa/pa.h (IN_NAMED_SECTION_P): Update.
  * config/ia64/ia64.c (ia64_in_small_data_p): Update.
  * config/arc/arc.c (arc_in_small_data_p): Update.
  * config/arm/unknown-elf.h (IN_NAMED_SECTION_P): Update.
  * config/mcore/mcore.c (mcore_unique_section): Update.
  * config/mips/mips.c (mips16_build_function_stub): Update.
  (mips16_build_call_stub): Update.
  (mips_function_rodata_section): Update.
  (mips_in_small_data_p): Update.
  * config/score/score.c (score_in_small_data_p): Update.
  * config/rx/rx.c (rx_in_small_data): Update.
  * config/rs6000/rs6000.c (rs6000_elf_in_small_data_p): Update.
  (rs6000_xcoff_asm_named_section): Update.
  (rs6000_xcoff_unique_section): Update.
  * config/frv/frv.c (frv_string_begins_with): Update.
  (frv_in_small_data_p): Update.
  * config/v850/v850.c (v850_encode_data_area): Update.
  * config/bfin/bfin.c (DECL_SECTION_NAME): Update.
  (bfin_handle_l1_data_attribute): Update.
  (bfin_handle_l2_attribute): Update.
  * config/mep/mep.c (mep_unique_section): Update.
  * config/microblaze/microblaze.c (microblaze_elf_in_small_data_p): 
  Update.
  * config/h8300/h8300.c (h8300_handle_eightbit_data_attribute): 
  Update.
  (h8300_handle_tiny_data_attribute): Update.
  * config/m32r/m32r.c (m32r_in_small_data_p): Update.
  (m32r_in_small_data_p): Update.
  * config/alpha/alpha.c (alpha_in_small_data_p): Update.
  * config/i386/i386.c (ix86_in_large_data_p): Update.
  * config/i386/winnt.c (i386_pe_unique_section): Update.
  * config/darwin.c (darwin_function_section): Update.
  * config/lm32/lm32.c (lm32_in_small_data_p): Update.
  * tree-emutls.c (get_emutls_init_templ_addr): Update.
  (new_emutls_decl): Update.
  * lto-cgraph.c (lto_output_node, input_node, input_varpool_node,