]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Adjust the symbol for SECTION_LINK_ORDER linked_to section [PR99889]
authorKewen.Lin <linkw@gcc.gnu.org>
Fri, 25 Nov 2022 03:17:28 +0000 (21:17 -0600)
committerKewen Lin <linkw@linux.ibm.com>
Fri, 25 Nov 2022 03:17:28 +0000 (21:17 -0600)
As discussed in PR98125, -fpatchable-function-entry with
SECTION_LINK_ORDER support doesn't work well on powerpc64
ELFv1 because the filled "Symbol" in

  .section name,"flags"o,@type,Symbol

sits in .opd section instead of in the function_section
like .text or named .text*.

Since we already generates one label LPFE* which sits in
function_section of current_function_decl, this patch is
to reuse it as the symbol for the linked_to section.  It
avoids the above ABI specific issue when using the symbol
concluded from current_function_decl.

Besides, with this support some previous workarounds can
be reverted.

PR target/99889

gcc/ChangeLog:

* config/rs6000/rs6000.cc (rs6000_print_patchable_function_entry):
Adjust to call function default_print_patchable_function_entry.
* targhooks.cc (default_print_patchable_function_entry_1): Remove and
move the flags preparation ...
(default_print_patchable_function_entry): ... here, adjust to use
current_function_funcdef_no for label no.
* targhooks.h (default_print_patchable_function_entry_1): Remove.
* varasm.cc (default_elf_asm_named_section): Adjust code for
__patchable_function_entries section support with LPFE label.

gcc/testsuite/ChangeLog:

* g++.dg/pr93195a.C: Remove the skip on powerpc*-*-* 64-bit.
* gcc.target/aarch64/pr92424-2.c: Adjust LPFE1 with LPFE0.
* gcc.target/aarch64/pr92424-3.c: Likewise.
* gcc.target/i386/pr93492-2.c: Likewise.
* gcc.target/i386/pr93492-3.c: Likewise.
* gcc.target/i386/pr93492-4.c: Likewise.
* gcc.target/i386/pr93492-5.c: Likewise.

gcc/config/rs6000/rs6000.cc
gcc/targhooks.cc
gcc/targhooks.h
gcc/testsuite/g++.dg/pr93195a.C
gcc/testsuite/gcc.target/aarch64/pr92424-2.c
gcc/testsuite/gcc.target/aarch64/pr92424-3.c
gcc/testsuite/gcc.target/i386/pr93492-2.c
gcc/testsuite/gcc.target/i386/pr93492-3.c
gcc/testsuite/gcc.target/i386/pr93492-4.c
gcc/testsuite/gcc.target/i386/pr93492-5.c
gcc/varasm.cc

index a85d7630b41d1734fac7ebf07677ddf086db4abc..eb7ad5e954f51a4da11b5d16978d31e69b1323d3 100644 (file)
@@ -14925,22 +14925,13 @@ rs6000_print_patchable_function_entry (FILE *file,
                                       unsigned HOST_WIDE_INT patch_area_size,
                                       bool record_p)
 {
-  unsigned int flags = SECTION_WRITE | SECTION_RELRO;
-  /* When .opd section is emitted, the function symbol
-     default_print_patchable_function_entry_1 is emitted into the .opd section
-     while the patchable area is emitted into the function section.
-     Don't use SECTION_LINK_ORDER in that case.  */
-  if (!(TARGET_64BIT && DEFAULT_ABI != ABI_ELFv2)
-      && HAVE_GAS_SECTION_LINK_ORDER)
-    flags |= SECTION_LINK_ORDER;
   bool global_entry_needed_p = rs6000_global_entry_point_prologue_needed_p ();
   /* For a function which needs global entry point, we will emit the
      patchable area before and after local entry point under the control of
      cfun->machine->global_entry_emitted, see the handling in function
      rs6000_output_function_prologue.  */
   if (!global_entry_needed_p || cfun->machine->global_entry_emitted)
-    default_print_patchable_function_entry_1 (file, patch_area_size, record_p,
-                                             flags);
+    default_print_patchable_function_entry (file, patch_area_size, record_p);
 }
 \f
 enum rtx_code
