소스 검색

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

git-svn-id: trunk@43012 -
florian 5 년 전
부모
커밋
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
 ****************************************************************************}
@@ -1441,7 +1445,15 @@ asm
         je      .Lj3596
 .Lj3620:
         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
+{$ifdef FPC_SYSTEM_STACKALIGNMENT16}
+        leal    8(%esp),%esp
+{$endif FPC_SYSTEM_STACKALIGNMENT16}
 .Lj3596:
         popl    %esi
 .Lquit:
@@ -1467,7 +1479,13 @@ asm
         je      .Lj4038
 // [441] result:=fpc_truely_ansistr_unique(s);
         movl    %edx,%eax
+{$ifdef FPC_SYSTEM_STACKALIGNMENT16}
+        leal    -12(%esp),%esp
+{$endif FPC_SYSTEM_STACKALIGNMENT16}
         call    fpc_truely_ansistr_unique
+{$ifdef FPC_SYSTEM_STACKALIGNMENT16}
+        leal    12(%esp),%esp
+{$endif FPC_SYSTEM_STACKALIGNMENT16}
 .Lj4038:
 .Lj4031:
 // [442] end;