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();
> +}