* converted _FPC_proc___start in OpenBSD's si_dll.inc to pascal

git-svn-id: trunk@41750 -
This commit is contained in:
nickysn 2019-03-20 14:55:35 +00:00
parent a0c433b171
commit aad032f133

View File

@ -18,7 +18,7 @@
procedure _init; external name '_init'; procedure _init; 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
@ -37,98 +37,35 @@ 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; procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord);
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 environ@GOTPCREL(%rip), %rdx if __progname<>nil then
movq -40(%rbp), %rax Inc(__progname)
movq %rax, (%rdx) else
movq operatingsystem_parameter_envp@GOTPCREL(%rip), %rdx __progname:=argv[0];
movq -40(%rbp), %rax I:=Low(__progname_storage);
movq %rax, (%rdx) while (I<High(__progname_storage)) and (__progname[I]<>#0) do
begin
movl -20(%rbp), %eax __progname_storage[I]:=__progname[I-Low(__progname_storage)];
movslq %eax,%rdx Inc(I);
movq operatingsystem_parameter_argc@GOTPCREL(%rip), %rax end;
movq %rdx, (%rax) __progname_storage[I]:=#0;
movq operatingsystem_parameter_argv@GOTPCREL(%rip), %rdx __progname:=@__progname_storage;
movq -32(%rbp), %rax end;
movq %rax, (%rdx) _init;
movq -32(%rbp), %rax PascalMain;
movq (%rax), %rax asm
movq %rax, -8(%rbp) jmp _FPC_proc_haltproc@PLT
cmpq $0, -8(%rbp) end;
je .L2
movq -8(%rbp), %rdi
movl $47, %esi
call _strrchr
movq %rax, %rdx
movq __progname@GOTPCREL(%rip), %rax
movq %rdx, (%rax)
movq __progname@GOTPCREL(%rip), %rax
movq (%rax), %rax
testq %rax, %rax
jne .L4
movq __progname@GOTPCREL(%rip), %rdx
movq -8(%rbp), %rax
movq %rax, (%rdx)
jmp .L6
.L4:
movq __progname@GOTPCREL(%rip), %rax
movq (%rax), %rax
leaq 1(%rax), %rdx
movq __progname@GOTPCREL(%rip), %rax
movq %rdx, (%rax)
.L6:
movq __progname_storage@GOTPCREL(%rip), %rax
movq %rax, -16(%rbp)
jmp .L7
.L8:
movq __progname@GOTPCREL(%rip), %rax
movq (%rax), %rcx
movzbl (%rcx), %edx
movq -16(%rbp), %rax
movb %dl, (%rax)
addq $1, -16(%rbp)
leaq 1(%rcx), %rdx
movq __progname@GOTPCREL(%rip), %rax
movq %rdx, (%rax)
.L7:
movq __progname@GOTPCREL(%rip), %rax
movq (%rax), %rax
movzbl (%rax), %eax
testb %al, %al
je .L9
movq __progname_storage@GOTPCREL(%rip), %rax
leaq 255(%rax), %rax
cmpq %rax, -16(%rbp)
jb .L8
.L9:
movq -16(%rbp), %rax
movb $0, (%rax)
movq __progname@GOTPCREL(%rip), %rdx
movq __progname_storage@GOTPCREL(%rip), %rax
movq %rax, (%rdx)
.L2:
movl $0, %eax
call _init@PLT
movq environ@GOTPCREL(%rip), %rax
movq (%rax), %rdx
movq -32(%rbp), %rsi
movl -20(%rbp), %edi
movl $0, %eax
call PASCALMAIN@PLT
// movl %eax, %edi
// call exit
jmp _FPC_proc_haltproc@PLT
end; end;
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc'; procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';