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

--- Comment #25 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Eric Botcazou <ebotca...@gcc.gnu.org>:

https://gcc.gnu.org/g:021ad8e5cf9ab66e1a0a41dce3a54586facb86e0

commit r12-4036-g021ad8e5cf9ab66e1a0a41dce3a54586facb86e0
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Fri Oct 1 10:49:34 2021 +0200

    Fix PR c++/64697 at -O1 or above

    The BFD fix eliminates the link failure and working code is generated at
    -O0, but _not_ when optimization is enabled because the optimizer changes:

            movq    .refptr._ZTH1s(%rip), %rax
            testq   %rax, %rax
            je      .L2
            call    _ZTH1s

    into:

            leaq    _ZTH1s(%rip), %rax
            testq   %rax, %rax
            je      .L2
            call    _ZTH1s

    and the leaq now also gets the relocation overflow.  So the fix is to
    teach legitimate_pic_address_disp_p to reject the transformation when
    the symbol is an external weak function, which yields:

            cmpq    $0, .refptr._ZTH1s(%rip)
            je      .L2
            call    _ZTH1s

    and the cmpq keeps a relocation that does not overflow.

    gcc/
            PR c++/64697
            * config/i386/i386.c (legitimate_pic_address_disp_p): For PE-COFF
do
            not return true for external weak function symbols in medium model.

Reply via email to