From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30471 invoked by alias); 23 May 2013 19:25:37 -0000 Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org Received: (qmail 30419 invoked by uid 89); 23 May 2013 19:25:37 -0000 X-Spam-SWARE-Status: No, score=-2.8 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.1 Received: from usmamail.tilera.com (HELO USMAMAIL.TILERA.COM) (12.216.194.151) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Thu, 23 May 2013 19:25:34 +0000 Received: from farm-0002.internal.tilera.com (10.2.0.32) by USMAEXCH2.tad.internal.tilera.com (10.3.0.33) with Microsoft SMTP Server (TLS) id 14.0.722.0; Thu, 23 May 2013 15:25:26 -0400 Received: (from cmetcalf@localhost) by farm-0002.internal.tilera.com (8.14.4/8.12.11/Submit) id r4NJPPJG013785; Thu, 23 May 2013 15:25:25 -0400 Message-ID: <201305231925.r4NJPPJG013785@farm-0002.internal.tilera.com> From: Chris Metcalf Date: Thu, 23 May 2013 19:25:00 -0000 Subject: [PATCH] tile: improve detection for missing -mcmodel=large support To: MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2013-05/txt/msg00100.txt.bz2 The existing test avoided passing -mcmodel=large if the compiler didn't support it. However, we need to test not just the compiler support, but also the toolchain (as and ld) support, so make the test more complete. In addition, we have to avoid using the hwN_plt() assembly operators if that support is missing, so guard the uses with #ifdef NO_PLT_PCREL. This allows us to properly build glibc with the current community binutils, which doesn't yet have the PC-relative PLT operator support. The -mcmodel=large support is in gcc 4.8, but the toolchain support won't be present in the community until binutils 2.24. --- This change should also be applied on the 2.17 release branch for when we release a 2.17.1. 2013-05-23 Chris Metcalf * sysdeps/tile/tilegx/Makefile ($(cflags-mcmodel-large)): Test for assembler and linker support for "-mcmodel=large -fpic" in addition to compiler support; provide -DNO_PLT_PCREL if not. * sysdeps/tile/start.S [NO_PLT_PCREL]: Guard for no PC-relative PLT operators in assembly. * sysdeps/tile/crti.S [NO_PLT_PCREL]: Likewise. diff --git a/ports/sysdeps/tile/crti.S b/ports/sysdeps/tile/crti.S index 9046010..7e8e559 100644 --- a/ports/sysdeps/tile/crti.S +++ b/ports/sysdeps/tile/crti.S @@ -95,7 +95,7 @@ _init: LD_PTR r0, r0 BEQZ r0, .Lno_weak_fn jalr r0 -#elif defined(__tilegx__) +#elif defined(__tilegx__) && !defined(NO_PLT_PCREL) /* Since we are calling from the start of the object to the PLT, call by loading the full address into a register. */ lnk r2 diff --git a/ports/sysdeps/tile/start.S b/ports/sysdeps/tile/start.S index 9941564..3e7ec5c 100644 --- a/ports/sysdeps/tile/start.S +++ b/ports/sysdeps/tile/start.S @@ -62,6 +62,13 @@ #include #include +/* Just create no-ops if we don't support PC-relative PLT relocations. */ +#ifdef NO_PLT_PCREL +# define hw2_last_plt(x) 0 +# define hw1_plt(x) 0 +# define hw0_plt(x) 0 +#endif + .text .global _start .type _start,@function @@ -155,7 +162,11 @@ _start: } { ADD_PTR r4, r4, r13 - jalr r12 +# ifdef NO_PLT_PCREL + j plt(__libc_start_main) +# else + jr r12 +# endif } #else addli r0, r13, lo16(main - .Lmy_pc) diff --git a/ports/sysdeps/tile/tilegx/Makefile b/ports/sysdeps/tile/tilegx/Makefile index d3a0e97..b0abc2d 100644 --- a/ports/sysdeps/tile/tilegx/Makefile +++ b/ports/sysdeps/tile/tilegx/Makefile @@ -1,12 +1,16 @@ include $(common-objpfx)cflags-mcmodel-large.mk +# Check for gcc to support the command-line switch, and for +# binutils to support the hwN_plt() assembly operators and relocations. $(common-objpfx)cflags-mcmodel-large.mk: $(common-objpfx)config.make mcmodel=no; \ - $(CC) -S -o /dev/null -xc /dev/null -mcmodel=large && mcmodel=yes; \ + (echo 'int main() { return getuid(); }' | \ + $(CC) -o /dev/null -xc - -mcmodel=large -fpic) && mcmodel=yes; \ echo "cflags-mcmodel-large = $$mcmodel" > $@ -ifeq ($(subdir),csu) ifeq (yes,$(cflags-mcmodel-large)) + +ifeq ($(subdir),csu) # elf-init.c is in libc_nonshared.o (the end of the shared object) but # must reach the _init symbol at the very start of the shared object. CFLAGS-elf-init.c += -mcmodel=large @@ -15,4 +19,17 @@ CFLAGS-elf-init.c += -mcmodel=large # with profiling, but calls to libc.so via the PLT at the very end. CFLAGS-gmon-start.c += -mcmodel=large endif + +else + +# Don't try to compile assembly code with hwN_plt() directives if the +# toolchain doesn't support -mcmodel=large. +ifeq ($(subdir),csu) +CPPFLAGS-start.S += -DNO_PLT_PCREL +CPPFLAGS-crti.S += -DNO_PLT_PCREL +endif +ifeq ($(subdir),nptl) +CPPFLAGS-pt-crti.S += -DNO_PLT_PCREL +endif + endif -- 1.7.10.3