mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-28 00:11:49 +01:00
* win32 system unit doesn't depend anymore directly on the main program, this is necessary to be able to keep it in a dll
git-svn-id: trunk@9052 -
This commit is contained in:
parent
1536e9e65b
commit
b2b0e749bb
@ -864,15 +864,21 @@ end;
|
|||||||
|
|
||||||
{$asmmode att}
|
{$asmmode att}
|
||||||
{$ifdef FPC_HAS_VALGRINDBOOL}
|
{$ifdef FPC_HAS_VALGRINDBOOL}
|
||||||
|
{$ifndef FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
var
|
var
|
||||||
valgrind_used : boolean;external name '__fpc_valgrind';
|
valgrind_used : boolean;external name '__fpc_valgrind';
|
||||||
|
{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
{$endif FPC_HAS_VALGRINDBOOL}
|
{$endif FPC_HAS_VALGRINDBOOL}
|
||||||
|
|
||||||
procedure setup_fastmove;{$ifdef SYSTEMINLINE}inline;{$endif}
|
procedure setup_fastmove;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||||
begin
|
begin
|
||||||
{$ifdef FPC_HAS_VALGRINDBOOL}
|
{$ifdef FPC_HAS_VALGRINDBOOL}
|
||||||
{ workaround valgrind bug }
|
{ workaround valgrind bug }
|
||||||
|
{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
if EntryInformation.valgrind_used then
|
||||||
|
{$else FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
if valgrind_used then
|
if valgrind_used then
|
||||||
|
{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
begin
|
begin
|
||||||
fastmoveproc_forward:=@Forwards_Valgrind;
|
fastmoveproc_forward:=@Forwards_Valgrind;
|
||||||
fastmoveproc_backward:=@Backwards_Valgrind;
|
fastmoveproc_backward:=@Backwards_Valgrind;
|
||||||
|
|||||||
@ -700,14 +700,19 @@ type
|
|||||||
InitProc,
|
InitProc,
|
||||||
FinalProc : TProcedure;
|
FinalProc : TProcedure;
|
||||||
end;
|
end;
|
||||||
TInitFinalTable=record
|
TInitFinalTable = record
|
||||||
TableCount,
|
TableCount,
|
||||||
InitCount : longint;
|
InitCount : longint;
|
||||||
Procs : array[1..maxunits] of TInitFinalRec;
|
Procs : array[1..maxunits] of TInitFinalRec;
|
||||||
end;
|
end;
|
||||||
|
PInitFinalTable = ^TInitFinalTable;
|
||||||
|
|
||||||
|
|
||||||
|
{$ifndef FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
var
|
var
|
||||||
InitFinalTable : TInitFinalTable;external name 'INITFINAL';
|
InitFinalTable : TInitFinalTable;external name 'INITFINAL';
|
||||||
|
{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
|
||||||
|
|
||||||
procedure fpc_InitializeUnits;[public,alias:'FPC_INITIALIZEUNITS']; compilerproc;
|
procedure fpc_InitializeUnits;[public,alias:'FPC_INITIALIZEUNITS']; compilerproc;
|
||||||
var
|
var
|
||||||
@ -715,7 +720,9 @@ var
|
|||||||
begin
|
begin
|
||||||
{ call cpu/fpu initialisation routine }
|
{ call cpu/fpu initialisation routine }
|
||||||
fpc_cpuinit;
|
fpc_cpuinit;
|
||||||
with InitFinalTable do
|
with {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PInitFinalTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
InitFinalTable
|
||||||
|
{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION} do
|
||||||
begin
|
begin
|
||||||
for i:=1 to TableCount do
|
for i:=1 to TableCount do
|
||||||
begin
|
begin
|
||||||
@ -731,7 +738,9 @@ end;
|
|||||||
|
|
||||||
procedure FinalizeUnits;[public,alias:'FPC_FINALIZEUNITS'];
|
procedure FinalizeUnits;[public,alias:'FPC_FINALIZEUNITS'];
|
||||||
begin
|
begin
|
||||||
with InitFinalTable do
|
with {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PInitFinalTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
InitFinalTable
|
||||||
|
{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION} do
|
||||||
begin
|
begin
|
||||||
while (InitCount>0) do
|
while (InitCount>0) do
|
||||||
begin
|
begin
|
||||||
|
|||||||
@ -293,6 +293,15 @@ Type
|
|||||||
{ platform dependent types }
|
{ platform dependent types }
|
||||||
{$i sysosh.inc}
|
{$i sysosh.inc}
|
||||||
|
|
||||||
|
type
|
||||||
|
TEntryInformation = record
|
||||||
|
InitFinalTable : Pointer;
|
||||||
|
ThreadvarTablesTable : Pointer;
|
||||||
|
asm_exit : Procedure;stdcall;
|
||||||
|
PascalMain : Procedure;stdcall;
|
||||||
|
valgrind_used : boolean;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
const
|
const
|
||||||
{ Maximum value of the biggest signed and unsigned integer type available}
|
{ Maximum value of the biggest signed and unsigned integer type available}
|
||||||
|
|||||||
@ -31,9 +31,12 @@ type
|
|||||||
count : dword;
|
count : dword;
|
||||||
tables : packed array [1..32767] of pltvInitEntry;
|
tables : packed array [1..32767] of pltvInitEntry;
|
||||||
end;
|
end;
|
||||||
|
PltvInitTablesTable = ^TltvInitTablesTable;
|
||||||
|
|
||||||
|
{$ifndef FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
var
|
var
|
||||||
ThreadvarTablesTable : TltvInitTablesTable; external name 'FPC_THREADVARTABLES';
|
ThreadvarTablesTable : TltvInitTablesTable; external name 'FPC_THREADVARTABLES';
|
||||||
|
{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
|
||||||
procedure init_unit_threadvars (tableEntry : pltvInitEntry);
|
procedure init_unit_threadvars (tableEntry : pltvInitEntry);
|
||||||
begin
|
begin
|
||||||
@ -50,10 +53,14 @@ var
|
|||||||
i : integer;
|
i : integer;
|
||||||
begin
|
begin
|
||||||
{$ifdef DEBUG_MT}
|
{$ifdef DEBUG_MT}
|
||||||
WriteLn ('init_all_unit_threadvars (',ThreadvarTablesTable.count,') units');
|
WriteLn ('init_all_unit_threadvars (',
|
||||||
|
{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.count,') units');
|
||||||
{$endif}
|
{$endif}
|
||||||
for i := 1 to ThreadvarTablesTable.count do
|
for i := 1 to {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
init_unit_threadvars (ThreadvarTablesTable.tables[i]);
|
ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.count do
|
||||||
|
init_unit_threadvars ({$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.tables[i]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -77,10 +84,13 @@ var
|
|||||||
i : integer;
|
i : integer;
|
||||||
begin
|
begin
|
||||||
{$ifdef DEBUG_MT}
|
{$ifdef DEBUG_MT}
|
||||||
WriteLn ('copy_all_unit_threadvars (',ThreadvarTablesTable.count,') units');
|
WriteLn ('copy_all_unit_threadvars (',{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.count,') units');
|
||||||
{$endif}
|
{$endif}
|
||||||
for i := 1 to ThreadvarTablesTable.count do
|
for i := 1 to {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
copy_unit_threadvars (ThreadvarTablesTable.tables[i]);
|
ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.count do
|
||||||
|
copy_unit_threadvars ({$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.tables[i]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure InitThreadVars(RelocProc : Pointer);
|
procedure InitThreadVars(RelocProc : Pointer);
|
||||||
|
|||||||
@ -21,6 +21,11 @@ unit sysinitcyg;
|
|||||||
|
|
||||||
var
|
var
|
||||||
SysInstance : Longint;external name '_FPC_SysInstance';
|
SysInstance : Longint;external name '_FPC_SysInstance';
|
||||||
|
EntryInformation : TEntryInformation;
|
||||||
|
|
||||||
|
InitFinalTable : record end; external name 'INITFINAL';
|
||||||
|
ThreadvarTablesTable : record end; external name 'FPC_THREADVARTABLES';
|
||||||
|
valgrind_used : boolean;external name '__fpc_valgrind';
|
||||||
|
|
||||||
procedure EXE_Entry; external name '_FPC_EXE_Entry';
|
procedure EXE_Entry; external name '_FPC_EXE_Entry';
|
||||||
function DLL_Entry : longbool; external name '_FPC_DLL_Entry';
|
function DLL_Entry : longbool; external name '_FPC_DLL_Entry';
|
||||||
@ -34,6 +39,24 @@ unit sysinitcyg;
|
|||||||
function GetStdHandle(nStdHandle:DWORD) : THandle; stdcall; external 'kernel32' name 'GetStdHandle';
|
function GetStdHandle(nStdHandle:DWORD) : THandle; stdcall; external 'kernel32' name 'GetStdHandle';
|
||||||
function GetConsoleMode(hConsoleHandle: THandle; var lpMode: DWORD): Boolean; stdcall; external 'kernel32' name 'GetConsoleMode';
|
function GetConsoleMode(hConsoleHandle: THandle; var lpMode: DWORD): Boolean; stdcall; external 'kernel32' name 'GetConsoleMode';
|
||||||
|
|
||||||
|
procedure EXE_Entry(const info : TEntryInformation); external name '_FPC_EXE_Entry';
|
||||||
|
function DLL_entry(const info : TEntryInformation) : longbool; external name '_FPC_DLL_Entry';
|
||||||
|
procedure PascalMain;stdcall;external name 'PASCALMAIN';
|
||||||
|
|
||||||
|
procedure asm_exit;stdcall;public name 'asm_exit';
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SetupEntryInformation;
|
||||||
|
begin
|
||||||
|
EntryInformation.InitFinalTable:=@InitFinalTable;
|
||||||
|
EntryInformation.ThreadvarTablesTable:=@ThreadvarTablesTable;
|
||||||
|
EntryInformation.asm_exit:=@asm_exit;
|
||||||
|
EntryInformation.PascalMain:=@PascalMain;
|
||||||
|
EntryInformation.valgrind_used:=valgrind_used;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure CMainEXE;cdecl;
|
procedure CMainEXE;cdecl;
|
||||||
begin
|
begin
|
||||||
asm
|
asm
|
||||||
@ -41,7 +64,8 @@ unit sysinitcyg;
|
|||||||
andl $0xfffffff0,%esp
|
andl $0xfffffff0,%esp
|
||||||
end;
|
end;
|
||||||
__main;
|
__main;
|
||||||
EXE_Entry;
|
SetupEntryInformation;
|
||||||
|
EXE_Entry(EntryInformation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -52,7 +76,8 @@ unit sysinitcyg;
|
|||||||
andl $0xfffffff0,%esp
|
andl $0xfffffff0,%esp
|
||||||
end;
|
end;
|
||||||
__main;
|
__main;
|
||||||
DLL_Entry;
|
SetupEntryInformation;
|
||||||
|
DLL_Entry(EntryInformation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -109,8 +134,4 @@ unit sysinitcyg;
|
|||||||
Cygwin_crt0(@CMainDLL);
|
Cygwin_crt0(@CMainDLL);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure asm_exit;stdcall;public name 'asm_exit';
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
@ -30,6 +30,11 @@ unit sysinitgprof;
|
|||||||
|
|
||||||
var
|
var
|
||||||
SysInstance : Longint;external name '_FPC_SysInstance';
|
SysInstance : Longint;external name '_FPC_SysInstance';
|
||||||
|
EntryInformation : TEntryInformation;
|
||||||
|
|
||||||
|
InitFinalTable : record end; external name 'INITFINAL';
|
||||||
|
ThreadvarTablesTable : record end; external name 'FPC_THREADVARTABLES';
|
||||||
|
valgrind_used : boolean;external name '__fpc_valgrind';
|
||||||
stext : record end;external name '__text_start__';
|
stext : record end;external name '__text_start__';
|
||||||
etext : record end;external name 'etext';
|
etext : record end;external name 'etext';
|
||||||
|
|
||||||
@ -51,6 +56,26 @@ unit sysinitgprof;
|
|||||||
function GetStdHandle(nStdHandle:DWORD) : THandle; stdcall; external 'kernel32' name 'GetStdHandle';
|
function GetStdHandle(nStdHandle:DWORD) : THandle; stdcall; external 'kernel32' name 'GetStdHandle';
|
||||||
function GetConsoleMode(hConsoleHandle: THandle; var lpMode: DWORD): Boolean; stdcall; external 'kernel32' name 'GetConsoleMode';
|
function GetConsoleMode(hConsoleHandle: THandle; var lpMode: DWORD): Boolean; stdcall; external 'kernel32' name 'GetConsoleMode';
|
||||||
|
|
||||||
|
procedure EXE_Entry(const info : TEntryInformation); external name '_FPC_EXE_Entry';
|
||||||
|
function DLL_entry(const info : TEntryInformation) : longbool; external name '_FPC_DLL_Entry';
|
||||||
|
procedure PascalMain;stdcall;external name 'PASCALMAIN';
|
||||||
|
|
||||||
|
procedure asm_exit;stdcall;public name 'asm_exit';
|
||||||
|
begin
|
||||||
|
_mcleanup;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure SetupEntryInformation;
|
||||||
|
begin
|
||||||
|
EntryInformation.InitFinalTable:=@InitFinalTable;
|
||||||
|
EntryInformation.ThreadvarTablesTable:=@ThreadvarTablesTable;
|
||||||
|
EntryInformation.asm_exit:=@asm_exit;
|
||||||
|
EntryInformation.PascalMain:=@PascalMain;
|
||||||
|
EntryInformation.valgrind_used:=valgrind_used;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure EXEgmon_start;
|
procedure EXEgmon_start;
|
||||||
begin
|
begin
|
||||||
if monstarted=0 then
|
if monstarted=0 then
|
||||||
@ -79,7 +104,8 @@ unit sysinitgprof;
|
|||||||
end;
|
end;
|
||||||
EXEgmon_start;
|
EXEgmon_start;
|
||||||
__main;
|
__main;
|
||||||
EXE_Entry;
|
SetupEntryInformation;
|
||||||
|
EXE_Entry(EntryInformation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -91,7 +117,8 @@ unit sysinitgprof;
|
|||||||
end;
|
end;
|
||||||
DLLgmon_start;
|
DLLgmon_start;
|
||||||
__main;
|
__main;
|
||||||
DLL_Entry;
|
SetupEntryInformation;
|
||||||
|
DLL_Entry(EntryInformation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -148,11 +175,4 @@ unit sysinitgprof;
|
|||||||
Cygwin_crt0(@CMainDLL);
|
Cygwin_crt0(@CMainDLL);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure asm_exit;stdcall;public name 'asm_exit';
|
|
||||||
begin
|
|
||||||
_mcleanup;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|||||||
@ -21,9 +21,28 @@ unit sysinitpas;
|
|||||||
|
|
||||||
var
|
var
|
||||||
SysInstance : Longint;external name '_FPC_SysInstance';
|
SysInstance : Longint;external name '_FPC_SysInstance';
|
||||||
|
EntryInformation : TEntryInformation;
|
||||||
|
|
||||||
procedure EXE_Entry; external name '_FPC_EXE_Entry';
|
InitFinalTable : record end; external name 'INITFINAL';
|
||||||
function DLL_entry : longbool; external name '_FPC_DLL_Entry';
|
ThreadvarTablesTable : record end; external name 'FPC_THREADVARTABLES';
|
||||||
|
valgrind_used : boolean;external name '__fpc_valgrind';
|
||||||
|
|
||||||
|
procedure asm_exit;stdcall;public name 'asm_exit';
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure EXE_Entry(const info : TEntryInformation); external name '_FPC_EXE_Entry';
|
||||||
|
function DLL_entry(const info : TEntryInformation) : longbool; external name '_FPC_DLL_Entry';
|
||||||
|
procedure PascalMain;stdcall;external name 'PASCALMAIN';
|
||||||
|
|
||||||
|
procedure SetupEntryInformation;
|
||||||
|
begin
|
||||||
|
EntryInformation.InitFinalTable:=@InitFinalTable;
|
||||||
|
EntryInformation.ThreadvarTablesTable:=@ThreadvarTablesTable;
|
||||||
|
EntryInformation.asm_exit:=@asm_exit;
|
||||||
|
EntryInformation.PascalMain:=@PascalMain;
|
||||||
|
EntryInformation.valgrind_used:=valgrind_used;
|
||||||
|
end;
|
||||||
|
|
||||||
const
|
const
|
||||||
STD_INPUT_HANDLE = dword(-10);
|
STD_INPUT_HANDLE = dword(-10);
|
||||||
@ -36,14 +55,16 @@ unit sysinitpas;
|
|||||||
IsConsole:=true;
|
IsConsole:=true;
|
||||||
{ do it like it is necessary for the startup code linking against cygwin }
|
{ do it like it is necessary for the startup code linking against cygwin }
|
||||||
GetConsoleMode(GetStdHandle((Std_Input_Handle)),StartupConsoleMode);
|
GetConsoleMode(GetStdHandle((Std_Input_Handle)),StartupConsoleMode);
|
||||||
Exe_entry;
|
SetupEntryInformation;
|
||||||
|
Exe_entry(EntryInformation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure _FPC_WinMainCRTStartup;stdcall;public name '_WinMainCRTStartup';
|
procedure _FPC_WinMainCRTStartup;stdcall;public name '_WinMainCRTStartup';
|
||||||
begin
|
begin
|
||||||
IsConsole:=false;
|
IsConsole:=false;
|
||||||
Exe_entry;
|
SetupEntryInformation;
|
||||||
|
Exe_entry(EntryInformation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -53,7 +74,8 @@ unit sysinitpas;
|
|||||||
sysinstance:=_hinstance;
|
sysinstance:=_hinstance;
|
||||||
dllreason:=_dllreason;
|
dllreason:=_dllreason;
|
||||||
dllparam:=_dllparam;
|
dllparam:=_dllparam;
|
||||||
DLL_Entry;
|
SetupEntryInformation;
|
||||||
|
DLL_Entry(EntryInformation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -63,11 +85,8 @@ unit sysinitpas;
|
|||||||
sysinstance:=_hinstance;
|
sysinstance:=_hinstance;
|
||||||
dllreason:=_dllreason;
|
dllreason:=_dllreason;
|
||||||
dllparam:=_dllparam;
|
dllparam:=_dllparam;
|
||||||
DLL_Entry;
|
SetupEntryInformation;
|
||||||
|
DLL_Entry(EntryInformation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure asm_exit;stdcall;public name 'asm_exit';
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
@ -20,6 +20,8 @@ interface
|
|||||||
{$define SYSTEMEXCEPTIONDEBUG}
|
{$define SYSTEMEXCEPTIONDEBUG}
|
||||||
{$endif SYSTEMDEBUG}
|
{$endif SYSTEMDEBUG}
|
||||||
|
|
||||||
|
{$define FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
|
||||||
{$ifdef cpui386}
|
{$ifdef cpui386}
|
||||||
{$define Set_i386_Exception_handler}
|
{$define Set_i386_Exception_handler}
|
||||||
{$endif cpui386}
|
{$endif cpui386}
|
||||||
@ -111,6 +113,7 @@ const
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
var
|
var
|
||||||
|
EntryInformation : TEntryInformation;
|
||||||
SysInstance : Longint;public name '_FPC_SysInstance';
|
SysInstance : Longint;public name '_FPC_SysInstance';
|
||||||
|
|
||||||
{$ifdef CPUI386}
|
{$ifdef CPUI386}
|
||||||
@ -311,7 +314,9 @@ end;
|
|||||||
|
|
||||||
procedure install_exception_handlers;forward;
|
procedure install_exception_handlers;forward;
|
||||||
procedure remove_exception_handlers;forward;
|
procedure remove_exception_handlers;forward;
|
||||||
|
{$ifndef FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
procedure PascalMain;stdcall;external name 'PASCALMAIN';
|
procedure PascalMain;stdcall;external name 'PASCALMAIN';
|
||||||
|
{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
procedure fpc_do_exit;stdcall;external name 'FPC_DO_EXIT';
|
procedure fpc_do_exit;stdcall;external name 'FPC_DO_EXIT';
|
||||||
Procedure ExitDLL(Exitcode : longint); forward;
|
Procedure ExitDLL(Exitcode : longint); forward;
|
||||||
procedure asm_exit;stdcall;external name 'asm_exit';
|
procedure asm_exit;stdcall;external name 'asm_exit';
|
||||||
@ -338,7 +343,11 @@ begin
|
|||||||
{ in 2.0 asm_exit does an exitprocess }
|
{ in 2.0 asm_exit does an exitprocess }
|
||||||
{$ifndef ver2_0}
|
{$ifndef ver2_0}
|
||||||
{ do cleanup required by the startup code }
|
{ do cleanup required by the startup code }
|
||||||
|
{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
EntryInformation.asm_exit();
|
||||||
|
{$else FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
asm_exit;
|
asm_exit;
|
||||||
|
{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
{$endif ver2_0}
|
{$endif ver2_0}
|
||||||
|
|
||||||
{ call exitprocess, with cleanup as required }
|
{ call exitprocess, with cleanup as required }
|
||||||
@ -350,10 +359,11 @@ var
|
|||||||
to check if the call stack can be written on exceptions }
|
to check if the call stack can be written on exceptions }
|
||||||
_SS : Cardinal;
|
_SS : Cardinal;
|
||||||
|
|
||||||
procedure Exe_entry;[public,alias:'_FPC_EXE_Entry'];
|
procedure Exe_entry(const info : TEntryInformation);[public,alias:'_FPC_EXE_Entry'];
|
||||||
var
|
var
|
||||||
ST : pointer;
|
ST : pointer;
|
||||||
begin
|
begin
|
||||||
|
EntryInformation:=info;
|
||||||
IsLibrary:=false;
|
IsLibrary:=false;
|
||||||
{ install the handlers for exe only ?
|
{ install the handlers for exe only ?
|
||||||
or should we install them for DLL also ? (PM) }
|
or should we install them for DLL also ? (PM) }
|
||||||
@ -380,7 +390,13 @@ procedure Exe_entry;[public,alias:'_FPC_EXE_Entry'];
|
|||||||
movw %ss,%ax
|
movw %ss,%ax
|
||||||
movl %eax,_SS
|
movl %eax,_SS
|
||||||
xorl %ebp,%ebp
|
xorl %ebp,%ebp
|
||||||
call PASCALMAIN
|
end;
|
||||||
|
{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
EntryInformation.PascalMain();
|
||||||
|
{$else FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
PascalMain;
|
||||||
|
{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
asm
|
||||||
popl %ebp
|
popl %ebp
|
||||||
end;
|
end;
|
||||||
{ if we pass here there was no error ! }
|
{ if we pass here there was no error ! }
|
||||||
@ -399,11 +415,11 @@ Var
|
|||||||
Const
|
Const
|
||||||
DLLExitOK : boolean = true;
|
DLLExitOK : boolean = true;
|
||||||
|
|
||||||
function Dll_entry : longbool; [public,alias:'_FPC_DLL_Entry'];
|
function Dll_entry(const info : TEntryInformation) : longbool; [public,alias:'_FPC_DLL_Entry'];
|
||||||
var
|
var
|
||||||
res : longbool;
|
res : longbool;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
EntryInformation:=info;
|
||||||
IsLibrary:=true;
|
IsLibrary:=true;
|
||||||
Dll_entry:=false;
|
Dll_entry:=false;
|
||||||
case DLLreason of
|
case DLLreason of
|
||||||
@ -417,7 +433,11 @@ var
|
|||||||
if not res then
|
if not res then
|
||||||
exit(false);
|
exit(false);
|
||||||
end;
|
end;
|
||||||
PASCALMAIN;
|
{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
EntryInformation.PascalMain();
|
||||||
|
{$else FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
|
PascalMain;
|
||||||
|
{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
|
||||||
Dll_entry:=true;
|
Dll_entry:=true;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user