brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 19520a6 Raw
90 lines · plain
1// REQUIRES: arm2// RUN: llvm-mc -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t3// RUN: llvm-mc -filetype=obj -triple=thumbv7a-none-linux-gnueabi %S/Inputs/arm-thumb-blx-targets.s -o %ttarget4// RUN: echo "SECTIONS { \5// RUN:          .R_ARM_CALL24_callee1 : { *(.R_ARM_CALL24_callee_low) } \6// RUN:          .R_ARM_CALL24_callee2 : { *(.R_ARM_CALL24_callee_thumb_low) } \7// RUN:          .caller : { *(.text) } \8// RUN:          .R_ARM_CALL24_callee3 : { *(.R_ARM_CALL24_callee_high) } \9// RUN:          .R_ARM_CALL24_callee4 : { *(.R_ARM_CALL24_callee_thumb_high) } } " > %t.script10// RUN: ld.lld --script %t.script %t %ttarget -o %t211// RUN: llvm-objdump -d %t2 | FileCheck %s12// Test BLX instruction is chosen for Thumb BL/BLX instruction and ARM callee13// 2 byte nops are used to test the pc-rounding behaviour. As a BLX from a14// 2 byte aligned destination is defined as Align(PC,4) + immediate:0015// FIXME: llvm-mc has problems assembling BLX unless the destination is16// external. The targets of the BL and BLX instructions are in arm-thumb-blx-target.s17 .syntax unified18 .section .text, "ax",%progbits19 .thumb20 .globl _start21 .balign 0x1000022 .type _start,%function23_start:24 blx  callee_low25 nop26 bl callee_low27 nop28 blx  callee_high29 nop30 bl callee_high31 nop32 blx  blx_far33 nop34 bl   blx_far35 nop36// Expect BLX to thumb target to be written out as a BL37 blx   callee_thumb_low38 nop39 blx   callee_thumb_high40 bx lr41 42// CHECK: Disassembly of section .R_ARM_CALL24_callee1:43// CHECK-EMPTY:44// CHECK-NEXT-ARM: callee_low:45// CHECK-NEXT-ARM:      b4:     1e ff 2f e1     bx      lr46 47// CHECK: Disassembly of section .R_ARM_CALL24_callee2:48// CHECK-EMPTY:49// CHECK-NEXT-THUMB: callee_thumb_low:50// CHECK-NEXT-THUMB:     100:	70 47 	bx	lr51 52// CHECK: Disassembly of section .caller:53// CHECK-EMPTY:54// CHECK: <_start>:55// Align(0x10000,4) - 0xff50 (65360) + 4 = 0xb4 = callee_low56// CHECK-NEXT-THUMB:   10000:       f0 f7 58 e8     blx     #-6536057// CHECK-NEXT-THUMB:   10004:       00 bf   nop58// Align(0x10006,4) - 0xff54 (65364) + 4 = 0xb4 = callee_low59// CHECK-NEXT-THUMB:   10006:       f0 f7 56 e8     blx     #-6536460// CHECK-NEXT-THUMB:   1000a:       00 bf   nop61// Align(0x1000c,4) + 0xf0 (240) + 4 = 0x10100 = callee_high62// CHECK-NEXT-THUMB:   1000c:   00 f0 78 e8     blx     #24063// CHECK-NEXT-THUMB:   10010:       00 bf   nop64// Align(0x10012,4) + 0xec (236) + 4 = 0x10100 = callee_high65// CHECK-NEXT-THUMB:   10012:       00 f0 76 e8     blx     #23666// CHECK-NEXT-THUMB:   10016:       00 bf   nop67// Align(0x10018,4) + 0xfffffc (16777212) = 0x1010018 = blx_far68// CHECK-NEXT-THUMB:   10018:       ff f3 fe c7     blx     #1677721269// CHECK-NEXT-THUMB:   1001c:       00 bf   nop70// Align(0x1001e,4) + 0xfffff8 (16777208) = 0x1010018 = blx_far71// CHECK-NEXT-THUMB:   1001e:       ff f3 fc c7     blx     #1677720872// CHECK-NEXT-THUMB:   10022:       00 bf   nop73// 10024 - 0xff28 (65320) + 4 = 0x100 = callee_thumb_low74// CHECK-NEXT-THUMB:   10024:       f0 f7 6c f8     bl      #-6532075// CHECK-NEXT-THUMB:   10028:       00 bf   nop76// 1002a + 0x1d2 (466) + 4 = 0x10200 = callee_thumb_high77// CHECK-NEXT-THUMB:   1002a:       00 f0 e9 f8     bl      #46678// CHECK-NEXT-THUMB:   1002e:       70 47   bx      lr79 80 81// CHECK: Disassembly of section .R_ARM_CALL24_callee3:82// CHECK-EMPTY:83// CHECK-NEXT-ARM: callee_high:84// CHECK-NEXT-ARM:   10100:     1e ff 2f e1     bx      lr85 86// CHECK: Disassembly of section .R_ARM_CALL24_callee4:87// CHECK-EMPTY:88// CHECK-NEXT-THUMB:callee_thumb_high:89// CHECK-NEXT-THUMB:   10200:   70 47   bx      lr90