]> git.ipfire.org Git - thirdparty/gcc.git/commit
rs6000: Rework ELFv2 support for -fpatchable-function-entry* [PR99888]
authorKewen Lin <linkw@linux.ibm.com>
Fri, 30 Sep 2022 12:16:49 +0000 (07:16 -0500)
committerKewen Lin <linkw@linux.ibm.com>
Fri, 30 Sep 2022 12:16:49 +0000 (07:16 -0500)
commitc23b5006d3ffeda1a9edf5fd817765a6da3696ca
treec14405fb33c96e76b5bfd74885e6ea8918c42620
parentc28957176dc0adff6e4b8fcbe6b91f5b82900563
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.
12 files changed:
gcc/config/rs6000/rs6000-internal.h
gcc/config/rs6000/rs6000-logue.cc
gcc/config/rs6000/rs6000.cc
gcc/config/rs6000/rs6000.h
gcc/doc/invoke.texi
gcc/testsuite/c-c++-common/patchable_function_entry-default.c
gcc/testsuite/gcc.target/powerpc/pr99888-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr99888-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr99888-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr99888-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr99888-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr99888-6.c [new file with mode: 0644]