https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63890

--- Comment #12 from Jan Hubicka <hubicka at ucw dot cz> ---
Hi,
the problem is that darwin output profiler after prologue.
With ACCUMULATE_OUTGOING_ARGS we leave stack pointer aligned to boundary - 4
(for return pointer) without we leave it aligned.
I guess it is possible to compensate this in FUNCTION_PROFILER, but I am not
convinced this will work reliably. Probably disabling combine-stack-adjustments
would be needed, too.
(I do not think it is reliable with ACCUMULATE_OUTGOING_ARGS either)

Honza

Index: config/i386/darwin.h
===================================================================
--- config/i386/darwin.h    (revision 221034)
+++ config/i386/darwin.h    (working copy)
@@ -210,6 +210,8 @@ extern int darwin_emit_branch_islands;
 #undef FUNCTION_PROFILER
 #define FUNCTION_PROFILER(FILE, LABELNO)                \
     do {                                \
+      if (!ACCUMULATE_OUTGOING_ARGS)                    \
+        fprintf (FILE, "\tpushl %%ebx\n");  /*  Align stack  */        \
       if (TARGET_MACHO_BRANCH_ISLANDS                     \
        && MACHOPIC_INDIRECT && !TARGET_64BIT)            \
     {                                \
@@ -218,6 +220,8 @@ extern int darwin_emit_branch_islands;
       machopic_validate_stub_or_non_lazy_ptr (name);        \
     }                                \
       else fprintf (FILE, "\tcall mcount\n");                \
+      if (!ACCUMULATE_OUTGOING_ARGS)                    \
+       fprintf (FILE, "\tpopl %%ebx\n");  /*  Align stack  */        \
     } while (0)

 #define C_COMMON_OVERRIDE_OPTIONS                    \
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c    (revision 221034)
+++ config/i386/i386.c    (working copy)
@@ -10061,6 +10061,13 @@ ix86_compute_frame_layout (struct ix86_f
       if (crtl->stack_alignment_needed < PREFERRED_STACK_BOUNDARY)
     crtl->stack_alignment_needed = PREFERRED_STACK_BOUNDARY;
     }
+  /* Be sure we get stack aligned for mcount call.  */
+  else if (crtl->profile && flag_fentry)
+    {
+      crtl->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
+      if (crtl->stack_alignment_needed < PREFERRED_STACK_BOUNDARY)
+    crtl->stack_alignment_needed = PREFERRED_STACK_BOUNDARY;
+    }

   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;

Reply via email to