summaryrefslogtreecommitdiff
path: root/compiler/x86_64
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-02-23 15:42:45 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-02-23 15:42:45 +0000
commit10a031e91ddccea3336cf546dbedb320456041cf (patch)
tree70090dbd2f39a06e16358bfaf486bf324ec3a0e5 /compiler/x86_64
parent6e36f433cc2e5d4d34a1b49b4957791c2727d714 (diff)
downloadfpc-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.pas19
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;