diff options
author | Kewen Lin <linkw@linux.ibm.com> | 2022-09-30 07:16:49 -0500 |
---|---|---|
committer | Kewen Lin <linkw@linux.ibm.com> | 2022-09-30 07:16:49 -0500 |
commit | c23b5006d3ffeda1a9edf5fd817765a6da3696ca (patch) | |
tree | c14405fb33c96e76b5bfd74885e6ea8918c42620 /gcc/doc | |
parent | c28957176dc0adff6e4b8fcbe6b91f5b82900563 (diff) | |
download | gcc-c23b5006d3ffeda1a9edf5fd817765a6da3696ca.zip gcc-c23b5006d3ffeda1a9edf5fd817765a6da3696ca.tar.gz gcc-c23b5006d3ffeda1a9edf5fd817765a6da3696ca.tar.bz2 |
rs6000: Rework ELFv2 support for -fpatchable-function-entry* [PR99888]
As PR99888 and its related show, the current support for
-fpatchable-function-entry on powerpc ELFv2 doesn't work
well with global entry existence. For example, with one
command line option -fpatchable-function-entry=3,2, it got
below w/o this patch:
.LPFE1:
nop
nop
.type foo, @function
foo:
nop
.LFB0:
.cfi_startproc
.LCF0:
0: addis 2,12,.TOC.-.LCF0@ha
addi 2,2,.TOC.-.LCF0@l
.localentry foo,.-foo
, the assembly is unexpected since the patched nops have
no effects when being entered from local entry.
This patch is to update the nops patched before and after
local entry, it looks like:
.type foo, @function
foo:
.LFB0:
.cfi_startproc
.LCF0:
0: addis 2,12,.TOC.-.LCF0@ha
addi 2,2,.TOC.-.LCF0@l
nop
nop
.localentry foo,.-foo
nop
PR target/99888
PR target/105649
gcc/ChangeLog:
* doc/invoke.texi (option -fpatchable-function-entry): Adjust the
documentation for PowerPC ELFv2 ABI dual entry points.
* config/rs6000/rs6000-internal.h
(rs6000_print_patchable_function_entry): New function declaration.
* config/rs6000/rs6000-logue.cc (rs6000_output_function_prologue):
Support patchable-function-entry by emitting nops before and after
local entry for the function that needs global entry.
* config/rs6000/rs6000.cc (rs6000_print_patchable_function_entry): Skip
the function that needs global entry till global entry has been
emitted.
* config/rs6000/rs6000.h (struct machine_function): New bool member
global_entry_emitted.
gcc/testsuite/ChangeLog:
* gcc.target/powerpc/pr99888-1.c: New test.
* gcc.target/powerpc/pr99888-2.c: New test.
* gcc.target/powerpc/pr99888-3.c: New test.
* gcc.target/powerpc/pr99888-4.c: New test.
* gcc.target/powerpc/pr99888-5.c: New test.
* gcc.target/powerpc/pr99888-6.c: New test.
* c-c++-common/patchable_function_entry-default.c: Adjust for
powerpc_elfv2 to avoid compilation error.
Diffstat (limited to 'gcc/doc')
-rw-r--r-- | gcc/doc/invoke.texi | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 2ac9cfc..518bfdf 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -16884,9 +16884,13 @@ the area size or to remove it completely on a single function. 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. +@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 maximum value of @var{N} and @var{M} is 65535. +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. @end table |