[PATCH] D52564: [PPC64] Add test for toc-restore on recursive call.

Sean Fertile via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 26 11:10:29 PDT 2018


sfertile created this revision.
sfertile added reviewers: MaskRay, ruiu, syzaara.
sfertile added a project: lld.
Herald added subscribers: jsji, kbarton, arichardson, nemanjai, emaste.
Herald added a reviewer: espindola.

A test verifying that  toc restores are properly inserted following recursive calls, as well as briefly describing why they are needed.

Prompted by the discussion in https://reviews.llvm.org/D46204 related to older builds of libstdc++.


Repository:
  rLLD LLVM Linker

https://reviews.llvm.org/D52564

Files:
  test/ELF/ppc64-toc-restore-recursive-call.s


Index: test/ELF/ppc64-toc-restore-recursive-call.s
===================================================================
--- /dev/null
+++ test/ELF/ppc64-toc-restore-recursive-call.s
@@ -0,0 +1,52 @@
+# REQUIRES: ppc
+
+# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t1.o
+# RUN: ld.lld -shared %t1.o -o %t
+# RUN: llvm-objdump -d -r %t | FileCheck %s
+
+# For a recursive call that is interposable the linker calls the plt-stub rather
+# then calling the function directly. Since the call is through a plt stub and
+# might be interposed with a different definition at runtime, a toc-restore is
+# required to follow the call.
+
+# The decision to use a plt-stub for the recursive call is not one I feel
+# strongly about either way. It was done because it matches what bfd and gold do
+# for recursive calls as well as keeps the logic for recursive calls consistent
+# with non-recursive calls.
+
+# CHECK-LABEL: __plt_recursive_func:
+# CHECK-NEXT: 10000:
+# CHECK-LABEL: recursive_func
+# CHECK-NEXT:  10014:
+# CHECK:       1003c: {{[0-9a-fA-F ]+}} bl .+67108804
+# CHECK-NEXT:  ld 2, 24(1)
+
+        .abiversion 2
+        .section ".text"
+        .p2align 2
+        .global recursive_func
+        .type recursive_func, @function
+recursive_func:
+.Lrf_gep:
+    addis 2, 12, .TOC.-.Lrf_gep at ha
+    addi  2, 2, .TOC.-.Lrf_gep at l
+    .localentry recursive_func, .-recursive_func
+    cmpldi 3, 2
+    blt   0, .Lend
+
+    mflr 0
+    std 0, 16(1)
+    stdu 1, -32(1)
+    addi 5, 3, -1
+    mulld 4, 4, 3
+    mr 3, 5
+    bl recursive_func
+    nop
+    mr 4, 3
+    addi 1, 1, 32
+    ld 0, 16(1)
+    mtlr 0
+
+.Lend:
+    extsw 3, 4
+    blr


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52564.167165.patch
Type: text/x-patch
Size: 1677 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180926/5c8b21c7/attachment.bin>


More information about the llvm-commits mailing list