From patchwork Sun Oct 25 19:32:36 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John David Anglin X-Patchwork-Id: 9361 Received: (qmail 26462 invoked by alias); 25 Oct 2015 19:32:41 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 26451 invoked by uid 89); 25 Oct 2015 19:32:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_PASS, UNPARSEABLE_RELAY autolearn=ham version=3.3.2 X-HELO: mtlfep02.bell.net From: John David Anglin Mime-Version: 1.0 (Apple Message framework v1085) Date: Sun, 25 Oct 2015 15:32:36 -0400 Subject: [PATCH] Handle __gmon_start__ as undefined weak or hidden on hppa Cc: Mike Frysinger , Helge Deller To: GNU C Library Message-Id: X-Opwv-CommTouchExtSvcRefID: str=0001.0A020202.562D2E54.00F9, ss=1, re=0.000, fgs=0 The attached change fixes libc/19170. It is identical to the approach used on ia64 aside from the hppa assembler code. It has been build tested on trunk and with Debian 2.19. It resolves the harfbuzz issue noted in the PR. Please install if okay. Dave --- John David Anglin dave.anglin@bell.net 2015-10-25 Helge Deller John David Anglin PR libc/19170 * sysdeps/hppa/crti.S (gmon_initializer): New. Use .init_array support to call gmon_initializer. Only call __gmon_start__ when symbol is defined. * sysdeps/hppa/crtn.S (__gmon_start__): Delete. diff -up ./crti.S.org ./crti.S --- ./crti.S.org 2015-10-23 17:46:33.115387971 +0200 +++ ./crti.S 2015-10-23 21:46:25.277880769 +0200 @@ -49,6 +49,72 @@ # define PREINIT_FUNCTION_WEAK 1 #endif +#if PREINIT_FUNCTION_WEAK + weak_extern (PREINIT_FUNCTION) +#else + .hidden PREINIT_FUNCTION +#endif + + +/* If we have working .init_array support, we want to keep the .init + section empty (apart from the mandatory prologue/epilogue. This + ensures that the default unwind conventions (return-pointer in b0, + frame state in ar.pfs, etc.) will do the Right Thing. To ensure + an empty .init section, we register gmon_initializer() via the + .init_array. + + --davidm 02/10/29 */ + +#if PREINIT_FUNCTION_WEAK +/* This blob of assembly code is one simple C function: + +static void +__attribute__ ((used)) +gmon_initializer (void) +{ + extern void weak_function __gmon_start__ (void); + + if (__gmon_start__) + (*__gmon_start__)(); +} +*/ + .section .data.rel.ro,"aw",@progbits + .align 4 +.LC0: + .word P%__gmon_start__ + .text + .align 4 + .type gmon_initializer, @function +gmon_initializer: + .PROC + .CALLINFO FRAME=64,CALLS,SAVE_RP,ENTRY_GR=3 + .ENTRY + stw %r2,-20(%r30) + addil LT'.LC0,%r19 + ldw RT'.LC0(%r1),%r28 + stwm %r4,64(%r30) + ldw 0(%r28),%r28 + comib,= 0,%r28,.L1 + stw %r19,-32(%r30) + bl __gmon_start__,%r2 + nop +.L1: + ldw -84(%r30),%r2 + bv %r0(%r2) + ldwm -64(%r30),%r4 + .EXIT + .PROCEND + + .size gmon_initializer, .-gmon_initializer + +# undef PREINIT_FUNCTION +# define PREINIT_FUNCTION gmon_initializer +#endif + + .section .init_array, "aw" + .word P% PREINIT_FUNCTION + + /* _init prologue. */ .section .init, "ax", %progbits .align 4 @@ -58,14 +124,6 @@ _init: stw %rp,-20(%sp) stwm %r4,64(%sp) stw %r19,-32(%sp) -#if PREINIT_FUNCTION_WEAK - bl PREINIT_FUNCTION,%rp - copy %r19,%r4 /* delay slot */ -#else - bl PREINIT_FUNCTION,%rp - copy %r19,%r4 /* delay slot */ -#endif - copy %r4,%r19 /* _fini prologue. */ .section .fini,"ax",%progbits diff -up ./crtn.S.org ./crtn.S --- ./crtn.S.org 2015-10-23 17:46:28.283390160 +0200 +++ ./crtn.S 2015-10-23 17:47:15.691368693 +0200 @@ -38,27 +38,6 @@ /* crtn.S puts function epilogues in the .init and .fini sections corresponding to the prologues in crti.S. */ -/* Note that we cannot have a weak undefined __gmon_start__, because - that would require this to be PIC, and the linker is currently not - able to generate a proper procedure descriptor for _init. Sad but - true. Anyway, HPPA is one of those horrible architectures where - making the comparison and indirect call is quite expensive (see the - comment in sysdeps/generic/initfini.c). */ - .text - .align 4 - .weak __gmon_start__ - .type __gmon_start__,@function -__gmon_start__: - .proc - .callinfo - .entry - bv,n %r0(%r2) - .exit - .procend - -/* Here is the tail end of _init. We put __gmon_start before this so - that the assembler creates the .PARISC.unwind section for us, ie. - with the right attributes. */ .section .init, "ax", @progbits ldw -84(%sp),%rp copy %r4,%r19