123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- # An external tdata symbol
- .globl tdata_ext[TL]
- .csect tdata_ext[TL]
- .long 1
- .csect tdata_int_csect[TL]
- # A first internal tdata symbol
- tdata_int1:
- .long 2
- # A second internal tdata symbol
- tdata_int2:
- .long 3
- # Two external tbss symbols.
- # XCOFF doesn't seem to allow internal tbss
- # (or bss) symbols.
- .comm tbss_ext[UL],8
- .toc
- # TC entries targeting the external tdata symbol
- # Their value should be "tdata_ext" address,
- # except TLSM value which must be 0.
- # Their relocations should target it.
- .tc tdata_ext_gd[TC],tdata_ext[TL]
- .tc .tdata_ext_gd[TC],tdata_ext[TL]@m
- .tc tdata_ext_ld[TC],tdata_ext[TL]@ld
- .tc tdata_ext_ie[TC],tdata_ext[TL]@ie
- .tc tdata_ext_le[TC],tdata_ext[TL]@le
- # TC entries targeting internal tdata symbols.
- # Their value should be "tdata_int1" or "tdata_int2"
- # addresses, except TLSM value which must be 0.
- # Their relocations should target "tdata_int_csect".
- .tc tdata_int1_gd[TC],tdata_int1
- .tc .tdata_int1_gd[TC],tdata_int1@m
- .tc tdata_int1_ld[TC],tdata_int1@ld
- .tc tdata_int1_ie[TC],tdata_int1@ie
- .tc tdata_int1_le[TC],tdata_int1@le
- .tc tdata_int2_gd[TC],tdata_int2
- .tc .tdata_int2_gd[TC],tdata_int2@m
- .tc tdata_int2_ld[TC],tdata_int2@ld
- .tc tdata_int2_ie[TC],tdata_int2@ie
- .tc tdata_int2_le[TC],tdata_int2@le
- # TC entries targeting the external tdata symbol
- # Their value should be "tbss_ext" address,
- # except TLSM value which must be 0.
- # Their relocations should target "tbss_ext".
- .tc tbss_ext_gd[TC],tbss_ext[UL]
- .tc .tbss_ext_gd[TC],tbss_ext[UL]@m
- .tc tbss_ext_ld[TC],tbss_ext[UL]@ld
- .tc tbss_ext_ie[TC],tbss_ext[UL]@ie
- .tc tbss_ext_le[TC],tbss_ext[UL]@le
- # Module entry
- .tc mh[TC],mh[TC]@ml
- .rename mh[TC], "_$TLSML" # Symbol for the module handle
- # Macros
- .macro gd_macro,sym
- .if size == 32
- lwz 4, \sym\()[TC](2)
- lwz 3, .\sym\()[TC](2)
- .else
- ld 4, \sym\()[TC](2)
- ld 3, .\sym\()[TC](2)
- .endif
- bla __tls_get_addr
- .endm
- .macro ld_macro, sym
- .if size == 32
- lwz 4, \sym\()[TC](2)
- .else
- ld 4, \sym\()[TC](2)
- .endif
- add 5,3,4
- .endm
- .macro ie_macro, sym
- .if size == 32
- bla __get_tpointer
- lwz 4, \sym\()[TC](2)
- add 5,3,4
- .else
- ld 4, \sym\()[TC](2)
- add 5,4,13
- .endif
- .endm
- .macro le_macro, sym
- .if size == 32
- bla __get_tpointer
- lwz 4, \sym\()[TC](2)
- add 5,3,4
- .else
- ld 4, \sym\()[TC](2)
- add 5,3,13
- .endif
- .endm
- # As TLS relocations are made in for TC symbols,
- # this function only aims to avoid garbage collection
- # of these symbols, especially hidden ones.
- .globl foo
- .globl .foo
- .csect foo[DS],3
- foo:
- .if size == 32
- .long .foo, TOC[tc0], 0
- .else
- .llong .foo, TOC[tc0], 0
- .endif
- .csect foo[PR]
- .foo:
- # External syms
- #GD
- gd_macro tdata_ext_gd
- gd_macro tdata_int1_gd
- gd_macro tdata_int2_gd
- gd_macro tbss_ext_gd
- #LD
- .if size == 32
- lwz 3, mh[TC](2)
- .else
- ld 3, mh[TC](2)
- .endif
- bla __tls_get_mod
- ld_macro tdata_ext_ld
- ld_macro tdata_int1_ld
- ld_macro tdata_int2_ld
- ld_macro tbss_ext_ld
- #IE
- ie_macro tdata_ext_ie
- ie_macro tdata_int1_ie
- ie_macro tdata_int2_ie
- ie_macro tbss_ext_ie
- #LE
- le_macro tdata_ext_le
- le_macro tdata_int1_le
- le_macro tdata_int2_le
- le_macro tbss_ext_le
|