From 933438ae781956a1b355567385cb66130d9946b8 Mon Sep 17 00:00:00 2001 From: wilson Date: Fri, 7 May 1999 12:42:05 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@26824 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/config/mips/elf64.h | 2 ++ gcc/config/mips/mips.c | 6 +++--- gcc/config/mips/mips.h | 15 ++++++++++++++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1c6523..d33a850 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Fri May 7 12:38:54 1999 Jim Wilson + + * 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 Patch from: Nick Burrett diff --git a/gcc/config/mips/elf64.h b/gcc/config/mips/elf64.h index cb02f9c..d692531 100644 --- a/gcc/config/mips/elf64.h +++ b/gcc/config/mips/elf64.h @@ -195,6 +195,8 @@ do { \ 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; \ diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index a4b38e1..20caaa4 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -6884,10 +6884,10 @@ mips_select_rtx_section (mode, x) { 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) { diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 75ee865..08b78b8 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -3168,7 +3168,20 @@ do \ 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); \ -- 2.7.4