183 lines · plain
1// REQUIRES: arm2// RUN: llvm-mc --triple=thumbv7m-none-eabi --arm-add-build-attributes -filetype=obj -o %t.o %s3// RUN: echo "SECTIONS { \4// RUN: .rodata.low 0x8012 : { *(.rodata.low) } \5// RUN: .text.low 0x8f00 : { *(.text.low) } \6// RUN: .text.neg 0x9000 : { *(.text.neg) } \7// RUN: .text.pos 0x10000 : { *(.text.pos) } \8// RUN: .text.high 0x10100 : { *(.text.high) } \9// RUN: .data_high 0x1100f : { *(.data.high) } \10// RUN: } " > %t.script11// RUN: ld.lld --script %t.script %t.o -o %t12// RUN: llvm-readobj --symbols %t | FileCheck %s --check-prefix=SYMS13// RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s14 15/// Test the various legal cases for the R_ARM_THM_ALU_PREL_11_0 relocation16/// Interesting things to note17/// Range is +- 4095 bytes18/// The expression is S + A - Pa where Pa is AlignDown(PC, 4) so we will use19/// 2-byte nops to make some of the adr psuedo instructions 2-byte aligned.20 .section .rodata.low, "a", %progbits21dat1:22 .byte 023dat2:24 .byte 125dat3:26 .byte 227dat4:28 .byte 329 30 .section .text.low, "ax", %progbits31 .balign 432 .global target133 .type target1, %function34target1:35 bx lr36 .type target2, %function37target2:38 bx lr39 40 .section .text.neg, "ax", %progbits41 .balign 442 .global _start43 .thumb_func44_start:45 nop46/// adr.w r0, dat147 .inst.w 0xf2af000448 .reloc 2, R_ARM_THM_ALU_PREL_11_0, dat149/// adr.w r1, dat250 .inst.w 0xf2af010451 .reloc 6, R_ARM_THM_ALU_PREL_11_0, dat252 nop53/// adr.w r2, dat354 .inst.w 0xf2af020455 .reloc 0xc, R_ARM_THM_ALU_PREL_11_0, dat356/// adr.w r3, dat457 .inst.w 0xf2af030458 .reloc 0x10, R_ARM_THM_ALU_PREL_11_0, dat459/// adr.w r0, target160 .inst.w 0xf2af000461 .reloc 0x14, R_ARM_THM_ALU_PREL_11_0, target162 nop63/// adr.w r1, target264 .inst.w 0xf2af010465 .reloc 0x1a, R_ARM_THM_ALU_PREL_11_0, target266 .section .text.pos, "ax", %progbits67 .balign 468 .global pos69 .thumb_func70pos:71/// adr.w r2, target372 .inst.w 0xf2af020473 .reloc 0, R_ARM_THM_ALU_PREL_11_0, target374 nop75/// adr.w r3, target476 .inst.w 0xf2af030477 .reloc 6, R_ARM_THM_ALU_PREL_11_0, target478 nop79/// adr.w r0, dat580 .inst.w 0xf2af000481 .reloc 0xc, R_ARM_THM_ALU_PREL_11_0, dat582/// adr.w r1, dat683 .inst.w 0xf2af010484 .reloc 0x10, R_ARM_THM_ALU_PREL_11_0, dat685 86 nop87/// adr.w r2, dat788 .inst.w 0xf2af020489 .reloc 0x16, R_ARM_THM_ALU_PREL_11_0, dat790 91/// adr.w r3, dat892 .inst.w 0xf2af030493 .reloc 0x1a, R_ARM_THM_ALU_PREL_11_0, dat894/// positive addend in instruction, all others are -4 (PC bias)95/// adr.w r4, dat5 + 896 .inst.w 0xf20f040497 .reloc 0x1e, R_ARM_THM_ALU_PREL_11_0, dat5 + 898 99 .section .text.high, "ax", %progbits100 .balign 4101 .thumb_func102 .global target3103target3:104 bx lr105 .thumb_func106target4:107 bx lr108 109 .section .data.high, "aw", %progbits110dat5:111 .byte 0112dat6:113 .byte 1114dat7:115 .byte 2116dat8:117 .byte 3118 119// SYMS: Name: dat1120// SYMS-NEXT: Value: 0x8012121// SYMS: Name: dat2122// SYMS-NEXT: Value: 0x8013123// SYMS: Name: dat3124// SYMS-NEXT: Value: 0x8014125// SYMS: Name: dat4126// SYMS-NEXT: Value: 0x8015127 128// CHECK: 00008f00 <target1>:129// CHECK-NEXT: 8f00: bx lr130// CHECK: 00008f02 <target2>:131// CHECK-NEXT: 8f02: bx lr132 133// CHECK: 00009000 <_start>:134// CHECK-NEXT: 9000: nop135/// AlignDown(0x9002+4, 4) - 0xff2 = 0x8012136// CHECK-NEXT: 9002: adr.w r0, #-4082137/// AlignDown(0x9006+4, 4) - 0xff5 = 0x8013138// CHECK-NEXT: 9006: adr.w r1, #-4085139// CHECK-NEXT: 900a: nop140/// AlignDown(0x900c+4, 4) - 0xffc = 0x8014141// CHECK-NEXT: 900c: adr.w r2, #-4092142/// AlignDown(0x9010+4, 4) - 0xfff = 0x8015143// CHECK-NEXT: 9010: adr.w r3, #-4095144/// AlignDown(0x9014+4, 4) - 0x117 = 0x8f01145// CHECK-NEXT: 9014: adr.w r0, #-279146// CHECK-NEXT: 9018: nop147/// AlignDown(0x901a+4, 4) - 0x119 = 0x8f03148// CHECK-NEXT: 901a: adr.w r1, #-281149 150// CHECK: 00010000 <pos>:151/// AlignDown(0x10000+4, 4) + 0xfd = 0x10101152// CHECK-NEXT: 10000: adr.w r2, #253153// CHECK-NEXT: 10004: nop154/// AlignDown(0x10006+4, 4) + 0xfb = 0x10103155// CHECK-NEXT: 10006: adr.w r3, #251156// CHECK-NEXT: 1000a: nop157/// AlignDown(0x1000c+4, 4) + 0xfff = 0x1100f158// CHECK-NEXT: 1000c: adr.w r0, #4095159/// AlignDown(0x10010+4, 4) + 0xffc = 0x11010160// CHECK-NEXT: 10010: adr.w r1, #4092161// CHECK-NEXT: 10014: nop162/// AlignDown(0x10016+4, 4) + 0xff9 = 0x11011163// CHECK-NEXT: 10016: adr.w r2, #4089164/// AlignDown(0x1001a+4, 4) + 0xff6 = 0x11012165// CHECK-NEXT: 1001a: adr.w r3, #4086166/// AlignDown(0x1001e+4, 4) + 0xff7 = 0x11017 = dat5 + 8167// CHECK-NEXT: 1001e: adr.w r4, #4087168 169// CHECK: 00010100 <target3>:170// CHECK-NEXT: 10100: bx lr171 172// CHECK: 00010102 <target4>:173// CHECK-NEXT: 10102: bx lr174 175// SYMS: Name: dat5176// SYMS-NEXT: Value: 0x1100F177// SYMS: Name: dat6178// SYMS-NEXT: Value: 0x11010179// SYMS: Name: dat7180// SYMS-NEXT: Value: 0x11011181// SYMS: Name: dat8182// SYMS-NEXT: Value: 0x11012183