diff options
author | Kewen.Lin <linkw@gcc.gnu.org> | 2022-11-24 21:17:28 -0600 |
---|---|---|
committer | Kewen Lin <linkw@linux.ibm.com> | 2022-11-24 21:17:28 -0600 |
commit | f120196382ac5ac49ec4a60f8abad42f22d45a91 (patch) | |
tree | 3e3db2e70fb65301de650e04b07e70cebe429620 /gcc | |
parent | 4581328022615c2cb732cfb404151c4b059d26e3 (diff) | |
download | gcc-f120196382ac5ac49ec4a60f8abad42f22d45a91.zip gcc-f120196382ac5ac49ec4a60f8abad42f22d45a91.tar.gz gcc-f120196382ac5ac49ec4a60f8abad42f22d45a91.tar.bz2 |
Adjust the symbol for SECTION_LINK_ORDER linked_to section [PR99889]
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/rs6000/rs6000.cc | 11 | ||||
-rw-r--r-- | gcc/targhooks.cc | 45 | ||||
-rw-r--r-- | gcc/targhooks.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr93195a.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/pr92424-2.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/pr92424-3.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr93492-2.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr93492-3.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr93492-4.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr93492-5.c | 4 | ||||
-rw-r--r-- | gcc/varasm.cc | 15 |
11 files changed, 39 insertions, 60 deletions
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index a85d7630..eb7ad5e 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -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); } enum rtx_code diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc index 4bfdd58..d9e61552 100644 --- a/gcc/targhooks.cc +++ b/gcc/targhooks.cc @@ -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) { diff --git a/gcc/targhooks.h b/gcc/targhooks.h index cb18f48..3ca25ab 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -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); diff --git a/gcc/testsuite/g++.dg/pr93195a.C b/gcc/testsuite/g++.dg/pr93195a.C index b14f1b3..26d265d 100644 --- a/gcc/testsuite/g++.dg/pr93195a.C +++ b/gcc/testsuite/g++.dg/pr93195a.C @@ -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*-*-* } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/pr92424-2.c b/gcc/testsuite/gcc.target/aarch64/pr92424-2.c index 0e75657..1246521 100644 --- a/gcc/testsuite/gcc.target/aarch64/pr92424-2.c +++ b/gcc/testsuite/gcc.target/aarch64/pr92424-2.c @@ -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" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/pr92424-3.c b/gcc/testsuite/gcc.target/aarch64/pr92424-3.c index 0a1f74d..2c6a737 100644 --- a/gcc/testsuite/gcc.target/aarch64/pr92424-3.c +++ b/gcc/testsuite/gcc.target/aarch64/pr92424-3.c @@ -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" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr93492-2.c b/gcc/testsuite/gcc.target/i386/pr93492-2.c index 3d67095..ede8c20 100644 --- a/gcc/testsuite/gcc.target/i386/pr93492-2.c +++ b/gcc/testsuite/gcc.target/i386/pr93492-2.c @@ -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" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr93492-3.c b/gcc/testsuite/gcc.target/i386/pr93492-3.c index a625c92..b68da30 100644 --- a/gcc/testsuite/gcc.target/i386/pr93492-3.c +++ b/gcc/testsuite/gcc.target/i386/pr93492-3.c @@ -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" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr93492-4.c b/gcc/testsuite/gcc.target/i386/pr93492-4.c index 8f205c34..c73034a 100644 --- a/gcc/testsuite/gcc.target/i386/pr93492-4.c +++ b/gcc/testsuite/gcc.target/i386/pr93492-4.c @@ -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" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr93492-5.c b/gcc/testsuite/gcc.target/i386/pr93492-5.c index 1ca5ba1..ee9849a 100644 --- a/gcc/testsuite/gcc.target/i386/pr93492-5.c +++ b/gcc/testsuite/gcc.target/i386/pr93492-5.c @@ -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" } } */ diff --git a/gcc/varasm.cc b/gcc/varasm.cc index d0beac8..9dfbebb 100644 --- a/gcc/varasm.cc +++ b/gcc/varasm.cc @@ -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)) { |