185 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 --no-print-imm-hex -d --no-show-raw-insn %t | FileCheck %s14 15/// Test the various legal cases for the R_ARM_THM_PC12 relocation16/// Interesting things to note17/// Range is +- 4095 bytes18/// The Thumb bit for function symbols is ignored19/// The expression is S + A - Pa where Pa is AlignDown(PC, 4) so we will use20/// 2-byte nops to make some of the ldr instructions 2-byte aligned.21 .section .rodata.low, "a", %progbits22dat1:23 .byte 024dat2:25 .byte 126dat3:27 .byte 228dat4:29 .byte 330 31 .section .text.low, "ax", %progbits32 .balign 433 .global target134 .type target1, %function35target1:36 bx lr37 .type target2, %function38target2:39 bx lr40 41 .section .text.neg, "ax", %progbits42 .balign 443 .global _start44 .thumb_func45_start:46 nop47/// ldr r0, dat148 .inst.w 0xf85f000449 .reloc 2, R_ARM_THM_PC12, dat150/// ldr r1, dat251 .inst.w 0xf85f100452 .reloc 6, R_ARM_THM_PC12, dat253 nop54/// ldr r2, dat355 .inst.w 0xf85f200456 .reloc 0xc, R_ARM_THM_PC12, dat357/// ldr r3, dat458 .inst.w 0xf85f300459 .reloc 0x10, R_ARM_THM_PC12, dat460 61/// ldr r0, target162 .inst.w 0xf85f000463 .reloc 0x14, R_ARM_THM_PC12, target164 65 nop66/// ldr r1, target267 .inst.w 0xf85f100468 .reloc 0x1a, R_ARM_THM_PC12, target269 70 .section .text.pos, "ax", %progbits71 .balign 472 .global pos73 .thumb_func74pos:75/// ldr r2, target376 .inst.w 0xf85f200477 .reloc 0, R_ARM_THM_PC12, target378 nop79/// ldr r3, target480 .inst.w 0xf85f300481 .reloc 6, R_ARM_THM_PC12, target482 nop83/// ldr r0, dat584 .inst.w 0xf85f000485 .reloc 0xc, R_ARM_THM_PC12, dat586/// ldr r1, dat687 .inst.w 0xf85f100488 .reloc 0x10, R_ARM_THM_PC12, dat689 nop90/// ldr r2, dat791 .inst.w 0xf85f200492 .reloc 0x16, R_ARM_THM_PC12, dat793/// ldr r3, dat894 .inst.w 0xf85f300495 .reloc 0x1a, R_ARM_THM_PC12, dat896/// positive addend in instruction, all others are -4 (PC bias)97///ldr.w r4, dat5 + 898 .inst 0xf8df400499 .reloc 0x1e, R_ARM_THM_PC12, dat5100 101 .section .text.high, "ax", %progbits102 .balign 4103 .thumb_func104 .global target3105target3:106 bx lr107 .thumb_func108target4:109 bx lr110 111 .section .data.high, "aw", %progbits112dat5:113 .byte 0114dat6:115 .byte 1116dat7:117 .byte 2118dat8:119 .byte 3120 121// SYMS: Name: dat1122// SYMS-NEXT: Value: 0x8012123// SYMS: Name: dat2124// SYMS-NEXT: Value: 0x8013125// SYMS: Name: dat3126// SYMS-NEXT: Value: 0x8014127// SYMS: Name: dat4128// SYMS-NEXT: Value: 0x8015129 130// CHECK: 00008f00 <target1>:131// CHECK-NEXT: 8f00: bx lr132// CHECK: 00008f02 <target2>:133// CHECK-NEXT: 8f02: bx lr134 135// CHECK: 00009000 <_start>:136// CHECK-NEXT: 9000: nop137/// AlignDown(0x9002+4, 4) - 0xff2 = 0x8012138// CHECK-NEXT: 9002: ldr.w r0, [pc, #-4082]139/// AlignDown(0x9006+4, 4) - 0xff5 = 0x8013140// CHECK-NEXT: 9006: ldr.w r1, [pc, #-4085]141// CHECK-NEXT: 900a: nop142/// AlignDown(0x900c+4, 4) - 0xffc = 0x8014143// CHECK-NEXT: 900c: ldr.w r2, [pc, #-4092]144/// AlignDown(0x9010+4, 4) - 0xfff = 0x8015145// CHECK-NEXT: 9010: ldr.w r3, [pc, #-4095]146/// AlignDown(0x9014+4, 4) - 0x118 = 0x8f00147// CHECK-NEXT: 9014: ldr.w r0, [pc, #-280]148// CHECK-NEXT: 9018: nop149/// AlignDown(0x901a+4, 4) - 0x11a = 0x8f02150// CHECK-NEXT: 901a: ldr.w r1, [pc, #-282]151 152// CHECK: 00010000 <pos>:153/// AlignDown(0x10000+4, 4) + 0x1c = 0x10100154// CHECK-NEXT: 10000: ldr.w r2, [pc, #252]155// CHECK-NEXT: 10004: nop156/// AlignDown(0x10006+4, 4) + 0x1a = 0x10122157// CHECK-NEXT: 10006: ldr.w r3, [pc, #250]158// CHECK-NEXT: 1000a: nop159/// AlignDown(0x1000c+4, 4) + 0xfff = 0x1100f160// CHECK-NEXT: 1000c: ldr.w r0, [pc, #4095]161/// AlignDown(0x10010+4, 4) + 0xffc = 0x11010162// CHECK-NEXT: 10010: ldr.w r1, [pc, #4092]163// CHECK-NEXT: 10014: nop164/// AlignDown(0x10016+4, 4) + 0xff9 = 0x11011165// CHECK-NEXT: 10016: ldr.w r2, [pc, #4089]166/// AlignDown(0x1001a+4, 4) + 0xff6 = 0x11012167// CHECK-NEXT: 1001a: ldr.w r3, [pc, #4086]168/// AlignDown(0x1001e+4, 4) + 0xff7 = 0x11017 = dat5 + 8169// CHECK-NEXT: 1001e: ldr.w r4, [pc, #4087]170 171// CHECK: 00010100 <target3>:172// CHECK-NEXT: 10100: bx lr173 174// CHECK: 00010102 <target4>:175// CHECK-NEXT: 10102: bx lr176 177// SYMS: Name: dat5178// SYMS-NEXT: Value: 0x1100F179// SYMS: Name: dat6180// SYMS-NEXT: Value: 0x11010181// SYMS: Name: dat7182// SYMS-NEXT: Value: 0x11011183// SYMS: Name: dat8184// SYMS-NEXT: Value: 0x11012185