diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index 74f94b91ad..b1a15bbd4f 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -1802,13 +1802,13 @@ end; procedure pd_syscall(pd:tabstractprocdef); -{$if defined(powerpc) or defined(m68k) or defined(i386)} +{$if defined(powerpc) or defined(m68k) or defined(i386) or defined(x86_64)} var vs : tparavarsym; sym : tsym; symtable : TSymtable; v: Tconstexprint; -{$endif defined(powerpc) or defined(m68k) or defined(i386)} +{$endif defined(powerpc) or defined(m68k) or defined(i386) or defined(x86_64)} begin if (pd.typ<>procdef) and (target_info.system <> system_powerpc_amiga) then internalerror(2003042614); @@ -1973,8 +1973,8 @@ begin Tprocdef(pd).extnumber:=v.uvalue; end; {$endif powerpc} -{$ifdef i386} - if target_info.system = system_i386_aros then +{$if defined(i386) or defined(x86_64)} + if target_info.system in [system_i386_aros,system_x86_64_aros] then begin include(pd.procoptions,po_syscall_sysvbase); @@ -2002,7 +2002,7 @@ begin if (vhigh(Tprocdef(pd).extnumber)) then message(parser_e_range_check_error) else - Tprocdef(pd).extnumber:=v.uvalue * 4; { sizeof Pointer for the target } + Tprocdef(pd).extnumber:=v.uvalue * sizeof(pint); end; {$endif} end; diff --git a/compiler/x86/agx86att.pas b/compiler/x86/agx86att.pas index 16b58efd61..c9bd2e3fa4 100644 --- a/compiler/x86/agx86att.pas +++ b/compiler/x86/agx86att.pas @@ -471,7 +471,7 @@ interface supported_targets : [system_x86_64_linux,system_x86_64_freebsd, system_x86_64_win64,system_x86_64_embedded, system_x86_64_openbsd,system_x86_64_netbsd, - system_x86_64_dragonfly]; + system_x86_64_dragonfly,system_x86_64_aros]; flags : [af_needar,af_smartlink_sections,af_supports_dwarf]; labelprefix : '.L'; comment : '# '; diff --git a/compiler/x86_64/cpuelf.pas b/compiler/x86_64/cpuelf.pas index 9a3d8d87b6..a5e4a45fd9 100644 --- a/compiler/x86_64/cpuelf.pas +++ b/compiler/x86_64/cpuelf.pas @@ -676,7 +676,8 @@ implementation asmcmd : ''; supported_targets : [system_x86_64_linux,system_x86_64_freebsd, system_x86_64_openbsd,system_x86_64_netbsd, - system_x86_64_dragonfly,system_x86_64_solaris]; + system_x86_64_dragonfly,system_x86_64_solaris, + system_x86_64_aros]; flags : [af_outputbinary,af_smartlink_sections,af_supports_dwarf]; labelprefix : '.L'; comment : ''; diff --git a/compiler/x86_64/cputarg.pas b/compiler/x86_64/cputarg.pas index b979a31ccb..7da0846918 100644 --- a/compiler/x86_64/cputarg.pas +++ b/compiler/x86_64/cputarg.pas @@ -49,6 +49,10 @@ implementation {$ifndef NOTARGETSUNOS} ,t_sunos {$endif} + {$ifndef NOTARGETAROS} + ,t_aros + {$endif} + {************************************** Assemblers diff --git a/compiler/x86_64/nx64cal.pas b/compiler/x86_64/nx64cal.pas index b97b1699bb..c5cd1eb998 100644 --- a/compiler/x86_64/nx64cal.pas +++ b/compiler/x86_64/nx64cal.pas @@ -31,9 +31,12 @@ interface type tx8664callnode = class(tx86callnode) - protected + protected + procedure gen_syscall_para(para: tcallparanode); override; procedure extra_call_code;override; procedure set_result_location(realresdef: tstoreddef);override; + public + procedure do_syscall;override; end; @@ -41,10 +44,53 @@ implementation uses globtype, - systems, + systems,verbose,cutils, cpubase,cgbase,cgutils,cgobj, + symsym,symcpu,nld, aasmtai,aasmdata,aasmcpu; +{ uses + globtype,systems, + cutils,verbose,globals, + cgbase,cgutils, + cpubase,paramgr, + aasmtai,aasmdata,aasmcpu, + nbas,nmem,nld,ncnv, + symdef,symsym,symcpu, + cga,cgobj,cpuinfo;} + + + procedure tx8664callnode.do_syscall; + var + tmpref: treference; + begin + case target_info.system of + system_x86_64_aros: + begin + // one syscall convention for AROS + current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('AROS SysCall'))); + reference_reset(tmpref,sizeof(pint)); + tmpref.symbol:=current_asmdata.RefAsmSymbol(tstaticvarsym(tcpuprocdef(procdefinition).libsym).mangledname); + cg.getcpuregister(current_asmdata.CurrAsmList,NR_RAX); + cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,NR_RAX); + reference_reset_base(tmpref,NR_EAX,-tprocdef(procdefinition).extnumber,sizeof(pint)); + cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,NR_RAX); + cg.a_call_reg(current_asmdata.CurrAsmList,NR_RAX); + cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_RAX); + end; + else + internalerror(2015062801); + end; + end; + + + procedure tx8664callnode.gen_syscall_para(para: tcallparanode); + begin + { lib parameter has no special type but proccalloptions must be a syscall } + para.left:=cloadnode.create(tcpuprocdef(procdefinition).libsym,tcpuprocdef(procdefinition).libsym.owner); + end; + + procedure tx8664callnode.extra_call_code; var mmregs : aint; diff --git a/compiler/x86_64/symcpu.pas b/compiler/x86_64/symcpu.pas index 09466d6be4..038726deef 100644 --- a/compiler/x86_64/symcpu.pas +++ b/compiler/x86_64/symcpu.pas @@ -26,7 +26,7 @@ unit symcpu; interface uses - symtype,symdef,symsym,symx86; + symconst,symtype,symdef,symsym,symx86; type { defs } @@ -91,6 +91,15 @@ type tcpuprocvardefclass = class of tcpuprocvardef; tcpuprocdef = class(tprocdef) + procedure ppuload_platform(ppufile: tcompilerppufile); override; + procedure ppuwrite_platform(ppufile: tcompilerppufile); override; + public + { library symbol for AROS } + libsym : tsym; + libsymderef : tderef; + function getcopyas(newtyp: tdeftyp; copytyp: tproccopytyp): tstoreddef; override; + procedure buildderef; override; + procedure deref; override; end; tcpuprocdefclass = class of tcpuprocdef; @@ -174,6 +183,52 @@ const implementation +{**************************************************************************** + tcpuprocdef +****************************************************************************} + + procedure tcpuprocdef.ppuload_platform(ppufile: tcompilerppufile); + begin + inherited; + if po_syscall_has_libsym in procoptions then + ppufile.getderef(libsymderef); + end; + + + procedure tcpuprocdef.ppuwrite_platform(ppufile: tcompilerppufile); + begin + inherited; + if po_syscall_has_libsym in procoptions then + ppufile.putderef(libsymderef); + end; + + + function tcpuprocdef.getcopyas(newtyp: tdeftyp; copytyp: tproccopytyp): tstoreddef; + begin + result:=inherited; + if newtyp=procdef then + tcpuprocdef(result).libsym:=libsym; + end; + + + procedure tcpuprocdef.buildderef; + begin + inherited; + if po_syscall_has_libsym in procoptions then + libsymderef.build(libsym); + end; + + + procedure tcpuprocdef.deref; + begin + inherited; + if po_syscall_has_libsym in procoptions then + libsym:=tsym(libsymderef.resolve) + else + libsym:=nil; + end; + + begin { used tdef classes } cfiledef:=tcpufiledef;