On 04/03/2025 11:01, Christophe Lyon wrote: > Commit r9-4307-g89d7557202d25a forgot to accept a fixed PIC register > when extending the assert in require_pic_register. > > arm_pic_register can be set explicitly by the user > (e.g. -mpic-register=r9) or implicitly as the default value with > -fpic/-fPIC/-fPIE and -mno-pic-data-is-text-relative -mlong-calls, and > we want to use/accept it when recording cfun->machine->pic_reg as used > to be the case. > > Tested on arm-none-linux-gnueabihf and arm-none-eabi with several sets > of options, covering all M-profile architecture versions. > > PR target/115485 > gcc/ > * config/arm/arm.cc (require_pic_register): Fix typos in > comment. Handle fixed arm_pic_register. > > gcc/testsuite/ > * g++.target/arm/pr115485.C: New test.
OK, along with any needed backports. R. > --- > gcc/config/arm/arm.cc | 5 +++-- > gcc/testsuite/g++.target/arm/pr115485.C | 16 ++++++++++++++++ > 2 files changed, 19 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/g++.target/arm/pr115485.C > > diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc > index 00499a26bae..670f487bcce 100644 > --- a/gcc/config/arm/arm.cc > +++ b/gcc/config/arm/arm.cc > @@ -8086,8 +8086,8 @@ legitimate_pic_operand_p (rtx x) > > /* Record that the current function needs a PIC register. If PIC_REG is > null, > a new pseudo is allocated as PIC register, otherwise PIC_REG is used. In > - both case cfun->machine->pic_reg is initialized if we have not already > done > - so. COMPUTE_NOW decide whether and where to set the PIC register. If > true, > + both cases cfun->machine->pic_reg is initialized if we have not already > done > + so. COMPUTE_NOW decides whether and where to set the PIC register. If > true, > PIC register is reloaded in the current position of the instruction stream > irregardless of whether it was loaded before. Otherwise, it is only > loaded > if not already done so (crtl->uses_pic_offset_table is null). Note that > @@ -8107,6 +8107,7 @@ require_pic_register (rtx pic_reg, bool compute_now) > if (!crtl->uses_pic_offset_table || compute_now) > { > gcc_assert (can_create_pseudo_p () > + || (arm_pic_register != INVALID_REGNUM) > || (pic_reg != NULL_RTX > && REG_P (pic_reg) > && GET_MODE (pic_reg) == Pmode)); > diff --git a/gcc/testsuite/g++.target/arm/pr115485.C > b/gcc/testsuite/g++.target/arm/pr115485.C > new file mode 100644 > index 00000000000..491b48c726a > --- /dev/null > +++ b/gcc/testsuite/g++.target/arm/pr115485.C > @@ -0,0 +1,16 @@ > +/* { dg-do compile } */ > +/* { dg-options "-fPIE -mno-pic-data-is-text-relative -mlong-calls > -ffunction-sections" } */ > + > +struct c1 { > + virtual void func1() = 0; > +}; > +struct c2 { > + virtual ~c2() {} > +}; > +struct c3 : c2, c1 { > + void func1() override; > + void func3(); > +}; > +void c3::func1() { > + func3(); > +}