+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.
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. */
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
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). */
&& (! 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);
}
}