+ initial implementation of setjmp/longjmp

git-svn-id: trunk@46537 -
This commit is contained in:
florian 2020-08-21 21:15:36 +00:00
parent 1f073818ba
commit 8a36e63a56
2 changed files with 41 additions and 3 deletions

View File

@ -14,12 +14,43 @@
**********************************************************************}
function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP']; compilerproc;
function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP']; compilerproc; nostackframe;
{$ifdef fpc_abi_call0}
asm
s32i.n a0,S.a0
s32i.n a1,S.a1
s32i.n a8,S.a8
s32i.n a12,S.a12
s32i.n a13,S.a13
s32i.n a14,S.a14
s32i.n a15,S.a15
movi.n a2,0
end;
{$endif fpc_abi_call0}
{$ifdef fpc_abi_windowed}
asm
movi a2,0
end;
{$endif fpc_abi_windowed}
procedure fpc_longjmp(var S : jmp_buf;value : longint);assembler;[Public, alias : 'FPC_LONGJMP']; compilerproc;
procedure fpc_longjmp(var S : jmp_buf;value : longint);assembler;[Public, alias : 'FPC_LONGJMP']; compilerproc; nostackframe;
{$ifdef fpc_abi_call0}
asm
l32i.n a0,S.a0
l32i.n a1,S.a1
l32i.n a8,S.a8
l32i.n a12,S.a12
l32i.n a13,S.a13
l32i.n a14,S.a14
l32i.n a15,S.a15
movi.n a2,1
movnez a2,value,value
end;
{$endif fpc_abi_call0}
{$ifdef fpc_abi_windowed}
asm
end;
{$endif fpc_abi_windowed}

View File

@ -15,8 +15,15 @@
**********************************************************************}
type
jmp_buf = packed record
{$ifdef fpc_abi_call0}
jmp_buf = record
a0,a1,a8,a12,a13,a14,a15 : DWord;
end;
{$endif fpc_abi_call0}
{$ifdef fpc_abi_windowed}
jmp_buf = record
end;
{$endif fpc_abi_windowed}
pjmp_buf = ^jmp_buf;
function setjmp(var S : jmp_buf) : longint;[external name 'FPC_SETJMP'];