On Wed, Nov 12, 2014 at 9:43 PM, H.J. Lu <[email protected]> wrote:
> Hi,
>
> r216154 exposed an x86 backend bug. For large PIC mode thunk, there
> are
>
> if (ix86_cmodel == CM_LARGE_PIC && SYMBOLIC_CONST (fnaddr))
> fnaddr = legitimize_pic_address (fnaddr,
> gen_rtx_REG (Pmode, tmp_regno));
>
> and legitimize_pic_address does:
>
> if (reg != 0)
> {
> new_rtx = expand_simple_binop (Pmode, PLUS, reg,
> pic_offset_table_rtx,
> tmpreg, 1, OPTAB_DIRECT);
> new_rtx = reg;
> }
>
> However, pic_offset_table_rtx was never initialized. Befor r216154,
> we generated thunk with random value in hardcoded PIC register. After
> r216154, compiler crashes. This patch sets PIC register to %r11 and
> initialize it. Tested on Linux/x86-64. OK for trunk and backport
> to 4.8/4.9 branches?
>
> 2014-11-12 H.J. Lu <[email protected]>
>
> PR target/63815
> * config/i386/i386.c (ix86_init_large_pic_reg): New. Extracted
> from ...
> (ix86_init_pic_reg): Here. Use ix86_init_large_pic_reg.
> (x86_output_mi_thunk): Set PIC register to %r11. Call
> ix86_init_large_pic_reg to initialize PIC register.
>
> gcc/testsuite/
>
> 2014-11-12 H.J. Lu <[email protected]>
>
> PR target/63815
> * g++.dg/other/pr63815.C: New test.
OK for mainline with a short comment addition.
Backports to release branches need RM's approval.
Thanks,
Uros.
> if (ix86_cmodel == CM_LARGE_PIC && SYMBOLIC_CONST (fnaddr))
> - fnaddr = legitimize_pic_address (fnaddr,
> - gen_rtx_REG (Pmode, tmp_regno));
> + {
Please put a short comment why we need hard reg here.
> + SET_REGNO (pic_offset_table_rtx, R11_REG);