diff options
author | Richard Sandiford <rsandifo@redhat.com> | 2002-10-07 08:56:04 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@redhat.com> | 2002-10-07 08:56:04 +0000 |
commit | e01b593af1accd07b65a6933efe0aefed4f6d71e (patch) | |
tree | de334bd333fa78ec259a3fda032e663bd18c4245 | |
parent | b18101625dd5649e15be63cc988061ed7704c8e8 (diff) |
* config/mips/mips.c (mips16_strings): New variable.
(mips_output_function_epilogue): Clear the SYMBOL_REF_FLAG of every
symbol in mips16_strings. Free the list.
(mips_encode_section_info): Keep track of local strings.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/mips-3_4-rewrite-branch@57891 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 23 |
2 files changed, 29 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d41c508bce9..24ee0e77cea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2002-10-01 Richard Sandiford <rsandifo@redhat.com> + * config/mips/mips.c (mips16_strings): New variable. + (mips_output_function_epilogue): Clear the SYMBOL_REF_FLAG of every + symbol in mips16_strings. Free the list. + (mips_encode_section_info): Keep track of local strings. + +2002-10-01 Richard Sandiford <rsandifo@redhat.com> + * config/mips/mips.md (bunge, bltgt, bungt): New define_expands. (sordered_df, sordered_sf): Remove. * config/mips/mips.c (get_float_compare_codes): New fn. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 78456e4885a..8eaf56a04d2 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -367,6 +367,11 @@ char mips_hard_regno_mode_ok[(int)MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER]; constant pool is output. */ int mips_string_length; +/* When generating mips16 code, a list of all strings that are to be + output after the current function. */ + +static GTY(()) rtx mips16_strings; + /* In mips16 mode, we build a list of all the string constants we see in a particular function. */ @@ -7706,6 +7711,7 @@ mips_output_function_epilogue (file, size) HOST_WIDE_INT size ATTRIBUTE_UNUSED; { const char *fnname = ""; /* FIXME: Correct initialisation? */ + rtx string; #ifndef FUNCTION_NAME_ALREADY_DECLARED /* Get the function name the same way that toplev.c does before calling @@ -7770,6 +7776,17 @@ mips_output_function_epilogue (file, size) string_constants = next; } + /* If any following function uses the same strings as this one, force + them to refer those strings indirectly. Nearby functions could + refer them using pc-relative addressing, but it isn't safe in + general. For instance, some functions may be placed in sections + other than .text, and we don't know whether they be close enough + to this one. In large files, even other .text functions can be + too far away. */ + for (string = mips16_strings; string != 0; string = XEXP (string, 1)) + SYMBOL_REF_FLAG (XEXP (string, 0)) = 0; + free_EXPR_LIST_list (&mips16_strings); + /* Restore the output file if optimizing the GP (optimizing the GP causes the text to be diverted to a tempfile, so that data decls come before references to the data). */ @@ -8148,7 +8165,11 @@ mips_encode_section_info (decl, first) && (! current_function_decl || ! DECL_ONE_ONLY (current_function_decl))) { - SYMBOL_REF_FLAG (XEXP (TREE_CST_RTL (decl), 0)) = 1; + rtx symref; + + symref = XEXP (TREE_CST_RTL (decl), 0); + mips16_strings = alloc_EXPR_LIST (0, symref, mips16_strings); + SYMBOL_REF_FLAG (symref) = 1; mips_string_length += TREE_STRING_LENGTH (decl); } } |