On Fri, Feb 20, 2015 at 5:35 AM, Marcus Shawcroft
<marcus.shawcr...@gmail.com> wrote:
>>      case SYMBOL_SMALL_GOTTPREL:
>>        {
>> -       rtx tmp_reg = gen_reg_rtx (Pmode);
>> +       /* In ILP32, the mode of dest can be either SImode or DImode,
>> +          while the got entry is always of SImode size.  The mode of
>> +          dest depends on how dest is used: if dest is assigned to a
>> +          pointer (e.g. in the memory), it has SImode; it may have
>> +          DImode if dest is dereferenced to access the memeory.
>> +          This is why we have to handle three different tlsie_small
>> +          patterns here (two patterns for ILP32).  */
>> +       enum machine_mode mode = GET_MODE (dest);
>> +       rtx tmp_reg = gen_reg_rtx (mode);
>>         rtx tp = aarch64_load_tp (NULL);
>> -       emit_insn (gen_tlsie_small (tmp_reg, imm));
>> -       emit_insn (gen_rtx_SET (Pmode, dest, gen_rtx_PLUS (Pmode, tp, 
>> tmp_reg)));
>> +
>> +       if (mode == ptr_mode)
>> +         {
>> +           if (mode == DImode)
>> +             emit_insn (gen_tlsie_small_di (tmp_reg, imm));
>> +           else
>> +             {
>> +               emit_insn (gen_tlsie_small_si (tmp_reg, imm));
>> +               tp = gen_lowpart (mode, tp);
>> +             }
>> +         }
>> +       else
>> +         {
>> +           gcc_assert (mode == Pmode);
>> +           emit_insn (gen_tlsie_small_sidi (tmp_reg, imm));
>> +         }
>
>
> Andrew, do you recall the circumstance that trigger the mode == SImode
> code path through the above code?  I've been trying to trigger this
> while working on the equivalent tiny address mode code... with no
> success.

IIRC this happened during the compiling of glibc.  That is with -fPIC
and with initial-exec tls_model.  errno variable in fact.

Thanks,
Andrew Pinski



> /Marcus

Reply via email to