Browse Source

haiku: pass the stackpointer from the startup code. this adjust stacktop to be closer to the actual stacktop, and fixes shallow stacktraces

git-svn-id: trunk@40843 -
Károly Balogh 6 years ago
parent
commit
d3c0762af0
3 changed files with 11 additions and 0 deletions
  1. 2 0
      rtl/haiku/si_c.pp
  2. 2 0
      rtl/haiku/si_dllc.pp
  3. 7 0
      rtl/haiku/system.pp

+ 2 - 0
rtl/haiku/si_c.pp

@@ -21,6 +21,7 @@ implementation
 
 { Bindings to RTL }
 var
+  initialstkptr: pointer; public name '__stkptr';
   argc: longint; public name 'operatingsystem_parameter_argc';
   argv: pointer; public name 'operatingsystem_parameter_argv';
   envp: pointer; public name 'operatingsystem_parameter_envp';
@@ -43,6 +44,7 @@ procedure __exit(status: longint); cdecl; external libc name 'exit';
 
 function _FPC_proc_start(_argc: longint; _argv: pointer; _envp: pointer): longint; cdecl; public name '_start';
 begin
+  initialstkptr:=get_frame;
   argc:=_argc;
   argv:=_argv;
   envp:=_envp;

+ 2 - 0
rtl/haiku/si_dllc.pp

@@ -22,6 +22,7 @@ implementation
 
 { Bindings to RTL }
 var
+  initialstkptr: pointer; public name '__stkptr';
   argc: longint; public name 'operatingsystem_parameter_argc';
   argv: pointer; public name 'operatingsystem_parameter_argv';
   envp: pointer; public name 'operatingsystem_parameter_envp';
@@ -42,6 +43,7 @@ procedure __exit(status: longint); cdecl; external libc name 'exit';
 
 procedure _FPC_shared_lib_start; cdecl; public name 'initialize_after';
 begin
+  initialstkptr:=get_frame;
   argc:=__libc_argc;
   argv:=__libc_argv;
   envp:=environ;

+ 7 - 0
rtl/haiku/system.pp

@@ -24,6 +24,9 @@ interface
 
 implementation
 
+var
+  initialstkptr : Pointer; external name '__stkptr';
+
 procedure debugger(s : PChar); cdecl; external 'root' name 'debugger';
 function disable_debugger(state : integer): integer; cdecl; external 'root' name 'disable_debugger';
 
@@ -272,7 +275,11 @@ end;
 begin
   IsConsole := TRUE;
   StackLength := CheckInitialStkLen(InitialStkLen);
+{$if FPC_FULLVERSION >= 30301}
+  StackBottom := initialstkptr - StackLength;
+{$else}
   StackBottom := Sptr - StackLength;
+{$endif}
   ReturnNilIfGrowHeapFails := False;
 
   { Set up signals handlers }