This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

powerpc32: make PLT call in _mcount compatible with -msecure-plt (bug 20554)


This fixes _mcount on powerpc32 so that it doesn't force bss-plt.
Tested by running the profiling tests from the gcc testsuite which were
skipped without this change do to the linker message.  Installed on
master.

Andreas.

	[BZ #20554]
	* sysdeps/powerpc/powerpc32/ppc-mcount.S (_mcount)
	[PIC && !SHARED]: Set up PIC register for PLT call.
---
 sysdeps/powerpc/powerpc32/ppc-mcount.S | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/sysdeps/powerpc/powerpc32/ppc-mcount.S b/sysdeps/powerpc/powerpc32/ppc-mcount.S
index 68df440cf3..1d36b91243 100644
--- a/sysdeps/powerpc/powerpc32/ppc-mcount.S
+++ b/sysdeps/powerpc/powerpc32/ppc-mcount.S
@@ -40,22 +40,38 @@
 */
 
 ENTRY(_mcount)
+#if defined PIC && !defined SHARED
+# define CALLER_LR_OFFSET 68
+	stwu	r1,-64(r1)
+	cfi_adjust_cfa_offset (64)
+	stw	r30, 48(r1)
+	cfi_rel_offset (r30, 48)
+#else
+# define CALLER_LR_OFFSET 52
 	stwu	r1,-48(r1)
 	cfi_adjust_cfa_offset (48)
+#endif
 /* We need to save the parameter-passing registers.  */
 	stw	r3, 12(r1)
 	stw	r4, 16(r1)
 	stw	r5, 20(r1)
 	stw	r6, 24(r1)
 	mflr	r4
-	lwz	r3, 52(r1)
+#if defined PIC && !defined SHARED
+	bcl	20,31,0f
+0:
+	mflr	r30
+	addis	r30, r30, _GLOBAL_OFFSET_TABLE_-0b@ha
+	addi	r30, r30, _GLOBAL_OFFSET_TABLE_-0b@l
+#endif
+	lwz	r3, CALLER_LR_OFFSET(r1)
 	mfcr	r5
 	stw	r7, 28(r1)
 	stw	r8, 32(r1)
 	stw	r9, 36(r1)
 	stw	r10,40(r1)
 	stw	r4, 44(r1)
-	cfi_offset (lr, -4)
+	cfi_rel_offset (lr, 44)
 	stw	r5,  8(r1)
 #ifndef SHARED
 	bl	JUMPTARGET(__mcount_internal)
@@ -71,13 +87,18 @@ ENTRY(_mcount)
 	mtcrf	0xff,r6
 	lwz	r5, 20(r1)
 	lwz	r6, 24(r1)
-	lwz	r0, 52(r1)
+	lwz	r0, CALLER_LR_OFFSET(r1)
 	lwz	r7, 28(r1)
 	lwz	r8, 32(r1)
 	mtlr	r0
 	lwz	r9, 36(r1)
 	lwz	r10,40(r1)
  /* ...unwind the stack frame, and return to your usual programming.  */
+#if defined PIC && !defined SHARED
+	lwz	r30, 48(r1)
+	addi	r1,r1,64
+#else
 	addi	r1,r1,48
+#endif
 	bctr
 END(_mcount)
-- 
2.10.1

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]