mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 04:19:07 +02:00
* refactored syscall types for unified naming,first bits of ARM AROS syscall support
git-svn-id: trunk@34806 -
This commit is contained in:
parent
86940dfb32
commit
c7c37f66ed
@ -68,9 +68,9 @@ implementation
|
||||
case target_info.system of
|
||||
system_i386_aros:
|
||||
begin
|
||||
if (po_syscall_stackbase in tprocdef(procdefinition).procoptions) then
|
||||
if (po_syscall_baselast in tprocdef(procdefinition).procoptions) then
|
||||
begin
|
||||
current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('AROS SysCall - StackBase')));
|
||||
current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('AROS SysCall - BaseLast on Stack')));
|
||||
{ re-read the libbase pushed first on the stack, instead of just trusting the
|
||||
mangledname will work. this is important for example for threadvar libbases.
|
||||
and this way they also don't need to be resolved twice then. (KB) }
|
||||
@ -85,9 +85,9 @@ implementation
|
||||
cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_EAX);
|
||||
exit;
|
||||
end;
|
||||
if (po_syscall_eaxbase in tprocdef(procdefinition).procoptions) then
|
||||
if (po_syscall_basereg in tprocdef(procdefinition).procoptions) then
|
||||
begin
|
||||
current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('AROS SysCall - EAXBase')));
|
||||
current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('AROS SysCall - RegBase in EAX')));
|
||||
{ libbase must be in EAX already, so just piggyback that, and dereference it }
|
||||
reference_reset_base(tmpref,NR_EAX,-tprocdef(procdefinition).extnumber,sizeof(pint));
|
||||
current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_CALL,S_NO,tmpref));
|
||||
|
@ -90,15 +90,15 @@ implementation
|
||||
system_powerpc_amiga:
|
||||
begin
|
||||
{ one syscall convention for AmigaOS/PowerPC
|
||||
which is very similar to basesysv on MorphOS }
|
||||
which is very similar to basesysv (a.k.a basefirst) on MorphOS }
|
||||
reference_reset_base(tmpref,NR_R3,tprocdef(procdefinition).extnumber,sizeof(pint));
|
||||
do_call_ref(tmpref);
|
||||
end;
|
||||
system_powerpc_morphos:
|
||||
begin
|
||||
{ all conventions but legacy }
|
||||
if ([po_syscall_basesysv,po_syscall_sysv,
|
||||
po_syscall_sysvbase,po_syscall_r12base] * tprocdef(procdefinition).procoptions) <> [] then
|
||||
if ([po_syscall_basefirst,po_syscall_basenone,
|
||||
po_syscall_baselast,po_syscall_basereg] * tprocdef(procdefinition).procoptions) <> [] then
|
||||
begin
|
||||
cg.getcpuregister(current_asmdata.CurrAsmList,NR_R12);
|
||||
|
||||
|
@ -136,7 +136,7 @@ const
|
||||
paranr_objc_cmd = 6;
|
||||
|
||||
{ Required to support variations of syscalls on Amiga-likes }
|
||||
paranr_syscall_lib_first = 9; { for basesysv on MorphOS/ppc and AmigaOS4/ppc }
|
||||
paranr_syscall_lib_first = 9; { for basefirst on MorphOS/ppc and AmigaOS4/ppc }
|
||||
paranr_syscall_lib_last = high(word)-3; { everything else }
|
||||
|
||||
paranr_result_leftright = high(word)-2;
|
||||
@ -340,15 +340,12 @@ type
|
||||
po_global,
|
||||
{ Generic syscall procoption, for systems like Atari, Palm, etc }
|
||||
po_syscall,
|
||||
{ The different kind of syscalls on AmigaOS and MorphOS, m68k and PPC }
|
||||
{ The different kind of syscalls on Amiga-like systems }
|
||||
po_syscall_legacy,
|
||||
po_syscall_sysv,
|
||||
po_syscall_basesysv,
|
||||
po_syscall_sysvbase,
|
||||
po_syscall_r12base,
|
||||
{ The different kind of syscalls on AROS, i386/x86_64 }
|
||||
po_syscall_stackbase,
|
||||
po_syscall_eaxbase,
|
||||
po_syscall_basenone,
|
||||
po_syscall_basefirst,
|
||||
po_syscall_baselast,
|
||||
po_syscall_basereg,
|
||||
{ Used to record the fact that a symbol is associated to this syscall }
|
||||
po_syscall_has_libsym,
|
||||
{ Procedure can be inlined }
|
||||
|
@ -37,16 +37,19 @@ type
|
||||
psyscallinfo = ^tsyscallinfo;
|
||||
|
||||
const
|
||||
syscall_conventions: array[1..8] of tsyscallinfo = (
|
||||
syscall_conventions: array[1..10] of tsyscallinfo = (
|
||||
( token: NOTOKEN; procoption: po_syscall; validon: [system_m68k_atari] ),
|
||||
( token: _LEGACY; procoption: po_syscall_legacy; validon: [system_powerpc_morphos,system_m68k_amiga] ),
|
||||
( token: _SYSV; procoption: po_syscall_sysv; validon: [system_powerpc_morphos] ),
|
||||
( token: _SYSVBASE; procoption: po_syscall_sysvbase; validon: [system_powerpc_morphos] ),
|
||||
( token: _BASESYSV; procoption: po_syscall_basesysv; validon: [system_powerpc_morphos,system_powerpc_amiga] ),
|
||||
( token: _R12BASE; procoption: po_syscall_r12base; validon: [system_powerpc_morphos] ),
|
||||
( token: _STACKBASE; procoption: po_syscall_stackbase; validon: [system_i386_aros,system_x86_64_aros] ),
|
||||
( token: _EAXBASE; procoption: po_syscall_eaxbase; validon: [system_i386_aros,system_x86_64_aros] ));
|
||||
|
||||
// old sysv naming, for compatibility only (on MorphOS/OS4)
|
||||
( token: _SYSV; procoption: po_syscall_basenone; validon: [system_powerpc_morphos] ),
|
||||
( token: _SYSVBASE; procoption: po_syscall_baselast; validon: [system_powerpc_morphos] ),
|
||||
( token: _BASESYSV; procoption: po_syscall_basefirst; validon: [system_powerpc_morphos,system_powerpc_amiga] ),
|
||||
( token: _R12BASE; procoption: po_syscall_basereg; validon: [system_powerpc_morphos] ),
|
||||
// new base naming, which should cover all "next-gen" Amiga-like systems
|
||||
( token: _BASENONE; procoption: po_syscall_basenone; validon: [system_powerpc_morphos] ),
|
||||
( token: _BASEFIRST; procoption: po_syscall_basefirst; validon: [system_powerpc_morphos,system_powerpc_amiga] ),
|
||||
( token: _BASELAST; procoption: po_syscall_baselast; validon: [system_powerpc_morphos,system_i386_aros,system_x86_64_aros,system_arm_aros] ),
|
||||
( token: _BASEREG; procoption: po_syscall_basereg; validon: [system_powerpc_morphos,system_i386_aros,system_x86_64_aros] ));
|
||||
|
||||
function get_syscall_by_token(const token: ttoken): psyscallinfo;
|
||||
function get_syscall_by_name(const name: string): psyscallinfo;
|
||||
@ -59,9 +62,8 @@ uses
|
||||
verbose;
|
||||
|
||||
const
|
||||
syscall_conventions_po = [ po_syscall, po_syscall_legacy, po_syscall_sysv,
|
||||
po_syscall_sysvbase, po_syscall_basesysv, po_syscall_r12base,
|
||||
po_syscall_stackbase, po_syscall_eaxbase ];
|
||||
syscall_conventions_po = [ po_syscall, po_syscall_legacy, po_syscall_basenone,
|
||||
po_syscall_baselast, po_syscall_basefirst, po_syscall_basereg ];
|
||||
|
||||
type
|
||||
tsyscalldefaultinfo = record
|
||||
@ -70,13 +72,14 @@ type
|
||||
end;
|
||||
|
||||
const
|
||||
default_syscall_conventions: array[0..5] of tsyscalldefaultinfo = (
|
||||
default_syscall_conventions: array[0..6] of tsyscalldefaultinfo = (
|
||||
( system: system_m68k_atari; procoption: po_syscall ),
|
||||
( system: system_m68k_amiga; procoption: po_syscall_legacy ),
|
||||
( system: system_powerpc_amiga; procoption: po_syscall_basesysv ),
|
||||
( system: system_powerpc_amiga; procoption: po_syscall_basefirst ),
|
||||
( system: system_powerpc_morphos; procoption: po_syscall_legacy ),
|
||||
( system: system_i386_aros; procoption: po_syscall_stackbase ),
|
||||
( system: system_x86_64_aros; procoption: po_syscall_stackbase ));
|
||||
( system: system_arm_aros; procoption: po_syscall_baselast ),
|
||||
( system: system_i386_aros; procoption: po_syscall_baselast ),
|
||||
( system: system_x86_64_aros; procoption: po_syscall_baselast ));
|
||||
|
||||
var
|
||||
default_syscall_convention: tprocoption = po_none;
|
||||
|
@ -189,10 +189,10 @@ type
|
||||
_SYSTEM,
|
||||
_WINAPI,
|
||||
_ASMNAME,
|
||||
_BASEREG,
|
||||
_CPPDECL,
|
||||
_DEFAULT,
|
||||
_DYNAMIC,
|
||||
_EAXBASE,
|
||||
_EXPORTS,
|
||||
_FINALLY,
|
||||
_FORWARD,
|
||||
@ -213,6 +213,8 @@ type
|
||||
_VIRTUAL,
|
||||
_ABSOLUTE,
|
||||
_ABSTRACT,
|
||||
_BASELAST,
|
||||
_BASENONE,
|
||||
_BASESYSV,
|
||||
_CONSTREF,
|
||||
_CONTAINS,
|
||||
@ -245,6 +247,7 @@ type
|
||||
_SUBTRACT,
|
||||
_SYSVBASE,
|
||||
_ASSEMBLER,
|
||||
_BASEFIRST,
|
||||
_BITPACKED,
|
||||
_BITWISEOR,
|
||||
_HARDFLOAT,
|
||||
@ -262,7 +265,6 @@ type
|
||||
_PUBLISHED,
|
||||
_REFERENCE,
|
||||
_SOFTFLOAT,
|
||||
_STACKBASE,
|
||||
_THREADVAR,
|
||||
_WRITEONLY,
|
||||
_BITWISEAND,
|
||||
@ -512,10 +514,10 @@ const
|
||||
(str:'SYSTEM' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'WINAPI' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'ASMNAME' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'BASEREG' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on Amiga-likes }
|
||||
(str:'CPPDECL' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'DEFAULT' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'DYNAMIC' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'EAXBASE' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on AROS }
|
||||
(str:'EXPORTS' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN),
|
||||
(str:'FINALLY' ;special:false;keyword:[m_except];op:NOTOKEN),
|
||||
(str:'FORWARD' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
@ -536,6 +538,8 @@ const
|
||||
(str:'VIRTUAL' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'ABSOLUTE' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'ABSTRACT' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'BASELAST' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on Amiga-likes }
|
||||
(str:'BASENONE' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on Amiga-likes }
|
||||
(str:'BASESYSV' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on MorphOS }
|
||||
(str:'CONSTREF' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'CONTAINS' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
@ -568,6 +572,7 @@ const
|
||||
(str:'SUBTRACT' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name }
|
||||
(str:'SYSVBASE' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on MorphOS }
|
||||
(str:'ASSEMBLER' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'BASEFIRST' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on Amiga-likes }
|
||||
(str:'BITPACKED' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN),
|
||||
(str:'BITWISEOR' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name }
|
||||
(str:'HARDFLOAT' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
@ -585,7 +590,6 @@ const
|
||||
(str:'PUBLISHED' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'REFERENCE' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'SOFTFLOAT' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'STACKBASE' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on AROS }
|
||||
(str:'THREADVAR' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN),
|
||||
(str:'WRITEONLY' ;special:false;keyword:[m_none];op:NOTOKEN),
|
||||
(str:'BITWISEAND' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name }
|
||||
|
@ -1933,12 +1933,10 @@ const
|
||||
(mask:po_global; str:'Global'),
|
||||
(mask:po_syscall; str:'Syscall'),
|
||||
(mask:po_syscall_legacy; str:'SyscallLegacy'),
|
||||
(mask:po_syscall_sysv; str:'SyscallSysV'),
|
||||
(mask:po_syscall_basesysv;str:'SyscallBaseSysV'),
|
||||
(mask:po_syscall_sysvbase;str:'SyscallSysVBase'),
|
||||
(mask:po_syscall_r12base; str:'SyscallR12Base'),
|
||||
(mask:po_syscall_stackbase;str:'SyscallStackBase'),
|
||||
(mask:po_syscall_eaxbase; str:'SyscallEAXBase'),
|
||||
(mask:po_syscall_basenone;str:'SyscallBaseNone');
|
||||
(mask:po_syscall_basefirst;str:'SyscallBaseFirst'),
|
||||
(mask:po_syscall_baselast;str:'SyscallBaseLast'),
|
||||
(mask:po_syscall_basereg; str:'SyscallBaseReg'),
|
||||
(mask:po_syscall_has_libsym; str:'Has LibSym'),
|
||||
(mask:po_inline; str:'Inline'),
|
||||
(mask:po_compilerproc; str:'CompilerProc'),
|
||||
|
Loading…
Reference in New Issue
Block a user