[Darwin] Amend section for constants with reloactions.
authorIain Sandoe <iain@sandoe.co.uk>
Sat, 5 Oct 2019 08:05:44 +0000 (08:05 +0000)
committerIain Sandoe <iains@gcc.gnu.org>
Sat, 5 Oct 2019 08:05:44 +0000 (08:05 +0000)
Darwin's linker doesn't like text section relocations (they require special
enabling).  At least, the Fortran FE seems to generate cases where the
initialiser for a pointer constant can need a relocation.  We can handle
this by special-casing SECCAT_RODATA when the relocation is present by
placing the constant in the .const_data section.

gcc/ChangeLog:

2019-10-05  Iain Sandoe  <iain@sandoe.co.uk>

PR target/59888
* config/darwin.c (darwin_rodata_section): Add relocation flag,
choose const_data section for constants with relocations.
(machopic_select_section): Pass relocation flag to
darwin_rodata_section ().

From-SVN: r276623

gcc/ChangeLog
gcc/config/darwin.c

index 171d554..e855712 100644 (file)
@@ -1,3 +1,11 @@
+2019-10-05  Iain Sandoe  <iain@sandoe.co.uk>
+
+       PR target/59888
+       * config/darwin.c (darwin_rodata_section): Add relocation flag,
+       choose const_data section for constants with relocations.
+       (machopic_select_section): Pass relocation flag to
+       darwin_rodata_section ().
+
 2019-10-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/91734
index 3a1be5a..2fb9c56 100644 (file)
@@ -1251,12 +1251,13 @@ darwin_mark_decl_preserved (const char *name)
 }
 
 static section *
-darwin_rodata_section (int use_coal, bool zsize)
+darwin_rodata_section (int use_coal, bool zsize, int reloc)
 {
   return (use_coal
          ? darwin_sections[const_coal_section]
          : (zsize ? darwin_sections[zobj_const_section]
-                  : darwin_sections[const_section]));
+                  : reloc ? darwin_sections[const_data_section]
+                          : darwin_sections[const_section]));
 }
 
 static section *
@@ -1549,7 +1550,7 @@ machopic_select_section (tree decl,
 
     case SECCAT_RODATA:
     case SECCAT_SRODATA:
-      base_section = darwin_rodata_section (use_coal, zsize);
+      base_section = darwin_rodata_section (use_coal, zsize, reloc);
       break;
 
     case SECCAT_RODATA_MERGE_STR: