Home | History | Annotate | Download | only in AArch64
      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