Enable EBX for x86 in 32bits PIC code

Ilya Enkovich enkovich.gnu@gmail.com
Wed Sep 24 06:56:00 GMT 2014


2014-09-23 20:10 GMT+04:00 Jeff Law <law@redhat.com>:
> On 09/23/14 10:03, Jakub Jelinek wrote:
>>
>> On Tue, Sep 23, 2014 at 10:00:00AM -0600, Jeff Law wrote:
>>>
>>> On 09/23/14 08:34, Jakub Jelinek wrote:
>>>>
>>>> On Tue, Sep 23, 2014 at 05:54:37PM +0400, Ilya Enkovich wrote:
>>>>>
>>>>> use fixed EBX at least until we make sure pseudo PIC doesn't harm debug
>>>>> info generation.  If we have such option then gcc.target/i386/pic-1.c
>>>>> and
>>>>
>>>>
>>>> For debug info, it seems you are already handling this in
>>>> delegitimize_address target hook, I'd suggest just building some very
>>>> large
>>>> shared library at -O2 -g -fpic on i?86 and either look at the
>>>> sizes of .debug_info/.debug_loc sections with/without the patch,
>>>> or use the locstat utility from elfutils (talk to Petr Machata if
>>>> needed).
>>>
>>> Can't hurt, but I really don't see how changing from a fixed to an
>>> allocatable register is going to muck up debug info in any significant
>>> way.
>>
>>
>> What matters is if the delegitimize_address target hook is as efficient in
>> delegitimization as before.  E.g. if it previously matched only when
>> seeing
>> %ebx + gotoff or similar, and wouldn't match anything now, some vars could
>> have debug locations including UNSPEC and be dropped on the floor.
>
> Ah, yea, that makes sense.
>
> jeff


After register allocation we have no idea where GOT address is and
therefore delegitimize_address target hook becomes less efficient and
cannot remove UNSPECs. That's what I see now when build GCC with patch
applied:

../../../../gcc/libgfortran/generated/sum_r4.c: In function 'msum_r4':
../../../../gcc/libgfortran/generated/sum_r4.c:195:1: note:
non-delegitimized UNSPEC UNSPEC_GOTOFF (1) found in variable location
 msum_r4 (gfc_array_r4 * const restrict retarray,
 ^
../../../../gcc/libgfortran/generated/sum_r4.c:195:1: note:
non-delegitimized UNSPEC UNSPEC_GOTOFF (1) found in variable location
../../../../gcc/libgfortran/generated/sum_r4.c:195:1: note:
non-delegitimized UNSPEC UNSPEC_GOTOFF (1) found in variable location
../../../../gcc/libgfortran/generated/sum_r4.c:195:1: note:
non-delegitimized UNSPEC UNSPEC_GOTOFF (1) found in variable location
../../../../gcc/libgfortran/generated/sum_r8.c: In function 'msum_r8':
../../../../gcc/libgfortran/generated/sum_r8.c:195:1: note:
non-delegitimized UNSPEC UNSPEC_GOTOFF (1) found in variable location
 msum_r8 (gfc_array_r8 * const restrict retarray,
 ^
../../../../gcc/libgfortran/generated/sum_r8.c:195:1: note:
non-delegitimized UNSPEC UNSPEC_GOTOFF (1) found in variable location
../../../../gcc/libgfortran/generated/sum_r8.c:195:1: note:
non-delegitimized UNSPEC UNSPEC_GOTOFF (1) found in variable location
../../../../gcc/libgfortran/generated/sum_r8.c:195:1: note:
non-delegitimized UNSPEC UNSPEC_GOTOFF (1) found in variable location


Ilya



More information about the Gcc-patches mailing list