fpc/rtl/freebsd/aarch64/cprt0.as

170 lines
3.1 KiB
ActionScript

/*
Start-up code for Free Pascal Compiler when linking with C library.
*/
.text
.align 2
#APP
.ident "FreePascal 2.6.x/2.7.x series dynlinked to libc"
#NO_APP
.section .note.tag,"a",%note
.p2align 2
.type abitag, @object
.size abitag, 24
abitag:
.4byte 8
.4byte 4
.4byte 1 /* NT_FREEBSD_ABI_TAG */
.string "FreeBSD"
.p2align 2
.4byte 1302001
.section .note.tag,"a",%note
.p2align 2
.4byte .L_2-.L_1
.4byte .L_4-.L_3
.4byte 4 /* NT_FREEBSD_FEATURE_CTL */
.L_1: .asciz "FreeBSD" /* NOTE_FREEBSD_VENDOR */
.L_2: .p2align 2
.L_3: .4byte 0
.L_4:
.globl __progname
.section .rodata
.LC0:
.string ""
.data
.p2align 3
.type __progname, @object
.size __progname, 8
__progname:
.quad .LC0
.text
.p2align 4,,15
.globl _start
.type _start,#function
_start:
/* Initialise FP to zero */
mov x29,#0
/* Get argc, argv, envp */
ldr x1,[x0]
add x2,x0,#8
add x3,x1,#1
add x3,x2,x3,lsl #3
/* Save argc, argv, envp, environ, __progname and initial stack pointer */
adrp x10,:got:operatingsystem_parameter_argc
ldr x10,[x10,#:got_lo12:operatingsystem_parameter_argc]
str x1,[x10]
adrp x10,:got:operatingsystem_parameter_argv
ldr x10,[x10,#:got_lo12:operatingsystem_parameter_argv]
str x2,[x10]
adrp x10,:got:operatingsystem_parameter_envp
ldr x10,[x10,#:got_lo12:operatingsystem_parameter_envp]
str x3,[x10]
/* save environ */
adrp x10,environ
ldr x10,[x10,:lo12:environ]
cbnz x10,.LBB0_2
ldr x10,=environ
str x3,[x10]
.LBB0_2:
/* save __progname */
ldr w8,=operatingsystem_parameter_argc
cmp w8,#0
cset w8,le
tbnz w8,#0,.LBB0_9
// %bb.1:
adrp x8,operatingsystem_parameter_argv
ldr x8,[x8,:lo12:operatingsystem_parameter_argv]
cbz x8,.LBB0_9
// %bb.2:
ldr x2,[x2]
adrp x9,__progname
adrp x10,__progname
add x10,x10,:lo12:__progname
str x2,[x10]
ldr x8,[x9,:lo12:__progname]
adrp x9,s
add x9,x9,:lo12:s
str x8,[x9]
.LBB0_3:
adrp x8,s
ldr x8,[x8,:lo12:s]
ldrb w9,[x8]
cbz w9,.LBB0_8
// %bb.4:
adrp x8,s
ldr x8,[x8, :lo12:s]
ldrb w9,[x8]
cmp w9,#47
b.ne .LBB0_6
// %bb.5:
adrp x8,s
ldr x8,[x8,:lo12:s]
add x8,x8,#1
adrp x9,__progname
add x9,x9,:lo12:__progname
str x8,[x9]
.LBB0_6:
// %bb.7:
adrp x8,s
adrp x9,s
add x9,x9,:lo12:s
ldr x8,[x8,:lo12:s]
add x8,x8,#1
str x8,[x9]
b .LBB0_3
.LBB0_8:
.LBB0_9:
/* save stack pointer */
adrp x10,:got:__stkptr
ldr x10,[x10,#:got_lo12:__stkptr]
mov x6,sp
str x6,[x10]
bl PASCALMAIN
/* This should never happen */
b abort
.globl _haltproc
.type _haltproc,#function
_haltproc:
adrp x0,:got:operatingsystem_result
ldr x0,[x0,#:got_lo12:operatingsystem_result]
ldr w0,[x0]
mov w8,#1 // SYS_exit
svc #0
b _haltproc
/* Define a symbol for the first piece of initialized data. */
.data
.align 3
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start
.bss
.align 3
.comm __stkptr,8
.comm operatingsystem_parameter_envp,8
.comm operatingsystem_parameter_argc,8
.comm operatingsystem_parameter_argv,8
.comm environ,8,8
s:
.xword 0
.size s, 8
.section .note.GNU-stack,"",%progbits