[PATCH 2/X, i386, PR54232] Enable EBX for x86 in 32bits PIC code

Andrew Pinski pinskia@gmail.com
Fri Oct 24 23:21:00 GMT 2014


On Fri, Oct 10, 2014 at 12:43 AM, Evgeny Stupachenko <evstupac@gmail.com> wrote:
> i386 specific part of the patch:
>
> 2014-10-08  Ilya Enkovich  <ilya.enkovich@intel.com>
>             Vladimir Makarov  <vmakarov@redhat.com>
>         * gcc/config/i386/i386.c (ix86_use_pseudo_pic_reg): New.
>         (ix86_init_pic_reg): New.
>         (ix86_select_alt_pic_regnum): Add check on pseudo register.
>         (ix86_save_reg): Likewise.
>         (ix86_expand_prologue): Remove irrelevant code.
>         (ix86_output_function_epilogue): Add check on pseudo register.
>         (set_pic_reg_ever_alive): New.
>         (legitimize_pic_address): Replace df_set_regs_ever_live with new
>         set_pic_reg_ever_alive.
>         (legitimize_tls_address): Likewise.
>         (ix86_pic_register_p): New check.
>         (ix86_delegitimize_address): Add check on pseudo register.
>         (ix86_expand_call): Insert move from pseudo PIC register to ABI
>         defined REAL_PIC_OFFSET_TABLE_REGNUM.
>         (TARGET_INIT_PIC_REG): New.
>         (TARGET_USE_PSEUDO_PIC_REG): New.
>         (PIC_OFFSET_TABLE_REGNUM): New check.


This patch breaks glibc's ld.so on i686.
glibc has a check to make sure the PIC register is setup correctly:
/* Consistency check for position-independent code.  */
#ifdef __PIC__
# define check_consistency()      \
  ({ int __res;      \
     __asm__ __volatile__      \
       (LOAD_PIC_REG_STR (cx) ";"      \
"subl %%ebx, %%ecx;"      \
"je 1f;"      \
"ud2;"      \
"1:\n"      \
: "=c" (__res));      \
     __res; })
#endif

This depends on ebx being the PIC register.  Now we don't have this so
we get ud2 in some cases.



Thanks,
Andrew Pinski



More information about the Gcc-patches mailing list