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