1// REQUIRES: arm 2// RUN: llvm-mc -filetype=obj -triple=armv7a-unknown-linux-gnueabi %s -o %t 3// RUN: ld.lld %t -o %t2 4// RUN: llvm-objdump -d %t2 --triple=armv7a-unknown-linux-gnueabi --no-show-raw-insn | FileCheck %s 5// RUN: llvm-mc -filetype=obj -triple=thumbv7a-unknown-linux-gnueabi %s -o %t3 6// RUN: ld.lld %t3 -o %t4 7// RUN: llvm-objdump -d %t4 --triple=thumbv7a-unknown-linux-gnueabi --no-show-raw-insn | FileCheck %s 8 9/// Test the following relocation pairs: 10/// * R_ARM_MOVW_ABS_NC and R_ARM_MOVT_ABS 11/// * R_ARM_MOVW_PREL_NC and R_ARM_MOVT_PREL 12/// * R_ARM_MOVW_BREL_NC and R_ARM_MOVT_BREL 13/// 14/// * R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_ABS 15/// * R_ARM_THM_MOVW_PREL_NC and R_ARM_THM_MOVT_PREL 16/// * R_ARM_THM_MOVW_BREL_NC and R_ARM_THM_MOVT_BREL 17 18 .syntax unified 19 .globl _start 20 .align 12 21_start: 22 .section .R_ARM_MOVW_ABS_NC, "ax",%progbits 23 .align 8 24 movw r0, :lower16:label 25 movw r1, :lower16:label1 26 movw r2, :lower16:label2 + 4 27 movw r3, :lower16:label3 28 movw r4, :lower16:label3 + 4 29// CHECK-LABEL: Disassembly of section .R_ARM_MOVW_ABS_NC 30// CHECK-EMPTY: 31// CHECK: 21000: movw r0, #0 32// CHECK: movw r1, #4 33// CHECK: movw r2, #12 34// CHECK: movw r3, #65532 35/// :lower16:label3 + 4 = :lower16:0x30000 = 0 36// CHECK: movw r4, #0 37 38 .section .R_ARM_MOVT_ABS, "ax",%progbits 39 .align 8 40 movt r0, :upper16:label 41 movt r1, :upper16:label1 42 movt r2, :upper16:label2 + 4 43 movt r3, :upper16:label3 44 movt r4, :upper16:label3 + 4 45// CHECK-LABEL: Disassembly of section .R_ARM_MOVT_ABS 46// CHECK-EMPTY: 47// CHECK: 21100: movt r0, #4 48// CHECK: movt r1, #4 49// CHECK: movt r2, #4 50// CHECK: movt r3, #4 51/// :upper16:label3 + 4 = :upper16:0x30000 = 3 52// CHECK: movt r4, #5 53 54.section .R_ARM_MOVW_PREL_NC, "ax",%progbits 55.align 8 56 movw r0, :lower16:label - . 57 movw r1, :lower16:label1 - . 58 movw r2, :lower16:label2 + 4 - . 59 movw r3, :lower16:label3 - . 60 movw r4, :lower16:label3 + 0x2214 - . 61// CHECK-LABEL: Disassembly of section .R_ARM_MOVW_PREL_NC 62// CHECK-EMPTY: 63/// :lower16:label - . = 56832 64// CHECK: 21200: movw r0, #60928 65/// :lower16:label1 - . = 56832 66// CHECK: movw r1, #60928 67/// :lower16:label2 - . + 4 = 60932 68// CHECK: movw r2, #60932 69/// :lower16:label3 - . = 60912 70// CHECK: movw r3, #60912 71/// :lower16:label3 - . + 0x2214 = :lower16:0x20000 = 4096 72// CHECK: movw r4, #4096 73 74.section .R_ARM_MOVT_PREL, "ax",%progbits 75.align 8 76 movt r0, :upper16:label - . 77 movt r1, :upper16:label1 - . 78 movt r2, :upper16:label2 + 0x4 - . 79 movt r3, :upper16:label3 - . 80 movt r4, :upper16:label3 + 0x2314 - . 81// CHECK-LABEL: Disassembly of section .R_ARM_MOVT_PREL 82// CHECK-EMPTY: 83/// :upper16:label - . = :upper16:0xdd00 = 1 84// CHECK: 21300: movt r0, #1 85/// :upper16:label1 - . = :upper16:0xdd00 = 1 86// CHECK: movt r1, #1 87/// :upper16:label2 - . + 4 = :upper16:0xdd04 = 1 88// CHECK: movt r2, #1 89/// :upper16:label3 - . = :upper16:0x1dcf0 = 2 90// CHECK: movt r3, #2 91/// :upper16:label3 - . + 0x2314 = :upper16:0x20000 = 3 92// CHECK: movt r4, #3 93 94.section .R_ARM_MOVW_BREL_NC, "ax",%progbits 95.align 8 96 movw r0, :lower16:label(sbrel) 97 movw r1, :lower16:label1(sbrel) 98 movw r2, :lower16:label2(sbrel) 99 movw r3, :lower16:label3(sbrel) 100 movw r4, :lower16:label3.4(sbrel) 101// CHECK-LABEL: Disassembly of section .R_ARM_MOVW_BREL_NC 102// CHECK-EMPTY: 103// SB = .destination 104/// :lower16:label - SB = 0 105// CHECK: 21400: movw r0, #0 106/// :lower16:label1 - SB = 4 107// CHECK: movw r1, #4 108/// :lower16:label2 - SB = 8 109// CHECK: movw r2, #8 110/// :lower16:label3 - SB = 0xfffc 111// CHECK: movw r3, #65532 112/// :lower16:label3.4 - SB = :lower16:0x10000 = 0 113// CHECK: movw r4, #0 114 115.section .R_ARM_MOVT_BREL, "ax",%progbits 116.align 8 117 movt r0, :upper16:label(sbrel) 118 movt r1, :upper16:label1(sbrel) 119 movt r2, :upper16:label2(sbrel) 120 movt r3, :upper16:label3(sbrel) 121 movt r4, :upper16:label3.4(sbrel) 122// CHECK-LABEL: Disassembly of section .R_ARM_MOVT_BREL 123// CHECK-EMPTY: 124// SB = .destination 125/// :upper16:label - SB = 0 126// CHECK: 21500: movt r0, #0 127/// :upper16:label1 - SB = 0 128// CHECK: movt r1, #0 129/// :upper16:label2 - SB = 0 130// CHECK: movt r2, #0 131/// :upper16:label3 - SB = 0 132// CHECK: movt r3, #0 133/// :upper16:label3.4 - SB = :upper16:0x10000 = 1 134// CHECK: movt r4, #1 135 136.section .R_ARM_THM_MOVW_ABS_NC, "ax",%progbits 137.align 8 138 movw r0, :lower16:label 139 movw r1, :lower16:label1 140 movw r2, :lower16:label2 + 4 141 movw r3, :lower16:label3 142 movw r4, :lower16:label3 + 4 143// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVW_ABS_NC 144// CHECK-EMPTY: 145// CHECK: 21600: movw r0, #0 146// CHECK: movw r1, #4 147// CHECK: movw r2, #12 148// CHECK: movw r3, #65532 149// CHECK: movw r4, #0 150 151.section .R_ARM_THM_MOVT_ABS, "ax",%progbits 152.align 8 153 movt r0, :upper16:label 154 movt r1, :upper16:label1 155 movt r2, :upper16:label2 + 4 156 movt r3, :upper16:label3 157 movt r4, :upper16:label3 + 4 158// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVT_ABS 159// CHECK-EMPTY: 160// CHECK: 21700: movt r0, #4 161// CHECK: movt r1, #4 162// CHECK: movt r2, #4 163// CHECK: movt r3, #4 164// CHECK: movt r4, #5 165 166.section .R_ARM_THM_MOVW_PREL_NC, "ax",%progbits 167.align 8 168 movw r0, :lower16:label - . 169 movw r1, :lower16:label1 - . 170 movw r2, :lower16:label2 + 4 - . 171 movw r3, :lower16:label3 - . 172 movw r4, :lower16:label3 + 0x2814 - . 173// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVW_PREL_NC 174// CHECK-EMPTY: 175/// :lower16:label - . = 59392 176// CHECK: 21800: movw r0, #59392 177/// :lower16:label1 - . = 59392 178// CHECK: movw r1, #59392 179/// :lower16:label2 - . + 4 = 59396 180// CHECK: movw r2, #59396 181/// :lower16:label3 - . = 59376 182// CHECK: movw r3, #59376 183/// :lower16:label3 - . + 0x2814 = 0x20000 184// CHECK: movw r4, #4096 185 186.section .R_ARM_THM_MOVT_PREL, "ax",%progbits 187.align 8 188 movt r0, :upper16:label - . 189 movt r1, :upper16:label1 - . 190 movt r2, :upper16:label2 + 0x4 - . 191 movt r3, :upper16:label3 - . 192 movt r4, :upper16:label3 + 0x2914 - . 193// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVT_PREL 194// CHECK-EMPTY: 195/// :upper16:label - . = :upper16:0xd700 = 1 196// CHECK: 21900: movt r0, #1 197/// :upper16:label1 - . = :upper16:0xd700 = 1 198// CHECK: movt r1, #1 199/// :upper16:label2 - . + 4 = :upper16:0xd704 = 1 200// CHECK: movt r2, #1 201/// :upper16:label3 - . = :upper16:0x1d6f0 = 2 202// CHECK: movt r3, #2 203/// :upper16:label3 - . + 0x2914 = :upper16:0x20000 = 3 204// CHECK: movt r4, #3 205 206.section .R_ARM_THM_MOVW_BREL_NC, "ax",%progbits 207.align 8 208 movw r0, :lower16:label(sbrel) 209 movw r1, :lower16:label1(sbrel) 210 movw r2, :lower16:label2(sbrel) 211 movw r3, :lower16:label3(sbrel) 212 movw r4, :lower16:label3.4(sbrel) 213// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVW_BREL_NC 214// CHECK-EMPTY: 215// SB = .destination 216/// :lower16:label - SB = 0 217// CHECK: 21a00: movw r0, #0 218/// :lower16:label1 - SB = 4 219// CHECK: movw r1, #4 220/// :lower16:label2 - SB = 8 221// CHECK: movw r2, #8 222/// :lower16:label3 - SB = 0xfffc 223// CHECK: movw r3, #65532 224/// :lower16:label3.4 - SB = :lower16:0x10000 = 0 225// CHECK: movw r4, #0 226 227.section .R_ARM_THM_MOVT_BREL, "ax",%progbits 228.align 8 229 movt r0, :upper16:label(sbrel) 230 movt r1, :upper16:label1(sbrel) 231 movt r2, :upper16:label2(sbrel) 232 movt r3, :upper16:label3(sbrel) 233 movt r4, :upper16:label3.4(sbrel) 234// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVT_BREL 235// CHECK-EMPTY: 236/// SB = .destination 237/// :upper16:label - SB = 0 238// CHECK: 21b00: movt r0, #0 239/// :upper16:label1 - SB = 0 240// CHECK: movt r1, #0 241/// :upper16:label2 - SB = 0 242// CHECK: movt r2, #0 243/// :upper16:label3 - SB = 0 244// CHECK: movt r3, #0 245/// :upper16:label3.4 - SB = :upper16:0x10000 = 1 246// CHECK: movt r4, #1 247 248 .section .destination, "aw",%progbits 249 .balign 65536 250/// 0x20000 251label: 252 .word 0 253/// 0x20004 254label1: 255 .word 1 256/// 0x20008 257label2: 258 .word 2 259/// Test label3 is immediately below 2^16 alignment boundary 260 .space 65536 - 16 261/// 0x2fffc 262label3: 263 .word 3 264/// label3 + 4 is on a 2^16 alignment boundary 265label3.4: 266 .word 4 267