2
0
Эх сурвалжийг харах

* keep stack aligned to 16 byte boundaries in assembler subroutines calling other subroutines

git-svn-id: trunk@43012 -
florian 5 жил өмнө
parent
commit
3e6e72118b
1 өөрчлөгдсөн 18 нэмэгдсэн , 0 устгасан
  1. 18 0
      rtl/i386/i386.inc

+ 18 - 0
rtl/i386/i386.inc

@@ -14,6 +14,10 @@
 
 
  **********************************************************************}
  **********************************************************************}
 
 
+{$if not(defined(VER3_0)) and defined(linux)}
+  {$define FPC_SYSTEM_STACKALIGNMENT16}
+{$endif not(defined(VER3_0)) and defined(linux)}
+
 {****************************************************************************
 {****************************************************************************
                                Primitives
                                Primitives
 ****************************************************************************}
 ****************************************************************************}
@@ -1441,7 +1445,15 @@ asm
         je      .Lj3596
         je      .Lj3596
 .Lj3620:
 .Lj3620:
         movl    %esi,%eax
         movl    %esi,%eax
+        { freemem is not an assembler leaf function like fpc_geteipasebx and cpudeclocked, so it
+          needs to be called with proper stack alignment }
+{$ifdef FPC_SYSTEM_STACKALIGNMENT16}
+        leal    -8(%esp),%esp
+{$endif FPC_SYSTEM_STACKALIGNMENT16}
         call    FPC_FREEMEM
         call    FPC_FREEMEM
+{$ifdef FPC_SYSTEM_STACKALIGNMENT16}
+        leal    8(%esp),%esp
+{$endif FPC_SYSTEM_STACKALIGNMENT16}
 .Lj3596:
 .Lj3596:
         popl    %esi
         popl    %esi
 .Lquit:
 .Lquit:
@@ -1467,7 +1479,13 @@ asm
         je      .Lj4038
         je      .Lj4038
 // [441] result:=fpc_truely_ansistr_unique(s);
 // [441] result:=fpc_truely_ansistr_unique(s);
         movl    %edx,%eax
         movl    %edx,%eax
+{$ifdef FPC_SYSTEM_STACKALIGNMENT16}
+        leal    -12(%esp),%esp
+{$endif FPC_SYSTEM_STACKALIGNMENT16}
         call    fpc_truely_ansistr_unique
         call    fpc_truely_ansistr_unique
+{$ifdef FPC_SYSTEM_STACKALIGNMENT16}
+        leal    12(%esp),%esp
+{$endif FPC_SYSTEM_STACKALIGNMENT16}
 .Lj4038:
 .Lj4038:
 .Lj4031:
 .Lj4031:
 // [442] end;
 // [442] end;