|
| 1 | +# RUN: llvm-mc %s -triple=sparc | FileCheck %s --check-prefix=ASM |
| 2 | +# RUN: llvm-mc %s -triple=sparcv9 | FileCheck %s --check-prefix=ASM |
| 3 | + |
| 4 | +# RUN: llvm-mc %s -triple=sparc -filetype=obj -o %t |
| 5 | +# RUN: llvm-objdump -dr %t | FileCheck %s --check-prefix=OBJDUMP |
| 6 | +# RUN: llvm-mc %s -triple=sparcv9 -filetype=obj -o %t |
| 7 | +# RUN: llvm-objdump -dr %t | FileCheck %s --check-prefix=OBJDUMP |
| 8 | +# RUN: llvm-readelf -s - < %t | FileCheck %s --check-prefix=READELF --implicit-check-not=TLS |
| 9 | + |
| 10 | +# READELF: TLS LOCAL DEFAULT [[#]] s_tle_hix22 |
| 11 | +# READELF: TLS LOCAL DEFAULT [[#]] s_tldo_hix22 |
| 12 | +# READELF: TLS GLOBAL DEFAULT UND s_tle_lox10 |
| 13 | +# READELF: TLS GLOBAL DEFAULT UND s_tie_hi22 |
| 14 | +# READELF: TLS GLOBAL DEFAULT UND s_tie_lo10 |
| 15 | +# READELF: TLS GLOBAL DEFAULT UND s_tie_ld |
| 16 | +# READELF: TLS GLOBAL DEFAULT UND s_tie_ldx |
| 17 | +# READELF: TLS GLOBAL DEFAULT UND s_tie_add |
| 18 | +# READELF: TLS GLOBAL DEFAULT UND s_tldm_hi22 |
| 19 | +# READELF: TLS GLOBAL DEFAULT UND s_tldm_lo10 |
| 20 | +# READELF: TLS GLOBAL DEFAULT UND s_tldm_add |
| 21 | +# READELF: TLS GLOBAL DEFAULT UND s_tldo_lox10 |
| 22 | +# READELF: TLS GLOBAL DEFAULT UND s_tldo_add |
| 23 | +# READELF: TLS GLOBAL DEFAULT UND s_tgd_hi22 |
| 24 | +# READELF: TLS GLOBAL DEFAULT UND s_tgd_lo10 |
| 25 | +# READELF: TLS GLOBAL DEFAULT UND s_tgd_add |
| 26 | + |
| 27 | +# ASM: or %g1, %lo(sym), %g3 |
| 28 | +# ASM-NEXT: sethi %hi(sym), %l0 |
| 29 | +# ASM-NEXT: sethi %h44(sym), %l0 |
| 30 | +# ASM-NEXT: or %g1, %m44(sym), %g3 |
| 31 | +# ASM-NEXT: or %g1, %l44(sym), %g3 |
| 32 | +# OBJDUMP: 0000000: R_SPARC_LO10 sym |
| 33 | +# OBJDUMP: 0000004: R_SPARC_HI22 sym |
| 34 | +# OBJDUMP: 0000008: R_SPARC_H44 sym |
| 35 | +# OBJDUMP: 000000c: R_SPARC_M44 sym |
| 36 | +# OBJDUMP: 0000010: R_SPARC_L44 sym |
| 37 | +or %g1, %lo(sym), %g3 |
| 38 | +sethi %hi(sym), %l0 |
| 39 | +sethi %h44(sym), %l0 |
| 40 | +or %g1, %m44(sym), %g3 |
| 41 | +or %g1, %l44(sym), %g3 |
| 42 | + |
| 43 | +# ASM: sethi %hh(sym), %l0 |
| 44 | +# ASM-NEXT: sethi %hh(sym), %l0 |
| 45 | +# ASM-NEXT: or %g1, %hm(sym), %g3 |
| 46 | +# ASM-NEXT: or %g1, %hm(sym), %g3 |
| 47 | +# ASM-NEXT: sethi %lm(sym), %l0 |
| 48 | +# OBJDUMP: 0000014: R_SPARC_HH22 sym |
| 49 | +# OBJDUMP: 0000018: R_SPARC_HH22 sym |
| 50 | +# OBJDUMP: 000001c: R_SPARC_HM10 sym |
| 51 | +# OBJDUMP: 0000020: R_SPARC_HM10 sym |
| 52 | +# OBJDUMP: 0000024: R_SPARC_LM22 sym |
| 53 | +sethi %hh(sym), %l0 |
| 54 | +sethi %uhi(sym), %l0 |
| 55 | +or %g1, %hm(sym), %g3 |
| 56 | +or %g1, %ulo(sym), %g3 |
| 57 | +sethi %lm(sym), %l0 |
| 58 | + |
| 59 | +# ASM: sethi %hix(sym), %g1 |
| 60 | +# ASM-NEXT: xor %g1, %lox(sym), %g1 |
| 61 | +# ASM-NEXT: sethi %gdop_hix22(sym), %l1 |
| 62 | +# ASM-NEXT: or %l1, %gdop_lox10(sym), %l1 |
| 63 | +# ASM-NEXT: ldx [%l7+%l1], %l2, %gdop(sym) |
| 64 | +# OBJDUMP: R_SPARC_HIX22 sym |
| 65 | +# OBJDUMP: R_SPARC_LOX10 sym |
| 66 | +# OBJDUMP: R_SPARC_GOTDATA_HIX22 sym |
| 67 | +# OBJDUMP: R_SPARC_GOTDATA_LOX10 sym |
| 68 | +# OBJDUMP: R_SPARC_GOTDATA_OP sym |
| 69 | +sethi %hix(sym), %g1 |
| 70 | +xor %g1, %lox(sym), %g1 |
| 71 | +sethi %gdop_hix22(sym), %l1 |
| 72 | +or %l1, %gdop_lox10(sym), %l1 |
| 73 | +ldx [%l7 + %l1], %l2, %gdop(sym) |
| 74 | + |
| 75 | +# OBJDUMP-LABEL: <.tls>: |
| 76 | +.section .tls,"ax" |
| 77 | +## Local Executable model: |
| 78 | +# ASM: sethi %tle_hix22(s_tle_hix22), %i0 |
| 79 | +# ASM-NEXT: xor %i0, %tle_lox10(s_tle_lox10), %i0 |
| 80 | + |
| 81 | +# OBJDUMP: 31 00 00 00 sethi 0x0, %i0 |
| 82 | +# OBJDUMP-NEXT: 00000000: R_SPARC_TLS_LE_HIX22 s_tle_hix22 |
| 83 | +# OBJDUMP-NEXT: b0 1e 20 00 xor %i0, 0x0, %i0 |
| 84 | +# OBJDUMP-NEXT: 00000004: R_SPARC_TLS_LE_LOX10 s_tle_lox10 |
| 85 | + sethi %tle_hix22(s_tle_hix22), %i0 |
| 86 | + xor %i0, %tle_lox10(s_tle_lox10), %i0 |
| 87 | + |
| 88 | +## Initial Executable model |
| 89 | +# ASM: sethi %tie_hi22(s_tie_hi22), %i1 |
| 90 | +# ASM-NEXT: add %i1, %tie_lo10(s_tie_lo10), %i1 |
| 91 | +# ASM-NEXT: ld [%i0+%i1], %i0, %tie_ld(s_tie_ld) |
| 92 | +# ASM-NEXT: ldx [%i0+%i1], %i0, %tie_ldx(s_tie_ldx) |
| 93 | +# ASM-NEXT: add %g7, %i0, %o0, %tie_add(s_tie_add) |
| 94 | + |
| 95 | +# OBJDUMP: R_SPARC_TLS_IE_HI22 s_tie_hi22 |
| 96 | +# OBJDUMP: R_SPARC_TLS_IE_LO10 s_tie_lo10 |
| 97 | +# OBJDUMP: R_SPARC_TLS_IE_LD s_tie_ld |
| 98 | +# OBJDUMP: R_SPARC_TLS_IE_LDX s_tie_ldx |
| 99 | +# OBJDUMP: R_SPARC_TLS_IE_ADD s_tie_add |
| 100 | + sethi %tie_hi22(s_tie_hi22), %i1 |
| 101 | + add %i1, %tie_lo10(s_tie_lo10), %i1 |
| 102 | + ld [%i0+%i1], %i0, %tie_ld(s_tie_ld) |
| 103 | + ldx [%i0+%i1], %i0, %tie_ldx(s_tie_ldx) |
| 104 | + add %g7, %i0, %o0, %tie_add(s_tie_add) |
| 105 | + |
| 106 | +## Local Dynamic model |
| 107 | +# ASM: sethi %tldo_hix22(s_tldo_hix22), %i1 |
| 108 | +# ASM-NEXT: sethi %tldm_hi22(s_tldm_hi22), %i2 |
| 109 | +# ASM-NEXT: add %i2, %tldm_lo10(s_tldm_lo10), %i2 |
| 110 | +# ASM-NEXT: add %i0, %i2, %o0, %tldm_add(s_tldm_add) |
| 111 | +# ASM-NEXT: xor %i1, %tldo_lox10(s_tldo_lox10), %i0 |
| 112 | +# ASM-NEXT: call __tls_get_addr, %tldm_call(s_tldm_call) |
| 113 | +# ASM-NEXT: nop |
| 114 | +# ASM-NEXT: add %o0, %i0, %o0, %tldo_add(s_tldo_add) |
| 115 | + |
| 116 | +# OBJDUMP: R_SPARC_TLS_LDO_HIX22 s_tldo_hix22 |
| 117 | +# OBJDUMP: R_SPARC_TLS_LDM_HI22 s_tldm_hi22 |
| 118 | +# OBJDUMP: R_SPARC_TLS_LDM_LO10 s_tldm_lo10 |
| 119 | +# OBJDUMP: R_SPARC_TLS_LDM_ADD s_tldm_add |
| 120 | +# OBJDUMP: R_SPARC_TLS_LDO_LOX10 s_tldo_lox10 |
| 121 | +# OBJDUMP: R_SPARC_TLS_LDM_CALL s_tldm_call |
| 122 | +# OBJDUMP: R_SPARC_TLS_LDO_ADD s_tldo_add |
| 123 | + sethi %tldo_hix22(s_tldo_hix22), %i1 |
| 124 | + sethi %tldm_hi22(s_tldm_hi22), %i2 |
| 125 | + add %i2, %tldm_lo10(s_tldm_lo10), %i2 |
| 126 | + add %i0, %i2, %o0, %tldm_add(s_tldm_add) |
| 127 | + xor %i1, %tldo_lox10(s_tldo_lox10), %i0 |
| 128 | + call __tls_get_addr, %tldm_call(s_tldm_call) |
| 129 | + nop |
| 130 | + add %o0, %i0, %o0, %tldo_add(s_tldo_add) |
| 131 | + |
| 132 | +## General Dynamic model |
| 133 | +# ASM: sethi %tgd_hi22(s_tgd_hi22), %i1 |
| 134 | +# ASM-NEXT: add %i1, %tgd_lo10(s_tgd_lo10), %i1 |
| 135 | +# ASM-NEXT: add %i0, %i1, %o0, %tgd_add(s_tgd_add) |
| 136 | +# ASM-NEXT: call __tls_get_addr, %tgd_call(s_tgd_call) |
| 137 | + |
| 138 | +# OBJDUMP: R_SPARC_TLS_GD_HI22 s_tgd_hi22 |
| 139 | +# OBJDUMP: R_SPARC_TLS_GD_LO10 s_tgd_lo10 |
| 140 | +# OBJDUMP: R_SPARC_TLS_GD_ADD s_tgd_add |
| 141 | +# OBJDUMP: R_SPARC_TLS_GD_CALL s_tgd_call |
| 142 | + sethi %tgd_hi22(s_tgd_hi22), %i1 |
| 143 | + add %i1, %tgd_lo10(s_tgd_lo10), %i1 |
| 144 | + add %i0, %i1, %o0, %tgd_add(s_tgd_add) |
| 145 | + call __tls_get_addr, %tgd_call(s_tgd_call) |
| 146 | + |
| 147 | + .type Local,@object |
| 148 | + .section .tbss,#alloc,#write,#tls |
| 149 | +s_tle_hix22: |
| 150 | +s_tldo_hix22: |
| 151 | + .word 0 |
| 152 | + .size Local, 4 |
0 commit comments