76 lines · plain
1# REQUIRES: hexagon2# RUN: rm -rf %t && split-file %s %t && cd %t3# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf external.s -o external.o4# RUN: ld.lld -shared external.o -soname external.so -o external.so5# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf main.s -o main.o6# RUN: ld.lld main.o external.so -o test7# RUN: llvm-objdump -d --no-show-raw-insn test | FileCheck %s8 9## Test thunk range scenarios for Hexagon R_HEX_PLT_B22_PCREL relocations.10## PLT calls use the same ±8MB range as regular calls but go through PLT entries.11## This test verifies thunk generation for PLT calls at range boundaries.12 13#--- external.s14.globl extern_within_range, extern_beyond_range, extern_close15.type extern_within_range, @function16.type extern_beyond_range, @function17.type extern_close, @function18 19extern_within_range:20 jumpr r3121 22extern_beyond_range:23 jumpr r3124 25extern_close:26 jumpr r3127 28#--- main.s29.globl _start30.type _start, @function31_start:32 ## Test PLT calls to external functions at various ranges33 call extern_within_range@PLT34 call extern_beyond_range@PLT35 call extern_close@PLT36 jumpr r3137 38.skip 0x20000039 40# CHECK: Disassembly of section .text:41# CHECK: <_start>:42# CHECK-NEXT: 2021c: { call 0x220250 <extern_within_range@plt> }43# CHECK-NEXT: { call 0x220260 <extern_beyond_range@plt> }44# CHECK-NEXT: { call 0x220270 <extern_close@plt> }45# CHECK-NEXT: { jumpr r31 }46 47## Verify PLT header and entries are created with exact addresses48# CHECK: Disassembly of section .plt:49# CHECK: <.plt>:50# CHECK-NEXT: 220230: { immext(#0x20080)51# CHECK-NEXT: r28 = add(pc,##0x200b8) }52# CHECK-NEXT: { r14 -= add(r28,#0x10)53# CHECK-NEXT: r15 = memw(r28+#0x8)54# CHECK-NEXT: r28 = memw(r28+#0x4) }55# CHECK-NEXT: { r14 = asr(r14,#0x2)56# CHECK-NEXT: jumpr r28 }57# CHECK-NEXT: { trap0(#0xdb) }58 59# CHECK: <extern_within_range@plt>:60# CHECK-NEXT: 220250: { immext(#0x20080)61# CHECK-NEXT: r14 = add(pc,##0x200a8) }62# CHECK-NEXT: { r28 = memw(r14+#0x0) }63# CHECK-NEXT: { jumpr r28 }64 65# CHECK: <extern_beyond_range@plt>:66# CHECK-NEXT: 220260: { immext(#0x20080)67# CHECK-NEXT: r14 = add(pc,##0x2009c) }68# CHECK-NEXT: { r28 = memw(r14+#0x0) }69# CHECK-NEXT: { jumpr r28 }70 71# CHECK: <extern_close@plt>:72# CHECK-NEXT: 220270: { immext(#0x20080)73# CHECK-NEXT: r14 = add(pc,##0x20090) }74# CHECK-NEXT: { r28 = memw(r14+#0x0) }75# CHECK-NEXT: { jumpr r28 }76