瀏覽代碼

m68k-amiga: print offsets during stacktraces, instead of absolute addresses, which are not really helpful in a single address space

Karoly Balogh 2 年之前
父節點
當前提交
ecbd5840ce
共有 2 個文件被更改,包括 22 次插入0 次删除
  1. 10 0
      rtl/amicommon/sysos.inc
  2. 12 0
      rtl/amiga/system.pp

+ 10 - 0
rtl/amicommon/sysos.inc

@@ -259,3 +259,13 @@ Procedure DoThreadExitProcChain;
 Begin
 Begin
   DoThreadProcChain(threadExitProcList);
   DoThreadProcChain(threadExitProcList);
 End;
 End;
+
+{$ifdef FPC_SYSTEM_HAS_BACKTRACESTR}
+function SysBackTraceStr (Addr: CodePointer): ShortString;
+begin
+  if (addr<codestart) or (addr>codeend) then
+    SysBackTraceStr:='  Addr $'+hexstr(addr)
+  else
+    SysBackTraceStr:='  Offs $'+hexstr(pointer(addr-codestart));
+end;
+{$endif FPC_SYSTEM_HAS_BACKTRACESTR}

+ 12 - 0
rtl/amiga/system.pp

@@ -22,6 +22,7 @@ interface
 
 
 {$define FPC_IS_SYSTEM}
 {$define FPC_IS_SYSTEM}
 {$define FPC_ANSI_TEXTFILEREC}
 {$define FPC_ANSI_TEXTFILEREC}
+{$define FPC_SYSTEM_HAS_BACKTRACESTR}
 
 
 {$if defined(AMIGA_V1_0_ONLY) or defined(AMIGA_V1_2_ONLY)}
 {$if defined(AMIGA_V1_0_ONLY) or defined(AMIGA_V1_2_ONLY)}
 {$define AMIGA_LEGACY}
 {$define AMIGA_LEGACY}
@@ -147,6 +148,15 @@ implementation
 {$define FPC_SYSTEM_HAS_extractFloat32Sign}
 {$define FPC_SYSTEM_HAS_extractFloat32Sign}
 {$endif defined(cpum68k) and defined(fpusoft)}
 {$endif defined(cpum68k) and defined(fpusoft)}
 
 
+var
+  _start: byte; external name '_start';
+  { __text_size is provided by the linker }
+  __text_size: ptruint; external name '___text_size';
+
+var
+  codestart: pointer;
+  codeend: pointer;
+
 {$I system.inc}
 {$I system.inc}
 {$ifdef FPC_AMIGA_USE_OSHEAP}
 {$ifdef FPC_AMIGA_USE_OSHEAP}
 {$i osheap.inc}
 {$i osheap.inc}
@@ -351,6 +361,8 @@ begin
   IsConsole := TRUE;
   IsConsole := TRUE;
   StackLength := CheckInitialStkLen(InitialStkLen);
   StackLength := CheckInitialStkLen(InitialStkLen);
   StackBottom := StackTop - StackLength;
   StackBottom := StackTop - StackLength;
+  codestart := @_start;
+  codeend := pointer(ptruint(@_start) + ptruint(@__text_size));
 { OS specific startup }
 { OS specific startup }
   AOS_wbMsg:=nil;
   AOS_wbMsg:=nil;
   ASYS_origDir:=0;
   ASYS_origDir:=0;