diff mbox

[1/2,rtl-optimization] : Fix PR 58066, __tls_get_addr is called with misaligned stack on x86-64

Message ID CAFULd4Y+XxWA5WEgLvYZd5KqDp732k2sbKbA+haOsy=U6gw8+g@mail.gmail.com
State New
Headers show

Commit Message

Uros Bizjak July 13, 2015, 5:03 p.m. UTC
This is rtl-optimization part of a two-part patch series.

As discussed in the PR, we have to prcompute register parameters
before stack alignment is performed, otherwise eventual call to
__tls_get_addr can be called with unaligned stack. When compiling the
testcase from the PR, anti_adjust_stack is called just before
precompute starts expanding function parameters.

The solution is to move  precomputation before stack pointer is adjusted.

2015-07-13  Uros Bizjak  <ubizjak@gmail.com>

    PR rtl-optimization/58066
    * calls.c (expand_call): Precompute register parameters before stack
    alignment is performed.

Patch was bootstrapped and regression tested on x86_64-linux-gnu
{,-m32} for all default languages, obj-c++ and go.

OK for mainline?

Uros.

Comments

Jeff Law July 14, 2015, 4:46 a.m. UTC | #1
On 07/13/2015 11:03 AM, Uros Bizjak wrote:
> This is rtl-optimization part of a two-part patch series.
>
> As discussed in the PR, we have to prcompute register parameters
> before stack alignment is performed, otherwise eventual call to
> __tls_get_addr can be called with unaligned stack. When compiling the
> testcase from the PR, anti_adjust_stack is called just before
> precompute starts expanding function parameters.
>
> The solution is to move  precomputation before stack pointer is adjusted.
>
> 2015-07-13  Uros Bizjak  <ubizjak@gmail.com>
>
>      PR rtl-optimization/58066
>      * calls.c (expand_call): Precompute register parameters before stack
>      alignment is performed.
>
> Patch was bootstrapped and regression tested on x86_64-linux-gnu
> {,-m32} for all default languages, obj-c++ and go.
>
> OK for mainline?
OK once a comment is added indicating why we have to precompute before 
the anti-adjust-stack.

jeff
Uros Bizjak July 15, 2015, 7:49 a.m. UTC | #2
On Tue, Jul 14, 2015 at 6:46 AM, Jeff Law <law@redhat.com> wrote:
> On 07/13/2015 11:03 AM, Uros Bizjak wrote:
>>
>> This is rtl-optimization part of a two-part patch series.
>>
>> As discussed in the PR, we have to prcompute register parameters
>> before stack alignment is performed, otherwise eventual call to
>> __tls_get_addr can be called with unaligned stack. When compiling the
>> testcase from the PR, anti_adjust_stack is called just before
>> precompute starts expanding function parameters.
>>
>> The solution is to move  precomputation before stack pointer is adjusted.
>>
>> 2015-07-13  Uros Bizjak  <ubizjak@gmail.com>
>>
>>      PR rtl-optimization/58066
>>      * calls.c (expand_call): Precompute register parameters before stack
>>      alignment is performed.
>>
>> Patch was bootstrapped and regression tested on x86_64-linux-gnu
>> {,-m32} for all default languages, obj-c++ and go.
>>
>> OK for mainline?
>
> OK once a comment is added indicating why we have to precompute before the
> anti-adjust-stack.

Thanks, I have committed the patch with following comment:

+      /* Precompute all register parameters.  It isn't safe to compute
+        anything once we have started filling any specific hard regs.
+        TLS symbols sometimes need a call to resolve.  Precompute
+        register parameters before any stack pointer manipulation
+        to avoid unaligned stack in the called function.  */

Uros.
diff mbox

Patch

Index: calls.c
===================================================================
--- calls.c    (revision 225727)
+++ calls.c    (working copy)
@@ -3144,6 +3144,10 @@  expand_call (tree exp, rtx target, int ignore)

       compute_argument_addresses (args, argblock, num_actuals);

+      /* Precompute all register parameters.  It isn't safe to compute anything
+     once we have started filling any specific hard regs.  */
+      precompute_register_parameters (num_actuals, args, &reg_parm_seen);
+
       /* Perform stack alignment before the first push (the last arg).  */
       if (argblock == 0
           && adjusted_args_size.constant > reg_parm_stack_space
@@ -3184,10 +3188,6 @@  expand_call (tree exp, rtx target, int ignore)

       funexp = rtx_for_function_call (fndecl, addr);

-      /* Precompute all register parameters.  It isn't safe to compute anything
-     once we have started filling any specific hard regs.  */
-      precompute_register_parameters (num_actuals, args, &reg_parm_seen);
-
       if (CALL_EXPR_STATIC_CHAIN (exp))
     static_chain_value = expand_normal (CALL_EXPR_STATIC_CHAIN (exp));
       else