1# RUN: llvm-mc --triple=loongarch64 < %s --show-encoding \ 2# RUN: | FileCheck --check-prefixes=INSTR,FIXUP %s 3# RUN: llvm-mc --filetype=obj --triple=loongarch64 < %s \ 4# RUN: | llvm-readobj -r - | FileCheck --check-prefix=RELOC %s 5 6## Check prefixes: 7## RELOC - Check the relocation in the object. 8## FIXUP - Check the fixup on the instruction. 9## INSTR - Check the instruction is handled properly by the ASMPrinter. 10 11.long foo 12# RELOC: R_LARCH_32 foo 13 14.quad foo 15# RELOC: R_LARCH_64 foo 16 17bne $t1, $t2, %b16(foo) 18# RELOC: R_LARCH_B16 19# INSTR: bne $t1, $t2, %b16(foo) 20# FIXUP: fixup A - offset: 0, value: %b16(foo), kind: fixup_loongarch_b16 21 22bnez $t1, %b21(foo) 23# RELOC: R_LARCH_B21 24# INSTR: bnez $t1, %b21(foo) 25# FIXUP: fixup A - offset: 0, value: %b21(foo), kind: fixup_loongarch_b21 26 27bl %plt(foo) 28# RELOC: R_LARCH_B26 29# INSTR: bl %plt(foo) 30# FIXUP: fixup A - offset: 0, value: %plt(foo), kind: fixup_loongarch_b26 31 32bl foo 33# RELOC: R_LARCH_B26 34# INSTR: bl foo 35# FIXUP: fixup A - offset: 0, value: foo, kind: fixup_loongarch_b26 36 37lu12i.w $t1, %abs_hi20(foo) 38# RELOC: R_LARCH_ABS_HI20 foo 0x0 39# INSTR: lu12i.w $t1, %abs_hi20(foo) 40# FIXUP: fixup A - offset: 0, value: %abs_hi20(foo), kind: fixup_loongarch_abs_hi20 41 42ori $t1, $t1, %abs_lo12(foo) 43# RELOC: R_LARCH_ABS_LO12 foo 0x0 44# INSTR: ori $t1, $t1, %abs_lo12(foo) 45# FIXUP: fixup A - offset: 0, value: %abs_lo12(foo), kind: fixup_loongarch_abs_lo12 46 47lu32i.d $t1, %abs64_lo20(foo) 48# RELOC: R_LARCH_ABS64_LO20 foo 0x0 49# INSTR: lu32i.d $t1, %abs64_lo20(foo) 50# FIXUP: fixup A - offset: 0, value: %abs64_lo20(foo), kind: fixup_loongarch_abs64_lo20 51 52lu52i.d $t1, $t1, %abs64_hi12(foo) 53# RELOC: R_LARCH_ABS64_HI12 foo 0x0 54# INSTR: lu52i.d $t1, $t1, %abs64_hi12(foo) 55# FIXUP: fixup A - offset: 0, value: %abs64_hi12(foo), kind: fixup_loongarch_abs64_hi12 56 57pcalau12i $t1, %pc_hi20(foo) 58# RELOC: R_LARCH_PCALA_HI20 foo 0x0 59# INSTR: pcalau12i $t1, %pc_hi20(foo) 60# FIXUP: fixup A - offset: 0, value: %pc_hi20(foo), kind: FK_NONE 61 62pcalau12i $t1, %pc_hi20(foo+4) 63# RELOC: R_LARCH_PCALA_HI20 foo 0x4 64# INSTR: pcalau12i $t1, %pc_hi20(foo+4) 65# FIXUP: fixup A - offset: 0, value: %pc_hi20(foo+4), kind: FK_NONE 66 67addi.d $t1, $t1, %pc_lo12(foo) 68# RELOC: R_LARCH_PCALA_LO12 foo 0x0 69# INSTR: addi.d $t1, $t1, %pc_lo12(foo) 70# FIXUP: fixup A - offset: 0, value: %pc_lo12(foo), kind: FK_NONE 71 72addi.d $t1, $t1, %pc_lo12(foo+4) 73# RELOC: R_LARCH_PCALA_LO12 foo 0x4 74# INSTR: addi.d $t1, $t1, %pc_lo12(foo+4) 75# FIXUP: fixup A - offset: 0, value: %pc_lo12(foo+4), kind: FK_NONE 76 77jirl $zero, $t1, %pc_lo12(foo) 78# RELOC: R_LARCH_PCALA_LO12 foo 0x0 79# INSTR: jirl $zero, $t1, %pc_lo12(foo) 80# FIXUP: fixup A - offset: 0, value: %pc_lo12(foo), kind: FK_NONE 81 82st.b $t1, $a2, %pc_lo12(foo) 83# RELOC: R_LARCH_PCALA_LO12 foo 0x0 84# INSTR: st.b $t1, $a2, %pc_lo12(foo) 85# FIXUP: fixup A - offset: 0, value: %pc_lo12(foo), kind: FK_NONE 86 87st.b $t1, $a2, %pc_lo12(foo+4) 88# RELOC: R_LARCH_PCALA_LO12 foo 0x4 89# INSTR: st.b $t1, $a2, %pc_lo12(foo+4) 90# FIXUP: fixup A - offset: 0, value: %pc_lo12(foo+4), kind: FK_NONE 91 92lu32i.d $t1, %pc64_lo20(foo) 93# RELOC: R_LARCH_PCALA64_LO20 foo 0x0 94# INSTR: lu32i.d $t1, %pc64_lo20(foo) 95# FIXUP: fixup A - offset: 0, value: %pc64_lo20(foo), kind: FK_NONE 96 97lu52i.d $t1, $t1, %pc64_hi12(foo) 98# RELOC: R_LARCH_PCALA64_HI12 foo 0x0 99# INSTR: lu52i.d $t1, $t1, %pc64_hi12(foo) 100# FIXUP: fixup A - offset: 0, value: %pc64_hi12(foo), kind: FK_NONE 101 102pcalau12i $t1, %got_pc_hi20(foo) 103# RELOC: R_LARCH_GOT_PC_HI20 foo 0x0 104# INSTR: pcalau12i $t1, %got_pc_hi20(foo) 105# FIXUP: fixup A - offset: 0, value: %got_pc_hi20(foo), kind: FK_NONE 106 107ld.d $t1, $a2, %got_pc_lo12(foo) 108# RELOC: R_LARCH_GOT_PC_LO12 foo 0x0 109# INSTR: ld.d $t1, $a2, %got_pc_lo12(foo) 110# FIXUP: fixup A - offset: 0, value: %got_pc_lo12(foo), kind: FK_NONE 111 112lu32i.d $t1, %got64_pc_lo20(foo) 113# RELOC: R_LARCH_GOT64_PC_LO20 foo 0x0 114# INSTR: lu32i.d $t1, %got64_pc_lo20(foo) 115# FIXUP: fixup A - offset: 0, value: %got64_pc_lo20(foo), kind: FK_NONE 116 117lu52i.d $t1, $t1, %got64_pc_hi12(foo) 118# RELOC: R_LARCH_GOT64_PC_HI12 foo 0x0 119# INSTR: lu52i.d $t1, $t1, %got64_pc_hi12(foo) 120# FIXUP: fixup A - offset: 0, value: %got64_pc_hi12(foo), kind: FK_NONE 121 122lu12i.w $t1, %got_hi20(foo) 123# RELOC: R_LARCH_GOT_HI20 foo 0x0 124# INSTR: lu12i.w $t1, %got_hi20(foo) 125# FIXUP: fixup A - offset: 0, value: %got_hi20(foo), kind: FK_NONE 126 127ori $t1, $a2, %got_lo12(foo) 128# RELOC: R_LARCH_GOT_LO12 foo 0x0 129# INSTR: ori $t1, $a2, %got_lo12(foo) 130# FIXUP: fixup A - offset: 0, value: %got_lo12(foo), kind: FK_NONE 131 132lu32i.d $t1, %got64_lo20(foo) 133# RELOC: R_LARCH_GOT64_LO20 foo 0x0 134# INSTR: lu32i.d $t1, %got64_lo20(foo) 135# FIXUP: fixup A - offset: 0, value: %got64_lo20(foo), kind: FK_NONE 136 137lu52i.d $t1, $t1, %got64_hi12(foo) 138# RELOC: R_LARCH_GOT64_HI12 foo 0x0 139# INSTR: lu52i.d $t1, $t1, %got64_hi12(foo) 140# FIXUP: fixup A - offset: 0, value: %got64_hi12(foo), kind: FK_NONE 141 142lu12i.w $t1, %le_hi20(foo) 143# RELOC: R_LARCH_TLS_LE_HI20 foo 0x0 144# INSTR: lu12i.w $t1, %le_hi20(foo) 145# FIXUP: fixup A - offset: 0, value: %le_hi20(foo), kind: fixup_loongarch_tls_le_hi20 146 147ori $t1, $a2, %le_lo12(foo) 148# RELOC: R_LARCH_TLS_LE_LO12 foo 0x0 149# INSTR: ori $t1, $a2, %le_lo12(foo) 150# FIXUP: fixup A - offset: 0, value: %le_lo12(foo), kind: fixup_loongarch_tls_le_lo12 151 152lu32i.d $t1, %le64_lo20(foo) 153# RELOC: R_LARCH_TLS_LE64_LO20 foo 0x0 154# INSTR: lu32i.d $t1, %le64_lo20(foo) 155# FIXUP: fixup A - offset: 0, value: %le64_lo20(foo), kind: fixup_loongarch_tls_le64_lo20 156 157lu52i.d $t1, $t1, %le64_hi12(foo) 158# RELOC: R_LARCH_TLS_LE64_HI12 foo 0x0 159# INSTR: lu52i.d $t1, $t1, %le64_hi12(foo) 160# FIXUP: fixup A - offset: 0, value: %le64_hi12(foo), kind: fixup_loongarch_tls_le64_hi12 161 162pcalau12i $t1, %ie_pc_hi20(foo) 163# RELOC: R_LARCH_TLS_IE_PC_HI20 foo 0x0 164# INSTR: pcalau12i $t1, %ie_pc_hi20(foo) 165# FIXUP: fixup A - offset: 0, value: %ie_pc_hi20(foo), kind: FK_NONE 166 167ld.d $t1, $a2, %ie_pc_lo12(foo) 168# RELOC: R_LARCH_TLS_IE_PC_LO12 foo 0x0 169# INSTR: ld.d $t1, $a2, %ie_pc_lo12(foo) 170# FIXUP: fixup A - offset: 0, value: %ie_pc_lo12(foo), kind: FK_NONE 171 172lu32i.d $t1, %ie64_pc_lo20(foo) 173# RELOC: R_LARCH_TLS_IE64_PC_LO20 foo 0x0 174# INSTR: lu32i.d $t1, %ie64_pc_lo20(foo) 175# FIXUP: fixup A - offset: 0, value: %ie64_pc_lo20(foo), kind: FK_NONE 176 177lu52i.d $t1, $t1, %ie64_pc_hi12(foo) 178# RELOC: R_LARCH_TLS_IE64_PC_HI12 foo 0x0 179# INSTR: lu52i.d $t1, $t1, %ie64_pc_hi12(foo) 180# FIXUP: fixup A - offset: 0, value: %ie64_pc_hi12(foo), kind: FK_NONE 181 182lu12i.w $t1, %ie_hi20(foo) 183# RELOC: R_LARCH_TLS_IE_HI20 foo 0x0 184# INSTR: lu12i.w $t1, %ie_hi20(foo) 185# FIXUP: fixup A - offset: 0, value: %ie_hi20(foo), kind: FK_NONE 186 187ori $t1, $a2, %ie_lo12(foo) 188# RELOC: R_LARCH_TLS_IE_LO12 foo 0x0 189# INSTR: ori $t1, $a2, %ie_lo12(foo) 190# FIXUP: fixup A - offset: 0, value: %ie_lo12(foo), kind: FK_NONE 191 192lu32i.d $t1, %ie64_lo20(foo) 193# RELOC: R_LARCH_TLS_IE64_LO20 foo 0x0 194# INSTR: lu32i.d $t1, %ie64_lo20(foo) 195# FIXUP: fixup A - offset: 0, value: %ie64_lo20(foo), kind: FK_NONE 196 197lu52i.d $t1, $t1, %ie64_hi12(foo) 198# RELOC: R_LARCH_TLS_IE64_HI12 foo 0x0 199# INSTR: lu52i.d $t1, $t1, %ie64_hi12(foo) 200# FIXUP: fixup A - offset: 0, value: %ie64_hi12(foo), kind: FK_NONE 201 202pcalau12i $t1, %ld_pc_hi20(foo) 203# RELOC: R_LARCH_TLS_LD_PC_HI20 foo 0x0 204# INSTR: pcalau12i $t1, %ld_pc_hi20(foo) 205# FIXUP: fixup A - offset: 0, value: %ld_pc_hi20(foo), kind: FK_NONE 206 207lu12i.w $t1, %ld_hi20(foo) 208# RELOC: R_LARCH_TLS_LD_HI20 foo 0x0 209# INSTR: lu12i.w $t1, %ld_hi20(foo) 210# FIXUP: fixup A - offset: 0, value: %ld_hi20(foo), kind: FK_NONE 211 212pcalau12i $t1, %gd_pc_hi20(foo) 213# RELOC: R_LARCH_TLS_GD_PC_HI20 foo 0x0 214# INSTR: pcalau12i $t1, %gd_pc_hi20(foo) 215# FIXUP: fixup A - offset: 0, value: %gd_pc_hi20(foo), kind: FK_NONE 216 217lu12i.w $t1, %gd_hi20(foo) 218# RELOC: R_LARCH_TLS_GD_HI20 foo 0x0 219# INSTR: lu12i.w $t1, %gd_hi20(foo) 220# FIXUP: fixup A - offset: 0, value: %gd_hi20(foo), kind: FK_NONE 221 222pcaddu18i $t1, %call36(foo) 223# RELOC: R_LARCH_CALL36 foo 0x0 224# INSTR: pcaddu18i $t1, %call36(foo) 225# FIXUP: fixup A - offset: 0, value: %call36(foo), kind: FK_NONE 226 227pcalau12i $t1, %desc_pc_hi20(foo) 228# RELOC: R_LARCH_TLS_DESC_PC_HI20 foo 0x0 229# INSTR: pcalau12i $t1, %desc_pc_hi20(foo) 230# FIXUP: fixup A - offset: 0, value: %desc_pc_hi20(foo), kind: FK_NONE 231 232addi.d $t1, $t1, %desc_pc_lo12(foo) 233# RELOC: R_LARCH_TLS_DESC_PC_LO12 foo 0x0 234# INSTR: addi.d $t1, $t1, %desc_pc_lo12(foo) 235# FIXUP: fixup A - offset: 0, value: %desc_pc_lo12(foo), kind: FK_NONE 236 237lu32i.d $t1, %desc64_pc_lo20(foo) 238# RELOC: R_LARCH_TLS_DESC64_PC_LO20 foo 0x0 239# INSTR: lu32i.d $t1, %desc64_pc_lo20(foo) 240# FIXUP: fixup A - offset: 0, value: %desc64_pc_lo20(foo), kind: FK_NONE 241 242lu52i.d $t1, $t1, %desc64_pc_hi12(foo) 243# RELOC: R_LARCH_TLS_DESC64_PC_HI12 foo 0x0 244# INSTR: lu52i.d $t1, $t1, %desc64_pc_hi12(foo) 245# FIXUP: fixup A - offset: 0, value: %desc64_pc_hi12(foo), kind: FK_NONE 246 247ld.d $ra, $t1, %desc_ld(foo) 248# RELOC: R_LARCH_TLS_DESC_LD foo 0x0 249# INSTR: ld.d $ra, $t1, %desc_ld(foo) 250# FIXUP: fixup A - offset: 0, value: %desc_ld(foo), kind: FK_NONE 251 252jirl $ra, $ra, %desc_call(foo) 253# RELOC: R_LARCH_TLS_DESC_CALL foo 0x0 254# INSTR: jirl $ra, $ra, %desc_call(foo) 255# FIXUP: fixup A - offset: 0, value: %desc_call(foo), kind: FK_NONE 256 257lu12i.w $t1, %desc_hi20(foo) 258# RELOC: R_LARCH_TLS_DESC_HI20 foo 0x0 259# INSTR: lu12i.w $t1, %desc_hi20(foo) 260# FIXUP: fixup A - offset: 0, value: %desc_hi20(foo), kind: FK_NONE 261 262ori $t1, $t1, %desc_lo12(foo) 263# RELOC: R_LARCH_TLS_DESC_LO12 foo 0x0 264# INSTR: ori $t1, $t1, %desc_lo12(foo) 265# FIXUP: fixup A - offset: 0, value: %desc_lo12(foo), kind: FK_NONE 266 267lu32i.d $t1, %desc64_lo20(foo) 268# RELOC: R_LARCH_TLS_DESC64_LO20 foo 0x0 269# INSTR: lu32i.d $t1, %desc64_lo20(foo) 270# FIXUP: fixup A - offset: 0, value: %desc64_lo20(foo), kind: FK_NONE 271 272lu52i.d $t1, $t1, %desc64_hi12(foo) 273# RELOC: R_LARCH_TLS_DESC64_HI12 foo 0x0 274# INSTR: lu52i.d $t1, $t1, %desc64_hi12(foo) 275# FIXUP: fixup A - offset: 0, value: %desc64_hi12(foo), kind: FK_NONE 276 277lu12i.w $t1, %le_hi20_r(foo) 278# RELOC: R_LARCH_TLS_LE_HI20_R foo 0x0 279# INSTR: lu12i.w $t1, %le_hi20_r(foo) 280# FIXUP: fixup A - offset: 0, value: %le_hi20_r(foo), kind: FK_NONE 281 282add.d $t1, $t2, $tp, %le_add_r(foo) 283# RELOC: R_LARCH_TLS_LE_ADD_R foo 0x0 284# INSTR: add.d $t1, $t2, $tp, %le_add_r(foo) 285# FIXUP: fixup A - offset: 0, value: %le_add_r(foo), kind: FK_NONE 286 287addi.d $t1, $a2, %le_lo12_r(foo) 288# RELOC: R_LARCH_TLS_LE_LO12_R foo 0x0 289# INSTR: addi.d $t1, $a2, %le_lo12_r(foo) 290# FIXUP: fixup A - offset: 0, value: %le_lo12_r(foo), kind: FK_NONE 291 292pcaddi $t1, %pcrel_20(foo) 293# RELOC: R_LARCH_PCREL20_S2 foo 0x0 294# INSTR: pcaddi $t1, %pcrel_20(foo) 295# FIXUP: fixup A - offset: 0, value: %pcrel_20(foo), kind: FK_NONE 296 297pcaddi $t1, %ld_pcrel_20(foo) 298# RELOC: R_LARCH_TLS_LD_PCREL20_S2 foo 0x0 299# INSTR: pcaddi $t1, %ld_pcrel_20(foo) 300# FIXUP: fixup A - offset: 0, value: %ld_pcrel_20(foo), kind: FK_NONE 301 302pcaddi $t1, %gd_pcrel_20(foo) 303# RELOC: R_LARCH_TLS_GD_PCREL20_S2 foo 0x0 304# INSTR: pcaddi $t1, %gd_pcrel_20(foo) 305# FIXUP: fixup A - offset: 0, value: %gd_pcrel_20(foo), kind: FK_NONE 306 307pcaddi $t1, %desc_pcrel_20(foo) 308# RELOC: R_LARCH_TLS_DESC_PCREL20_S2 foo 0x0 309# INSTR: pcaddi $t1, %desc_pcrel_20(foo) 310# FIXUP: fixup A - offset: 0, value: %desc_pcrel_20(foo), kind: FK_NONE 311