Browse Source

rtl/m68k/setjump.inc:
* implement "fpc_setjmp" and "fpc_longjmp"
rtl/m68k/m68k.inc:
* add "nostackframe" to "get_frame" and "sptr"
+ add "get_pc_addr"
=> allows stack traces to be displayed correctly

git-svn-id: trunk@22899 -

svenbarth 12 years ago
parent
commit
4d1e42e891
2 changed files with 36 additions and 6 deletions
  1. 10 3
      rtl/m68k/m68k.inc
  2. 26 3
      rtl/m68k/setjump.inc

+ 10 - 3
rtl/m68k/m68k.inc

@@ -34,7 +34,7 @@ procedure fpc_cpuinit;
   end;
   end;
 
 
 {$define FPC_SYSTEM_HAS_GET_FRAME}
 {$define FPC_SYSTEM_HAS_GET_FRAME}
-function get_frame : pointer; assembler;
+function get_frame : pointer; assembler;nostackframe;
   asm
   asm
     move.l a6,d0
     move.l a6,d0
   end;
   end;
@@ -69,10 +69,17 @@ function get_caller_frame(framebp : pointer;addr:pointer=nil) : pointer;
 
 
 
 
 {$define FPC_SYSTEM_HAS_SPTR}
 {$define FPC_SYSTEM_HAS_SPTR}
-function Sptr : pointer; assembler;
+function Sptr : pointer; assembler;nostackframe;
 asm
 asm
   move.l sp,d0
   move.l sp,d0
-end ['d0'];
+end;
+
+{$define FPC_SYSTEM_HAS_GET_PC_ADDR}
+function get_pc_addr : pointer;assembler;nostackframe;
+asm
+  move.l (sp),d0
+end;
+
 
 
 
 
 {$define FPC_SYSTEM_HAS_FILLCHAR}
 {$define FPC_SYSTEM_HAS_FILLCHAR}

+ 26 - 3
rtl/m68k/setjump.inc

@@ -16,11 +16,34 @@
            Set_Jmp/Long_jmp
            Set_Jmp/Long_jmp
  **********************************************************************}
  **********************************************************************}
 
 
-Function fpc_SetJmp (Var S : Jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];compilerproc;
+Function fpc_SetJmp (Var S : Jmp_buf) : longint;assembler;nostackframe;[Public, alias : 'FPC_SETJMP'];compilerproc;
 asm
 asm
-  moveq.l #0, d0
+  // load S to a0
+  move.l 4(sp), a0
+  // save return address (PC)
+  move.l (sp), d0
+  move.l d0, 8(a0)
+  // save FP
+  move.l a6, (a0)
+  // save SP
+  move.l sp, d0
+  addq.l #8, d0
+  move.l d0, 4(a0)
+  // return 0
+  clr.l d0
 end;
 end;
 
 
-Procedure fpc_longJmp (Var S : Jmp_buf; value : longint); assembler;[Public, alias : 'FPC_LONGJMP'];compilerproc;
+Procedure fpc_longJmp (Var S : Jmp_buf; value : longint); assembler;nostackframe;[Public, alias : 'FPC_LONGJMP'];compilerproc;
 asm
 asm
+  // load S to a0
+  move.l 4(sp),a0
+  // load value to d0
+  move.l 8(sp),d0
+  // restore FP
+  move.l (a0), a6
+  // restore SP
+  move.l 4(a0), sp
+  // jump to PC
+  move.l 8(a0),a0
+  jmp (a0)
 end;
 end;