From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10686 invoked by alias); 12 Jan 2006 00:09:29 -0000 Received: (qmail 16492 invoked by uid 22791); 11 Jan 2006 19:55:45 -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; Wed, 11 Jan 2006 19:55:40 +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 k0BJtYl6028390 for ; Wed, 11 Jan 2006 11:55:34 -0800 Received: (from rth@localhost) by are.twiddle.net (8.12.11/8.12.11/Submit) id k0BJtQf9028389 for libc-hacker@sources.redhat.com; Wed, 11 Jan 2006 11:55:26 -0800 Date: Thu, 12 Jan 2006 00:09:00 -0000 From: Richard Henderson To: libc-hacker@sources.redhat.com Subject: Re: [rfa] alpha sjlj vs pointer mangling Message-ID: <20060111195526.GA28361@twiddle.net> Mail-Followup-To: libc-hacker@sources.redhat.com References: <20060110003517.GA16111@twiddle.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20060110003517.GA16111@twiddle.net> 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/msg00052.txt.bz2 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 * 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 - .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 + +#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 */