aix-tls-reloc.s 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. # An external tdata symbol
  2. .globl tdata_ext[TL]
  3. .csect tdata_ext[TL]
  4. .long 1
  5. .csect tdata_int_csect[TL]
  6. # A first internal tdata symbol
  7. tdata_int1:
  8. .long 2
  9. # A second internal tdata symbol
  10. tdata_int2:
  11. .long 3
  12. # Two external tbss symbols.
  13. # XCOFF doesn't seem to allow internal tbss
  14. # (or bss) symbols.
  15. .comm tbss_ext[UL],8
  16. .toc
  17. # TC entries targeting the external tdata symbol
  18. # Their value should be "tdata_ext" address,
  19. # except TLSM value which must be 0.
  20. # Their relocations should target it.
  21. .tc tdata_ext_gd[TC],tdata_ext[TL]
  22. .tc .tdata_ext_gd[TC],tdata_ext[TL]@m
  23. .tc tdata_ext_ld[TC],tdata_ext[TL]@ld
  24. .tc tdata_ext_ie[TC],tdata_ext[TL]@ie
  25. .tc tdata_ext_le[TC],tdata_ext[TL]@le
  26. # TC entries targeting internal tdata symbols.
  27. # Their value should be "tdata_int1" or "tdata_int2"
  28. # addresses, except TLSM value which must be 0.
  29. # Their relocations should target "tdata_int_csect".
  30. .tc tdata_int1_gd[TC],tdata_int1
  31. .tc .tdata_int1_gd[TC],tdata_int1@m
  32. .tc tdata_int1_ld[TC],tdata_int1@ld
  33. .tc tdata_int1_ie[TC],tdata_int1@ie
  34. .tc tdata_int1_le[TC],tdata_int1@le
  35. .tc tdata_int2_gd[TC],tdata_int2
  36. .tc .tdata_int2_gd[TC],tdata_int2@m
  37. .tc tdata_int2_ld[TC],tdata_int2@ld
  38. .tc tdata_int2_ie[TC],tdata_int2@ie
  39. .tc tdata_int2_le[TC],tdata_int2@le
  40. # TC entries targeting the external tdata symbol
  41. # Their value should be "tbss_ext" address,
  42. # except TLSM value which must be 0.
  43. # Their relocations should target "tbss_ext".
  44. .tc tbss_ext_gd[TC],tbss_ext[UL]
  45. .tc .tbss_ext_gd[TC],tbss_ext[UL]@m
  46. .tc tbss_ext_ld[TC],tbss_ext[UL]@ld
  47. .tc tbss_ext_ie[TC],tbss_ext[UL]@ie
  48. .tc tbss_ext_le[TC],tbss_ext[UL]@le
  49. # Module entry
  50. .tc mh[TC],mh[TC]@ml
  51. .rename mh[TC], "_$TLSML" # Symbol for the module handle
  52. # Macros
  53. .macro gd_macro,sym
  54. .if size == 32
  55. lwz 4, \sym\()[TC](2)
  56. lwz 3, .\sym\()[TC](2)
  57. .else
  58. ld 4, \sym\()[TC](2)
  59. ld 3, .\sym\()[TC](2)
  60. .endif
  61. bla __tls_get_addr
  62. .endm
  63. .macro ld_macro, sym
  64. .if size == 32
  65. lwz 4, \sym\()[TC](2)
  66. .else
  67. ld 4, \sym\()[TC](2)
  68. .endif
  69. add 5,3,4
  70. .endm
  71. .macro ie_macro, sym
  72. .if size == 32
  73. bla __get_tpointer
  74. lwz 4, \sym\()[TC](2)
  75. add 5,3,4
  76. .else
  77. ld 4, \sym\()[TC](2)
  78. add 5,4,13
  79. .endif
  80. .endm
  81. .macro le_macro, sym
  82. .if size == 32
  83. bla __get_tpointer
  84. lwz 4, \sym\()[TC](2)
  85. add 5,3,4
  86. .else
  87. ld 4, \sym\()[TC](2)
  88. add 5,3,13
  89. .endif
  90. .endm
  91. # As TLS relocations are made in for TC symbols,
  92. # this function only aims to avoid garbage collection
  93. # of these symbols, especially hidden ones.
  94. .globl foo
  95. .globl .foo
  96. .csect foo[DS],3
  97. foo:
  98. .if size == 32
  99. .long .foo, TOC[tc0], 0
  100. .else
  101. .llong .foo, TOC[tc0], 0
  102. .endif
  103. .csect foo[PR]
  104. .foo:
  105. # External syms
  106. #GD
  107. gd_macro tdata_ext_gd
  108. gd_macro tdata_int1_gd
  109. gd_macro tdata_int2_gd
  110. gd_macro tbss_ext_gd
  111. #LD
  112. .if size == 32
  113. lwz 3, mh[TC](2)
  114. .else
  115. ld 3, mh[TC](2)
  116. .endif
  117. bla __tls_get_mod
  118. ld_macro tdata_ext_ld
  119. ld_macro tdata_int1_ld
  120. ld_macro tdata_int2_ld
  121. ld_macro tbss_ext_ld
  122. #IE
  123. ie_macro tdata_ext_ie
  124. ie_macro tdata_int1_ie
  125. ie_macro tdata_int2_ie
  126. ie_macro tbss_ext_ie
  127. #LE
  128. le_macro tdata_ext_le
  129. le_macro tdata_int1_le
  130. le_macro tdata_int2_le
  131. le_macro tbss_ext_le