https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119430

--- Comment #22 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Richard Earnshaw <[email protected]>:

https://gcc.gnu.org/g:f5166f5badb190eec5d3707fe25ad33febf1969e

commit r16-6650-gf5166f5badb190eec5d3707fe25ad33febf1969e
Author: Alexandre Oliva <[email protected]>
Date:   Thu Jul 10 22:21:31 2025 -0300

    arm: prevent impossible tail- long-calls with static chain [PR119430]

    When a function call uses up all argument registers, and needs IP for
    the static chain, there aren't any call-clobbered registers left for
    reload to assign as the sibcall target, when -mlong-calls is enabled.
    Use the same logic that does the job for indirect calls to prevent
    tail calls in this case.

    With this change, it is possible to bootstrap armv7a-linux-gnu with
    both -O3 and lto, but only with both -mlong-calls and
    -ffunction-sections.

    Without -mlong-calls, linker veneer thunks may clobber the static
    chain register set up by callers in one lto unit, preventing them from
    reaching the callee in a separate lto unit.  -ffunction-sections is
    required for -mlong-calls to be effective, because both caller and
    callee are in the same section, and that disables long-calls when
    !flag_reorder_blocks_and_partition.

    gcc/ChangeLog

            PR target/119430
            * config/arm/arm.cc (arm_function_ok_for_sibcall): Disable
            sibcalls for long-calls that use all call-clobbered
            general-purpose registers, including the static chain.

Reply via email to