* refactored syscall types for unified naming,first bits of ARM AROS syscall support

git-svn-id: trunk@34806 -
This commit is contained in:
Károly Balogh 2016-11-06 12:41:56 +00:00
parent 86940dfb32
commit c7c37f66ed
6 changed files with 43 additions and 41 deletions

View File

@ -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));

View File

@ -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);

View File

@ -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 }

View File

@ -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;

View File

@ -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 }

View File

@ -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'),