From 9938169d2c7c6c5995d7f18c3d00ecc8b80c9567 Mon Sep 17 00:00:00 2001 From: Jonas Maebe <jonas@freepascal.org> Date: Sun, 2 Jun 2013 14:05:07 +0000 Subject: [PATCH] * don't use the paracgsize in get_paraloc_def(), because it generally contains the tcgsize of the entire parameter rather than only of what is left (-> calculate it from the remaining parameter length) git-svn-id: trunk@24776 - --- compiler/arm/cpupara.pas | 2 +- compiler/avr/cpupara.pas | 2 +- compiler/i386/cpupara.pas | 2 +- compiler/m68k/cpupara.pas | 2 +- compiler/mips/cpupara.pas | 2 +- compiler/paramgr.pas | 10 +++++----- compiler/powerpc/cpupara.pas | 2 +- compiler/powerpc64/cpupara.pas | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/compiler/arm/cpupara.pas b/compiler/arm/cpupara.pas index 3a4718cdef..8bdc12a55b 100644 --- a/compiler/arm/cpupara.pas +++ b/compiler/arm/cpupara.pas @@ -439,7 +439,7 @@ unit cpupara; else begin paraloc^.size:=paracgsize; - paraloc^.def:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc); + paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc); end; case loc of LOC_REGISTER: diff --git a/compiler/avr/cpupara.pas b/compiler/avr/cpupara.pas index a674684ad8..c4575e6bfc 100644 --- a/compiler/avr/cpupara.pas +++ b/compiler/avr/cpupara.pas @@ -366,7 +366,7 @@ unit cpupara; { LOC_REFERENCE covers always the overleft } paraloc^.loc:=LOC_REFERENCE; paraloc^.size:=int_cgsize(paralen); - paraloc^.def:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc); + paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc); if (side=callerside) then paraloc^.reference.index:=NR_STACK_POINTER_REG; diff --git a/compiler/i386/cpupara.pas b/compiler/i386/cpupara.pas index 23c0696f15..c9c1279d12 100644 --- a/compiler/i386/cpupara.pas +++ b/compiler/i386/cpupara.pas @@ -531,7 +531,7 @@ unit cpupara; else begin l:=paralen; - paraloc^.def:=get_paraloc_def(paradef,paracgsize,l,firstparaloc); + paraloc^.def:=get_paraloc_def(paradef,l,firstparaloc); end; paraloc^.size:=int_cgsize(l); end; diff --git a/compiler/m68k/cpupara.pas b/compiler/m68k/cpupara.pas index 6c2d7f6ffc..233232c081 100644 --- a/compiler/m68k/cpupara.pas +++ b/compiler/m68k/cpupara.pas @@ -396,7 +396,7 @@ unit cpupara; {$endif DEBUG_CHARLIE} paraloc^.loc:=LOC_REFERENCE; paraloc^.size:=int_cgsize(paralen); - paraloc^.def:=get_paraloc_def(paradef,paraloc^.size,paralen,firstparaloc); + paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc); if (side = callerside) then paraloc^.reference.index:=NR_STACK_POINTER_REG else diff --git a/compiler/mips/cpupara.pas b/compiler/mips/cpupara.pas index b5ba7014b2..ce5b232965 100644 --- a/compiler/mips/cpupara.pas +++ b/compiler/mips/cpupara.pas @@ -463,7 +463,7 @@ implementation begin paraloc^.loc:=LOC_REFERENCE; paraloc^.size:=int_cgsize(paralen); - paraloc^.def:=get_paraloc_def(locdef,paraloc^.size,paralen,firstparaloc); + paraloc^.def:=get_paraloc_def(locdef,paralen,firstparaloc); if side=callerside then begin diff --git a/compiler/paramgr.pas b/compiler/paramgr.pas index 63adabee29..94d1bbc358 100644 --- a/compiler/paramgr.pas +++ b/compiler/paramgr.pas @@ -151,9 +151,9 @@ unit paramgr; function handle_common_ret_in_param(def:tdef;pd:tabstractprocdef;out retinparam:boolean):boolean; { returns the def to use for a tparalocation part of a cgpara for paradef, - for which the tcgsize is locsize and the integer length is restlen. + for which the def is paradef and the integer length is restlen. fullsize is true if restlen equals the full paradef size } - function get_paraloc_def(paradef: tdef; paracgsize: tcgsize; restlen: aint; fullsize: boolean): tdef; + function get_paraloc_def(paradef: tdef; restlen: aint; fullsize: boolean): tdef; end; @@ -610,14 +610,14 @@ implementation end; - function tparamanager.get_paraloc_def(paradef: tdef; paracgsize: tcgsize; restlen: aint; fullsize: boolean): tdef; + function tparamanager.get_paraloc_def(paradef: tdef; restlen: aint; fullsize: boolean): tdef; begin if fullsize then result:=paradef { no support for 128 bit ints -> tcgsize2orddef can't handle OS_(S)128 } - else if not(paracgsize in [OS_NO,OS_128,OS_S128]) then - result:=cgsize_orddef(paracgsize) + else if restlen in [1,2,4,8] then + result:=cgsize_orddef(int_cgsize(paracgsize)) else result:=getarraydef(u8inttype,restlen); end; diff --git a/compiler/powerpc/cpupara.pas b/compiler/powerpc/cpupara.pas index a5e90ef1e9..c8fdb8da8f 100644 --- a/compiler/powerpc/cpupara.pas +++ b/compiler/powerpc/cpupara.pas @@ -480,7 +480,7 @@ unit cpupara; if (paradef.typ<>orddef) then begin paracgsize:=int_cgsize(paralen); - locdef:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc); + locdef:=get_paraloc_def(paradef,paralen,firstparaloc); end; if (paracgsize in [OS_NO,OS_64,OS_S64,OS_128,OS_S128]) then begin diff --git a/compiler/powerpc64/cpupara.pas b/compiler/powerpc64/cpupara.pas index d3240aace4..35f65862eb 100644 --- a/compiler/powerpc64/cpupara.pas +++ b/compiler/powerpc64/cpupara.pas @@ -387,7 +387,7 @@ begin if (paracgsize <> OS_NO) and (paradef.typ <> orddef) then begin paracgsize := int_cgsize(paralen); - locdef:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc); + locdef:=get_paraloc_def(paradef,paralen,firstparaloc); end; { aix requires that record data (including partial data) stored in