+Fri May 7 12:38:54 1999 Jim Wilson <wilson@cygnus.com>
+
+ * mips/elf64.h (MAKE_DECL_ONE_ONLY, UNIQUE_SECTION_P): Define.
+ * mips/mips.c (mips_select_rtx_section): When TARGET_MIPS16, use
+ function_section instead of text_section.
+ * mips/mips.h (ENCODE_SECTION_INFO): Add check for UNIQUE_SECTION_P
+ in TARGET_MIPS16 STRING_CST handling.
+
Fri May 7 09:54:11 1999 Nick Clifton <nickc@cygnus.com>
Patch from: Nick Burrett <nick.burrett@btinternet.com>
fputc ('\n', FILE); \
} while (0)
+#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
+#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
#define UNIQUE_SECTION(DECL,RELOC) \
do { \
int len, size, sec; \
{
if (TARGET_MIPS16)
{
- /* In mips16 mode, the constant table always goes in the .text
- section, so that constants can be loaded using PC relative
+ /* In mips16 mode, the constant table always goes in the same section
+ as the function, so that constants can be loaded using PC relative
addressing. */
- text_section ();
+ function_section (current_function_decl);
}
else if (TARGET_EMBEDDED_DATA)
{
if (TARGET_MIPS16) \
{ \
if (TREE_CODE (DECL) == STRING_CST \
- && ! flag_writable_strings) \
+ && ! flag_writable_strings \
+ /* If this string is from a function, and the function will \
+ go in a gnu linkonce section, then we can't directly \
+ access the string. This gets an assembler error \
+ "unsupported PC relative reference to different section".\
+ If we modify SELECT_SECTION to put it in function_section\
+ instead of text_section, it still fails because \
+ DECL_SECTION_NAME isn't set until assemble_start_function.\
+ If we fix that, it still fails because strings are shared\
+ among multiple functions, and we have cross section \
+ references again. We force it to work by putting string \
+ addresses in the constant pool and indirecting. */ \
+ && (! current_function_decl \
+ || ! UNIQUE_SECTION_P (current_function_decl))) \
{ \
SYMBOL_REF_FLAG (XEXP (TREE_CST_RTL (DECL), 0)) = 1; \
mips_string_length += TREE_STRING_LENGTH (DECL); \