[PATCH] D57743: [LLD][ELF][ARM] Add test case that will fail if toPlt() is removed [NFC]

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 5 03:36:16 PST 2019


peter.smith created this revision.
peter.smith added reviewers: ruiu, grimar, pcc.
Herald added subscribers: kristof.beyls, arichardson, javed.absar, emaste.
Herald added a reviewer: espindola.

When a thunk is created to a PLT entry, the call to the thunk is converted to a non-plt expression with fromPlt(). If the thunk becomes unusable we retarget the relocation back to its original target and try again. When we do this we need to make sure that we restore the PLT form of the expression with toPlt().

      

This change adds a test case that will fail if toPlt() is removed. We need to have a call to a preemptible symbol defined within the link unit. If toPlt() is removed then the relocation to the thunk to the PLT entry for the preemptible symbol will be retargeted to the preemptible symbol itself instead of its PLT entry.

This test was suggested in D57371 <https://reviews.llvm.org/D57371>, as without this test toPlt() can be removed and no test will fail.


https://reviews.llvm.org/D57743

Files:
  test/ELF/arm-thunk-multipass-plt.s


Index: test/ELF/arm-thunk-multipass-plt.s
===================================================================
--- /dev/null
+++ test/ELF/arm-thunk-multipass-plt.s
@@ -0,0 +1,94 @@
+// REQUIRES: arm
+// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=armv5-none-linux-gnueabi %s -o %t
+// RUN: ld.lld %t -o %t2 --shared 2>&1
+// RUN: llvm-objdump --start-address=7340044 --stop-address=7340048 --triple=armv5-none-linux-gnueabi -d %t2 | FileCheck %s
+// RUN: llvm-objdump --start-address=8388620 --stop-address=8388624 --triple=thumbv5-none-linux-gnueabi -d %t2 | FileCheck %s -check-prefix=CHECK-CALL
+// RUN: llvm-objdump --start-address=13631520 --stop-address=13631584 --triple=armv5-none-linux-gnueabi -d %t2 | FileCheck %s -check-prefix=CHECK-PLT
+// When we create a thunk to a PLT entry the relocation is redirected to the
+// Thunk, changing its expression to a non-PLT equivalent. If the thunk
+// becomes unusable we need to restore the relocation expression to the PLT
+// form so that when we create a new thunk it targets the PLT.
+
+// Test case that checks the case:
+// - Thunk is created on pass 1 to a PLT entry for preemptible
+// - Some other Thunk added in the same pass moves the thunk to
+// preemptible out of range of its caller.
+// - New Thunk is created on pass 2 to PLT entry for preemptible
+
+        .globl preemptible
+        .globl preemptible2
+.section .text.01, "ax", %progbits
+.balign 0x100000
+        .thumb
+        .globl needsplt
+        .type needsplt, %function
+needsplt:
+        bl preemptible
+        .section .text.02, "ax", %progbits
+        .space (1024 * 1024)
+
+        .section .text.03, "ax", %progbits
+        .space (1024 * 1024)
+
+        .section .text.04, "ax", %progbits
+        .space (1024 * 1024)
+
+        .section .text.05, "ax", %progbits
+        .space (1024 * 1024)
+
+        .section .text.06, "ax", %progbits
+        .space (1024 * 1024)
+
+        .section .text.07, "ax", %progbits
+        .space (1024 * 1024)
+// 0x70000c + 8 + 0x60002c = 0xd00040 = preemptible at plt
+// CHECK: 000000000070000c __ARMV5PILongThunk_preemptible:
+// CHECK-NEXT:   70000c:        0b 00 18 ea     b       #6291500
+
+        .section .text.08, "ax", %progbits
+        .space (1024 * 1024) - 4
+
+        .section .text.10, "ax", %progbits
+        .balign 2
+        bl preemptible
+        bl preemptible2
+// 0x80000c + 4 - 100004 = 0x70000c = __ARMv5PILongThunk_preemptible
+// CHECK-CALL: 80000c:   ff f6 fe ef     blx     #-1048580
+        .balign 2
+        .globl preemptible
+        .type preemptible, %function
+preemptible:
+        bx lr
+        .globl preemptible2
+        .type preemptible2, %function
+preemptible2:
+        bx lr
+
+
+        .section .text.11, "ax", %progbits
+        .space (5 * 1024 * 1024)
+
+
+// CHECK-PLT: Disassembly of section .plt:
+// CHECK-PLT-NEXT: 0000000000d00020 $a:
+// CHECK-PLT-NEXT:   d00020:    04 e0 2d e5     str     lr, [sp, #-4]!
+// CHECK-PLT-NEXT:   d00024:    00 e6 8f e2     add     lr, pc, #0, #12
+// CHECK-PLT-NEXT:   d00028:    00 ea 8e e2     add     lr, lr, #0, #20
+// CHECK-PLT-NEXT:   d0002c:    dc ff be e5     ldr     pc, [lr, #4060]!
+// CHECK-PLT: 0000000000d00030 $d:
+// CHECK-PLT-NEXT:   d00030:    d4 d4 d4 d4     .word   0xd4d4d4d4
+// CHECK-PLT-NEXT:   d00034:    d4 d4 d4 d4     .word   0xd4d4d4d4
+// CHECK-PLT-NEXT:   d00038:    d4 d4 d4 d4     .word   0xd4d4d4d4
+// CHECK-PLT-NEXT:   d0003c:    d4 d4 d4 d4     .word   0xd4d4d4d4
+// CHECK-PLT: 0000000000d00040 $a:
+// CHECK-PLT-NEXT:   d00040:    00 c6 8f e2     add     r12, pc, #0, #12
+// CHECK-PLT-NEXT:   d00044:    00 ca 8c e2     add     r12, r12, #0, #20
+// CHECK-PLT-NEXT:   d00048:    c4 ff bc e5     ldr     pc, [r12, #4036]!
+// CHECK-PLT: 0000000000d0004c $d:
+// CHECK-PLT-NEXT:   d0004c:    d4 d4 d4 d4     .word   0xd4d4d4d4
+// CHECK-PLT: 0000000000d00050 $a:
+// CHECK-PLT-NEXT:   d00050:    00 c6 8f e2     add     r12, pc, #0, #12
+// CHECK-PLT-NEXT:   d00054:    00 ca 8c e2     add     r12, r12, #0, #20
+// CHECK-PLT-NEXT:   d00058:    b8 ff bc e5     ldr     pc, [r12, #4024]!
+// CHECK-PLT: 0000000000d0005c $d:
+// CHECK-PLT-NEXT:   d0005c:    d4 d4 d4 d4     .word   0xd4d4d4d4


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57743.185271.patch
Type: text/x-patch
Size: 4230 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190205/466c63a2/attachment.bin>


More information about the llvm-commits mailing list