From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26642 invoked by alias); 10 Jan 2006 00:35:34 -0000 Received: (qmail 26626 invoked by uid 22791); 10 Jan 2006 00:35:34 -0000 X-Spam-Check-By: sourceware.org Received: from are.twiddle.net (HELO are.twiddle.net) (64.81.246.98) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 10 Jan 2006 00:35:31 +0000 Received: from are.twiddle.net (localhost.localdomain [127.0.0.1]) by are.twiddle.net (8.12.11/8.12.11) with ESMTP id k0A0ZPWx016475 for ; Mon, 9 Jan 2006 16:35:25 -0800 Received: (from rth@localhost) by are.twiddle.net (8.12.11/8.12.11/Submit) id k0A0ZHjG016474 for libc-hacker@sources.redhat.com; Mon, 9 Jan 2006 16:35:17 -0800 Date: Tue, 10 Jan 2006 00:35:00 -0000 From: Richard Henderson To: libc-hacker@sources.redhat.com Subject: [rfa] alpha sjlj vs pointer mangling Message-ID: <20060110003517.GA16111@twiddle.net> Mail-Followup-To: libc-hacker@sources.redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2006-01/txt/msg00038.txt.bz2 For Alpha, it's faster to access through got than through thread pointer. So I'd rather rely on __pointer_chk_guard{,_local} than have to manage setting up a local thread base pointer. This does cause one complication -- the iconvdata libraries use one of the objects that does a pointer check, and thus must be linked against ld.so to get that resolved. This isn't strictly needed for other targets, so I wonder what the best way to avoid this is? Unless of course we already default to --as-needed? r~ 2006-01-09 Richard Henderson * iconvdata/extra-module.mk ($(objpfx)$(mod).so): Depend on ld.so. * sysdeps/alpha/__longjmp.S: Use PTR_DEMANGLE. * sysdeps/alpha/setjmp.S: Likewise. Avoid __sigjmp_save for rtld; tailcall in libc.so. * sysdeps/unix/sysv/linux/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 9 Jan 2006 23:05:58 -0000 @@ -10,7 +10,9 @@ $(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 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 9 Jan 2006 23:06:01 -0000 @@ -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 9 Jan 2006 23:06:01 -0000 @@ -23,16 +23,22 @@ #define _SETJMP_H #include - .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 +53,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 +83,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/sysv/linux/alpha/sysdep.h =================================================================== RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h,v retrieving revision 1.17 diff -u -p -d -r1.17 sysdep.h --- sysdeps/unix/sysv/linux/alpha/sysdep.h 23 Mar 2004 23:31:47 -0000 1.17 +++ sysdeps/unix/sysv/linux/alpha/sysdep.h 9 Jan 2006 23:06:03 -0000 @@ -22,10 +22,10 @@ #define _LINUX_ALPHA_SYSDEP_H 1 #ifdef __ASSEMBLER__ - #include #include - +#else +#include #endif /* There is some commonality. */ @@ -98,4 +98,39 @@ INTERNAL_SYSCALL1(name, err_out, nr, args); \ }) +/* Pointer mangling support. Note that tls access is slow enough that + we don't deoptimize things by placing the pointer check value there. */ +#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 /* _LINUX_ALPHA_SYSDEP_H */