ソースを参照

* 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 -

Jonas Maebe 19 年 前
コミット
fad5d59bd9
5 ファイル変更49 行追加45 行削除
  1. 5 0
      compiler/cgutils.pas
  2. 2 1
      compiler/i386/cpupara.pas
  3. 32 32
      compiler/ncgcal.pas
  4. 2 3
      compiler/ncgutil.pas
  5. 8 9
      compiler/paramgr.pas

+ 5 - 0
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.
+

+ 2 - 1
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)

+ 32 - 32
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 (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 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
                               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]);

+ 2 - 3
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);

+ 8 - 9
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);