* interrupt procedures fixed for i386 targets with a fixed stack with 16 byte alignment

git-svn-id: trunk@43006 -
This commit is contained in:
florian 2019-09-15 17:17:27 +00:00
parent 72391dc4b8
commit 896e031e84
3 changed files with 6 additions and 8 deletions

View File

@ -331,9 +331,7 @@ unit cgcpu;
end;
{ return from proc }
if (po_interrupt in current_procinfo.procdef.procoptions) and
{ this messes up stack alignment }
(target_info.stackalign=4) then
if po_interrupt in current_procinfo.procdef.procoptions then
begin
if assigned(current_procinfo.procdef.funcretloc[calleeside].location) and
(current_procinfo.procdef.funcretloc[calleeside].location^.loc=LOC_REGISTER) then

View File

@ -433,7 +433,7 @@ unit cpupara;
{ we push Flags and CS as long
to cope with the IRETD
and we save 6 register + 4 selectors }
if po_interrupt in p.procoptions then
if (po_interrupt in p.procoptions) and (side=calleeside) then
inc(parasize,8+6*4+4*2);
{ Offset is calculated like:
sub esp,12

View File

@ -3433,6 +3433,7 @@ unit cgx86;
begin
regsize:=0;
stackmisalignment:=0;
{$ifdef i8086}
{ Win16 callback/exported proc prologue support.
Since callbacks can be called from different modules, DS on entry may be
@ -3533,9 +3534,7 @@ unit cgx86;
{$endif i8086}
{$ifdef i386}
{ interrupt support for i386 }
if (po_interrupt in current_procinfo.procdef.procoptions) and
{ this messes up stack alignment }
not(target_info.system in [system_i386_darwin,system_i386_iphonesim,system_i386_android]) then
if (po_interrupt in current_procinfo.procdef.procoptions) then
begin
{ .... also the segment registers }
list.concat(Taicpu.Op_reg(A_PUSH,S_W,NR_GS));
@ -3549,6 +3548,7 @@ unit cgx86;
list.concat(Taicpu.Op_reg(A_PUSH,S_L,NR_ECX));
list.concat(Taicpu.Op_reg(A_PUSH,S_L,NR_EBX));
list.concat(Taicpu.Op_reg(A_PUSH,S_L,NR_EAX));
inc(stackmisalignment,4*2+6*8);
end;
{$endif i386}
@ -3556,7 +3556,7 @@ unit cgx86;
if not nostackframe then
begin
{ return address }
stackmisalignment := sizeof(pint);
inc(stackmisalignment,sizeof(pint));
list.concat(tai_regalloc.alloc(current_procinfo.framepointer,nil));
if current_procinfo.framepointer=NR_STACK_POINTER_REG then
begin