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

--- Comment #21 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Christophe Lyon <cl...@gcc.gnu.org>:

https://gcc.gnu.org/g:3c3b4224875d7b8bfd4126b9dd1d9cb028997285

commit r11-1732-g3c3b4224875d7b8bfd4126b9dd1d9cb028997285
Author: Christophe Lyon <christophe.l...@linaro.org>
Date:   Tue Jun 30 13:51:20 2020 +0000

    arm: Warn if IRQ handler is not compiled with -mgeneral-regs-only [PR
target/94743]

    The interrupt attribute does not guarantee that the FP registers are
    saved, which can result in problems difficult to debug.

    Saving the FP registers and status registers can be a large penalty,
    so it's probably not desirable to do that all the time.

    If the handler calls other functions, we'd likely need to save all of
    them, for lack of knowledge of which registers they actually clobber.

    This is even more obscure for the end-user when the compiler inserts
    calls to helper functions such as memcpy (some multilibs do use FP
    registers to speed it up).

    In the PR, we discussed adding routines in libgcc to save the FP
    context and saving only locally-clobbered FP registers, but this seems
    to be too much work for the purpose, given that in general such
    handlers try to avoid this kind of penalty.
    I suspect we would also want new attributes to instruct the compiler
    that saving the FP context is not needed.

    In the mean time, emit a warning to suggest re-compiling with
    -mgeneral-regs-only. Note that this can lead to errors if the code
    uses floating-point and -mfloat-abi=hard, eg:
    argument of type 'double' not permitted with -mgeneral-regs-only

    This can be troublesome for the user, but at least this would make
    him aware of the latent issue.

    The patch adds several testcases:

    - pr94734-1-hard.c checks that a warning is emitted when using
      -mfloat-abi=hard. Function IRQ_HDLR_Test can make implicit calls to
      runtime floating-point routines (or direct use of FP instructions),
      IRQ_HDLR_Test2 doesn't. We emit a warning in both cases, though.

    - pr94734-1-softfp.c: same as above wih -mfloat-abi=softfp.

    - pr94734-1-soft.c checks that no warning is emitted when using
      -mfloat-abi=soft when the same code as above.

    - pr94734-2.c checks that no warning is emitted when using
      -mgeneral-regs-only.

    - pr94734-3.c checks that no warning is emitted when using
      -mgeneral-regs-only even using float-point data.

    2020-06-30  Christophe Lyon  <christophe.l...@linaro.org>

            PR target/94743
            gcc/
            * config/arm/arm.c (arm_handle_isr_attribute): Warn if
            -mgeneral-regs-only is not used.

            gcc/testsuite/
            * gcc.misc-tests/arm-isr.c: Add -mgeneral-regs-only.
            * gcc.target/arm/empty_fiq_handler.c: Add -mgeneral-regs-only.
            * gcc.target/arm/interrupt-1.c: Add -mgeneral-regs-only.
            * gcc.target/arm/interrupt-2.c: Add -mgeneral-regs-only.
            * gcc.target/arm/pr70830.c: Add -mgeneral-regs-only.
            * gcc.target/arm/pr94743-1-hard.c: New test.
            * gcc.target/arm/pr94743-1-soft.c: New test.
            * gcc.target/arm/pr94743-1-softfp.c: New test.
            * gcc.target/arm/pr94743-2.c: New test.
            * gcc.target/arm/pr94743-3.c: New test.

Reply via email to