cprt0.as 2.9 KB

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