From fad5d59bd9f68590756052d93f11e91c76046d5a Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Fri, 10 Mar 2006 23:44:04 +0000 Subject: [PATCH] * turned {$ifdef cputargethasfixedstack} into "if use_fixed_stack" * fixed i386 parameter passing of function calls nested in parameters of functions which also need the stack to pass poarameters git-svn-id: trunk@2847 - --- compiler/cgutils.pas | 5 ++++ compiler/i386/cpupara.pas | 3 +- compiler/ncgcal.pas | 62 +++++++++++++++++++-------------------- compiler/ncgutil.pas | 5 ++-- compiler/paramgr.pas | 17 +++++------ 5 files changed, 48 insertions(+), 44 deletions(-) diff --git a/compiler/cgutils.pas b/compiler/cgutils.pas index e95430482b..d8db7e6a4e 100644 --- a/compiler/cgutils.pas +++ b/compiler/cgutils.pas @@ -194,8 +194,13 @@ uses {$ifdef i386} result := (target_info.system = system_i386_darwin); {$else i386} +{$ifdef cputargethasfixedstack} + result := true; +{$else cputargethasfixedstack} result := false; +{$endif cputargethasfixedstack} {$endif i386} end; end. + diff --git a/compiler/i386/cpupara.pas b/compiler/i386/cpupara.pas index 5888523a35..39b7116481 100644 --- a/compiler/i386/cpupara.pas +++ b/compiler/i386/cpupara.pas @@ -618,7 +618,8 @@ unit cpupara; begin paraloc:=parasym.paraloc[callerside].location; { No need for temps when value is pushed } - if assigned(paraloc) and + if not(use_fixed_stack) and + assigned(paraloc) and (paraloc^.loc=LOC_REFERENCE) and (paraloc^.reference.index=NR_STACK_POINTER_REG) then duplicateparaloc(list,calloption,parasym,cgpara) diff --git a/compiler/ncgcal.pas b/compiler/ncgcal.pas index b45f54a50a..ad96180ce8 100644 --- a/compiler/ncgcal.pas +++ b/compiler/ncgcal.pas @@ -166,7 +166,8 @@ implementation LOC_CREFERENCE : begin size:=align(left.resulttype.def.size,tempcgpara.alignment); - if tempcgpara.location^.reference.index=NR_STACK_POINTER_REG then + if (not use_fixed_stack) and + (tempcgpara.location^.reference.index=NR_STACK_POINTER_REG) then cg.a_param_ref(exprasmlist,left.location.size,left.location.reference,tempcgpara) else begin @@ -696,10 +697,8 @@ implementation callerparaloc, tmpparaloc : pcgparalocation; sizeleft: aint; -{$ifdef cputargethasfixedstack} htempref, href : treference; -{$endif cputargethasfixedstack} begin { copy all resources to the allocated registers } ppn:=tcgcallparanode(left); @@ -750,37 +749,38 @@ implementation end; LOC_REFERENCE: begin -{$ifdef cputargethasfixedstack} - { Can't have a data copied to the stack, every location - must contain a valid size field } + if use_fixed_stack then + begin + { Can't have a data copied to the stack, every location + must contain a valid size field } - if (ppn.tempcgpara.size=OS_NO) and - ((tmpparaloc^.loc<>LOC_REFERENCE) or - assigned(tmpparaloc^.next)) then - internalerror(200501281); - reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset); - { copy parameters in case they were moved to a temp. location because we've a fixed stack } - case tmpparaloc^.loc of + if (ppn.tempcgpara.size=OS_NO) and + ((tmpparaloc^.loc<>LOC_REFERENCE) or + assigned(tmpparaloc^.next)) then + internalerror(200501281); + reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset); + { copy parameters in case they were moved to a temp. location because we've a fixed stack } + case tmpparaloc^.loc of LOC_REFERENCE: - begin - reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset); - { use concatcopy, because it can also be a float which fails when - load_ref_ref is used } - if (ppn.tempcgpara.size <> OS_NO) then - cg.g_concatcopy(exprasmlist,htempref,href,tcgsize2size[tmpparaloc^.size]) - else - cg.g_concatcopy(exprasmlist,htempref,href,sizeleft) - end; - LOC_REGISTER: - cg.a_load_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href); - LOC_FPUREGISTER: - cg.a_loadfpu_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.register,href); - LOC_MMREGISTER: - cg.a_loadmm_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href,mms_movescalar); - else - internalerror(200402081); + begin + reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset); + { use concatcopy, because it can also be a float which fails when + load_ref_ref is used } + if (ppn.tempcgpara.size <> OS_NO) then + cg.g_concatcopy(exprasmlist,htempref,href,tcgsize2size[tmpparaloc^.size]) + else + cg.g_concatcopy(exprasmlist,htempref,href,sizeleft) + end; + LOC_REGISTER: + cg.a_load_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href); + LOC_FPUREGISTER: + cg.a_loadfpu_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.register,href); + LOC_MMREGISTER: + cg.a_loadmm_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href,mms_movescalar); + else + internalerror(200402081); + end; end; -{$endif cputargethasfixedstack} end; end; dec(sizeleft,tcgsize2size[tmpparaloc^.size]); diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas index af3924e6a9..a484107a74 100644 --- a/compiler/ncgutil.pas +++ b/compiler/ncgutil.pas @@ -200,9 +200,8 @@ implementation LOC_REFERENCE, LOC_CREFERENCE : begin -{$ifdef cputargethasfixedstack} - location_freetemp(list,location); -{$endif cputargethasfixedstack} + if use_fixed_stack then + location_freetemp(list,location); end; else internalerror(2004110211); diff --git a/compiler/paramgr.pas b/compiler/paramgr.pas index 201d633a4f..91304ac1ac 100644 --- a/compiler/paramgr.pas +++ b/compiler/paramgr.pas @@ -251,9 +251,7 @@ implementation procedure tparamanager.freeparaloc(list: taasmoutput; const cgpara: TCGPara); var paraloc : Pcgparalocation; -{$ifdef cputargethasfixedstack} href : treference; -{$endif cputargethasfixedstack} begin paraloc:=cgpara.location; while assigned(paraloc) do @@ -282,13 +280,14 @@ implementation LOC_REFERENCE, LOC_CREFERENCE : begin -{$ifdef cputargethasfixedstack} - { don't use reference_reset_base, because that will depend on cgobj } - fillchar(href,sizeof(href),0); - href.base:=paraloc^.reference.index; - href.offset:=paraloc^.reference.offset; - tg.ungettemp(list,href); -{$endif cputargethasfixedstack} + if use_fixed_stack then + begin + { don't use reference_reset_base, because that will depend on cgobj } + fillchar(href,sizeof(href),0); + href.base:=paraloc^.reference.index; + href.offset:=paraloc^.reference.offset; + tg.ungettemp(list,href); + end; end; else internalerror(2004110212);