cprt0.as 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. Start-up code for Free Pascal Compiler when linking with C library.
  3. */
  4. .text
  5. .align 2
  6. #APP
  7. .ident "FreePascal 2.6.x/2.7.x series dynlinked to libc"
  8. #NO_APP
  9. .section .note.tag,"a",%note
  10. .p2align 2
  11. .type abitag, @object
  12. .size abitag, 24
  13. abitag:
  14. .4byte 8
  15. .4byte 4
  16. .4byte 1 /* NT_FREEBSD_ABI_TAG */
  17. .string "FreeBSD"
  18. .p2align 2
  19. .4byte 1302001
  20. .section .note.tag,"a",%note
  21. .p2align 2
  22. .4byte .L_2-.L_1
  23. .4byte .L_4-.L_3
  24. .4byte 4 /* NT_FREEBSD_FEATURE_CTL */
  25. .L_1: .asciz "FreeBSD" /* NOTE_FREEBSD_VENDOR */
  26. .L_2: .p2align 2
  27. .L_3: .4byte 0
  28. .L_4:
  29. .globl __progname
  30. .section .rodata
  31. .LC0:
  32. .string ""
  33. .data
  34. .p2align 3
  35. .type __progname, @object
  36. .size __progname, 8
  37. __progname:
  38. .quad .LC0
  39. .text
  40. .p2align 4,,15
  41. .globl _start
  42. .type _start,#function
  43. _start:
  44. /* Initialise FP to zero */
  45. mov x29,#0
  46. /* Get argc, argv, envp */
  47. ldr x1,[x0]
  48. add x2,x0,#8
  49. add x3,x1,#1
  50. add x3,x2,x3,lsl #3
  51. /* Save argc, argv, envp, environ, __progname and initial stack pointer */
  52. adrp x10,:got:operatingsystem_parameter_argc
  53. ldr x10,[x10,#:got_lo12:operatingsystem_parameter_argc]
  54. str x1,[x10]
  55. adrp x10,:got:operatingsystem_parameter_argv
  56. ldr x10,[x10,#:got_lo12:operatingsystem_parameter_argv]
  57. str x2,[x10]
  58. adrp x10,:got:operatingsystem_parameter_envp
  59. ldr x10,[x10,#:got_lo12:operatingsystem_parameter_envp]
  60. str x3,[x10]
  61. /* save environ */
  62. adrp x10,environ
  63. ldr x10,[x10,:lo12:environ]
  64. cbnz x10,.LBB0_2
  65. ldr x10,=environ
  66. str x3,[x10]
  67. .LBB0_2:
  68. /* save __progname */
  69. ldr w8,=operatingsystem_parameter_argc
  70. cmp w8,#0
  71. cset w8,le
  72. tbnz w8,#0,.LBB0_9
  73. // %bb.1:
  74. adrp x8,operatingsystem_parameter_argv
  75. ldr x8,[x8,:lo12:operatingsystem_parameter_argv]
  76. cbz x8,.LBB0_9
  77. // %bb.2:
  78. ldr x2,[x2]
  79. adrp x9,__progname
  80. adrp x10,__progname
  81. add x10,x10,:lo12:__progname
  82. str x2,[x10]
  83. ldr x8,[x9,:lo12:__progname]
  84. adrp x9,s
  85. add x9,x9,:lo12:s
  86. str x8,[x9]
  87. .LBB0_3:
  88. adrp x8,s
  89. ldr x8,[x8,:lo12:s]
  90. ldrb w9,[x8]
  91. cbz w9,.LBB0_8
  92. // %bb.4:
  93. adrp x8,s
  94. ldr x8,[x8, :lo12:s]
  95. ldrb w9,[x8]
  96. cmp w9,#47
  97. b.ne .LBB0_6
  98. // %bb.5:
  99. adrp x8,s
  100. ldr x8,[x8,:lo12:s]
  101. add x8,x8,#1
  102. adrp x9,__progname
  103. add x9,x9,:lo12:__progname
  104. str x8,[x9]
  105. .LBB0_6:
  106. // %bb.7:
  107. adrp x8,s
  108. adrp x9,s
  109. add x9,x9,:lo12:s
  110. ldr x8,[x8,:lo12:s]
  111. add x8,x8,#1
  112. str x8,[x9]
  113. b .LBB0_3
  114. .LBB0_8:
  115. .LBB0_9:
  116. /* save stack pointer */
  117. adrp x10,:got:__stkptr
  118. ldr x10,[x10,#:got_lo12:__stkptr]
  119. mov x6,sp
  120. str x6,[x10]
  121. bl PASCALMAIN
  122. /* This should never happen */
  123. b abort
  124. .globl _haltproc
  125. .type _haltproc,#function
  126. _haltproc:
  127. adrp x0,:got:operatingsystem_result
  128. ldr x0,[x0,#:got_lo12:operatingsystem_result]
  129. ldr w0,[x0]
  130. mov w8,#1 // SYS_exit
  131. svc #0
  132. b _haltproc
  133. /* Define a symbol for the first piece of initialized data. */
  134. .data
  135. .align 3
  136. .globl __data_start
  137. __data_start:
  138. .long 0
  139. .weak data_start
  140. data_start = __data_start
  141. .bss
  142. .align 3
  143. .comm __stkptr,8
  144. .comm operatingsystem_parameter_envp,8
  145. .comm operatingsystem_parameter_argc,8
  146. .comm operatingsystem_parameter_argv,8
  147. .comm environ,8,8
  148. s:
  149. .xword 0
  150. .size s, 8
  151. .section .note.GNU-stack,"",%progbits