diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-02-23 15:42:45 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-02-23 15:42:45 +0000 |
commit | 10a031e91ddccea3336cf546dbedb320456041cf (patch) | |
tree | 70090dbd2f39a06e16358bfaf486bf324ec3a0e5 /compiler/x86_64 | |
parent | 6e36f433cc2e5d4d34a1b49b4957791c2727d714 (diff) | |
download | fpc-10a031e91ddccea3336cf546dbedb320456041cf.tar.gz |
* keep track of whether a routine has a C-style variadic parameter in the
procoptions even when it's through an array-of-const parameter
* always call create_varargs_paraloc_info() instead of create_paraloc_info()
in the former case, even when no varargs parameters are specified (because
on some platforms even some non-variadic parameters need to be passed
differently, such as on ARM with gnueabihf)
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@41420 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/x86_64')
-rw-r--r-- | compiler/x86_64/cpupara.pas | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/compiler/x86_64/cpupara.pas b/compiler/x86_64/cpupara.pas index 7ef50c7251..a2182201e0 100644 --- a/compiler/x86_64/cpupara.pas +++ b/compiler/x86_64/cpupara.pas @@ -46,7 +46,7 @@ unit cpupara; function get_saved_registers_int(calloption : tproccalloption):tcpuregisterarray;override; function get_saved_registers_mm(calloption: tproccalloption):tcpuregisterarray;override; function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override; - function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;override; + function create_varargs_paraloc_info(p : tabstractprocdef; side: tcallercallee; varargspara:tvarargsparalist):longint;override; function get_funcretloc(p : tabstractprocdef; side: tcallercallee; forcetempdef: tdef): tcgpara;override; end; @@ -1946,7 +1946,7 @@ unit cpupara; end; - function tcpuparamanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint; + function tcpuparamanager.create_varargs_paraloc_info(p : tabstractprocdef; side: tcallercallee; varargspara:tvarargsparalist):longint; var intparareg,mmparareg, parasize : longint; @@ -1958,11 +1958,18 @@ unit cpupara; else parasize:=0; { calculate the registers for the normal parameters } - create_paraloc_info_intern(p,callerside,p.paras,intparareg,mmparareg,parasize,false); + create_paraloc_info_intern(p,side,p.paras,intparareg,mmparareg,parasize,false); { append the varargs } - create_paraloc_info_intern(p,callerside,varargspara,intparareg,mmparareg,parasize,true); - { store used no. of SSE registers, that needs to be passed in %AL } - varargspara.mmregsused:=mmparareg; + if assigned(varargspara) then + begin + if side=callerside then + create_paraloc_info_intern(p,side,varargspara,intparareg,mmparareg,parasize,true) + else + internalerror(2019021917); + { store used no. of SSE registers, that needs to be passed in %AL } + varargspara.mmregsused:=mmparareg; + end; + create_funcretloc_info(p,side); result:=parasize; end; |