RISC-V: Make unique SECCAT_SRODATA names start with .srodata (not .sdata2)
authorKeith Packard <keithp@keithp.com>
Wed, 29 Apr 2020 16:49:56 +0000 (09:49 -0700)
committerJim Wilson <jimw@sifive.com>
Tue, 12 May 2020 23:12:10 +0000 (16:12 -0700)
default_unique_section uses ".sdata2" as a prefix for SECCAT_SRODATA
unique sections, but RISC-V uses ".srodata" instead. Override the
TARGET_ASM_UNIQUE_SECTION function to catch this case, allowing the
default to be used for all other sections.

Signed-off-by: Keith Packard <keithp@keithp.com>
gcc/
* config/riscv/riscv.c (riscv_unique_section): New.
(TARGET_ASM_UNIQUE_SECTION): New.

gcc/ChangeLog
gcc/config/riscv/riscv.c

index a360b5a975760f79d582269651c6564f85efcb90..7627f94a2fb6d9ae1d3ee226b359e4ee18124609 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-12  Keith Packard  <keith.packard@sifive.com>
+
+       * config/riscv/riscv.c (riscv_unique_section): New.
+       (TARGET_ASM_UNIQUE_SECTION): New.
+
 2020-05-12  Craig Blackmore  <craig.blackmore@embecosm.com>
 
        * config.gcc:  Add riscv-shorten-memrefs.o to extra_objs for riscv.
index e4c08d780db531c6a59e5252ec40524d3a8050d2..1ad9799fce406933343404b7fefef95a16a92a61 100644 (file)
@@ -3492,6 +3492,43 @@ riscv_select_section (tree decl, int reloc,
     }
 }
 
+/* Switch to the appropriate section for output of DECL.  */
+
+static void
+riscv_unique_section (tree decl, int reloc)
+{
+  const char *prefix = NULL;
+  bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
+
+  switch (categorize_decl_for_section (decl, reloc))
+    {
+    case SECCAT_SRODATA:
+      prefix = one_only ? ".sr" : ".srodata";
+      break;
+
+    default:
+      break;
+    }
+  if (prefix)
+    {
+      const char *name, *linkonce;
+      char *string;
+
+      name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+      name = targetm.strip_name_encoding (name);
+
+      /* If we're using one_only, then there needs to be a .gnu.linkonce
+        prefix to the section name.  */
+      linkonce = one_only ? ".gnu.linkonce" : "";
+
+      string = ACONCAT ((linkonce, prefix, ".", name, NULL));
+
+      set_decl_section_name (decl, string);
+      return;
+    }
+  default_unique_section (decl, reloc);
+}
+
 /* Return a section for X, handling small data. */
 
 static section *
@@ -5254,6 +5291,9 @@ riscv_new_address_profitable_p (rtx memref, rtx_insn *insn, rtx new_addr)
 #undef TARGET_ASM_SELECT_SECTION
 #define TARGET_ASM_SELECT_SECTION riscv_select_section
 
+#undef TARGET_ASM_UNIQUE_SECTION
+#define TARGET_ASM_UNIQUE_SECTION riscv_unique_section
+
 #undef TARGET_ASM_SELECT_RTX_SECTION
 #define TARGET_ASM_SELECT_RTX_SECTION  riscv_elf_select_rtx_section