From patchwork Sun Jul 30 00:04:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 795291 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-82549-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="V3R/rATI"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xKjWN0B4sz9s7F for ; Sun, 30 Jul 2017 10:04:47 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:from:to:cc:subject:message-id:references :mime-version:content-type:in-reply-to; q=dns; s=default; b=DrmS +9BG3GjNfgAF1SZVadlngBzDhoG9b88ugdk7r/yrBZ3Qbr7uQ+rqZKwthcWjBEou zGvjhpuFiCS2RrsXzAuvXMoAh+Bo5KQQTZC0MsBoR70M5/gmemFhfscfmgc4ggvD mt1UIqcZRona8e77hzQtO1s+7GiiQ484Sns6Wbk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:from:to:cc:subject:message-id:references :mime-version:content-type:in-reply-to; s=default; bh=gcCfM2dxxo tFkyEVlIgpMDRTPUA=; b=V3R/rATInGroUIOmMvGE5bknXlI5A1uVUUM0ej0tzF 5PqKi8w6AJ7wgiIg/taXEJRqLT3JTRT/PMsC9/BYUYXepDW8IGFqv4OaWE+W0TfA VkLWzUu52id7gH3MEbpssshGeKhbDjOsGFM+CqK/QYgiFAyDhsIjB4vkcln2y41O w= Received: (qmail 80450 invoked by alias); 30 Jul 2017 00:04:40 -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 80397 invoked by uid 89); 30 Jul 2017 00:04:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.6 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=3, 2, 44pm, 44PM X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-pg0-f68.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=1oTOZIDs30286VQpcCGEahxTry0KThaLUI6NmeW+5hQ=; b=SMKVFSBMqwVZ6xQkPLpIaf9KdU1s+s8yROXbrHvM9Je8uYjTjbEDcwYIf1J+BhwrLg qZGfg5b3plwNp6HLWTvjmUejeSP6pq7GrlUHP5rLHT0g7R/pwJeMfBtaJy0ZsdLxx6jZ dPW59Y4KGck2GrZL78wRRIosZz/vhXLuRNdYuQ+dzkNyP648jIaY6oN7Wdm/olC2UXPe tX7EqygxINHUECdoZbjL+uhrjBUXWdM2XKOHa9coJOoVDbvFiZKbJXPK4tWEjiRyStKJ wgmrU8baNeqAxLsptN5SnBgihI/sQ/XDfPJuB2V7x253IrnTX7mDpOsXbaEFN0ICUQNW tlAQ== X-Gm-Message-State: AIVw112UXbRZZ4X3pxDC/n9z0i6oIEaCubApTx26RzOsvkRC5xzTa8Gg 6YNg+4zehj2Mkw== X-Received: by 10.101.72.138 with SMTP id n10mr41023pgs.138.1501373075563; Sat, 29 Jul 2017 17:04:35 -0700 (PDT) Date: Sun, 30 Jul 2017 09:34:30 +0930 From: Alan Modra To: Adam Conrad Cc: Carlos O'Donell , Tulio Magno Quites Machado Filho , Josh Stone , libc-alpha@sourceware.org, binutils@sourceware.org, Matthias Klose , Steven Munroe Subject: [PATCH] tst-tlsopt-powerpc as a shared lib Message-ID: <20170730000430.GF1956@bubble.grove.modra.org> References: <00ac3cbe-47f4-ccf0-3017-c1f2ab43db20@redhat.com> <30946d0a-a095-f5cb-bf0b-d3897712cdab@redhat.com> <20170727040411.GX14520@bubble.grove.modra.org> <20170727234529.GZ14520@bubble.grove.modra.org> <20170728090246.GA1956@bubble.grove.modra.org> <20170728130744.GU21230@0c3.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20170728130744.GU21230@0c3.net> User-Agent: Mutt/1.5.24 (2015-08-30) On Fri, Jul 28, 2017 at 01:07:44PM +0000, Adam Conrad wrote: > On Fri, Jul 28, 2017 at 06:32:46PM +0930, Alan Modra wrote: > > > > Since tst-tlsopt-powerpc is supposed to test glibc dynamic relocation > > processing, the body of the test ought to be put in a shared library > > (*). I cobbled together such a test, and TRY_STATIC_TLS works fine. > > So, not a powerpc64 glibc bug. > > Excellent. Should I expect said cobbled test to replace tst-tlsopt-powerpc > in glibc trunk soonish (obviously, I'll just XFAIL it for now locally). This makes the __tls_get_addr_opt test run as a shared library, and so actually test that DTPMOD64/DTPREL64 pairs are processed by ld.so to support the __tls_get_adfr_opt call stub fast return. After a 2017-01-24 patch (binutils f0158f4416) ld.bfd no longer emitted unnecessary dynamic relocations against local thread variables, instead setting up the __tls_index GOT entries for the call stub fast return. This meant tst-tlsopt-powerpc passed but did not check ld.so relocation support. After a 2017-07-16 patch (binutils 676ee2b5fa) ld.bfd no longer set up the __tls_index GOT entries for the call stub fast return, and tst-tlsopt-powerpc failed. Compiling mod-tlsopt-powerpc.c with -DSHARED exposed a bug in powerpc64/tls-macros.h, which defines a __TLS_GET_ADDR macro that clashes with one defined in dl-tls.h. The tls-macros.h version is only used in that file, so delete it and expand. Regression tested powerpc64le-linux. Please verify the Makefile changes. The test passes with "make -j64 check", but I may well have missed something there. * sysdeps/powerpc/mod-tlsopt-powerpc.c: Extract from tst-tlsopt-powerpc.c with function name change and no test harness. * sysdeps/powerpc/tst-tlsopt-powerpc.c: Remove body of test. Call tls_get_addr_opt_test. * sysdeps/powerpc/Makefile (LDFLAGS-tst-tlsopt-powerpc): Don't define. (modules-names): Add mod-tlsopt-powerpc. (mod-tlsopt-powerpc.so-no-z-defs): Define. (tst-tlsopt-powerpc): Depend on .so. * sysdeps/powerpc/powerpc64/tls-macros.h (__TLS_GET_ADDR): Don't define. Expand use in TLS_GD and TLS_LD. diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile index 0d9206b..6aa683b 100644 --- a/sysdeps/powerpc/Makefile +++ b/sysdeps/powerpc/Makefile @@ -8,9 +8,11 @@ sysdep-dl-routines += dl-machine hwcapinfo sysdep_routines += dl-machine hwcapinfo # extra shared linker files to link only into dl-allobjs.so sysdep-rtld-routines += dl-machine hwcapinfo -# Don't optimize GD tls sequence to LE. -LDFLAGS-tst-tlsopt-powerpc += -Wl,--no-tls-optimize + +modules-names += mod-tlsopt-powerpc +mod-tlsopt-powerpc.so-no-z-defs = yes tests += tst-tlsopt-powerpc +$(objpfx)tst-tlsopt-powerpc: $(objpfx)mod-tlsopt-powerpc.so ifneq (no,$(multi-arch)) tests-static += tst-tlsifunc-static diff --git a/sysdeps/powerpc/mod-tlsopt-powerpc.c b/sysdeps/powerpc/mod-tlsopt-powerpc.c new file mode 100644 index 0000000..ee0db12 --- /dev/null +++ b/sysdeps/powerpc/mod-tlsopt-powerpc.c @@ -0,0 +1,49 @@ +/* shared library to test for __tls_get_addr optimization. */ +#include + +#include "../../elf/tls-macros.h" +#include "dl-tls.h" + +/* common 'int' variable in TLS. */ +COMMON_INT_DEF(foo); + + +int +tls_get_addr_opt_test (void) +{ + int result = 0; + + /* Get variable using general dynamic model. */ + int *ap = TLS_GD (foo); + if (*ap != 0) + { + printf ("foo = %d\n", *ap); + result = 1; + } + + tls_index *tls_arg; +#ifdef __powerpc64__ + register unsigned long thread_pointer __asm__ ("r13"); + asm ("addi %0,2,foo@got@tlsgd" : "=r" (tls_arg)); +#else + register unsigned long thread_pointer __asm__ ("r2"); + asm ("bcl 20,31,1f\n1:\t" + "mflr %0\n\t" + "addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" + "addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" + "addi %0,%0,foo@got@tlsgd" : "=b" (tls_arg)); +#endif + + if (tls_arg->ti_module != 0) + { + printf ("tls_index not optimized, binutils too old?\n"); + result = 1; + } + else if (tls_arg->ti_offset + thread_pointer != (unsigned long) ap) + { + printf ("tls_index->ti_offset wrong value\n"); + result = 1; + } + + return result; +} diff --git a/sysdeps/powerpc/powerpc64/tls-macros.h b/sysdeps/powerpc/powerpc64/tls-macros.h index 42a95ec..79a0b25 100644 --- a/sysdeps/powerpc/powerpc64/tls-macros.h +++ b/sysdeps/powerpc/powerpc64/tls-macros.h @@ -18,13 +18,11 @@ __result; \ }) -#define __TLS_GET_ADDR "__tls_get_addr" - /* PowerPC64 Local Dynamic TLS access. */ #define TLS_LD(x) \ ({ int * __result; \ asm ("addi 3,2," #x "@got@tlsld\n\t" \ - "bl " __TLS_GET_ADDR "\n\t" \ + "bl __tls_get_addr\n\t" \ "nop \n\t" \ "addis %0,3," #x "@dtprel@ha\n\t" \ "addi %0,%0," #x "@dtprel@l" \ @@ -36,7 +34,7 @@ #define TLS_GD(x) \ ({ register int *__result __asm__ ("r3"); \ asm ("addi 3,2," #x "@got@tlsgd\n\t" \ - "bl " __TLS_GET_ADDR "\n\t" \ + "bl __tls_get_addr\n\t" \ "nop " \ : "=r" (__result) : \ : __TLS_CALL_CLOBBERS); \ diff --git a/sysdeps/powerpc/tst-tlsopt-powerpc.c b/sysdeps/powerpc/tst-tlsopt-powerpc.c index 8ae928a..cc682b2 100644 --- a/sysdeps/powerpc/tst-tlsopt-powerpc.c +++ b/sysdeps/powerpc/tst-tlsopt-powerpc.c @@ -1,51 +1,11 @@ /* glibc test for __tls_get_addr optimization. */ -#include - -#include "../../elf/tls-macros.h" -#include "dl-tls.h" - -/* common 'int' variable in TLS. */ -COMMON_INT_DEF(foo); - static int do_test (void) { - int result = 0; - - /* Get variable using general dynamic model. */ - int *ap = TLS_GD (foo); - if (*ap != 0) - { - printf ("foo = %d\n", *ap); - result = 1; - } - - tls_index *tls_arg; -#ifdef __powerpc64__ - register unsigned long thread_pointer __asm__ ("r13"); - asm ("addi %0,2,foo@got@tlsgd" : "=r" (tls_arg)); -#else - register unsigned long thread_pointer __asm__ ("r2"); - asm ("bcl 20,31,1f\n1:\t" - "mflr %0\n\t" - "addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" - "addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" - "addi %0,%0,foo@got@tlsgd" : "=b" (tls_arg)); -#endif - - if (tls_arg->ti_module != 0) - { - printf ("tls_index not optimized, binutils too old?\n"); - result = 1; - } - else if (tls_arg->ti_offset + thread_pointer != (unsigned long) ap) - { - printf ("tls_index->ti_offset wrong value\n"); - result = 1; - } + extern int tls_get_addr_opt_test (void); - return result; + return tls_get_addr_opt_test (); } #include