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

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


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

Re: [rfa] alpha sjlj vs pointer mangling


Here's a revised patch, also tested on i686 to be sure that the
iconvdata dso's don't get a DT_NEEDED for ld.so.


r~


2006-01-11  Richard Henderson  <rth@redhat.com>

	* iconvdata/extra-module.mk ($(objpfx)$(mod).so): Depend on ld.so;
	append --as-needed, if available, to LDFLAGS.so.
 	* sysdeps/alpha/__longjmp.S: Use PTR_DEMANGLE.
 	* sysdeps/alpha/setjmp.S: Likewise.  Avoid __sigjmp_save for rtld;
 	tailcall in libc.so.
 	* sysdeps/unix/alpha/sysdep.h (PTR_MANGLE): New.
 	(PTR_MANGLE2): New.

Index: iconvdata/extra-module.mk
===================================================================
RCS file: /cvs/glibc/libc/iconvdata/extra-module.mk,v
retrieving revision 1.4
diff -u -p -d -r1.4 extra-module.mk
--- iconvdata/extra-module.mk	26 Apr 2003 23:38:36 -0000	1.4
+++ iconvdata/extra-module.mk	11 Jan 2006 19:48:42 -0000
@@ -10,7 +10,15 @@ $(objpfx)$(mod).so: $(addprefix $(objpfx
 # Depend on libc.so so a DT_NEEDED is generated in the shared objects.
 # This ensures they will load libc.so for needed symbols if loaded by
 # a statically-linked program that hasn't already loaded it.
-$(objpfx)$(mod).so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a
+$(objpfx)$(mod).so: $(common-objpfx)libc.so \
+	$(common-objpfx)/elf/ld.so \
+	$(common-objpfx)libc_nonshared.a
+
+# Don't depend on ld.so if it isn't needed.  This is a sort-of big hammer
+# to use for this, but it's easiest to avoid mucking with the Makerules.
+ifeq ($(have-as-needed),yes)
+$(objpfx)$(mod).so: LDFLAGS.so += -Wl,--as-needed
+endif
 
 ifneq (,$(extra-modules-left))
 include extra-module.mk
Index: sysdeps/alpha/__longjmp.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/alpha/__longjmp.S,v
retrieving revision 1.3
diff -u -p -d -r1.3 __longjmp.S
--- sysdeps/alpha/__longjmp.S	6 Jul 2001 04:55:44 -0000	1.3
+++ sysdeps/alpha/__longjmp.S	11 Jan 2006 19:48:45 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1994, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1994, 1997, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -54,6 +54,11 @@ ENTRY(__longjmp)
 	ldt     $f7, JB_F7*8(a0)
 	ldt     $f8, JB_F8*8(a0)
 	ldt     $f9, JB_F9*8(a0)
+#ifdef PTR_DEMANGLE
+	PTR_DEMANGLE(ra, t1)
+	PTR_DEMANGLE2(t0, t1)
+	PTR_DEMANGLE2(fp, t1)
+#endif
 	cmoveq  v0, 1, v0
 	mov     t0, sp
 	ret
Index: sysdeps/alpha/setjmp.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/alpha/setjmp.S,v
retrieving revision 1.19
diff -u -p -d -r1.19 setjmp.S
--- sysdeps/alpha/setjmp.S	24 Jun 2003 16:29:21 -0000	1.19
+++ sysdeps/alpha/setjmp.S	11 Jan 2006 19:48:45 -0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 1992, 1994, 1996, 1997, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1994, 1996, 1997, 2002, 2006
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -23,16 +24,22 @@
 #define _SETJMP_H
 #include <bits/setjmp.h>
 
-       .ent __sigsetjmp
-       .global __sigsetjmp
+	.ent __sigsetjmp
+	.global __sigsetjmp
 __sigsetjmp:
-       ldgp    gp, 0(pv)
+	ldgp    gp, 0(pv)
 
 $sigsetjmp_local:
-       subq    sp, 16, sp
-       .frame  sp, 16, ra, 0
-       stq     ra, 0(sp)
-       .mask   0x04000000, -16
+#ifndef PIC
+#define FRAME	16	
+	subq    sp, FRAME, sp
+	.frame  sp, FRAME, ra, 0
+	stq     ra, 0(sp)
+	.mask   0x04000000, -FRAME
+#else
+#define FRAME	0
+	.frame	sp, FRAME, ra, 0
+#endif
 #ifdef PROF
 	.set noat
 	lda	AT, _mcount
@@ -47,10 +54,27 @@ $sigsetjmp_local:
 	stq	s3, JB_S3*8(a0)
 	stq	s4, JB_S4*8(a0)
 	stq	s5, JB_S5*8(a0)
+#ifdef PTR_MANGLE
+	PTR_MANGLE(t1, ra, t0)
+	stq	t1, JB_PC*8(a0)
+#else
 	stq	ra, JB_PC*8(a0)
-	addq	sp, 16, t0
+#endif
+#if defined(PTR_MANGLE) && FRAME == 0
+	PTR_MANGLE2(t1, sp, t0)
+#else
+	addq	sp, FRAME, t1
+# ifdef PTR_MANGLE
+	PTR_MANGLE2(t1, t1, t0)
+# endif
+#endif
+	stq	t1, JB_SP*8(a0)
+#ifdef PTR_MANGLE
+	PTR_MANGLE2(t1, fp, t0)
+	stq	t1, JB_FP*8(a0)
+#else
 	stq	fp, JB_FP*8(a0)
-	stq	t0, JB_SP*8(a0)
+#endif
 	stt	$f2, JB_F2*8(a0)
 	stt	$f3, JB_F3*8(a0)
 	stt	$f4, JB_F4*8(a0)
@@ -60,12 +84,20 @@ $sigsetjmp_local:
 	stt	$f8, JB_F8*8(a0)
 	stt	$f9, JB_F9*8(a0)
 
+#ifndef PIC
 	/* Call to C to (potentially) save our signal mask.  */
 	jsr	ra, __sigjmp_save
-
 	ldq	ra, 0(sp)
 	addq	sp, 16, sp
 	ret
+#elif defined NOT_IN_libc && defined IS_IN_rtld
+	/* In ld.so we never save the signal mask.  */
+	mov	0, v0
+	ret
+#else
+	/* Tailcall to save the signal mask.  */
+	br	$31, __sigjmp_save	!samegp
+#endif
 
 END(__sigsetjmp)
 
Index: sysdeps/unix/alpha/sysdep.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/alpha/sysdep.h,v
retrieving revision 1.27
diff -u -p -d -r1.27 sysdep.h
--- sysdeps/unix/alpha/sysdep.h	20 Sep 2005 05:35:42 -0000	1.27
+++ sysdeps/unix/alpha/sysdep.h	11 Jan 2006 19:48:47 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1995, 1996, 2000, 2003, 2004
+/* Copyright (C) 1992, 1995, 1996, 2000, 2003, 2004, 2006
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Brendan Kehoe (brendan@zen.org).
@@ -397,4 +397,42 @@ __LABEL(name)						\
 	_sc_ret = _sc_0, _sc_err = _sc_19;			\
 }
 
+/* Pointer mangling support.  Note that tls access is slow enough that
+   we don't deoptimize things by placing the pointer check value there.  */
+
+#include <stdint.h>
+
+#if defined NOT_IN_libc && defined IS_IN_rtld
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(dst, src, tmp)				\
+	ldah	tmp, __pointer_chk_guard_local($29) !gprelhigh;	\
+	ldq	tmp, __pointer_chk_guard_local(tmp) !gprellow;	\
+	xor	src, tmp, dst
+#  define PTR_MANGLE2(dst, src, tmp)				\
+	xor	src, tmp, dst
+#  define PTR_DEMANGLE(dst, tmp)   PTR_MANGLE(dst, dst, tmp)
+#  define PTR_DEMANGLE2(dst, tmp)  PTR_MANGLE2(dst, dst, tmp)
+# else
+extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
+#  define PTR_MANGLE(var)	\
+	(var) = (void *) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
+#  define PTR_DEMANGLE(var)  PTR_MANGLE(var)
+# endif
+#elif defined PIC
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(dst, src, tmp)		\
+	ldq	tmp, __pointer_chk_guard;	\
+	xor	src, tmp, dst
+#  define PTR_MANGLE2(dst, src, tmp)		\
+	xor	src, tmp, dst
+#  define PTR_DEMANGLE(dst, tmp)   PTR_MANGLE(dst, dst, tmp)
+#  define PTR_DEMANGLE2(dst, tmp)  PTR_MANGLE2(dst, dst, tmp)
+# else
+extern uintptr_t __pointer_chk_guard attribute_relro;
+#  define PTR_MANGLE(var)	\
+	(var) = (void *) ((uintptr_t) (var) ^ __pointer_chk_guard)
+#  define PTR_DEMANGLE(var)  PTR_MANGLE(var)
+# endif
+#endif
+
 #endif /* ASSEMBLER */


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