1# RUN: llvm-mc --triple=loongarch64 %s | FileCheck %s 2# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=-relax %s -o %t 3# RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=RELOC 4# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.relax 5# RUN: llvm-readobj -r %t.relax | FileCheck %s --check-prefixes=RELOC,RELAX 6# RUN: llvm-mc --triple=loongarch64 --mattr=+la-global-with-abs \ 7# RUN: %s | FileCheck %s --check-prefix=ABS 8# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+la-global-with-abs \ 9# RUN: --mattr=-relax %s -o %t 10# RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=GTOABS-RELOC 11# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+la-global-with-abs \ 12# RUN: --mattr=+relax %s -o %t.relax 13# RUN: llvm-readobj -r %t.relax | FileCheck %s --check-prefixes=GTOABS-RELOC,GTOABS-RELAX 14 15# RELOC: Relocations [ 16# RELOC-NEXT: Section ({{.*}}) .rela.text { 17 18la.abs $a0, sym_abs 19# CHECK: lu12i.w $a0, %abs_hi20(sym_abs) 20# CHECK-NEXT: ori $a0, $a0, %abs_lo12(sym_abs) 21# CHECK-NEXT: lu32i.d $a0, %abs64_lo20(sym_abs) 22# CHECK-NEXT: lu52i.d $a0, $a0, %abs64_hi12(sym_abs) 23# CHECK-EMPTY: 24# ABS: lu12i.w $a0, %abs_hi20(sym_abs) 25# ABS-NEXT: ori $a0, $a0, %abs_lo12(sym_abs) 26# ABS-NEXT: lu32i.d $a0, %abs64_lo20(sym_abs) 27# ABS-NEXT: lu52i.d $a0, $a0, %abs64_hi12(sym_abs) 28# ABS-EMPTY: 29# RELOC-NEXT: R_LARCH_ABS_HI20 sym_abs 0x0 30# RELOC-NEXT: R_LARCH_ABS_LO12 sym_abs 0x0 31# RELOC-NEXT: R_LARCH_ABS64_LO20 sym_abs 0x0 32# RELOC-NEXT: R_LARCH_ABS64_HI12 sym_abs 0x0 33 34la.pcrel $a0, sym_pcrel 35# CHECK-NEXT: pcalau12i $a0, %pc_hi20(sym_pcrel) 36# CHECK-NEXT: addi.d $a0, $a0, %pc_lo12(sym_pcrel) 37# CHECK-EMPTY: 38# ABS-NEXT: pcalau12i $a0, %pc_hi20(sym_pcrel) 39# ABS-NEXT: addi.d $a0, $a0, %pc_lo12(sym_pcrel) 40# ABS-EMPTY: 41# RELOC-NEXT: R_LARCH_PCALA_HI20 sym_pcrel 0x0 42# RELAX-NEXT: R_LARCH_RELAX - 0x0 43# RELOC-NEXT: R_LARCH_PCALA_LO12 sym_pcrel 0x0 44# RELAX-NEXT: R_LARCH_RELAX - 0x0 45# GTOABS-RELOC: R_LARCH_PCALA_HI20 sym_pcrel 0x0 46# GTOABS-RELAX-NEXT: R_LARCH_RELAX - 0x0 47# GTOABS-RELOC-NEXT: R_LARCH_PCALA_LO12 sym_pcrel 0x0 48# GTOABS-RELAX-NEXT: R_LARCH_RELAX - 0x0 49 50la.got $a0, sym_got 51# CHECK-NEXT: pcalau12i $a0, %got_pc_hi20(sym_got) 52# CHECK-NEXT: ld.d $a0, $a0, %got_pc_lo12(sym_got) 53# CHECK-EMPTY: 54# ABS-NEXT: lu12i.w $a0, %got_hi20(sym_got) 55# ABS-NEXT: ori $a0, $a0, %got_lo12(sym_got) 56# ABS-NEXT: lu32i.d $a0, %got64_lo20(sym_got) 57# ABS-NEXT: lu52i.d $a0, $a0, %got64_hi12(sym_got) 58# ABS-NEXT: ld.d $a0, $a0, 0 59# ABS-EMPTY: 60# RELOC-NEXT: R_LARCH_GOT_PC_HI20 sym_got 0x0 61# RELAX-NEXT: R_LARCH_RELAX - 0x0 62# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_got 0x0 63# RELAX-NEXT: R_LARCH_RELAX - 0x0 64 65la.tls.le $a0, sym_le 66# CHECK-NEXT: lu12i.w $a0, %le_hi20(sym_le) 67# CHECK-NEXT: ori $a0, $a0, %le_lo12(sym_le) 68# CHECK-EMPTY: 69# ABS-NEXT: lu12i.w $a0, %le_hi20(sym_le) 70# ABS-NEXT: ori $a0, $a0, %le_lo12(sym_le) 71# ABS-EMPTY: 72# RELOC-NEXT: R_LARCH_TLS_LE_HI20 sym_le 0x0 73# RELOC-NEXT: R_LARCH_TLS_LE_LO12 sym_le 0x0 74 75la.tls.ie $a0, sym_ie 76# CHECK-NEXT: pcalau12i $a0, %ie_pc_hi20(sym_ie) 77# CHECK-NEXT: ld.d $a0, $a0, %ie_pc_lo12(sym_ie) 78# CHECK-EMPTY: 79# ABS-NEXT: lu12i.w $a0, %ie_hi20(sym_ie) 80# ABS-NEXT: ori $a0, $a0, %ie_lo12(sym_ie) 81# ABS-NEXT: lu32i.d $a0, %ie64_lo20(sym_ie) 82# ABS-NEXT: lu52i.d $a0, $a0, %ie64_hi12(sym_ie) 83# ABS-NEXT: ld.d $a0, $a0, 0 84# ABS-EMPTY: 85# RELOC-NEXT: R_LARCH_TLS_IE_PC_HI20 sym_ie 0x0 86# RELAX-NEXT: R_LARCH_RELAX - 0x0 87# RELOC-NEXT: R_LARCH_TLS_IE_PC_LO12 sym_ie 0x0 88# RELAX-NEXT: R_LARCH_RELAX - 0x0 89 90la.tls.ld $a0, sym_ld 91# CHECK-NEXT: pcalau12i $a0, %ld_pc_hi20(sym_ld) 92# CHECK-NEXT: addi.d $a0, $a0, %got_pc_lo12(sym_ld) 93# CHECK-EMPTY: 94# ABS-NEXT: lu12i.w $a0, %ld_hi20(sym_ld) 95# ABS-NEXT: ori $a0, $a0, %got_lo12(sym_ld) 96# ABS-NEXT: lu32i.d $a0, %got64_lo20(sym_ld) 97# ABS-NEXT: lu52i.d $a0, $a0, %got64_hi12(sym_ld) 98# ABS-EMPTY: 99# RELOC-NEXT: R_LARCH_TLS_LD_PC_HI20 sym_ld 0x0 100# RELAX-NEXT: R_LARCH_RELAX - 0x0 101# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_ld 0x0 102# RELAX-NEXT: R_LARCH_RELAX - 0x0 103 104la.tls.gd $a0, sym_gd 105# CHECK-NEXT: pcalau12i $a0, %gd_pc_hi20(sym_gd) 106# CHECK-NEXT: addi.d $a0, $a0, %got_pc_lo12(sym_gd) 107# CHECK-EMPTY: 108# ABS-NEXT: lu12i.w $a0, %gd_hi20(sym_gd) 109# ABS-NEXT: ori $a0, $a0, %got_lo12(sym_gd) 110# ABS-NEXT: lu32i.d $a0, %got64_lo20(sym_gd) 111# ABS-NEXT: lu52i.d $a0, $a0, %got64_hi12(sym_gd) 112# ABS-EMPTY: 113# RELOC-NEXT: R_LARCH_TLS_GD_PC_HI20 sym_gd 0x0 114# RELAX-NEXT: R_LARCH_RELAX - 0x0 115# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_gd 0x0 116# RELAX-NEXT: R_LARCH_RELAX - 0x0 117 118la.tls.desc $a0, sym_desc 119# CHECK-NEXT: pcalau12i $a0, %desc_pc_hi20(sym_desc) 120# CHECK-NEXT: addi.d $a0, $a0, %desc_pc_lo12(sym_desc) 121# CHECK-NEXT: ld.d $ra, $a0, %desc_ld(sym_desc) 122# CHECK-NEXT: jirl $ra, $ra, %desc_call(sym_desc) 123# CHECK-EMPTY: 124# ABS-NEXT: lu12i.w $a0, %desc_hi20(sym_desc) 125# ABS-NEXT: ori $a0, $a0, %desc_lo12(sym_desc) 126# ABS-NEXT: lu32i.d $a0, %desc64_lo20(sym_desc) 127# ABS-NEXT: lu52i.d $a0, $a0, %desc64_hi12(sym_desc) 128# ABS-NEXT: ld.d $ra, $a0, %desc_ld(sym_desc) 129# ABS-NEXT: jirl $ra, $ra, %desc_call(sym_desc) 130# ABS-EMPTY: 131# RELOC-NEXT: R_LARCH_TLS_DESC_PC_HI20 sym_desc 0x0 132# RELAX-NEXT: R_LARCH_RELAX - 0x0 133# RELOC-NEXT: R_LARCH_TLS_DESC_PC_LO12 sym_desc 0x0 134# RELAX-NEXT: R_LARCH_RELAX - 0x0 135# RELOC-NEXT: R_LARCH_TLS_DESC_LD sym_desc 0x0 136# RELAX-NEXT: R_LARCH_RELAX - 0x0 137# RELOC-NEXT: R_LARCH_TLS_DESC_CALL sym_desc 0x0 138# RELAX-NEXT: R_LARCH_RELAX - 0x0 139 140############################################################# 141## with a temporary register. 142############################################################# 143la.pcrel $a0, $a1, sym_pcrel_large 144# CHECK-NEXT: pcalau12i $a0, %pc_hi20(sym_pcrel_large) 145# CHECK-NEXT: addi.d $a1, $zero, %pc_lo12(sym_pcrel_large) 146# CHECK-NEXT: lu32i.d $a1, %pc64_lo20(sym_pcrel_large) 147# CHECK-NEXT: lu52i.d $a1, $a1, %pc64_hi12(sym_pcrel_large) 148# CHECK-NEXT: add.d $a0, $a0, $a1 149# CHECK-EMPTY: 150# RELOC-NEXT: R_LARCH_PCALA_HI20 sym_pcrel_large 0x0 151# RELOC-NEXT: R_LARCH_PCALA_LO12 sym_pcrel_large 0x0 152# RELOC-NEXT: R_LARCH_PCALA64_LO20 sym_pcrel_large 0x0 153# RELOC-NEXT: R_LARCH_PCALA64_HI12 sym_pcrel_large 0x0 154 155la.got $a0, $a1, sym_got_large 156# CHECK-NEXT: pcalau12i $a0, %got_pc_hi20(sym_got_large) 157# CHECK-NEXT: addi.d $a1, $zero, %got_pc_lo12(sym_got_large) 158# CHECK-NEXT: lu32i.d $a1, %got64_pc_lo20(sym_got_large) 159# CHECK-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(sym_got_large) 160# CHECK-NEXT: ldx.d $a0, $a0, $a1 161# CHECK-EMPTY: 162# RELOC-NEXT: R_LARCH_GOT_PC_HI20 sym_got_large 0x0 163# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_got_large 0x0 164# RELOC-NEXT: R_LARCH_GOT64_PC_LO20 sym_got_large 0x0 165# RELOC-NEXT: R_LARCH_GOT64_PC_HI12 sym_got_large 0x0 166 167la.tls.ie $a0, $a1, sym_ie_large 168# CHECK-NEXT: pcalau12i $a0, %ie_pc_hi20(sym_ie_large) 169# CHECK-NEXT: addi.d $a1, $zero, %ie_pc_lo12(sym_ie_large) 170# CHECK-NEXT: lu32i.d $a1, %ie64_pc_lo20(sym_ie_large) 171# CHECK-NEXT: lu52i.d $a1, $a1, %ie64_pc_hi12(sym_ie_large) 172# CHECK-NEXT: ldx.d $a0, $a0, $a1 173# CHECK-EMPTY: 174# RELOC-NEXT: R_LARCH_TLS_IE_PC_HI20 sym_ie_large 0x0 175# RELOC-NEXT: R_LARCH_TLS_IE_PC_LO12 sym_ie_large 0x0 176# RELOC-NEXT: R_LARCH_TLS_IE64_PC_LO20 sym_ie_large 0x0 177# RELOC-NEXT: R_LARCH_TLS_IE64_PC_HI12 sym_ie_large 0x0 178 179la.tls.ld $a0, $a1, sym_ld_large 180# CHECK-NEXT: pcalau12i $a0, %ld_pc_hi20(sym_ld_large) 181# CHECK-NEXT: addi.d $a1, $zero, %got_pc_lo12(sym_ld_large) 182# CHECK-NEXT: lu32i.d $a1, %got64_pc_lo20(sym_ld_large) 183# CHECK-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(sym_ld_large) 184# CHECK-NEXT: add.d $a0, $a0, $a1 185# CHECK-EMPTY: 186# RELOC-NEXT: R_LARCH_TLS_LD_PC_HI20 sym_ld_large 0x0 187# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_ld_large 0x0 188# RELOC-NEXT: R_LARCH_GOT64_PC_LO20 sym_ld_large 0x0 189# RELOC-NEXT: R_LARCH_GOT64_PC_HI12 sym_ld_large 0x0 190 191la.tls.gd $a0, $a1, sym_gd_large 192# CHECK-NEXT: pcalau12i $a0, %gd_pc_hi20(sym_gd_large) 193# CHECK-NEXT: addi.d $a1, $zero, %got_pc_lo12(sym_gd_large) 194# CHECK-NEXT: lu32i.d $a1, %got64_pc_lo20(sym_gd_large) 195# CHECK-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(sym_gd_large) 196# CHECK-NEXT: add.d $a0, $a0, $a1 197# CHECK-EMPTY: 198# RELOC-NEXT: R_LARCH_TLS_GD_PC_HI20 sym_gd_large 0x0 199# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_gd_large 0x0 200# RELOC-NEXT: R_LARCH_GOT64_PC_LO20 sym_gd_large 0x0 201# RELOC-NEXT: R_LARCH_GOT64_PC_HI12 sym_gd_large 0x0 202 203la.tls.desc $a0, $a1, sym_desc_large 204# CHECK-NEXT: pcalau12i $a0, %desc_pc_hi20(sym_desc_large) 205# CHECK-NEXT: addi.d $a1, $zero, %desc_pc_lo12(sym_desc_large) 206# CHECK-NEXT: lu32i.d $a1, %desc64_pc_lo20(sym_desc_large) 207# CHECK-NEXT: lu52i.d $a1, $a1, %desc64_pc_hi12(sym_desc_large) 208# CHECK-NEXT: add.d $a0, $a0, $a1 209# CHECK-NEXT: ld.d $ra, $a0, %desc_ld(sym_desc_large) 210# CHECK-NEXT: jirl $ra, $ra, %desc_call(sym_desc_large) 211# CHECK-EMPTY: 212# RELOC-NEXT: R_LARCH_TLS_DESC_PC_HI20 sym_desc_large 0x0 213# RELOC-NEXT: R_LARCH_TLS_DESC_PC_LO12 sym_desc_large 0x0 214# RELOC-NEXT: R_LARCH_TLS_DESC64_PC_LO20 sym_desc_large 0x0 215# RELOC-NEXT: R_LARCH_TLS_DESC64_PC_HI12 sym_desc_large 0x0 216# RELOC-NEXT: R_LARCH_TLS_DESC_LD sym_desc_large 0x0 217# RELOC-NEXT: R_LARCH_TLS_DESC_CALL sym_desc_large 0x0 218 219 220# RELOC-NEXT: } 221# RELOC-NEXT: ] 222