2
0
Эх сурвалжийг харах

* cleanedup cpupara

git-svn-id: trunk@5087 -
florian 19 жил өмнө
parent
commit
293638230a
1 өөрчлөгдсөн 35 нэмэгдсэн , 20 устгасан
  1. 35 20
      compiler/arm/cpupara.pas

+ 35 - 20
compiler/arm/cpupara.pas

@@ -228,10 +228,14 @@ unit cpupara;
         for i:=0 to paras.count-1 do
           begin
             hp:=tparavarsym(paras[i]);
+            paradef:=hp.vardef;
+
+            hp.paraloc[side].reset;
+
             { currently only support C-style array of const,
               there should be no location assigned to the vararg array itself }
             if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
-               is_array_of_const(hp.vardef) then
+               is_array_of_const(paradef) then
               begin
                 paraloc:=hp.paraloc[side].add_location;
                 { hack: the paraloc must be valid, but is not actually used }
@@ -241,32 +245,43 @@ unit cpupara;
                 break;
               end;
 
-            if push_addr_param(hp.varspez,hp.vardef,p.proccalloption) then
-              paracgsize:=OS_ADDR
+            if (hp.varspez in [vs_var,vs_out]) or
+               push_addr_param(hp.varspez,paradef,p.proccalloption) or
+               is_open_array(paradef) or
+               is_array_of_const(paradef) then
+              begin
+                paradef:=voidpointertype;
+                loc:=LOC_REGISTER;
+                paracgsize := OS_ADDR;
+                paralen := tcgsize2size[OS_ADDR];
+              end
             else
               begin
-                paracgsize:=def_cgSize(hp.vardef);
-                if paracgsize=OS_NO then
-                  paracgsize:=OS_ADDR;
+                if not is_special_array(paradef) then
+                  paralen := paradef.size
+                else
+                  paralen := tcgsize2size[def_cgsize(paradef)];
+                loc := getparaloc(p.proccalloption,paradef);
+                if (paradef.deftype in [objectdef,arraydef,recorddef]) and
+                  not is_special_array(paradef) and
+                  (hp.varspez in [vs_value,vs_const]) then
+                  paracgsize := int_cgsize(paralen)
+                else
+                  begin
+                    paracgsize:=def_cgsize(paradef);
+                    { for things like formaldef }
+                    if (paracgsize=OS_NO) then
+                      begin
+                        paracgsize:=OS_ADDR;
+                        paralen := tcgsize2size[OS_ADDR];
+                      end;
+                  end
               end;
 
-             hp.paraloc[side].reset;
              hp.paraloc[side].size:=paracgsize;
              hp.paraloc[side].Alignment:=std_param_align;
-
-             if (hp.varspez in [vs_var,vs_out]) then
-               begin
-                 paradef:=voidpointertype;
-                 loc:=LOC_REGISTER;
-               end
-             else
-               begin
-                 paradef:=hp.vardef;
-                 loc:=getparaloc(p.proccalloption,paradef);
-               end;
-
-             paralen:=tcgsize2size[paracgsize];
              hp.paraloc[side].intsize:=paralen;
+
 {$ifdef EXTDEBUG}
              if paralen=0 then
                internalerror(200410311);