1 // RUN: llvm-mc -triple=arm64-linux-gnu -o - < %s | FileCheck %s 2 // RUN: llvm-mc -triple=arm64-linux-gnu -filetype=obj < %s | llvm-objdump -triple=arm64-linux-gnu - -r | FileCheck %s --check-prefix=CHECK-OBJ 3 4 add x0, x2, #:lo12:sym 5 // CHECK: add x0, x2, :lo12:sym 6 // CHECK-OBJ: 0 R_AARCH64_ADD_ABS_LO12_NC sym 7 8 add x5, x7, #:dtprel_lo12:sym 9 // CHECK: add x5, x7, :dtprel_lo12:sym 10 // CHECK-OBJ: 4 R_AARCH64_TLSLD_ADD_DTPREL_LO12 sym 11 12 add x9, x12, #:dtprel_lo12_nc:sym 13 // CHECK: add x9, x12, :dtprel_lo12_nc:sym 14 // CHECK-OBJ: 8 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC sym 15 16 add x20, x30, #:tprel_lo12:sym 17 // CHECK: add x20, x30, :tprel_lo12:sym 18 // CHECK-OBJ: c R_AARCH64_TLSLE_ADD_TPREL_LO12 sym 19 20 add x9, x12, #:tprel_lo12_nc:sym 21 // CHECK: add x9, x12, :tprel_lo12_nc:sym 22 // CHECK-OBJ: 10 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC sym 23 24 add x5, x0, #:tlsdesc_lo12:sym 25 // CHECK: add x5, x0, :tlsdesc_lo12:sym 26 // CHECK-OBJ: 14 R_AARCH64_TLSDESC_ADD_LO12_NC sym 27 28 add x0, x2, #:lo12:sym+8 29 // CHECK: add x0, x2, :lo12:sym 30 // CHECK-OBJ: 18 R_AARCH64_ADD_ABS_LO12_NC sym+8 31 32 add x5, x7, #:dtprel_lo12:sym+1 33 // CHECK: add x5, x7, :dtprel_lo12:sym+1 34 // CHECK-OBJ: 1c R_AARCH64_TLSLD_ADD_DTPREL_LO12 sym+1 35 36 add x9, x12, #:dtprel_lo12_nc:sym+2 37 // CHECK: add x9, x12, :dtprel_lo12_nc:sym+2 38 // CHECK-OBJ:20 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC sym+2 39 40 add x20, x30, #:tprel_lo12:sym+12 41 // CHECK: add x20, x30, :tprel_lo12:sym+12 42 // CHECK-OBJ: 24 R_AARCH64_TLSLE_ADD_TPREL_LO12 sym+12 43 44 add x9, x12, #:tprel_lo12_nc:sym+54 45 // CHECK: add x9, x12, :tprel_lo12_nc:sym+54 46 // CHECK-OBJ: 28 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC sym+54 47 48 add x5, x0, #:tlsdesc_lo12:sym+70 49 // CHECK: add x5, x0, :tlsdesc_lo12:sym+70 50 // CHECK-OBJ: 2c R_AARCH64_TLSDESC_ADD_LO12_NC sym+70 51 52 .hword sym + 4 - . 53 // CHECK-OBJ: 30 R_AARCH64_PREL16 sym+4 54 .word sym - . + 8 55 // CHECK-OBJ: 32 R_AARCH64_PREL32 sym+8 56 .xword sym-. 57 // CHECK-OBJ: 36 R_AARCH64_PREL64 sym{{$}} 58 59 .hword sym 60 // CHECK-OBJ: 3e R_AARCH64_ABS16 sym 61 .word sym+1 62 // CHECK-OBJ: 40 R_AARCH64_ABS32 sym+1 63 .xword sym+16 64 // CHECK-OBJ: 44 R_AARCH64_ABS64 sym+16 65 66 adrp x0, sym 67 // CHECK: adrp x0, sym 68 // CHECK-OBJ: 4c R_AARCH64_ADR_PREL_PG_HI21 sym 69 70 adrp x15, :got:sym 71 // CHECK: adrp x15, :got:sym 72 // CHECK-OBJ: 50 R_AARCH64_ADR_GOT_PAGE sym 73 74 adrp x29, :gottprel:sym 75 // CHECK: adrp x29, :gottprel:sym 76 // CHECK-OBJ: 54 R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 sym 77 78 adrp x2, :tlsdesc:sym 79 // CHECK: adrp x2, :tlsdesc:sym 80 // CHECK-OBJ: 58 R_AARCH64_TLSDESC_ADR_PAGE21 sym 81 82 // LLVM is not competent enough to do this relocation because the 83 // page boundary could occur anywhere after linking. A relocation 84 // is needed. 85 adrp x3, trickQuestion 86 .global trickQuestion 87 trickQuestion: 88 // CHECK: adrp x3, trickQuestion 89 // CHECK-OBJ: 5c R_AARCH64_ADR_PREL_PG_HI21 trickQuestion 90 91 ldrb w2, [x3, :lo12:sym] 92 ldrsb w5, [x7, #:lo12:sym] 93 ldrsb x11, [x13, :lo12:sym] 94 ldr b17, [x19, #:lo12:sym] 95 // CHECK: ldrb w2, [x3, :lo12:sym] 96 // CHECK: ldrsb w5, [x7, :lo12:sym] 97 // CHECK: ldrsb x11, [x13, :lo12:sym] 98 // CHECK: ldr b17, [x19, :lo12:sym] 99 // CHECK-OBJ: R_AARCH64_LDST8_ABS_LO12_NC sym 100 // CHECK-OBJ: R_AARCH64_LDST8_ABS_LO12_NC sym 101 // CHECK-OBJ: R_AARCH64_LDST8_ABS_LO12_NC sym 102 // CHECK-OBJ: R_AARCH64_LDST8_ABS_LO12_NC sym 103 104 ldrb w23, [x29, #:dtprel_lo12_nc:sym] 105 ldrsb w23, [x19, #:dtprel_lo12:sym] 106 ldrsb x17, [x13, :dtprel_lo12_nc:sym] 107 ldr b11, [x7, #:dtprel_lo12:sym] 108 // CHECK: ldrb w23, [x29, :dtprel_lo12_nc:sym] 109 // CHECK: ldrsb w23, [x19, :dtprel_lo12:sym] 110 // CHECK: ldrsb x17, [x13, :dtprel_lo12_nc:sym] 111 // CHECK: ldr b11, [x7, :dtprel_lo12:sym] 112 // CHECK-OBJ: R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC sym 113 // CHECK-OBJ: R_AARCH64_TLSLD_LDST8_DTPREL_LO12 sym 114 // CHECK-OBJ: R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC sym 115 // CHECK-OBJ: R_AARCH64_TLSLD_LDST8_DTPREL_LO12 sym 116 117 ldrb w1, [x2, :tprel_lo12:sym] 118 ldrsb w3, [x4, #:tprel_lo12_nc:sym] 119 ldrsb x5, [x6, :tprel_lo12:sym] 120 ldr b7, [x8, #:tprel_lo12_nc:sym] 121 // CHECK: ldrb w1, [x2, :tprel_lo12:sym] 122 // CHECK: ldrsb w3, [x4, :tprel_lo12_nc:sym] 123 // CHECK: ldrsb x5, [x6, :tprel_lo12:sym] 124 // CHECK: ldr b7, [x8, :tprel_lo12_nc:sym] 125 // CHECK-OBJ: R_AARCH64_TLSLE_LDST8_TPREL_LO12 sym 126 // CHECK-OBJ: R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC sym 127 // CHECK-OBJ: R_AARCH64_TLSLE_LDST8_TPREL_LO12 sym 128 // CHECK-OBJ: R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC sym 129 130 ldrh w2, [x3, #:lo12:sym] 131 ldrsh w5, [x7, :lo12:sym] 132 ldrsh x11, [x13, #:lo12:sym] 133 ldr h17, [x19, :lo12:sym] 134 // CHECK: ldrh w2, [x3, :lo12:sym] 135 // CHECK: ldrsh w5, [x7, :lo12:sym] 136 // CHECK: ldrsh x11, [x13, :lo12:sym] 137 // CHECK: ldr h17, [x19, :lo12:sym] 138 // CHECK-OBJ: R_AARCH64_LDST16_ABS_LO12_NC sym 139 // CHECK-OBJ: R_AARCH64_LDST16_ABS_LO12_NC sym 140 // CHECK-OBJ: R_AARCH64_LDST16_ABS_LO12_NC sym 141 // CHECK-OBJ: R_AARCH64_LDST16_ABS_LO12_NC sym 142 143 ldrh w23, [x29, #:dtprel_lo12_nc:sym] 144 ldrsh w23, [x19, :dtprel_lo12:sym] 145 ldrsh x17, [x13, :dtprel_lo12_nc:sym] 146 ldr h11, [x7, #:dtprel_lo12:sym] 147 // CHECK: ldrh w23, [x29, :dtprel_lo12_nc:sym] 148 // CHECK: ldrsh w23, [x19, :dtprel_lo12:sym] 149 // CHECK: ldrsh x17, [x13, :dtprel_lo12_nc:sym] 150 // CHECK: ldr h11, [x7, :dtprel_lo12:sym] 151 // CHECK-OBJ: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC sym 152 // CHECK-OBJ: R_AARCH64_TLSLD_LDST16_DTPREL_LO12 sym 153 // CHECK-OBJ: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC sym 154 // CHECK-OBJ: R_AARCH64_TLSLD_LDST16_DTPREL_LO12 sym 155 156 ldrh w1, [x2, :tprel_lo12:sym] 157 ldrsh w3, [x4, #:tprel_lo12_nc:sym] 158 ldrsh x5, [x6, :tprel_lo12:sym] 159 ldr h7, [x8, #:tprel_lo12_nc:sym] 160 // CHECK: ldrh w1, [x2, :tprel_lo12:sym] 161 // CHECK: ldrsh w3, [x4, :tprel_lo12_nc:sym] 162 // CHECK: ldrsh x5, [x6, :tprel_lo12:sym] 163 // CHECK: ldr h7, [x8, :tprel_lo12_nc:sym] 164 // CHECK-OBJ: R_AARCH64_TLSLE_LDST16_TPREL_LO12 sym 165 // CHECK-OBJ: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC sym 166 // CHECK-OBJ: R_AARCH64_TLSLE_LDST16_TPREL_LO12 sym 167 // CHECK-OBJ: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC sym 168 169 ldr w1, [x2, #:lo12:sym] 170 ldrsw x3, [x4, #:lo12:sym] 171 ldr s4, [x5, :lo12:sym] 172 // CHECK: ldr w1, [x2, :lo12:sym] 173 // CHECK: ldrsw x3, [x4, :lo12:sym] 174 // CHECK: ldr s4, [x5, :lo12:sym] 175 // CHECK-OBJ: R_AARCH64_LDST32_ABS_LO12_NC sym 176 // CHECK-OBJ: R_AARCH64_LDST32_ABS_LO12_NC sym 177 // CHECK-OBJ: R_AARCH64_LDST32_ABS_LO12_NC sym 178 179 ldr w1, [x2, :dtprel_lo12:sym] 180 ldrsw x3, [x4, #:dtprel_lo12_nc:sym] 181 ldr s4, [x5, #:dtprel_lo12_nc:sym] 182 // CHECK: ldr w1, [x2, :dtprel_lo12:sym] 183 // CHECK: ldrsw x3, [x4, :dtprel_lo12_nc:sym] 184 // CHECK: ldr s4, [x5, :dtprel_lo12_nc:sym] 185 // CHECK-OBJ: R_AARCH64_TLSLD_LDST32_DTPREL_LO12 sym 186 // CHECK-OBJ: R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC sym 187 // CHECK-OBJ: R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC sym 188 189 190 ldr w1, [x2, #:tprel_lo12:sym] 191 ldrsw x3, [x4, :tprel_lo12_nc:sym] 192 ldr s4, [x5, :tprel_lo12_nc:sym] 193 // CHECK: ldr w1, [x2, :tprel_lo12:sym] 194 // CHECK: ldrsw x3, [x4, :tprel_lo12_nc:sym] 195 // CHECK: ldr s4, [x5, :tprel_lo12_nc:sym] 196 // CHECK-OBJ: R_AARCH64_TLSLE_LDST32_TPREL_LO12 sym 197 // CHECK-OBJ: R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC sym 198 // CHECK-OBJ: R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC sym 199 200 ldr x28, [x27, :lo12:sym] 201 ldr d26, [x25, #:lo12:sym] 202 // CHECK: ldr x28, [x27, :lo12:sym] 203 // CHECK: ldr d26, [x25, :lo12:sym] 204 // CHECK-OBJ: R_AARCH64_LDST64_ABS_LO12_NC sym 205 // CHECK-OBJ: R_AARCH64_LDST64_ABS_LO12_NC sym 206 207 ldr x24, [x23, #:got_lo12:sym] 208 ldr d22, [x21, :got_lo12:sym] 209 // CHECK: ldr x24, [x23, :got_lo12:sym] 210 // CHECK: ldr d22, [x21, :got_lo12:sym] 211 // CHECK-OBJ: R_AARCH64_LD64_GOT_LO12_NC sym 212 // CHECK-OBJ: R_AARCH64_LD64_GOT_LO12_NC sym 213 214 ldr x24, [x23, :dtprel_lo12_nc:sym] 215 ldr d22, [x21, #:dtprel_lo12:sym] 216 // CHECK: ldr x24, [x23, :dtprel_lo12_nc:sym] 217 // CHECK: ldr d22, [x21, :dtprel_lo12:sym] 218 // CHECK-OBJ: R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC sym 219 // CHECK-OBJ: R_AARCH64_TLSLD_LDST64_DTPREL_LO12 sym 220 221 ldr x24, [x23, #:tprel_lo12:sym] 222 ldr d22, [x21, :tprel_lo12_nc:sym] 223 // CHECK: ldr x24, [x23, :tprel_lo12:sym] 224 // CHECK: ldr d22, [x21, :tprel_lo12_nc:sym] 225 // CHECK-OBJ: R_AARCH64_TLSLE_LDST64_TPREL_LO12 sym 226 // CHECK-OBJ: R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC sym 227 228 ldr x24, [x23, :gottprel_lo12:sym] 229 ldr d22, [x21, #:gottprel_lo12:sym] 230 // CHECK: ldr x24, [x23, :gottprel_lo12:sym] 231 // CHECK: ldr d22, [x21, :gottprel_lo12:sym] 232 // CHECK-OBJ: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC sym 233 // CHECK-OBJ: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC sym 234 235 ldr x24, [x23, #:tlsdesc_lo12:sym] 236 ldr d22, [x21, :tlsdesc_lo12:sym] 237 // CHECK: ldr x24, [x23, :tlsdesc_lo12:sym] 238 // CHECK: ldr d22, [x21, :tlsdesc_lo12:sym] 239 // CHECK-OBJ: R_AARCH64_TLSDESC_LD64_LO12_NC sym 240 // CHECK-OBJ: R_AARCH64_TLSDESC_LD64_LO12_NC sym 241 242 ldr q20, [x19, #:lo12:sym] 243 // CHECK: ldr q20, [x19, :lo12:sym] 244 // CHECK-OBJ: R_AARCH64_LDST128_ABS_LO12_NC sym 245 246 // Since relocated instructions print without a '#', that syntax should 247 // certainly be accepted when assembling. 248 add x3, x5, :lo12:imm 249 // CHECK: add x3, x5, :lo12:imm 250