From 293107d161b6bea57023ee55890b1ac589423ee7 Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Sun, 27 Apr 2003 03:50:27 +0000 Subject: [PATCH] varasm.c (output_constant_def): Split out two new static functions... * varasm.c (output_constant_def): Split out two new static functions, build_constant_desc and maybe_output_constant_def_contents. Restructure for comprehensibility. Don't call output_addressed_constants. Treat defstr being non-NULL for STRING_POOL_ADDRESS_P constants as an invariant. (struct deferred_string): Remove labelno field. (output_constant_def_contents): Kill labelno argument. Call output_addressed_constants here. Use ASM_OUTPUT_LABEL, not asm_out.internal_label. (mark_constant): Update call to output_constant_def_contents. Treat defstr being non-NULL for STRING_POOL_ADDRESS_P constants as an invariant. From-SVN: r66129 --- gcc/ChangeLog | 127 ++++++++++++++++------------- gcc/varasm.c | 217 ++++++++++++++++++++++++++------------------------ 2 files changed, 185 insertions(+), 159 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 060609ee921..66aec014742 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2003-04-26 Zack Weinberg + + * varasm.c (output_constant_def): Split out two new static + functions, build_constant_desc and maybe_output_constant_def_contents. + Restructure for comprehensibility. Don't call + output_addressed_constants. Treat defstr being non-NULL for + STRING_POOL_ADDRESS_P constants as an invariant. + (struct deferred_string): Remove labelno field. + (output_constant_def_contents): Kill labelno argument. Call + output_addressed_constants here. Use ASM_OUTPUT_LABEL, not + asm_out.internal_label. + (mark_constant): Update call to output_constant_def_contents. + Treat defstr being non-NULL for STRING_POOL_ADDRESS_P + constants as an invariant. + 2003-04-26 Richard Henderson * config/i386/i386.c (output_pic_addr_const): Use SYMBOL_REF_LOCAL_P. @@ -88,9 +103,9 @@ 2003-04-25 Richard Henderson - PR opt/10315 - * config/rs6000/rs6000.c (rs6000_emit_move): Only elide proper - checks during reload; use validize_mem instead of adjust_address. + PR opt/10315 + * config/rs6000/rs6000.c (rs6000_emit_move): Only elide proper + checks during reload; use validize_mem instead of adjust_address. 2003-04-26 Ben Elliston @@ -115,14 +130,14 @@ 2003-04-24 Alexander Kabaev * config/sparc/sparc.md (umulsidi3, mulsidi3): Avoid using - const_umulsidi3_sp32 and const_mulsidi3_sp32 on 64bit targets + const_umulsidi3_sp32 and const_mulsidi3_sp32 on 64bit targets where they might be not present. Use their _sp64 equivalent instead. Thu Apr 24 20:42:12 CEST 2003 Jan Hubicka * i386.md (cvtsi2sdq): Fix typo in previous patch. - + 2003-04-24 Krister Walfridsson * configure.in: Check whether mbstowcs works. @@ -156,7 +171,7 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka PR c/10308 * reload.c (find_reloads_address_1): Reload plus at the place of index register. - + 2003-04-24 Nathan Sidwell New GCOV_TAG_FUNCTION layout @@ -334,14 +349,14 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka 2003-04-22 Richard Henderson - PR 8866 - * rtl.h (MEM_NOTRAP_P): New. - (MEM_COPY_ATTRIBUTES): Copy it. - * rtlanal.c (may_trap_p): Check it. - * expr.c (do_tablejump): Set it. + PR 8866 + * rtl.h (MEM_NOTRAP_P): New. + (MEM_COPY_ATTRIBUTES): Copy it. + * rtlanal.c (may_trap_p): Check it. + * expr.c (do_tablejump): Set it. * doc/rtl.texi (Flags): Document it. - * cfgrtl.c (try_redirect_by_replacing_jump): Revert last three changes. + * cfgrtl.c (try_redirect_by_replacing_jump): Revert last three changes. 2003-04-22 Olivier Hainque @@ -350,12 +365,12 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka 2003-04-22 Vincent Celier - * gthr-gnat.h, gthr-gnat.c: new sources for implementation of - --enable-threads=gnat. - * Makefile.in: Add gthr-gnat.c to LIB2ADDEH. - * configure.in: Add gnat to the list of thread packages - * configure: Rebuild. - * config/t-linux: Add gthr-gnat.c to LIB2ADDEH and LIB2ADDEHDEP + * gthr-gnat.h, gthr-gnat.c: new sources for implementation of + --enable-threads=gnat. + * Makefile.in: Add gthr-gnat.c to LIB2ADDEH. + * configure.in: Add gnat to the list of thread packages + * configure: Rebuild. + * config/t-linux: Add gthr-gnat.c to LIB2ADDEH and LIB2ADDEHDEP 2003-04-22 Neil Booth @@ -366,7 +381,7 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka * cpptrad.c (_cpp_replacement_text_len): Add check for macro parameter count. (_cpp_copy_replacement_text): Same. - + 2003-04-22 Neil Booth * c-lex.c (c_lex): Handle CPP_OTHER differently. @@ -397,9 +412,9 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka 2003-04-22 Aldy Hernandez - * config/rs6000/t-spe: Merge in t-fprules into file. + * config/rs6000/t-spe: Merge in t-fprules into file. - * config.gcc: Add t-spe to powerpc-eabispe. + * config.gcc: Add t-spe to powerpc-eabispe. 2003-04-22 Kean Johnston @@ -433,8 +448,8 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka 2003-04-21 Aldy Hernandez - * config/rs6000/rs6000.c (rs6000_override_options): No SPE means - 64-bit long doubles. + * config/rs6000/rs6000.c (rs6000_override_options): No SPE means + 64-bit long doubles. 2003-04-21 Olivier Hainque @@ -446,7 +461,7 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka nested subprograms. * expmed.c (extract_bit_field): Reverse operands of && condition to - prevent a potential division by zero in the previously first branch. + prevent a potential division by zero in the previously first branch. * config/pa/pa.md (extv, extzv): FAIL if the bitfield length is zero. 2003-04-21 Joel Brobecker @@ -458,34 +473,34 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka 2003-04-21 Nathan Sidwell - Break out coverage routines to new file. - * Makefile.in (COVERAGE_H): New variable - (C_OBJS): Add coverage.o - (coverage.o): New target. - (profile.o, loop-init.o, sched-ebb.o, predict.o, tracer.o): Adjust - dependencies. - (GTFILES): Adjust. - (gt-coverage.h): New target. - (gt-profile.h): Remove. - * profile.h: Remove. Move to ... - * coverage.h: ... here. New. #include gcov-io.h. - * gcov-io.h: Move function definitions to ... - * gcov-io.c: ... here. New. - * profile.c: Move coverage routines to coverage.c. - (instrument_edges, get_exec_counts, branch_prob, init_branch_prob, - end_branch_prob): Adjust. - * coverage.c: New. Coverage routines from profile.c - (coverage_counter_ref, coverage_init, coverage_finish, - coverage_end_function, coverage_begin_output, - coverage_counter_ref, get_coverage_counts): Define. - * gcov-dump.c, gcov.c: #include gcov-io.c. - * libgcov.c: Likewise. Adjust. - * loop-init.c: Don't #include profile.h - * tracer.c, predict.c, sched-ebb.c: Adjust #includes. - * rtl.h: Add coverage prototypes. - * toplev.c (compile_file): Init coverage, not branch_prob. - Always call coverage_finish. - (rest_of_compilation): Call coverage_end_function. + Break out coverage routines to new file. + * Makefile.in (COVERAGE_H): New variable + (C_OBJS): Add coverage.o + (coverage.o): New target. + (profile.o, loop-init.o, sched-ebb.o, predict.o, tracer.o): Adjust + dependencies. + (GTFILES): Adjust. + (gt-coverage.h): New target. + (gt-profile.h): Remove. + * profile.h: Remove. Move to ... + * coverage.h: ... here. New. #include gcov-io.h. + * gcov-io.h: Move function definitions to ... + * gcov-io.c: ... here. New. + * profile.c: Move coverage routines to coverage.c. + (instrument_edges, get_exec_counts, branch_prob, init_branch_prob, + end_branch_prob): Adjust. + * coverage.c: New. Coverage routines from profile.c + (coverage_counter_ref, coverage_init, coverage_finish, + coverage_end_function, coverage_begin_output, + coverage_counter_ref, get_coverage_counts): Define. + * gcov-dump.c, gcov.c: #include gcov-io.c. + * libgcov.c: Likewise. Adjust. + * loop-init.c: Don't #include profile.h + * tracer.c, predict.c, sched-ebb.c: Adjust #includes. + * rtl.h: Add coverage prototypes. + * toplev.c (compile_file): Init coverage, not branch_prob. + Always call coverage_finish. + (rest_of_compilation): Call coverage_end_function. 2003-04-21 Matt Kraai @@ -506,10 +521,10 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka * cpplib.h (struct cpp_callbacks): Change prototype of include. 2003-04-21 Richard Kenner - + * doc/rtl.texi (RTX_UNCHANGING_P): Point to true_dependence for details of conflict handling. - + * fold-const.c (extract_muldiv, case CONVERT_EXPR): Detect case when conversion overflows. @@ -525,7 +540,7 @@ Thu Apr 24 16:55:26 CEST 2003 Jan Hubicka 2003-04-21 Andreas Jaeger - * cppcharset.c (_cpp_valid_ucn): Cast field precision to int. + * cppcharset.c (_cpp_valid_ucn): Cast field precision to int. 2003-04-20 Chris Lattner Zack Weinberg @@ -921,7 +936,7 @@ Fri Apr 18 01:28:51 CEST 2003 Jan Hubicka * emit-rtl.c (subreg_hard_regno): Check that register is representable. - + * reload.c (reload_inner_reg_of_subreg): When register is not representable, reload the whole thing. (find_reloads): Likewsie. diff --git a/gcc/varasm.c b/gcc/varasm.c index fed8b9667c0..82a3e15486c 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -142,7 +142,8 @@ static unsigned int const_hash PARAMS ((tree)); static unsigned int const_hash_1 PARAMS ((tree)); static int compare_constant PARAMS ((tree, tree)); static tree copy_constant PARAMS ((tree)); -static void output_constant_def_contents PARAMS ((tree, int, int)); +static void maybe_output_constant_def_contents PARAMS ((tree, rtx, int)); +static void output_constant_def_contents PARAMS ((tree, const char *)); static void decode_rtx_const PARAMS ((enum machine_mode, rtx, struct rtx_const *)); static unsigned int const_hash_rtx PARAMS ((enum machine_mode, rtx)); @@ -2164,6 +2165,8 @@ struct constant_descriptor_tree GTY(()) static GTY(()) struct constant_descriptor_tree * const_hash_table[MAX_HASH_TABLE]; +static struct constant_descriptor_tree * build_constant_desc PARAMS ((tree)); + /* We maintain a hash table of STRING_CST values. Unless we are asked to force out a string constant, we defer output of the constants until we know they are actually used. This will be if something takes its address or if @@ -2175,7 +2178,6 @@ struct deferred_string GTY(()) { const char *label; tree exp; - int labelno; }; static GTY ((param_is (struct deferred_string))) htab_t const_str_htab; @@ -2533,6 +2535,51 @@ copy_constant (exp) } } +/* Subroutine of output_constant_def: + No constant equal to EXP is known to have been output. + Make a constant descriptor to enter EXP in the hash table. + Assign the label number and construct RTL to refer to the + constant's location in memory. + Caller is responsible for updating the hash table. */ + +static struct constant_descriptor_tree * +build_constant_desc (exp) + tree exp; +{ + rtx symbol; + rtx rtl; + char label[256]; + int labelno; + struct constant_descriptor_tree *desc; + + desc = ggc_alloc (sizeof (*desc)); + desc->value = copy_constant (exp); + + /* Create a string containing the label name, in LABEL. */ + labelno = const_labelno++; + ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno); + + /* We have a symbol name; construct the SYMBOL_REF and the MEM. */ + symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label)); + SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL; + + rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol); + set_mem_attributes (rtl, exp, 1); + set_mem_alias_set (rtl, 0); + set_mem_alias_set (rtl, const_alias_set); + + /* Set flags or add text to the name to record information, such as + that it is a local symbol. If the name is changed, the macro + ASM_OUTPUT_LABELREF will have to know how to strip this + information. */ + (*targetm.encode_section_info) (exp, rtl, true); + + desc->rtl = rtl; + desc->label = XSTR (XEXP (desc->rtl, 0), 0); + + return desc; +} + /* Return an rtx representing a reference to constant data in memory for the constant expression EXP. @@ -2554,12 +2601,6 @@ output_constant_def (exp, defer) { int hash; struct constant_descriptor_tree *desc; - struct deferred_string **defstr; - char label[256]; - int reloc; - int found = 1; - int labelno = -1; - rtx rtl; /* We can't just use the saved RTL if this is a deferred string constant and we are not to defer anymore. */ @@ -2567,133 +2608,102 @@ output_constant_def (exp, defer) && (defer || !STRING_POOL_ADDRESS_P (XEXP (TREE_CST_RTL (exp), 0)))) return TREE_CST_RTL (exp); - /* Make sure any other constants whose addresses appear in EXP - are assigned label numbers. */ - - reloc = output_addressed_constants (exp); - /* Compute hash code of EXP. Search the descriptors for that hash code to see if any of them describes EXP. If yes, the descriptor records the label number already assigned. */ hash = const_hash (exp); - for (desc = const_hash_table[hash]; desc; desc = desc->next) if (compare_constant (exp, desc->value)) break; if (desc == 0) { - rtx symbol; - - /* No constant equal to EXP is known to have been output. - Make a constant descriptor to enter EXP in the hash table. - Assign the label number and record it in the descriptor for - future calls to this function to find. */ - - /* Create a string containing the label name, in LABEL. */ - labelno = const_labelno++; - ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno); - - desc = ggc_alloc (sizeof (*desc)); + desc = build_constant_desc (exp); desc->next = const_hash_table[hash]; - desc->label = ggc_strdup (label); - desc->value = copy_constant (exp); const_hash_table[hash] = desc; - /* We have a symbol name; construct the SYMBOL_REF and the MEM. */ - symbol = gen_rtx_SYMBOL_REF (Pmode, desc->label); - SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL; - - rtl = desc->rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol); + maybe_output_constant_def_contents (exp, desc->rtl, defer); + } + else if (!defer && STRING_POOL_ADDRESS_P (XEXP (desc->rtl, 0))) + { + /* If the string is currently deferred but we need to output it + now, remove it from the deferred string hash table. */ + struct deferred_string **defstr; - set_mem_attributes (rtl, exp, 1); - set_mem_alias_set (rtl, 0); - set_mem_alias_set (rtl, const_alias_set); + defstr = (struct deferred_string **) + htab_find_slot_with_hash (const_str_htab, desc->label, + STRHASH (desc->label), NO_INSERT); +#ifdef ENABLE_CHECKING + if (!defstr) + abort (); +#endif - found = 0; + STRING_POOL_ADDRESS_P (XEXP (desc->rtl, 0)) = 0; + htab_clear_slot (const_str_htab, (void **) defstr); + maybe_output_constant_def_contents (exp, desc->rtl, 0); } - else - rtl = desc->rtl; - if (TREE_CODE (exp) != INTEGER_CST) - TREE_CST_RTL (exp) = rtl; + TREE_CST_RTL (exp) = desc->rtl; + return desc->rtl; +} - /* Optionally set flags or add text to the name to record information - such as that it is a function name. If the name is changed, the macro - ASM_OUTPUT_LABELREF will have to know how to strip this information. */ - /* A previously-processed constant would already have section info - encoded in it. */ - if (! found) - { - (*targetm.encode_section_info) (exp, rtl, true); +/* Subroutine of output_constant_def: + Decide whether or not to defer the output of EXP, which can be + accesed through rtl RTL, and either do the output or record EXP in + the table of deferred strings. */ +static void +maybe_output_constant_def_contents (exp, rtl, defer) + tree exp; + rtx rtl; + int defer; +{ + const char *label; - desc->rtl = rtl; - desc->label = XSTR (XEXP (desc->rtl, 0), 0); - } + if (flag_syntax_only) + return; - if (found && !defer && STRING_POOL_ADDRESS_P (XEXP (rtl, 0))) + label = XSTR (XEXP (rtl, 0), 0); + + if (defer && TREE_CODE (exp) == STRING_CST && !flag_writable_strings) { + struct deferred_string **defstr; defstr = (struct deferred_string **) - htab_find_slot_with_hash (const_str_htab, desc->label, - STRHASH (desc->label), NO_INSERT); + htab_find_slot_with_hash (const_str_htab, label, + STRHASH (label), INSERT); if (defstr) { - /* If the string is currently deferred but we need to output it now, - remove it from deferred string hash table. */ - found = 0; - labelno = (*defstr)->labelno; - STRING_POOL_ADDRESS_P (XEXP (rtl, 0)) = 0; - htab_clear_slot (const_str_htab, (void **) defstr); - } - } + struct deferred_string *p; - /* If this is the first time we've seen this particular constant, - output it. Do no output if -fsyntax-only. */ - if (! found && ! flag_syntax_only) - { - if (!defer || TREE_CODE (exp) != STRING_CST - || flag_writable_strings) - output_constant_def_contents (exp, reloc, labelno); - else - { - defstr = (struct deferred_string **) - htab_find_slot_with_hash (const_str_htab, desc->label, - STRHASH (desc->label), INSERT); - if (!defstr) - output_constant_def_contents (exp, reloc, labelno); - else - { - struct deferred_string *p; + p = (struct deferred_string *) + ggc_alloc (sizeof (struct deferred_string)); - p = (struct deferred_string *) - ggc_alloc (sizeof (struct deferred_string)); + p->exp = exp; + p->label = label; - p->exp = desc->value; - p->label = desc->label; - p->labelno = labelno; - *defstr = p; - STRING_POOL_ADDRESS_P (XEXP (rtl, 0)) = 1; - } + *defstr = p; + STRING_POOL_ADDRESS_P (XEXP (rtl, 0)) = 1; + return; } } - return rtl; + output_constant_def_contents (exp, label); } /* Now output assembler code to define the label for EXP, and follow it with the data of EXP. */ static void -output_constant_def_contents (exp, reloc, labelno) +output_constant_def_contents (exp, label) tree exp; - int reloc; - int labelno; + const char *label; { - int align; + /* Make sure any other constants whose addresses appear in EXP + are assigned label numbers. */ + int reloc = output_addressed_constants (exp); /* Align the location counter as required by EXP's data type. */ - align = TYPE_ALIGN (TREE_TYPE (exp)); + int align = TYPE_ALIGN (TREE_TYPE (exp)); #ifdef CONSTANT_ALIGNMENT align = CONSTANT_ALIGNMENT (exp, align); #endif @@ -2709,7 +2719,7 @@ output_constant_def_contents (exp, reloc, labelno) } /* Output the label itself. */ - (*targetm.asm_out.internal_label) (asm_out_file, "LC", labelno); + ASM_OUTPUT_LABEL (asm_out_file, label); /* Output the value of EXP. */ output_constant (exp, @@ -3521,19 +3531,20 @@ mark_constant (current_rtx, data) } else if (STRING_POOL_ADDRESS_P (x)) { - struct deferred_string **defstr; + struct deferred_string *p, **defstr; defstr = (struct deferred_string **) htab_find_slot_with_hash (const_str_htab, XSTR (x, 0), STRHASH (XSTR (x, 0)), NO_INSERT); - if (defstr) - { - struct deferred_string *p = *defstr; +#ifdef ENABLE_CHECKING + if (!defstr) + abort (); +#endif - STRING_POOL_ADDRESS_P (x) = 0; - output_constant_def_contents (p->exp, 0, p->labelno); - htab_clear_slot (const_str_htab, (void **) defstr); - } + p = *defstr; + STRING_POOL_ADDRESS_P (x) = 0; + output_constant_def_contents (p->exp, p->label); + htab_clear_slot (const_str_htab, (void **) defstr); } } return 0; -- 2.30.2