瀏覽代碼

haiku: pascal sysinit code for haiku, will be needed for x86_64, nice to have for i386

git-svn-id: trunk@40754 -
Károly Balogh 6 年之前
父節點
當前提交
efba70f82b
共有 3 個文件被更改,包括 129 次插入0 次删除
  1. 2 0
      .gitattributes
  2. 68 0
      rtl/haiku/si_c.pp
  3. 59 0
      rtl/haiku/si_dllc.pp

+ 2 - 0
.gitattributes

@@ -9411,6 +9411,8 @@ rtl/haiku/pthread.inc svneol=native#text/plain
 rtl/haiku/ptypes.inc svneol=native#text/plain
 rtl/haiku/rtldefs.inc svneol=native#text/plain
 rtl/haiku/settimeo.inc svneol=native#text/plain
+rtl/haiku/si_c.pp svneol=native#text/plain
+rtl/haiku/si_dllc.pp svneol=native#text/plain
 rtl/haiku/signal.inc svneol=native#text/plain
 rtl/haiku/suuid.inc svneol=native#text/plain
 rtl/haiku/syscall.inc svneol=native#text/plain

+ 68 - 0
rtl/haiku/si_c.pp

@@ -0,0 +1,68 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2019 by the Free Pascal development team
+
+    System Entry point for Haiku, linked-against-libc version
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+unit si_c;
+
+interface
+
+implementation
+
+{ Bindings to RTL }
+var
+  argc: longint; public name 'operatingsystem_parameter_argc';
+  argv: pointer; public name 'operatingsystem_parameter_argv';
+  envp: pointer; public name 'operatingsystem_parameter_envp';
+
+procedure PascalMain; external name 'PASCALMAIN';
+
+{ Bindings to libroot/libc }
+const
+  libc = 'root';
+
+var
+  argv_save: pointer; external name 'argv_save';
+  main_thread_id: ptruint; external name '__main_thread_id';
+
+function find_thread(name: pchar): ptruint; cdecl; external libc name 'find_thread';
+procedure _init_c_library_(argc: longint; argv: ppchar; env: ppchar); cdecl; external libc name '_init_c_library_';
+procedure _call_init_routines_; cdecl; external libc name '_call_init_routines_';
+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
+  argc:=_argc;
+  argv:=_argv;
+  envp:=_envp;
+
+  argv_save:=_argv;
+  main_thread_id:=find_thread(nil);
+
+  { This is actually only needed for BeOS R5 compatibility,
+    they're empty stubs in Haiku, according to the C code (KB) }
+  _init_c_library_(_argc,_argv,_envp);
+  _call_init_routines_;
+
+  PascalMain;
+end;
+
+procedure _FPC_proc_halt(_ExitCode: longint); cdecl; public name '_haltproc';
+begin
+  { call C exit code }
+  __exit(_ExitCode);
+end;
+
+
+end.

+ 59 - 0
rtl/haiku/si_dllc.pp

@@ -0,0 +1,59 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2019 by the Free Pascal development team
+
+    System Entry point for Haiku shared libraries,
+    linked-against-libc version
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+unit si_dllc;
+
+interface
+
+implementation
+
+{ Bindings to RTL }
+var
+  argc: longint; public name 'operatingsystem_parameter_argc';
+  argv: pointer; public name 'operatingsystem_parameter_argv';
+  envp: pointer; public name 'operatingsystem_parameter_envp';
+
+
+procedure PascalMain; external name 'PASCALMAIN';
+
+{ Bindings to libroot/libc }
+const
+  libc = 'root';
+
+var
+  __libc_argc: longint; external libc name '__libc_argc';
+  __libc_argv: pointer; external libc name '__libc_argv';
+  environ: pointer; external libc name 'environ';
+
+procedure __exit(status: longint); cdecl; external libc name 'exit';
+
+procedure _FPC_shared_lib_start; cdecl; public name 'initialize_after';
+begin
+  argc:=__libc_argc;
+  argv:=__libc_argv;
+  envp:=environ;
+
+  PascalMain;
+end;
+
+procedure _FPC_shared_lib_halt(_ExitCode: longint); cdecl; public name '_haltproc';
+begin
+  { call C exit code }
+  __exit(_ExitCode);
+end;
+
+
+end.