On Fri, Mar 7, 2014 at 2:33 PM, Wei Mi <w...@google.com> wrote:
> Yes, x32 has the same problem. It should be tested. Fixed.
>
> Thanks,
> Wei.
>
>
> On Fri, Mar 7, 2014 at 2:06 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>> On Fri, Mar 7, 2014 at 1:26 PM, Wei Mi <w...@google.com> wrote:
>>> Hi,
>>>
>>> This patch is to fix the problem described here:
>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58066
>>>
>>> I follow Ian's suggestion and set
>>> ix86_tls_descriptor_calls_expanded_in_cfun in
>>> tls_global_dynamic_64_<mode> and tls_local_dynamic_base_64_<mode>.
>>> Although 32bit doesn't have the problem,
>>> ix86_tls_descriptor_calls_expanded_in_cfun is also set for
>>> tls_global_dynamic_32 and tls_local_dynamic_base_32 to make
>>> ix86_tls_descriptor_calls_expanded_in_cfun setting consistent across
>>> 32bits and 64bits.
>>>
>>> If ix86_current_function_calls_tls_descriptor is set, we know that
>>> there is tls expanded call in current function. Update
>>> crtl->preferred_stack_boundary and crtl->stack_alignment_needed to be
>>> no less than PREFERED_STACK_ALIGNMENT at the start of
>>> ix86_compute_frame_layout. We don't do the update in
>>> legitimize_tls_address in cfgexpand stage, which is too early because
>>> according to the comments before
>>> ix86_current_function_calls_tls_descriptor, tls call may be optimized
>>> away. ix86_compute_frame_layout is the latest place to do the update.
>>>
>>> bootstrap on x86_64-linux-gnu is ok. regression test is going on. Ok
>>> for trunk if tests pass?
>>>
>>> Thanks,
>>> Wei.
>>>
>>> gcc/ChangeLog:
>>>
>>> 2014-03-07  Wei Mi  <w...@google.com>
>>>
>>>         * config/i386/i386.c (ix86_compute_frame_layout): Update
>>>         preferred_stack_boundary when there is tls expanded call.
>>>         * config/i386/i386.md: Set
>>>         ix86_tls_descriptor_calls_expanded_in_cfun.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>> 2014-03-07  Wei Mi  <w...@google.com>
>>>
>>>         * g++.dg/pr58066.C: New test.
>>>
>>>
>>> Index: gcc/config/i386/i386.c
>>> ===================================================================
>>> --- gcc/config/i386/i386.c      (revision 208410)
>>> +++ gcc/config/i386/i386.c      (working copy)
>>> @@ -9504,6 +9504,19 @@ ix86_compute_frame_layout (struct ix86_f
>>>        crtl->preferred_stack_boundary = 128;
>>>        crtl->stack_alignment_needed = 128;
>>>      }
>>> +  /* For 64-bit target, preferred_stack_boundary is never updated for call
>>> +     expanded from tls descriptor. Update it here. We don't update it in
>>> +     expand stage because according to the comments before
>>> +     ix86_current_function_calls_tls_descriptor, tls calls may be optimized
>>> +     away.  */
>>> +  else if (TARGET_64BIT
>>> +          && ix86_current_function_calls_tls_descriptor
>>> +          && crtl->preferred_stack_boundary < PREFERRED_STACK_BOUNDARY)
>>> +    {
>>> +      crtl->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
>>> +      if (crtl->stack_alignment_needed < PREFERRED_STACK_BOUNDARY)
>>> +       crtl->stack_alignment_needed = PREFERRED_STACK_BOUNDARY;
>>> +    }
>>>

There are several problems with this:

1.  It doesn't work with C.
2.  IA32 has the same issue and isn't fixed.
3.  There is no testcase for global dynamic model.

-- 
H.J.

Reply via email to