Fix mips16 libstdc++ builds. Fix inconsistency from Apr 7 change.
authorJim Wilson <wilson@cygnus.com>
Fri, 7 May 1999 12:42:05 +0000 (12:42 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Fri, 7 May 1999 12:42:05 +0000 (05:42 -0700)
* 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

gcc/ChangeLog
gcc/config/mips/elf64.h
gcc/config/mips/mips.c
gcc/config/mips/mips.h

index e1c6523a0d314e10ba3c40da8b940c366f5d7580..d33a85008fd60d578a13cb171eb9d0f8b1e55666 100644 (file)
@@ -1,3 +1,11 @@
+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>
index cb02f9c365f5b893134f9d75dd755bbc88e37d47..d692531120f211da4829c8949e2459ff6026c5db 100644 (file)
@@ -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;                                                     \
index a4b38e197a3ef75dee0947b12d68c61c7e3a4d19..20caaa4417904545765f5169d84edfef3cfa714b 100644 (file)
@@ -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)
     {
index 75ee865cdee651aed7508af605c50b168d432728..08b78b82d3c0bf4111cf51e07c71dd96ef5ee7d6 100644 (file)
@@ -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);            \