index 4bfdd586a3c59c13a1b415a129ff3ff7dc9883a6..d9e61552ad5a7b7a92eb172b011075cf7f29cc11 100644 (file)
@@ -2020,15 +2020,17 @@ default_compare_by_pieces_branch_ratio (machine_mode)
   return 1;
 }
 
-/* Helper for default_print_patchable_function_entry and other
-   print_patchable_function_entry hook implementations.  */
+/* Write PATCH_AREA_SIZE NOPs into the asm outfile FILE around a function
+   entry.  If RECORD_P is true and the target supports named sections,
+   the location of the NOPs will be recorded in a special object section
+   called "__patchable_function_entries".  This routine may be called
+   twice per function to put NOPs before and after the function
+   entry.  */
 
 void
-default_print_patchable_function_entry_1 (FILE *file,
-                                         unsigned HOST_WIDE_INT
-                                         patch_area_size,
-                                         bool record_p,
-                                         unsigned int flags)
+default_print_patchable_function_entry (FILE *file,
+                                       unsigned HOST_WIDE_INT patch_area_size,
+                                       bool record_p)
 {
   const char *nop_templ = 0;
   int code_num;
@@ -2042,13 +2044,17 @@ default_print_patchable_function_entry_1 (FILE *file,
   if (record_p && targetm_common.have_named_sections)
     {
       char buf[256];
-      static int patch_area_number;
       section *previous_section = in_section;
       const char *asm_op = integer_asm_op (POINTER_SIZE_UNITS, false);
 
       gcc_assert (asm_op != NULL);
-      patch_area_number++;
-      ASM_GENERATE_INTERNAL_LABEL (buf, "LPFE", patch_area_number);
+      /* If SECTION_LINK_ORDER is supported, this internal label will
+        be filled as the symbol for linked_to section.  */
+      ASM_GENERATE_INTERNAL_LABEL (buf, "LPFE", current_function_funcdef_no);
+
+      unsigned int flags = SECTION_WRITE | SECTION_RELRO;
+      if (HAVE_GAS_SECTION_LINK_ORDER)
+       flags |= SECTION_LINK_ORDER;
 
       section *sect = get_section ("__patchable_function_entries",
                                  flags, current_function_decl);
@@ -2070,25 +2076,6 @@ default_print_patchable_function_entry_1 (FILE *file,
     output_asm_insn (nop_templ, NULL);
 }
 
-/* Write PATCH_AREA_SIZE NOPs into the asm outfile FILE around a function
-   entry.  If RECORD_P is true and the target supports named sections,
-   the location of the NOPs will be recorded in a special object section
-   called "__patchable_function_entries".  This routine may be called
-   twice per function to put NOPs before and after the function
-   entry.  */
-
-void
-default_print_patchable_function_entry (FILE *file,
-                                       unsigned HOST_WIDE_INT patch_area_size,
-                                       bool record_p)
-{
-  unsigned int flags = SECTION_WRITE | SECTION_RELRO;
-  if (HAVE_GAS_SECTION_LINK_ORDER)
-    flags |= SECTION_LINK_ORDER;
-  default_print_patchable_function_entry_1 (file, patch_area_size, record_p,
-                                           flags);
-}
-
 bool
 default_profile_before_prologue (void)
 {
index cb18f486821ed0f6056e62f340cd04634723a565..3ca25ab6edb59b98225e7f22c0703730e569c30b 100644 (file)
@@ -233,9 +233,6 @@ extern bool default_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT,
                                                    bool);
 extern int default_compare_by_pieces_branch_ratio (machine_mode);
 
-extern void default_print_patchable_function_entry_1 (FILE *,
-                                                     unsigned HOST_WIDE_INT,
-                                                     bool, unsigned int);
 extern void default_print_patchable_function_entry (FILE *,
                                                    unsigned HOST_WIDE_INT,
                                                    bool);
index b14f1b3e34189b06c0472489ee5e63a637fcfae4..26d265da74ebf7754a1724c0ba5694c5b28d03b3 100644 (file)
@@ -1,5 +1,4 @@
 /* { dg-do link { target { ! { nvptx*-*-* visium-*-* } } } } */
-/* { dg-skip-if "not supported" { { powerpc*-*-* } && lp64 } } */
 // { dg-require-effective-target o_flag_in_section }
 /* { dg-options "-O0 -fpatchable-function-entry=1" } */
 /* { dg-additional-options "-fno-pie" { target sparc*-*-* } } */
index 0e75657a15371533c8d75dbb3a730b81ea6e67a0..12465213aef07ceaa8b06bf53b0f873f5175eb33 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do "compile" } */
 /* { dg-options "-O1" } */
 
-/* Test the placement of the .LPFE1 label.  */
+/* Test the placement of the .LPFE0 label.  */
 
 void
 __attribute__ ((target("branch-protection=bti"),
@@ -9,4 +9,4 @@ __attribute__ ((target("branch-protection=bti"),
 f10_bti ()
 {
 }
-/* { dg-final { scan-assembler "f10_bti:\n\thint\t34 // bti c\n.*\.LPFE1:\n\tnop\n.*\tret\n" } } */
+/* { dg-final { scan-assembler "f10_bti:\n\thint\t34 // bti c\n.*\.LPFE0:\n\tnop\n.*\tret\n" } } */
index 0a1f74d4096220ac69dec0886bbe4f6c5d174378..2c6a73789f0aa3a2cd8317c53dfe555c8045e803 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do "compile" } */
 /* { dg-options "-O1" } */
 
-/* Test the placement of the .LPFE1 label.  */
+/* Test the placement of the .LPFE0 label.  */
 
 void
 __attribute__ ((target("branch-protection=bti+pac-ret+leaf"),
@@ -9,4 +9,4 @@ __attribute__ ((target("branch-protection=bti+pac-ret+leaf"),
 f10_pac ()
 {
 }
-/* { dg-final { scan-assembler "f10_pac:\n\thint\t34 // bti c\n.*\.LPFE1:\n\tnop\n.*\thint\t25 // paciasp\n.*\thint\t29 // autiasp\n.*\tret\n" } } */
+/* { dg-final { scan-assembler "f10_pac:\n\thint\t34 // bti c\n.*\.LPFE0:\n\tnop\n.*\thint\t25 // paciasp\n.*\thint\t29 // autiasp\n.*\tret\n" } } */
index 3d67095fd10434b1c6e69c23cf1565ead4ff0eaf..ede8c2077b7e43618798076e5c86868e40ae2301 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do "compile" { target *-*-linux* } } */
 /* { dg-options "-O1 -fcf-protection -mmanual-endbr -fasynchronous-unwind-tables" } */
 
-/* Test the placement of the .LPFE1 label.  */
+/* Test the placement of the .LPFE0 label.  */
 
 void
 __attribute__ ((cf_check,patchable_function_entry (1, 0)))
@@ -9,4 +9,4 @@ f10_endbr (void)
 {
 }
 
-/* { dg-final { scan-assembler "\t\.cfi_startproc\n\tendbr(32|64)\n.*\.LPFE1:\n\tnop\n\tret\n" } } */
+/* { dg-final { scan-assembler "\t\.cfi_startproc\n\tendbr(32|64)\n.*\.LPFE0:\n\tnop\n\tret\n" } } */
index a625c927f4f0bb5e0e3b27941fe514e3cb28875f..b68da30bd36566465ac7ad805bfd639e5236f751 100644 (file)
@@ -2,7 +2,7 @@
 /* { dg-require-effective-target mfentry } */
 /* { dg-options "-O1 -fcf-protection -mmanual-endbr -mfentry -pg -fasynchronous-unwind-tables" } */
 
-/* Test the placement of the .LPFE1 label.  */
+/* Test the placement of the .LPFE0 label.  */
 
 void
 __attribute__ ((cf_check,patchable_function_entry (1, 0)))
@@ -10,4 +10,4 @@ f10_endbr (void)
 {
 }
 
-/* { dg-final { scan-assembler "\t\.cfi_startproc\n\tendbr(32|64)\n.*\.LPFE1:\n\tnop\n1:\tcall\t\[^\n\]*__fentry__\[^\n\]*\n\tret\n" } } */
+/* { dg-final { scan-assembler "\t\.cfi_startproc\n\tendbr(32|64)\n.*\.LPFE0:\n\tnop\n1:\tcall\t\[^\n\]*__fentry__\[^\n\]*\n\tret\n" } } */
index 8f205c345b8c171c085b6b4374af035ab274b696..c73034a46241f5a5260c3b2bca24e172555ce0b0 100644 (file)
@@ -1,11 +1,11 @@
 /* { dg-do "compile" { target *-*-linux* } } */
 /* { dg-options "-O1 -fpatchable-function-entry=1 -fasynchronous-unwind-tables" } */
 
-/* Test the placement of the .LPFE1 label.  */
+/* Test the placement of the .LPFE0 label.  */
 
 void
 foo (void)
 {
 }
 
-/* { dg-final { scan-assembler "\t\.cfi_startproc\n.*\.LPFE1:\n\tnop\n\tret\n" } } */
+/* { dg-final { scan-assembler "\t\.cfi_startproc\n.*\.LPFE0:\n\tnop\n\tret\n" } } */
index 1ca5ba1fac16c46ff8b93b776c920d6b584f52cc..ee9849ae852ed460d2df7c8eb4f35d360c3f76f1 100644 (file)
@@ -2,11 +2,11 @@
 /* { dg-options "-O1 -fpatchable-function-entry=1 -mfentry -pg -fasynchronous-unwind-tables" } */
 /* { dg-additional-options "-fno-PIE" { target ia32 } } */
 
-/* Test the placement of the .LPFE1 label.  */
+/* Test the placement of the .LPFE0 label.  */
 
 void
 foo (void)
 {
 }
 
-/* { dg-final { scan-assembler "\t\.cfi_startproc\n.*\.LPFE1:\n\tnop\n1:\tcall\t\[^\n\]*__fentry__\[^\n\]*\n\tret\n" } } */
+/* { dg-final { scan-assembler "\t\.cfi_startproc\n.*\.LPFE0:\n\tnop\n1:\tcall\t\[^\n\]*__fentry__\[^\n\]*\n\tret\n" } } */
index d0beac8f8e36814921a06407950f6afc6b8b641b..9dfbebbb91597d431bf286a920b6025a766bc822 100644 (file)
@@ -6915,11 +6915,16 @@ default_elf_asm_named_section (const char *name, unsigned int flags,
        fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
       if (flags & SECTION_LINK_ORDER)
        {
-         tree id = DECL_ASSEMBLER_NAME (decl);
-         ultimate_transparent_alias_target (&id);
-         const char *name = IDENTIFIER_POINTER (id);
-         name = targetm.strip_name_encoding (name);
-         fprintf (asm_out_file, ",%s", name);
+         /* For now, only section "__patchable_function_entries"
+            adopts flag SECTION_LINK_ORDER, internal label LPFE*
+            was emitted in default_print_patchable_function_entry,
+            just place it here for linked_to section.  */
+         gcc_assert (!strcmp (name, "__patchable_function_entries"));
+         fprintf (asm_out_file, ",");
+         char buf[256];
+         ASM_GENERATE_INTERNAL_LABEL (buf, "LPFE",
+                                      current_function_funcdef_no);
+         assemble_name_raw (asm_out_file, buf);
        }
       if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
        {