From patchwork Sun Feb 13 23:22:51 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 83023 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 021FDB7125 for ; Mon, 14 Feb 2011 10:23:02 +1100 (EST) Received: (qmail 20703 invoked by alias); 13 Feb 2011 23:23:01 -0000 Received: (qmail 20694 invoked by uid 22791); 13 Feb 2011 23:23:00 -0000 X-SWARE-Spam-Status: No, hits=-0.7 required=5.0 tests=AWL, BAYES_00, KAM_STOCKGEN, NO_DNS_FOR_FROM, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 13 Feb 2011 23:22:53 +0000 Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 13 Feb 2011 15:22:52 -0800 X-ExtLoop1: 1 Received: from gnu-6.sc.intel.com ([10.3.194.135]) by azsmga001.ch.intel.com with ESMTP; 13 Feb 2011 15:22:52 -0800 Received: by gnu-6.sc.intel.com (Postfix, from userid 500) id A5F99180902; Sun, 13 Feb 2011 15:22:51 -0800 (PST) Date: Sun, 13 Feb 2011 15:22:51 -0800 From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Subject: [x32] PATCH: PR target/47715: [x32] TLS doesn't work Message-ID: <20110213232251.GA23412@intel.com> Reply-To: "H.J. Lu" MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, ix86_expand_move has tmp = expand_simple_binop (Pmode, PLUS, tmp, addend, op0, 1, OPTAB_DIRECT); if (tmp == op0) return; It never checks the case of tmp != op0. This patch fixes it. From 44741a1c97a7fec7c98702d217ac284856c75621 Mon Sep 17 00:00:00 2001 From: H.J. Lu Date: Sun, 13 Feb 2011 15:09:50 -0800 Subject: [PATCH 3/3] Properly support TLS symbol in ix86_expand_move. --- gcc/ChangeLog.x32 | 6 ++++++ gcc/config/i386/i386.c | 26 +++++++++++++++++--------- gcc/testsuite/ChangeLog.x32 | 5 +++++ gcc/testsuite/gcc.target/i386/pr47715-3.c | 17 +++++++++++++++++ 4 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr47715-3.c diff --git a/gcc/ChangeLog.x32 b/gcc/ChangeLog.x32 index dda2a10..ec8aa23 100644 --- a/gcc/ChangeLog.x32 +++ b/gcc/ChangeLog.x32 @@ -1,5 +1,11 @@ 2011-02-13 H.J. Lu + PR target/47715 + * config/i386/i386.c (ix86_expand_move): Properly support TLS + symbol. + +2011-02-13 H.J. Lu + * config/i386/morestack.S: Properly check __x86_64__ and __LP64__. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 63add39..9ceb5c0 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -15403,6 +15403,7 @@ void ix86_expand_move (enum machine_mode mode, rtx operands[]) { rtx op0, op1; + rtx symbol1 = NULL; enum tls_model model; op0 = operands[0]; @@ -15430,21 +15431,20 @@ ix86_expand_move (enum machine_mode mode, rtx operands[]) { rtx addend = XEXP (XEXP (op1, 0), 1); rtx symbol = XEXP (XEXP (op1, 0), 0); - rtx tmp = NULL; model = SYMBOL_REF_TLS_MODEL (symbol); if (model) - tmp = legitimize_tls_address (symbol, model, true); + symbol1 = legitimize_tls_address (symbol, model, true); else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES && SYMBOL_REF_DLLIMPORT_P (symbol)) - tmp = legitimize_dllimport_symbol (symbol, true); + symbol1 = legitimize_dllimport_symbol (symbol, true); - if (tmp) + if (symbol1) { - tmp = force_operand (tmp, NULL); - tmp = expand_simple_binop (Pmode, PLUS, tmp, addend, - op0, 1, OPTAB_DIRECT); - if (tmp == op0) + symbol1 = force_operand (symbol1, NULL); + symbol1 = expand_simple_binop (Pmode, PLUS, symbol1, addend, + op0, 1, OPTAB_DIRECT); + if (symbol1 == op0) return; } } @@ -15455,6 +15455,7 @@ ix86_expand_move (enum machine_mode mode, rtx operands[]) { if (TARGET_MACHO && !TARGET_64BIT) { + gcc_assert (symbol1 == NULL); #if TARGET_MACHO /* dynamic-no-pic */ if (MACHOPIC_INDIRECT) @@ -15491,7 +15493,13 @@ ix86_expand_move (enum machine_mode mode, rtx operands[]) } else { - if (MEM_P (op0)) + if (symbol1 != NULL) + { + op1 = symbol1; + if (GET_MODE (op1) != mode) + op1 = convert_to_mode (mode, op1, 1); + } + else if (MEM_P (op0)) op1 = force_reg (mode, op1); else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, mode)) { diff --git a/gcc/testsuite/ChangeLog.x32 b/gcc/testsuite/ChangeLog.x32 index fd4f856..2aceb2f 100644 --- a/gcc/testsuite/ChangeLog.x32 +++ b/gcc/testsuite/ChangeLog.x32 @@ -1,3 +1,8 @@ +2011-02-13 H.J. Lu + + PR target/47715 + * gcc.target/i386/pr47715-3.c: New. + 2011-02-12 H.J. Lu PR target/47715 diff --git a/gcc/testsuite/gcc.target/i386/pr47715-3.c b/gcc/testsuite/gcc.target/i386/pr47715-3.c new file mode 100644 index 0000000..9134674 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr47715-3.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fPIC" } */ + +struct initial_sp +{ + void *sp; + long len; +}; +__thread +struct initial_sp __morestack_initial_sp; +void bar (void *); +void +foo () +{ + bar (&__morestack_initial_sp.len); +}