Browse Source

* fixed framepointer storage: it's now always stored at r1+12, which is
a place in the link area reserved for compiler use.

Jonas Maebe 22 years ago
parent
commit
d321a5aa3d
3 changed files with 23 additions and 7 deletions
  1. 9 1
      compiler/ncgld.pas
  2. 7 2
      compiler/powerpc/cpupi.pas
  3. 7 4
      compiler/powerpc/nppccal.pas

+ 9 - 1
compiler/ncgld.pas

@@ -205,7 +205,11 @@ implementation
                                        while (i>symtable.symtablelevel) do
                                        while (i>symtable.symtablelevel) do
                                          begin
                                          begin
                                             { make a reference }
                                             { make a reference }
+{$ifdef powerpc}
+                                            reference_reset_base(href,hregister,current_procinfo.framepointer_offset);
+{$else powerpc}
                                             reference_reset_base(href,hregister,target_info.first_parm_offset);
                                             reference_reset_base(href,hregister,target_info.first_parm_offset);
+{$endif powerpc}
                                             cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
                                             cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
                                             dec(i);
                                             dec(i);
                                          end;
                                          end;
@@ -915,7 +919,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.60  2003-05-23 14:27:35  peter
+  Revision 1.61  2003-05-24 11:47:27  jonas
+    * fixed framepointer storage: it's now always stored at r1+12, which is
+      a place in the link area reserved for compiler use.
+
+  Revision 1.60  2003/05/23 14:27:35  peter
     * remove some unit dependencies
     * remove some unit dependencies
     * current_procinfo changes to store more info
     * current_procinfo changes to store more info
 
 

+ 7 - 2
compiler/powerpc/cpupi.pas

@@ -70,7 +70,8 @@ unit cpupi;
            begin
            begin
              ofs:=align(maxpushedparasize+LinkageAreaSize,16);
              ofs:=align(maxpushedparasize+LinkageAreaSize,16);
              inc(procdef.parast.address_fixup,ofs);
              inc(procdef.parast.address_fixup,ofs);
-             inc(framepointer_offset,ofs);
+             { use space reserved for compilers in link area }
+             framepointer_offset := 12;
              // inc(selfpointer_offset,ofs);
              // inc(selfpointer_offset,ofs);
              // inc(vmtpointer_offset,ofs);
              // inc(vmtpointer_offset,ofs);
              if cs_asm_source in aktglobalswitches then
              if cs_asm_source in aktglobalswitches then
@@ -99,7 +100,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.20  2003-05-23 18:51:26  jonas
+  Revision 1.21  2003-05-24 11:47:27  jonas
+    * fixed framepointer storage: it's now always stored at r1+12, which is
+      a place in the link area reserved for compiler use.
+
+  Revision 1.20  2003/05/23 18:51:26  jonas
     * fixed support for nested procedures and more parameters than those
     * fixed support for nested procedures and more parameters than those
       which fit in registers (untested/probably not working: calling a
       which fit in registers (untested/probably not working: calling a
       nested procedure from a deeper nested procedure)
       nested procedure from a deeper nested procedure)

+ 7 - 4
compiler/powerpc/nppccal.pas

@@ -106,10 +106,9 @@ implementation
             hregister1:=rg.getregisterint(exprasmlist,OS_ADDR);
             hregister1:=rg.getregisterint(exprasmlist,OS_ADDR);
             reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
             reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset);
             cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister1);
             cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister1);
-            { !!!!!!!!!! not true anymore!!!!!!! (JM)       }
             { the previous frame pointer is always saved at }
             { the previous frame pointer is always saved at }
-            { previous_framepointer-sizeof(pointer)         }
-            reference_reset_base(href,hregister1,-POINTER_SIZE);
+            { previous_framepointer+12 (in the link area)   }
+            reference_reset_base(href,hregister1,12);
             i:=current_procdef.parast.symtablelevel-1;
             i:=current_procdef.parast.symtablelevel-1;
             while (i>tprocdef(procdefinition).parast.symtablelevel) do
             while (i>tprocdef(procdefinition).parast.symtablelevel) do
               begin
               begin
@@ -131,7 +130,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.14  2003-05-23 18:51:26  jonas
+  Revision 1.15  2003-05-24 11:47:27  jonas
+    * fixed framepointer storage: it's now always stored at r1+12, which is
+      a place in the link area reserved for compiler use.
+
+  Revision 1.14  2003/05/23 18:51:26  jonas
     * fixed support for nested procedures and more parameters than those
     * fixed support for nested procedures and more parameters than those
       which fit in registers (untested/probably not working: calling a
       which fit in registers (untested/probably not working: calling a
       nested procedure from a deeper nested procedure)
       nested procedure from a deeper nested procedure)