Commit 52ecdfda by Jim Wilson Committed by Jim Wilson

Fix mips16 libstdc++ builds. Fix inconsistency from Apr 7 change.

	* 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.

From-SVN: r26824
parent e42dc604
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> Fri May 7 09:54:11 1999 Nick Clifton <nickc@cygnus.com>
Patch from: Nick Burrett <nick.burrett@btinternet.com> Patch from: Nick Burrett <nick.burrett@btinternet.com>
......
...@@ -195,6 +195,8 @@ do { \ ...@@ -195,6 +195,8 @@ do { \
fputc ('\n', FILE); \ fputc ('\n', FILE); \
} while (0) } 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) \ #define UNIQUE_SECTION(DECL,RELOC) \
do { \ do { \
int len, size, sec; \ int len, size, sec; \
......
...@@ -6884,10 +6884,10 @@ mips_select_rtx_section (mode, x) ...@@ -6884,10 +6884,10 @@ mips_select_rtx_section (mode, x)
{ {
if (TARGET_MIPS16) if (TARGET_MIPS16)
{ {
/* In mips16 mode, the constant table always goes in the .text /* In mips16 mode, the constant table always goes in the same section
section, so that constants can be loaded using PC relative as the function, so that constants can be loaded using PC relative
addressing. */ addressing. */
text_section (); function_section (current_function_decl);
} }
else if (TARGET_EMBEDDED_DATA) else if (TARGET_EMBEDDED_DATA)
{ {
......
...@@ -3168,7 +3168,20 @@ do \ ...@@ -3168,7 +3168,20 @@ do \
if (TARGET_MIPS16) \ if (TARGET_MIPS16) \
{ \ { \
if (TREE_CODE (DECL) == STRING_CST \ 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; \ SYMBOL_REF_FLAG (XEXP (TREE_CST_RTL (DECL), 0)) = 1; \
mips_string_length += TREE_STRING_LENGTH (DECL); \ mips_string_length += TREE_STRING_LENGTH (DECL); \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment