浏览代码

* fix structure parameter passing

git-svn-id: trunk@5083 -
florian 19 年之前
父节点
当前提交
797c8de846
共有 1 个文件被更改,包括 10 次插入14 次删除
  1. 10 14
      compiler/arm/cpupara.pas

+ 10 - 14
compiler/arm/cpupara.pas

@@ -120,12 +120,9 @@ unit cpupara;
             classrefdef:
             classrefdef:
               getparaloc:=LOC_REGISTER;
               getparaloc:=LOC_REGISTER;
             recorddef:
             recorddef:
-              getparaloc:=LOC_REFERENCE;
+              getparaloc:=LOC_REGISTER;
             objectdef:
             objectdef:
-              if is_object(p) then
-                getparaloc:=LOC_REFERENCE
-              else
-                getparaloc:=LOC_REGISTER;
+              getparaloc:=LOC_REGISTER;
             stringdef:
             stringdef:
               if is_shortstring(p) or is_longstring(p) then
               if is_shortstring(p) or is_longstring(p) then
                 getparaloc:=LOC_REFERENCE
                 getparaloc:=LOC_REFERENCE
@@ -143,7 +140,7 @@ unit cpupara;
               else
               else
                 getparaloc:=LOC_REFERENCE;
                 getparaloc:=LOC_REFERENCE;
             variantdef:
             variantdef:
-              getparaloc:=LOC_REFERENCE;
+              getparaloc:=LOC_REGISTER;
             { avoid problems with errornous definitions }
             { avoid problems with errornous definitions }
             errordef:
             errordef:
               getparaloc:=LOC_REGISTER;
               getparaloc:=LOC_REGISTER;
@@ -162,17 +159,16 @@ unit cpupara;
             exit;
             exit;
           end;
           end;
         case def.deftype of
         case def.deftype of
+          objectdef,
           variantdef,
           variantdef,
           formaldef,
           formaldef,
           recorddef:
           recorddef:
-            result:=true;
+            result:=varspez=vs_const;
           arraydef:
           arraydef:
             result:=(tarraydef(def).highrange>=tarraydef(def).lowrange) or
             result:=(tarraydef(def).highrange>=tarraydef(def).lowrange) or
                              is_open_array(def) or
                              is_open_array(def) or
                              is_array_of_const(def) or
                              is_array_of_const(def) or
                              is_array_constructor(def);
                              is_array_constructor(def);
-          objectdef :
-            result:=is_object(def);
           setdef :
           setdef :
             result:=(tsetdef(def).settype<>smallset);
             result:=(tsetdef(def).settype<>smallset);
           stringdef :
           stringdef :
@@ -278,11 +274,11 @@ unit cpupara;
              while paralen>0 do
              while paralen>0 do
                begin
                begin
                  paraloc:=hp.paraloc[side].add_location;
                  paraloc:=hp.paraloc[side].add_location;
-                 { for things like formaldef }
-                 if paracgsize=OS_NO then
-                   paraloc^.size:=OS_ADDR
-                 else if paracgsize in [OS_64,OS_S64] then
-                   paraloc^.size:=OS_32
+
+                 if (paradef.deftype <> orddef) then
+                   paracgsize := int_cgsize(paralen);
+                 if (paracgsize in [OS_NO,OS_64,OS_S64]) then
+                   paraloc^.size := OS_32
                  else if (loc=LOC_REGISTER) and (paracgsize in [OS_F32,OS_F64,OS_F80]) then
                  else if (loc=LOC_REGISTER) and (paracgsize in [OS_F32,OS_F64,OS_F80]) then
                    case paracgsize of
                    case paracgsize of
                      OS_F32:
                      OS_F32: