You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

macro.S 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "platform_config.h"
  2. #if !defined(HAVE_SLASHMACRO) && !defined(HAVE_DOLLARMACRO)
  3. #error Unknown gnu as macro parameter convention! Run ./configure
  4. #endif
  5. #if defined(__MACH__)
  6. .macro FN name
  7. #if defined(HAVE_SLASHMACRO)
  8. \name:
  9. _\name:
  10. #elif defined(HAVE_DOLLARMACRO)
  11. $0:
  12. _$0:
  13. #endif
  14. .endm
  15. .macro FN_EXT name, args, xmmused
  16. #if defined(HAVE_SLASHMACRO)
  17. FN \name
  18. #elif defined(HAVE_DOLLARMACRO)
  19. FN $0
  20. #endif
  21. .endm
  22. .macro FN_END name
  23. .endm
  24. .macro HIDDEN name
  25. #if defined(HAVE_AS_PRIVATE_EXTERN)
  26. #if defined(HAVE_SLASHMACRO)
  27. .private_extern \name
  28. .private_extern _\name
  29. #elif defined(HAVE_DOLLARMACRO)
  30. .private_extern $0
  31. .private_extern _$0
  32. #endif
  33. #endif
  34. .endm
  35. #else
  36. .macro FN name
  37. \name:
  38. _\name:
  39. .endm
  40. .macro FN_EXT name, args, xmmused
  41. FN \name
  42. .endm
  43. .macro FN_END name
  44. .size \name, .-\name
  45. .size _\name, .-_\name
  46. .type \name, @function
  47. .type _\name, @function
  48. .endm
  49. .macro HIDDEN name
  50. #if defined(HAVE_AS_HIDDEN)
  51. .hidden \name
  52. .hidden _\name
  53. #endif
  54. .endm
  55. /* set NX for stack */
  56. .section .note.GNU-stack,"",@progbits
  57. #endif
  58. #if defined(__MACH__)
  59. .macro SECTION_TEXT
  60. .section __TEXT,__text,regular
  61. .endm
  62. .macro SECTION_RODATA
  63. .section __TEXT,__text,regular
  64. .endm
  65. #else
  66. /* put everything in the code segment to simplify things */
  67. .macro SECTION_TEXT
  68. .text
  69. .endm
  70. .macro SECTION_RODATA
  71. .text
  72. .endm
  73. #endif
  74. /* declare a global function */
  75. .macro GLOBAL name
  76. #if defined(HAVE_SLASHMACRO)
  77. .globl \name
  78. .globl _\name
  79. #elif defined(HAVE_DOLLARMACRO)
  80. .globl $0
  81. .globl _$0
  82. #endif
  83. .endm
  84. .macro FN_LOCAL_PREFIX name
  85. #if defined(HAVE_SLASHMACRO)
  86. FN LOCAL_PREFIX(\name)
  87. #elif defined(HAVE_DOLLARMACRO)
  88. FN LOCAL_PREFIX($0)
  89. #endif
  90. .endm
  91. .macro FN_EXT_LOCAL_PREFIX name, args, xmmused
  92. #if defined(HAVE_SLASHMACRO)
  93. FN_EXT LOCAL_PREFIX(\name), \args, \xmmused
  94. #elif defined(HAVE_DOLLARMACRO)
  95. FN_EXT LOCAL_PREFIX($0), $1, $2
  96. #endif
  97. .endm
  98. .macro FN_END_LOCAL_PREFIX name
  99. #if defined(HAVE_SLASHMACRO)
  100. FN_END LOCAL_PREFIX(\name)
  101. #elif defined(HAVE_DOLLARMACRO)
  102. FN_END LOCAL_PREFIX($0)
  103. #endif
  104. .endm
  105. .macro GLOBAL_LOCAL_PREFIX name
  106. #if defined(HAVE_SLASHMACRO)
  107. GLOBAL LOCAL_PREFIX(\name)
  108. HIDDEN LOCAL_PREFIX(\name)
  109. #elif defined(HAVE_DOLLARMACRO)
  110. GLOBAL LOCAL_PREFIX($0)
  111. HIDDEN LOCAL_PREFIX($0)
  112. #endif
  113. .endm
  114. .macro GLOBAL_HIDDEN_FN name
  115. #if defined(HAVE_SLASHMACRO)
  116. GLOBAL \name
  117. HIDDEN \name
  118. FN \name
  119. #elif defined(HAVE_DOLLARMACRO)
  120. GLOBAL $0
  121. HIDDEN $0
  122. FN $0
  123. #endif
  124. .endm
  125. .macro GLOBAL_HIDDEN_FN_EXT name, args, xmmused
  126. #if defined(HAVE_SLASHMACRO)
  127. GLOBAL \name
  128. HIDDEN \name
  129. FN_EXT \name, \args, \xmmused
  130. #elif defined(HAVE_DOLLARMACRO)
  131. GLOBAL $0
  132. HIDDEN $0
  133. FN_EXT $0, $1, $2
  134. #endif
  135. .endm
  136. /* pic support */
  137. .macro LOAD_VAR_PIC var, reg
  138. #if !defined(__LP64__)
  139. #if defined(HAVE_SLASHMACRO)
  140. call 1f
  141. 1:
  142. popl \reg
  143. leal \var - 1b(\reg), \reg
  144. #elif defined(HAVE_DOLLARMACRO)
  145. call 1f
  146. 1:
  147. popl $1
  148. leal $0 - 1b($1), $1
  149. #endif
  150. #else
  151. #if defined(HAVE_SLASHMACRO)
  152. leaq \var(%rip), \reg
  153. #elif defined(HAVE_DOLLARMACRO)
  154. leaq $0(%rip), $1
  155. #endif
  156. #endif
  157. .endm