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.
This commit is contained in:
parent
4581328022
commit
f120196382
11 changed files with 39 additions and 60 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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*-*-* } } */
|
||||
|
|
|
@ -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" } } */
|
||||
|
|
|
@ -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" } } */
|
||||
|
|
|
@ -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" } } */
|
||||
|
|
|
@ -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" } } */
|
||||
|
|
|
@ -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" } } */
|
||||
|
|
|
@ -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" } } */
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue