mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 04:26:13 +02:00
* the OpenBSD x86_64 C library startup code converted to Pascal
git-svn-id: trunk@41739 -
This commit is contained in:
parent
76623648e4
commit
d1a91a380b
@ -30,7 +30,7 @@ function atexit(proc: TCdeclProcedure): cint; cdecl; external name 'atexit';
|
|||||||
procedure monstartup(lowpc, highpc: u_long); cdecl; external name 'monstartup';
|
procedure monstartup(lowpc, highpc: u_long); cdecl; external name 'monstartup';
|
||||||
procedure _init; cdecl; external name '_init';
|
procedure _init; cdecl; external name '_init';
|
||||||
|
|
||||||
procedure _FPC_proc___start; forward;
|
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); forward;
|
||||||
|
|
||||||
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
|
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
|
||||||
asm
|
asm
|
||||||
@ -49,82 +49,37 @@ procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public
|
|||||||
procedure _FPC_proc_haltproc; forward;
|
procedure _FPC_proc_haltproc; forward;
|
||||||
function _strrchr(str: PChar; character: LongInt): PChar; forward;
|
function _strrchr(str: PChar; character: LongInt): PChar; forward;
|
||||||
|
|
||||||
procedure _FPC_proc___start; assembler; nostackframe; public name '___start';
|
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); public name '___start';
|
||||||
asm
|
var
|
||||||
pushq %rbp
|
I: SizeUInt;
|
||||||
movq %rsp, %rbp
|
begin
|
||||||
subq $64, %rsp
|
environ:=envp;
|
||||||
movl %edi, -20(%rbp) { argc }
|
operatingsystem_parameter_envp:=envp;
|
||||||
movq %rsi, -32(%rbp) { argv }
|
operatingsystem_parameter_argc:=argc;
|
||||||
movq %rdx, -40(%rbp) { environment }
|
operatingsystem_parameter_argv:=argv;
|
||||||
movq %rcx, -48(%rbp) { ??? }
|
if argv[0]<>nil then
|
||||||
movq %r8, -56(%rbp) { ??? }
|
begin
|
||||||
movq %r9, -64(%rbp) { ??? }
|
__progname:=_strrchr(argv[0], Ord('/'));
|
||||||
movq -40(%rbp), %rax
|
if __progname<>nil then
|
||||||
movq %rax, environ(%rip)
|
Inc(__progname)
|
||||||
movq %rax,operatingsystem_parameter_envp(%rip)
|
else
|
||||||
movq -32(%rbp), %rax
|
__progname:=argv[0];
|
||||||
movq (%rax), %rax
|
I:=Low(__progname_storage);
|
||||||
movq %rax, -8(%rbp)
|
while (I<High(__progname_storage)) and (__progname[I]<>#0) do
|
||||||
cmpq $0, -8(%rbp)
|
begin
|
||||||
je .L2
|
__progname_storage[I]:=__progname[I-Low(__progname_storage)];
|
||||||
movq -8(%rbp), %rdi
|
Inc(I);
|
||||||
movl $47, %esi
|
end;
|
||||||
call _strrchr
|
__progname_storage[I]:=#0;
|
||||||
movq %rax, __progname(%rip)
|
__progname:=@__progname_storage;
|
||||||
movq __progname(%rip), %rax
|
end;
|
||||||
testq %rax, %rax
|
atexit(@_mcleanup);
|
||||||
jne .L4
|
monstartup(u_long(@_eprol),u_long(@_etext));
|
||||||
movq -8(%rbp), %rax
|
_init;
|
||||||
movq %rax, __progname(%rip)
|
PascalMain;
|
||||||
jmp .L6
|
asm
|
||||||
.L4:
|
jmp _FPC_proc_haltproc
|
||||||
movq __progname(%rip), %rax
|
end;
|
||||||
addq $1, %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
.L6:
|
|
||||||
leaq __progname_storage(%rip), %rax
|
|
||||||
movq %rax, -16(%rbp)
|
|
||||||
jmp .L7
|
|
||||||
.L8:
|
|
||||||
movq __progname(%rip), %rcx
|
|
||||||
movzbl (%rcx), %edx
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
movb %dl, (%rax)
|
|
||||||
addq $1, -16(%rbp)
|
|
||||||
leaq 1(%rcx), %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
.L7:
|
|
||||||
movq __progname(%rip), %rax
|
|
||||||
movzbl (%rax), %eax
|
|
||||||
testb %al, %al
|
|
||||||
je .L9
|
|
||||||
leaq __progname_storage+255(%rip), %rax
|
|
||||||
cmpq %rax, -16(%rbp)
|
|
||||||
jb .L8
|
|
||||||
.L9:
|
|
||||||
leaq __progname_storage(%rip), %rax
|
|
||||||
movq %rax, __progname(%rip)
|
|
||||||
movq -16(%rbp), %rax
|
|
||||||
movb $0, (%rax)
|
|
||||||
.L2:
|
|
||||||
movq _mcleanup@GOTPCREL(%rip), %rdi
|
|
||||||
call atexit
|
|
||||||
movq _etext@GOTPCREL(%rip), %rsi
|
|
||||||
movq _eprol(%rip), %rdi
|
|
||||||
call monstartup@plt
|
|
||||||
movl $0, %eax
|
|
||||||
call _init
|
|
||||||
movq environ(%rip), %rdx
|
|
||||||
movq -32(%rbp), %rsi
|
|
||||||
movl -20(%rbp), %edi
|
|
||||||
movq %rdi,operatingsystem_parameter_argc(%rip)
|
|
||||||
movq %rsi,operatingsystem_parameter_argv(%rip)
|
|
||||||
movl $0, %eax
|
|
||||||
call PASCALMAIN
|
|
||||||
// movl %eax, %edi
|
|
||||||
// call exit
|
|
||||||
jmp _FPC_proc_haltproc
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
|
||||||
|
Loading…
Reference in New Issue
Block a user