Sync from SUSE:SLFO:Main gcc13 revision 7e9c7d7c8233446811b1bcfb4c1d783b
This commit is contained in:
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -147,7 +147,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -147,7 +147,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -147,7 +147,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -147,7 +147,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -146,7 +146,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# Define the canonical target and host architecture
|
||||
# %%gcc_target_arch is supposed to be the full target triple
|
||||
|
@ -403,7 +403,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
# GCC-TESTSUITE-DELETE-BEGIN
|
||||
# SRC-COMMON-END
|
||||
|
@ -1,265 +0,0 @@
|
||||
From 8926dc1cbe8fa3b9ae35bf03ec503bbc40f9cf37 Mon Sep 17 00:00:00 2001
|
||||
From: Giuliano Belinassi <gbelinassi@suse.de>
|
||||
Date: Thu, 25 Jul 2024 11:54:22 -0300
|
||||
Subject: [PATCH] Backport rs6000: Adjust -fpatchable-function-entry* support
|
||||
for dual entry
|
||||
|
||||
Original message:
|
||||
As the discussion in PR112980, although the current
|
||||
implementation for -fpatchable-function-entry* conforms
|
||||
with the documentation (making N NOPs be consecutive),
|
||||
it's inefficient for both kernel and userspace livepatching
|
||||
(see comments in PR for the details).
|
||||
|
||||
So this patch is to change the current implementation by
|
||||
emitting the "before" NOPs before global entry point and
|
||||
the "after" NOPs after local entry point. The new behavior
|
||||
would not keep NOPs to be consecutive, so the documentation
|
||||
is updated to emphasize this
|
||||
|
||||
Backport to gcc-13
|
||||
|
||||
Authored-by: Kewen Lin <linkw@linux.ibm.com>
|
||||
Backported-by: Giuliano Belinassi <gbelinassi@suse.de>
|
||||
|
||||
PR target/112980
|
||||
|
||||
gcc/ChangeLog:
|
||||
|
||||
* config/rs6000/rs6000-logue.cc (rs6000_output_function_prologue):
|
||||
Adjust the handling on patch area emitting with dual entry, remove
|
||||
the restriction on "before" NOPs count, not emit "before" NOPs any
|
||||
more but only emit "after" NOPs.
|
||||
* config/rs6000/rs6000.cc (rs6000_print_patchable_function_entry):
|
||||
Adjust by respecting cfun->machine->stop_patch_area_print.
|
||||
(rs6000_elf_declare_function_name): For ELFv2 with dual entry, set
|
||||
cfun->machine->stop_patch_area_print as true.
|
||||
* config/rs6000/rs6000.h (struct machine_function): Remove member
|
||||
global_entry_emitted, add new member stop_patch_area_print.
|
||||
* doc/invoke.texi (option -fpatchable-function-entry): Adjust the
|
||||
documentation for PowerPC ELFv2 dual entry.
|
||||
|
||||
gcc/testsuite/ChangeLog:
|
||||
|
||||
* c-c++-common/patchable_function_entry-default.c: Adjust.
|
||||
* gcc.target/powerpc/pr99888-4.c: Likewise.
|
||||
* gcc.target/powerpc/pr99888-5.c: Likewise.
|
||||
* gcc.target/powerpc/pr99888-6.c: Likewise.
|
||||
|
||||
Signed-off-by: Giuliano Belinassi <gbelinassi@suse.de>
|
||||
---
|
||||
gcc/config/rs6000/rs6000-logue.cc | 40 +++++--------------
|
||||
gcc/config/rs6000/rs6000.cc | 15 +++++--
|
||||
gcc/config/rs6000/rs6000.h | 10 +++--
|
||||
gcc/doc/invoke.texi | 8 ++--
|
||||
.../patchable_function_entry-default.c | 3 --
|
||||
gcc/testsuite/gcc.target/powerpc/pr99888-4.c | 4 +-
|
||||
gcc/testsuite/gcc.target/powerpc/pr99888-5.c | 4 +-
|
||||
gcc/testsuite/gcc.target/powerpc/pr99888-6.c | 4 +-
|
||||
8 files changed, 33 insertions(+), 55 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/rs6000/rs6000-logue.cc b/gcc/config/rs6000/rs6000-logue.cc
|
||||
index 208404e6864..3835bc943ad 100644
|
||||
--- a/gcc/config/rs6000/rs6000-logue.cc
|
||||
+++ b/gcc/config/rs6000/rs6000-logue.cc
|
||||
@@ -4001,43 +4001,21 @@ rs6000_output_function_prologue (FILE *file)
|
||||
fprintf (file, "\tadd 2,2,12\n");
|
||||
}
|
||||
|
||||
- unsigned short patch_area_size = crtl->patch_area_size;
|
||||
- unsigned short patch_area_entry = crtl->patch_area_entry;
|
||||
- /* Need to emit the patching area. */
|
||||
- if (patch_area_size > 0)
|
||||
- {
|
||||
- cfun->machine->global_entry_emitted = true;
|
||||
- /* As ELFv2 ABI shows, the allowable bytes between the global
|
||||
- and local entry points are 0, 4, 8, 16, 32 and 64 when
|
||||
- there is a local entry point. Considering there are two
|
||||
- non-prefixed instructions for global entry point prologue
|
||||
- (8 bytes), the count for patchable nops before local entry
|
||||
- point would be 2, 6 and 14. It's possible to support those
|
||||
- other counts of nops by not making a local entry point, but
|
||||
- we don't have clear use cases for them, so leave them
|
||||
- unsupported for now. */
|
||||
- if (patch_area_entry > 0)
|
||||
- {
|
||||
- if (patch_area_entry != 2
|
||||
- && patch_area_entry != 6
|
||||
- && patch_area_entry != 14)
|
||||
- error ("unsupported number of nops before function entry (%u)",
|
||||
- patch_area_entry);
|
||||
- rs6000_print_patchable_function_entry (file, patch_area_entry,
|
||||
- true);
|
||||
- patch_area_size -= patch_area_entry;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
fputs ("\t.localentry\t", file);
|
||||
assemble_name (file, name);
|
||||
fputs (",.-", file);
|
||||
assemble_name (file, name);
|
||||
fputs ("\n", file);
|
||||
/* Emit the nops after local entry. */
|
||||
- if (patch_area_size > 0)
|
||||
- rs6000_print_patchable_function_entry (file, patch_area_size,
|
||||
- patch_area_entry == 0);
|
||||
+ unsigned short patch_area_size = crtl->patch_area_size;
|
||||
+ unsigned short patch_area_entry = crtl->patch_area_entry;
|
||||
+ if (patch_area_size > patch_area_entry)
|
||||
+ {
|
||||
+ cfun->machine->stop_patch_area_print = false;
|
||||
+ patch_area_size -= patch_area_entry;
|
||||
+ rs6000_print_patchable_function_entry (file, patch_area_size,
|
||||
+ patch_area_entry == 0);
|
||||
+ }
|
||||
}
|
||||
|
||||
else if (rs6000_pcrel_p ())
|
||||
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
|
||||
index 2b876c90e6f..a08ed7466dd 100644
|
||||
--- a/gcc/config/rs6000/rs6000.cc
|
||||
+++ b/gcc/config/rs6000/rs6000.cc
|
||||
@@ -14936,12 +14936,14 @@ rs6000_print_patchable_function_entry (FILE *file,
|
||||
bool record_p)
|
||||
{
|
||||
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
|
||||
+ /* For a function which needs global entry point, we will only emit the
|
||||
+ patchable area after local entry point under the control of
|
||||
+ !cfun->machine->stop_patch_area_print, see the handling in functions
|
||||
rs6000_output_function_prologue. */
|
||||
- if (!global_entry_needed_p || cfun->machine->global_entry_emitted)
|
||||
+ if (!cfun->machine->stop_patch_area_print)
|
||||
default_print_patchable_function_entry (file, patch_area_size, record_p);
|
||||
+ else
|
||||
+ gcc_assert (global_entry_needed_p);
|
||||
}
|
||||
|
||||
enum rtx_code
|
||||
@@ -21115,6 +21117,11 @@ rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
|
||||
fprintf (file, "\t.previous\n");
|
||||
}
|
||||
ASM_OUTPUT_LABEL (file, name);
|
||||
+ /* At this time, the "before" NOPs have been already emitted,
|
||||
+ let's stop generic code from printing the "after" NOPs and
|
||||
+ emit just after local entry later. */
|
||||
+ if (rs6000_global_entry_point_prologue_needed_p ())
|
||||
+ cfun->machine->stop_patch_area_print = true;
|
||||
}
|
||||
|
||||
static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
|
||||
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
|
||||
index 9f02025b0c8..ebe97beb182 100644
|
||||
--- a/gcc/config/rs6000/rs6000.h
|
||||
+++ b/gcc/config/rs6000/rs6000.h
|
||||
@@ -2437,10 +2437,12 @@ typedef struct GTY(()) machine_function
|
||||
bool lr_is_wrapped_separately;
|
||||
bool toc_is_wrapped_separately;
|
||||
bool mma_return_type_error;
|
||||
- /* Indicate global entry is emitted, only useful when the function requires
|
||||
- global entry. It helps to control the patchable area before and after
|
||||
- local entry. */
|
||||
- bool global_entry_emitted;
|
||||
+ /* With ELFv2 ABI dual entry points being adopted, generic framework
|
||||
+ targetm.asm_out.print_patchable_function_entry would generate "after"
|
||||
+ NOPs before local entry, it is wrong. This flag is to stop it from
|
||||
+ printing patch area before local entry, it is only useful when the
|
||||
+ function requires dual entry points. */
|
||||
+ bool stop_patch_area_print;
|
||||
} machine_function;
|
||||
#endif
|
||||
|
||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
||||
index b17d0cf9341..0cdc5ac8c61 100644
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -17449,11 +17449,11 @@ If @code{N=0}, no pad location is recorded.
|
||||
The NOP instructions are inserted at---and maybe before, depending on
|
||||
@var{M}---the function entry address, even before the prologue. On
|
||||
PowerPC with the ELFv2 ABI, for a function with dual entry points,
|
||||
-the local entry point is this function entry address.
|
||||
+@var{M} NOP instructions are inserted before the global entry point and
|
||||
+@var{N} - @var{M} NOP instructions are inserted after the local entry
|
||||
+point, which means the NOP instructions may not be consecutive.
|
||||
|
||||
-The maximum value of @var{N} and @var{M} is 65535. On PowerPC with the
|
||||
-ELFv2 ABI, for a function with dual entry points, the supported values
|
||||
-for @var{M} are 0, 2, 6 and 14.
|
||||
+The maximum value of @var{N} and @var{M} is 65535.
|
||||
@end table
|
||||
|
||||
|
||||
diff --git a/gcc/testsuite/c-c++-common/patchable_function_entry-default.c b/gcc/testsuite/c-c++-common/patchable_function_entry-default.c
|
||||
index 3ccbafc87db..899938b4aa3 100644
|
||||
--- a/gcc/testsuite/c-c++-common/patchable_function_entry-default.c
|
||||
+++ b/gcc/testsuite/c-c++-common/patchable_function_entry-default.c
|
||||
@@ -1,9 +1,6 @@
|
||||
/* { dg-do compile { target { ! { nvptx*-*-* visium-*-* } } } } */
|
||||
/* { dg-options "-O2 -fpatchable-function-entry=3,1" } */
|
||||
/* { dg-additional-options "-fno-pie" { target sparc*-*-* } } */
|
||||
-/* See PR99888, one single preceding nop isn't allowed on powerpc_elfv2,
|
||||
- so overriding with two preceding nops to make it pass there. */
|
||||
-/* { dg-additional-options "-fpatchable-function-entry=3,2" { target powerpc_elfv2 } } */
|
||||
/* { dg-final { scan-assembler-times "nop|NOP|SWYM" 3 { target { ! { alpha*-*-* riscv*-*-* } } } } } */
|
||||
/* { dg-final { scan-assembler-times "bis" 3 { target alpha*-*-* } } } */
|
||||
/* { dg-final { scan-assembler-times "nop\n" 3 { target riscv*-*-* } } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/powerpc/pr99888-4.c b/gcc/testsuite/gcc.target/powerpc/pr99888-4.c
|
||||
index 00a8d4d316e..6f23f2bb939 100644
|
||||
--- a/gcc/testsuite/gcc.target/powerpc/pr99888-4.c
|
||||
+++ b/gcc/testsuite/gcc.target/powerpc/pr99888-4.c
|
||||
@@ -2,12 +2,10 @@
|
||||
/* There is no global entry point prologue with pcrel. */
|
||||
/* { dg-options "-mno-pcrel -fpatchable-function-entry=1,1" } */
|
||||
|
||||
-/* Verify one error emitted for unexpected 1 nop before local
|
||||
- entry. */
|
||||
+/* Verify there is no error with 1 nop before local entry. */
|
||||
|
||||
extern int a;
|
||||
|
||||
int test (int b) {
|
||||
return a + b;
|
||||
}
|
||||
-/* { dg-error "unsupported number of nops before function entry \\(1\\)" "" { target *-*-* } .-1 } */
|
||||
diff --git a/gcc/testsuite/gcc.target/powerpc/pr99888-5.c b/gcc/testsuite/gcc.target/powerpc/pr99888-5.c
|
||||
index 39d3b4465f1..13f192ebd20 100644
|
||||
--- a/gcc/testsuite/gcc.target/powerpc/pr99888-5.c
|
||||
+++ b/gcc/testsuite/gcc.target/powerpc/pr99888-5.c
|
||||
@@ -2,12 +2,10 @@
|
||||
/* There is no global entry point prologue with pcrel. */
|
||||
/* { dg-options "-mno-pcrel -fpatchable-function-entry=7,3" } */
|
||||
|
||||
-/* Verify one error emitted for unexpected 3 nops before local
|
||||
- entry. */
|
||||
+/* Verify no error emitted for 3 nops before local entry. */
|
||||
|
||||
extern int a;
|
||||
|
||||
int test (int b) {
|
||||
return a + b;
|
||||
}
|
||||
-/* { dg-error "unsupported number of nops before function entry \\(3\\)" "" { target *-*-* } .-1 } */
|
||||
diff --git a/gcc/testsuite/gcc.target/powerpc/pr99888-6.c b/gcc/testsuite/gcc.target/powerpc/pr99888-6.c
|
||||
index c6c18dcc7ac..431c69cae9a 100644
|
||||
--- a/gcc/testsuite/gcc.target/powerpc/pr99888-6.c
|
||||
+++ b/gcc/testsuite/gcc.target/powerpc/pr99888-6.c
|
||||
@@ -2,8 +2,7 @@
|
||||
/* There is no global entry point prologue with pcrel. */
|
||||
/* { dg-options "-mno-pcrel" } */
|
||||
|
||||
-/* Verify one error emitted for unexpected 4 nops before local
|
||||
- entry. */
|
||||
+/* Verify no error emitted for 4 nops before local entry. */
|
||||
|
||||
extern int a;
|
||||
|
||||
@@ -11,4 +10,3 @@ __attribute__ ((patchable_function_entry (20, 4)))
|
||||
int test (int b) {
|
||||
return a + b;
|
||||
}
|
||||
-/* { dg-error "unsupported number of nops before function entry \\(4\\)" "" { target *-*-* } .-1 } */
|
||||
--
|
||||
2.45.2
|
||||
|
201
gcc13-rs6000-msplit-patch-nops.patch
Normal file
201
gcc13-rs6000-msplit-patch-nops.patch
Normal file
@ -0,0 +1,201 @@
|
||||
From 1807ab6f3a5028ef0b7b30a37e947ea2c9d2bb18 Mon Sep 17 00:00:00 2001
|
||||
From: Richard Biener <rguenther@suse.de>
|
||||
Date: Wed, 13 Nov 2024 16:04:06 +0100
|
||||
Subject: [PATCH] rs6000: Add -msplit-patch-nops (PR112980)
|
||||
To: gcc-patches@gcc.gnu.org
|
||||
|
||||
From: Michael Matz <matz@suse.de>
|
||||
|
||||
as the bug report details some uses of -fpatchable-function-entry
|
||||
aren't happy with the "before" NOPs being inserted between global and
|
||||
local entry point on powerpc. We want the before NOPs be in front
|
||||
of the global entry point. That means that the patching NOPs aren't
|
||||
consecutive for dual entry point functions, but for these usecases
|
||||
that's not the problem. But let us support both under the control
|
||||
of a new target option: -msplit-patch-nops.
|
||||
|
||||
gcc/
|
||||
|
||||
PR target/112980
|
||||
* config/rs6000/rs6000.opt (msplit-patch-nops): New option.
|
||||
* doc/invoke.texi (RS/6000 and PowerPC Options): Document it.
|
||||
* config/rs6000/rs6000.h (machine_function.stop_patch_area_print):
|
||||
New member.
|
||||
* config/rs6000/rs6000.cc (rs6000_print_patchable_function_entry):
|
||||
Emit split nops under control of that one.
|
||||
* config/rs6000/rs6000-logue.cc (rs6000_output_function_prologue):
|
||||
Add handling of split patch nops.
|
||||
---
|
||||
gcc/config/rs6000/rs6000-logue.cc | 15 +++++++++------
|
||||
gcc/config/rs6000/rs6000.cc | 27 +++++++++++++++++++++++----
|
||||
gcc/config/rs6000/rs6000.h | 6 ++++++
|
||||
gcc/config/rs6000/rs6000.opt | 4 ++++
|
||||
gcc/doc/invoke.texi | 17 +++++++++++++++--
|
||||
5 files changed, 57 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/rs6000/rs6000-logue.cc b/gcc/config/rs6000/rs6000-logue.cc
|
||||
index 208404e6864..0c3425fdd9a 100644
|
||||
--- a/gcc/config/rs6000/rs6000-logue.cc
|
||||
+++ b/gcc/config/rs6000/rs6000-logue.cc
|
||||
@@ -4003,8 +4003,8 @@ rs6000_output_function_prologue (FILE *file)
|
||||
|
||||
unsigned short patch_area_size = crtl->patch_area_size;
|
||||
unsigned short patch_area_entry = crtl->patch_area_entry;
|
||||
- /* Need to emit the patching area. */
|
||||
- if (patch_area_size > 0)
|
||||
+ /* Emit non-split patching area now. */
|
||||
+ if (!TARGET_SPLIT_PATCH_NOPS && patch_area_size > 0)
|
||||
{
|
||||
cfun->machine->global_entry_emitted = true;
|
||||
/* As ELFv2 ABI shows, the allowable bytes between the global
|
||||
@@ -4025,7 +4025,6 @@ rs6000_output_function_prologue (FILE *file)
|
||||
patch_area_entry);
|
||||
rs6000_print_patchable_function_entry (file, patch_area_entry,
|
||||
true);
|
||||
- patch_area_size -= patch_area_entry;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4035,9 +4034,13 @@ rs6000_output_function_prologue (FILE *file)
|
||||
assemble_name (file, name);
|
||||
fputs ("\n", file);
|
||||
/* Emit the nops after local entry. */
|
||||
- if (patch_area_size > 0)
|
||||
- rs6000_print_patchable_function_entry (file, patch_area_size,
|
||||
- patch_area_entry == 0);
|
||||
+ if (patch_area_size > patch_area_entry)
|
||||
+ {
|
||||
+ patch_area_size -= patch_area_entry;
|
||||
+ cfun->machine->stop_patch_area_print = false;
|
||||
+ rs6000_print_patchable_function_entry (file, patch_area_size,
|
||||
+ patch_area_entry == 0);
|
||||
+ }
|
||||
}
|
||||
|
||||
else if (rs6000_pcrel_p ())
|
||||
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
|
||||
index 2b876c90e6f..e6fbfe76e19 100644
|
||||
--- a/gcc/config/rs6000/rs6000.cc
|
||||
+++ b/gcc/config/rs6000/rs6000.cc
|
||||
@@ -14937,11 +14937,25 @@ rs6000_print_patchable_function_entry (FILE *file,
|
||||
{
|
||||
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)
|
||||
+ patchable area when it isn't split 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 (!TARGET_SPLIT_PATCH_NOPS
|
||||
+ && (!global_entry_needed_p || cfun->machine->global_entry_emitted))
|
||||
default_print_patchable_function_entry (file, patch_area_size, record_p);
|
||||
+
|
||||
+ /* For split patch nops we emit the before nops (from generic code)
|
||||
+ in front of the global entry point and after the local entry point,
|
||||
+ under the control of cfun->machine->stop_patch_area_print, see
|
||||
+ rs6000_output_function_prologue and rs6000_elf_declare_function_name. */
|
||||
+ if (TARGET_SPLIT_PATCH_NOPS)
|
||||
+ {
|
||||
+ if (!cfun->machine->stop_patch_area_print)
|
||||
+ default_print_patchable_function_entry (file, patch_area_size,
|
||||
+ record_p);
|
||||
+ else
|
||||
+ gcc_assert (global_entry_needed_p);
|
||||
+ }
|
||||
}
|
||||
|
||||
enum rtx_code
|
||||
@@ -21115,6 +21129,11 @@ rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
|
||||
fprintf (file, "\t.previous\n");
|
||||
}
|
||||
ASM_OUTPUT_LABEL (file, name);
|
||||
+ /* At this time, the "before" NOPs have been already emitted.
|
||||
+ For split nops stop generic code from printing the "after" NOPs and
|
||||
+ emit them just after local entry ourself later. */
|
||||
+ if (rs6000_global_entry_point_prologue_needed_p ())
|
||||
+ cfun->machine->stop_patch_area_print = true;
|
||||
}
|
||||
|
||||
static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
|
||||
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
|
||||
index b8edba43d53..b5dae276420 100644
|
||||
--- a/gcc/config/rs6000/rs6000.h
|
||||
+++ b/gcc/config/rs6000/rs6000.h
|
||||
@@ -2443,6 +2443,12 @@ typedef struct GTY(()) machine_function
|
||||
global entry. It helps to control the patchable area before and after
|
||||
local entry. */
|
||||
bool global_entry_emitted;
|
||||
+ /* With ELFv2 ABI dual entry points being adopted, generic framework
|
||||
+ targetm.asm_out.print_patchable_function_entry would generate "after"
|
||||
+ NOPs before local entry, which is wrong. This flag is to stop it from
|
||||
+ printing patch area before local entry, it is only useful when the
|
||||
+ function requires dual entry points. */
|
||||
+ bool stop_patch_area_print;
|
||||
} machine_function;
|
||||
#endif
|
||||
|
||||
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
|
||||
index 52507956a4d..6acd8c3c5ff 100644
|
||||
--- a/gcc/config/rs6000/rs6000.opt
|
||||
+++ b/gcc/config/rs6000/rs6000.opt
|
||||
@@ -300,6 +300,10 @@ mfull-toc
|
||||
Target
|
||||
Put everything in the regular TOC.
|
||||
|
||||
+msplit-patch-nops
|
||||
+Target Var(TARGET_SPLIT_PATCH_NOPS) Init(0)
|
||||
+Emit NOPs before global and after local entry point for -fpatchable-function-entry.
|
||||
+
|
||||
mvrsave
|
||||
Target Var(TARGET_ALTIVEC_VRSAVE) Save
|
||||
Generate VRSAVE instructions when generating AltiVec code.
|
||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
||||
index 89d4b24dd74..1b0cd6c8e26 100644
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -1265,6 +1265,7 @@ See RS/6000 and PowerPC Options.
|
||||
-mtraceback=@var{traceback_type}
|
||||
-maix-struct-return -msvr4-struct-return
|
||||
-mabi=@var{abi-type} -msecure-plt -mbss-plt
|
||||
+-msplit-patch-nops
|
||||
-mlongcall -mno-longcall -mpltseq -mno-pltseq
|
||||
-mblock-move-inline-limit=@var{num}
|
||||
-mblock-compare-inline-limit=@var{num}
|
||||
@@ -17449,11 +17450,12 @@ If @code{N=0}, no pad location is recorded.
|
||||
The NOP instructions are inserted at---and maybe before, depending on
|
||||
@var{M}---the function entry address, even before the prologue. On
|
||||
PowerPC with the ELFv2 ABI, for a function with dual entry points,
|
||||
-the local entry point is this function entry address.
|
||||
+the local entry point is this function entry address by default. See
|
||||
+the @option{-msplit-patch-nops} option to change this.
|
||||
|
||||
The maximum value of @var{N} and @var{M} is 65535. On PowerPC with the
|
||||
ELFv2 ABI, for a function with dual entry points, the supported values
|
||||
-for @var{M} are 0, 2, 6 and 14.
|
||||
+for @var{M} are 0, 2, 6 and 14 when not using @option{-msplit-patch-nops}.
|
||||
@end table
|
||||
|
||||
|
||||
@@ -29486,6 +29488,17 @@ requires @code{.plt} and @code{.got}
|
||||
sections that are both writable and executable.
|
||||
This is a PowerPC 32-bit SYSV ABI option.
|
||||
|
||||
+@opindex msplit-patch-nops
|
||||
+@item -msplit-patch-nops
|
||||
+When adding NOPs for a patchable area via the
|
||||
+@option{-fpatchable-function-entry} option emit the ``before'' NOPs in front
|
||||
+of the global entry point and the ``after'' NOPs after the local entry point.
|
||||
+This makes the sequence of NOPs not consecutive when a global entry point
|
||||
+is generated. Without this option the NOPs are emitted directly before and
|
||||
+after the local entry point, making them consecutive but moving global and
|
||||
+local entry point further apart. If only a single entry point is generated
|
||||
+this option has no effect.
|
||||
+
|
||||
@opindex misel
|
||||
@opindex mno-isel
|
||||
@item -misel
|
||||
--
|
||||
2.43.0
|
||||
|
@ -419,7 +419,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
Summary: Testsuite results
|
||||
License: SUSE-Public-Domain
|
||||
|
@ -1,3 +1,11 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Mar 27 10:05:46 UTC 2025 - Richard Biener <rguenther@suse.com>
|
||||
|
||||
- Replace gcc13-rs6000-Adjust-fpatchable-function-entry.patch with
|
||||
a backport of the now upstream -msplit-patch-nops in
|
||||
gcc13-rs6000-msplit-patch-nops.patch requried for user-space
|
||||
livepatching on powerpc.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Mar 13 08:22:15 UTC 2025 - Richard Biener <rguenther@suse.com>
|
||||
|
||||
|
@ -398,7 +398,7 @@ Patch60: gcc44-textdomain.patch
|
||||
Patch61: gcc44-rename-info-files.patch
|
||||
# Feature backports
|
||||
Patch100: gcc13-pr88345-min-func-alignment.diff
|
||||
Patch101: gcc13-rs6000-Adjust-fpatchable-function-entry.patch
|
||||
Patch101: gcc13-rs6000-msplit-patch-nops.patch
|
||||
|
||||
License: GPL-3.0-or-later
|
||||
Summary: The GNU C Compiler and Support Files
|
||||
|
Reference in New Issue
Block a user