Re: Turn DECL_SECTION_NAME into string
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
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
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
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,