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

* MIPS: handle get_frame internally, so it sets pi_needs_stackframe flag on current procedure. This makes possible not to force pi_needs_stackframe on every procedure and thus omit saving/restoring $fp register when it is not necessary.

git-svn-id: trunk@25170 -
sergei 12 жил өмнө
parent
commit
404c3efa58

+ 1 - 0
compiler/fpcdefs.inc

@@ -217,6 +217,7 @@
   { define cpumm}
   { define cpumm}
   {$define cpurefshaveindexreg}
   {$define cpurefshaveindexreg}
   {$define fpc_compiler_has_fixup_jmps}
   {$define fpc_compiler_has_fixup_jmps}
+  {$define SUPPORT_GET_FRAME}
 {$endif mips}
 {$endif mips}
 
 
 {$ifdef jvm}
 {$ifdef jvm}

+ 2 - 2
compiler/mips/cpupi.pas

@@ -65,8 +65,8 @@ implementation
     constructor TMIPSProcInfo.create(aparent: tprocinfo);
     constructor TMIPSProcInfo.create(aparent: tprocinfo);
       begin
       begin
         inherited create(aparent);
         inherited create(aparent);
-        { if (cs_generate_stackframes in current_settings.localswitches) or
-           not (cs_opt_stackframe in current_settings.optimizerswitches) then }
+        if (cs_generate_stackframes in current_settings.localswitches) or
+           not (cs_opt_stackframe in current_settings.optimizerswitches) then
           include(flags,pi_needs_stackframe);
           include(flags,pi_needs_stackframe);
 
 
         floatregssave:=12; { f20-f31 }
         floatregssave:=12; { f20-f31 }

+ 9 - 0
compiler/mips/ncpuinln.pas

@@ -36,6 +36,7 @@ type
     procedure second_abs_real; override;
     procedure second_abs_real; override;
     procedure second_sqr_real; override;
     procedure second_sqr_real; override;
     procedure second_sqrt_real; override;
     procedure second_sqrt_real; override;
+    procedure second_get_frame; override;
   private
   private
     procedure load_fpu_location;
     procedure load_fpu_location;
   end;
   end;
@@ -133,6 +134,14 @@ begin
   end;
   end;
 end;
 end;
 
 
+
+procedure tMIPSELinlinenode.second_get_frame;
+begin
+  location_reset(location,LOC_CREGISTER,OS_ADDR);
+  location.register:=NR_FRAME_POINTER_REG;
+end;
+
+
 begin
 begin
   cInlineNode := tMIPSELinlinenode;
   cInlineNode := tMIPSELinlinenode;
 end.
 end.

+ 2 - 0
rtl/mips/mips.inc

@@ -76,6 +76,7 @@ var
   end;
   end;
 
 
 
 
+{$ifndef INTERNAL_BACKTRACE}
 {$define FPC_SYSTEM_HAS_GET_FRAME}
 {$define FPC_SYSTEM_HAS_GET_FRAME}
 function get_frame:pointer;assembler;nostackframe;
 function get_frame:pointer;assembler;nostackframe;
   asm
   asm
@@ -94,6 +95,7 @@ function get_frame:pointer;assembler;nostackframe;
     // lw $2,0($sp)
     // lw $2,0($sp)
     move $2,$30
     move $2,$30
   end;
   end;
+{$endif INTERNAL_BACKTRACE}
 
 
 
 
 { Try to find previous $fp,$ra register pair
 { Try to find previous $fp,$ra register pair