Sfoglia il codice sorgente

* calculate stack correction on exit correctly if stack parameters are passed

git-svn-id: trunk@25427 -
florian 12 anni fa
parent
commit
e0f48b9f02
1 ha cambiato i file con 13 aggiunte e 4 eliminazioni
  1. 13 4
      compiler/arm/cgcpu.pas

+ 13 - 4
compiler/arm/cgcpu.pas

@@ -3676,12 +3676,14 @@ unit cgcpu;
          shift : byte;
          saveregs,
          regs : tcpuregisterset;
+         registerarea : DWord;
          stackmisalignment: pint;
          imm1, imm2: DWord;
+         stack_parameters : Boolean;
       begin
         if not(nostackframe) then
           begin
-            stackmisalignment:=0;
+            stack_parameters:=current_procinfo.procdef.stack_tainting_parameter(calleeside);
             regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
 
             include(regs,RS_R15);
@@ -3689,12 +3691,19 @@ unit cgcpu;
             if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
               include(regs,getsupreg(current_procinfo.framepointer));
 
+            registerarea:=0;
             for r:=RS_R0 to RS_R15 do
               if r in regs then
-                inc(stackmisalignment,4);
-            stackmisalignment:=stackmisalignment mod current_settings.alignment.localalignmax;
+                inc(registerarea,4);
+
+            stackmisalignment:=registerarea mod current_settings.alignment.localalignmax;
+
             LocalSize:=current_procinfo.calc_stackframe_size;
-            localsize:=align(localsize+stackmisalignment,current_settings.alignment.localalignmax)-stackmisalignment;
+            if stack_parameters then
+              localsize:=tarmprocinfo(current_procinfo).stackframesize-registerarea
+            else
+              localsize:=align(localsize+stackmisalignment,current_settings.alignment.localalignmax)-stackmisalignment;
+
             if (current_procinfo.framepointer=NR_STACK_POINTER_REG) or
                (target_info.system in systems_darwin) then
               begin