sysinitgprof.pp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2006 by Florian Klaempfl and Pavel Ozerski
  4. member of the Free Pascal development team.
  5. Win32 cygwin profiler startup code
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit sysinitgprof;
  13. interface
  14. implementation
  15. {$linklib gmon}
  16. {$linklib gcc}
  17. {$linklib cygwin}
  18. {$linklib user32}
  19. {$linklib kernel32}
  20. const
  21. monstarted : dword = 0;
  22. var
  23. SysInstance : Longint;external name '_FPC_SysInstance';
  24. EntryInformation : TEntryInformation;
  25. InitFinalTable : record end; external name 'INITFINAL';
  26. ThreadvarTablesTable : record end; external name 'FPC_THREADVARTABLES';
  27. valgrind_used : boolean;external name '__fpc_valgrind';
  28. stext : record end;external name '__text_start__';
  29. etext : record end;external name 'etext';
  30. procedure EXE_Entry; external name '_FPC_EXE_Entry';
  31. function DLL_Entry : longbool; external name '_FPC_DLL_Entry';
  32. procedure Cygwin_crt0(p : pointer);cdecl;external name 'cygwin_crt0';
  33. procedure __main;cdecl;external name '__main';
  34. procedure _mcleanup;cdecl;external name '_mcleanup';
  35. procedure monstartup(main,etext : pointer);cdecl;external name 'monstartup';
  36. procedure CMainEXE;cdecl;forward;
  37. procedure CMainDLL;cdecl;forward;
  38. const
  39. STD_INPUT_HANDLE = dword(-10);
  40. function GetStdHandle(nStdHandle:DWORD) : THandle; stdcall; external 'kernel32' name 'GetStdHandle';
  41. function GetConsoleMode(hConsoleHandle: THandle; var lpMode: DWORD): Boolean; stdcall; external 'kernel32' name 'GetConsoleMode';
  42. procedure EXE_Entry(const info : TEntryInformation); external name '_FPC_EXE_Entry';
  43. function DLL_entry(const info : TEntryInformation) : longbool; external name '_FPC_DLL_Entry';
  44. procedure PascalMain;stdcall;external name 'PASCALMAIN';
  45. procedure asm_exit;stdcall;public name 'asm_exit';
  46. begin
  47. _mcleanup;
  48. end;
  49. procedure SetupEntryInformation;
  50. begin
  51. EntryInformation.InitFinalTable:=@InitFinalTable;
  52. EntryInformation.ThreadvarTablesTable:=@ThreadvarTablesTable;
  53. EntryInformation.asm_exit:=@asm_exit;
  54. EntryInformation.PascalMain:=@PascalMain;
  55. EntryInformation.valgrind_used:=valgrind_used;
  56. end;
  57. procedure EXEgmon_start;
  58. begin
  59. if monstarted=0 then
  60. begin
  61. inc(monstarted);
  62. monstartup(@stext,@etext);
  63. end;
  64. end;
  65. procedure DLLgmon_start;
  66. begin
  67. if monstarted=0 then
  68. begin
  69. inc(monstarted);
  70. monstartup(@stext,@etext);
  71. end;
  72. end;
  73. procedure CMainEXE;cdecl;
  74. begin
  75. asm
  76. subl $0x8,%esp
  77. andl $0xfffffff0,%esp
  78. end;
  79. EXEgmon_start;
  80. __main;
  81. SetupEntryInformation;
  82. EXE_Entry(EntryInformation);
  83. end;
  84. procedure CMainDLL;cdecl;
  85. begin
  86. asm
  87. subl $0x8,%esp
  88. andl $0xfffffff0,%esp
  89. end;
  90. DLLgmon_start;
  91. __main;
  92. SetupEntryInformation;
  93. DLL_Entry(EntryInformation);
  94. end;
  95. procedure _FPC_mainCRTStartup;stdcall;public name '_mainCRTStartup';
  96. begin
  97. IsConsole:=true;
  98. asm
  99. subl $0x8,%esp
  100. andl $0xfffffff0,%esp
  101. end;
  102. { it seems cygwin messed around with the console mode so we've to
  103. store the startup console mode before cygwin can do anything (FK)
  104. }
  105. GetConsoleMode(GetStdHandle((Std_Input_Handle)),StartupConsoleMode);
  106. Cygwin_crt0(@CMainEXE);
  107. end;
  108. procedure _FPC_WinMainCRTStartup;stdcall;public name '_WinMainCRTStartup';
  109. begin
  110. IsConsole:=false;
  111. asm
  112. subl $0x8,%esp
  113. andl $0xfffffff0,%esp
  114. end;
  115. Cygwin_crt0(@CMainEXE);
  116. end;
  117. procedure _FPC_DLLMainCRTStartup(_hinstance,_dllreason,_dllparam:longint);stdcall;public name '_DLLMainCRTStartup';
  118. begin
  119. IsConsole:=true;
  120. sysinstance:=_hinstance;
  121. dllreason:=_dllreason;
  122. dllparam:=_dllparam;
  123. asm
  124. subl $0x8,%esp
  125. andl $0xfffffff0,%esp
  126. end;
  127. Cygwin_crt0(@CMainDLL);
  128. end;
  129. procedure _FPC_DLLWinMainCRTStartup(_hinstance,_dllreason,_dllparam:longint);stdcall;public name '_DLLWinMainCRTStartup';
  130. begin
  131. IsConsole:=false;
  132. sysinstance:=_hinstance;
  133. dllreason:=_dllreason;
  134. dllparam:=_dllparam;
  135. asm
  136. subl $0x8,%esp
  137. andl $0xfffffff0,%esp
  138. end;
  139. Cygwin_crt0(@CMainDLL);
  140. end;
  141. end.