Prechádzať zdrojové kódy

* fix for broken TP-style constructor handling in the compiler

Jonas Maebe 21 rokov pred
rodič
commit
563f7ba253
1 zmenil súbory, kde vykonal 42 pridanie a 20 odobranie
  1. 42 20
      compiler/powerpc/cpupara.pas

+ 42 - 20
compiler/powerpc/cpupara.pas

@@ -43,10 +43,11 @@ unit cpupara;
           function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
           function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;override;
          private
-           procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
-           function create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; firstpara: tparaitem;
-               var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
-           function parseparaloc(p : tparaitem;const s : string) : boolean;override;
+          procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
+          procedure create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
+          function create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; firstpara: tparaitem;
+              var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
+          function parseparaloc(p : tparaitem;const s : string) : boolean;override;
        end;
 
   implementation
@@ -155,6 +156,7 @@ unit cpupara;
          end;
       end;
 
+
     function tppcparamanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
       begin
         { var,out always require address }
@@ -199,24 +201,24 @@ unit cpupara;
       end;
 
 
-    function tppcparamanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
 
+    procedure tppcparamanager.create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
       var
         paraloc : tparalocation;
-        cur_stack_offset: aword;
-        curintreg, curfloatreg, curmmreg: tsuperregister;
       begin
-        init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
-
-        result := create_paraloc_info_intern(p,side,tparaitem(p.para.first),curintreg,curfloatreg,curmmreg,cur_stack_offset);
-
-        { Function return }
         fillchar(paraloc,sizeof(tparalocation),0);
-        paraloc.alignment:= std_param_align;
         paraloc.size:=def_cgsize(p.rettype.def);
-        paraloc.lochigh:=LOC_INVALID;
-        { Return in FPU register? }
-        if p.rettype.def.deftype=floatdef then
+        paraloc.Alignment:= std_param_align;
+        { Constructors return self }
+        if (p.proctypeoption=potype_constructor) then
+          begin
+            paraloc.size:=OS_ADDR;
+            paraloc.loc:=LOC_REGISTER;
+            paraloc.register:=NR_FUNCTION_RESULT_REG;
+          end
+        else
+         { Return in FPU register? }
+         if p.rettype.def.deftype=floatdef then
           begin
             paraloc.loc:=LOC_FPUREGISTER;
             paraloc.register:=NR_FPU_RESULT_REG;
@@ -229,13 +231,15 @@ unit cpupara;
 {$ifndef cpu64bit}
             if paraloc.size in [OS_64,OS_S64] then
              begin
-               paraloc.register64.reglo:=NR_FUNCTION_RETURN64_LOW_REG;
-               paraloc.register64.reghi:=NR_FUNCTION_RETURN64_HIGH_REG;
                paraloc.lochigh:=LOC_REGISTER;
+               paraloc.register64.reglo:=NR_FUNCTION_RESULT64_LOW_REG;
+               paraloc.register64.reghi:=NR_FUNCTION_RESULT64_HIGH_REG
              end
             else
 {$endif cpu64bit}
-             paraloc.register:=NR_FUNCTION_RETURN_REG;
+             begin
+               paraloc.register:=NR_FUNCTION_RESULT_REG
+             end;
           end
         else
           begin
@@ -245,6 +249,21 @@ unit cpupara;
       end;
 
 
+    function tppcparamanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
+
+      var
+        paraloc : tparalocation;
+        cur_stack_offset: aword;
+        curintreg, curfloatreg, curmmreg: tsuperregister;
+      begin
+        init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
+
+        result := create_paraloc_info_intern(p,side,tparaitem(p.para.first),curintreg,curfloatreg,curmmreg,cur_stack_offset);
+        
+        create_funcret_paraloc_info(p,side);
+      end;
+
+
 
     function tppcparamanager.create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; firstpara: tparaitem;
                var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint;
@@ -514,7 +533,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.63  2004-06-20 08:55:32  florian
+  Revision 1.64  2004-07-01 18:00:37  jonas
+    * fix for broken TP-style constructor handling in the compiler
+
+  Revision 1.63  2004/06/20 08:55:32  florian
     * logs truncated
 
   Revision 1.62  2004/05/01 22:05:02  florian