From patchwork Sat Nov 3 08:14:27 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 196804 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 875E22C00E1 for ; Sat, 3 Nov 2012 19:14:52 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1352535293; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:Date:From:To:Subject:Message-ID:MIME-Version: Content-Type:Content-Disposition:User-Agent:Mailing-List: Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:Sender:Delivered-To; bh=h/wSNhg1cVHzfzh8BwLyqPjSvfY=; b=ooHs1rgjx8CmCfPvWbkbg+jngn3/zDRKdGDidMS5vl6HDqo0172Dk8WHUML7hj MrDWCinPIGNNsJQzWRxIFRFS8UcRW3hMQuD0HmBxZDIv+n16VS6/cFsQ7+J/ERul 3kbdvdrfTxn/YT/1FAk63urglwll8L1lxoX/MLnUURmRI= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Received:Received:Date:From:To:Subject:Message-ID:MIME-Version:Content-Type:Content-Disposition:User-Agent:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=EofxLdLNZiMOJ53Ol07KN1bTNinwB9Yo7gTfw+tLljJlmwJDLBHkOBzLGjrNh9 iC4CjTLzTOq10dvSk6Q987XXvyz0MQYEvm+RC0SznUfEcV8H1HmN1sCrq2R44vLr m4OrNEAVDjxQdlMJGBnqH8odCSmSJSxoh2/qDlOSo/17g=; Received: (qmail 1298 invoked by alias); 3 Nov 2012 08:14:46 -0000 Received: (qmail 1290 invoked by uid 22791); 3 Nov 2012 08:14:45 -0000 X-SWARE-Spam-Status: No, hits=-4.4 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KHOP_RCVD_TRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-pb0-f47.google.com (HELO mail-pb0-f47.google.com) (209.85.160.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 03 Nov 2012 08:14:35 +0000 Received: by mail-pb0-f47.google.com with SMTP id ro12so2798047pbb.20 for ; Sat, 03 Nov 2012 01:14:34 -0700 (PDT) Received: by 10.68.231.41 with SMTP id td9mr13290394pbc.128.1351930474657; Sat, 03 Nov 2012 01:14:34 -0700 (PDT) Received: from gnu-tools-1.localdomain ([116.230.21.15]) by mx.google.com with ESMTPS id uh10sm2325858pbc.35.2012.11.03.01.14.32 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 03 Nov 2012 01:14:33 -0700 (PDT) Received: by gnu-tools-1.localdomain (Postfix, from userid 1000) id 094B31A0667; Sat, 3 Nov 2012 01:14:27 -0700 (PDT) Date: Sat, 3 Nov 2012 01:14:27 -0700 From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Subject: RFC: PR middle-end/55142: Check Pmode instead of ptr_mode for address mode Message-ID: <20121103081427.GA5929@gmail.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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, The testcase shows -O -mx32 -maddress-mode=long -fPIC -S generates; x.i:22:37: internal compiler error: in plus_constant, at explow.c:88 info[0x6ffffeff - dyn->d_tag + 12] = dyn; expand_expr_real_2 has /* No sense saving up arithmetic to be done if it's all in the wrong mode to form part of an address. And force_operand won't know whether to sign-extend or zero-extend. */ if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) || mode != ptr_mode) With mode == SImode, Pmode == DImode and ptr_mode == SImode, we generate wrong address. Instead of zero-extending address 0xf7ffdd64, we sign-extend it to 0xfffffffff7ffdd64. This patch checks Pmode instead of ptr_mode for address mode. It fixes the testcase and generates a working x32 glibc. Is this patch correct? Thanks. H.J. --- gcc/ 2012-11-03 H.J. Lu PR middle-end/55142 * expr.c (expand_expr_real_2): Check Pmode instead of ptr_mode for wrong address mode. gcc/testsuite/ 2012-11-03 H.J. Lu PR middle-end/55142 * gcc.target/i386/pr55142.c: New file. diff --git a/gcc/expr.c b/gcc/expr.c index 0ad3b57..1600380 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -8290,7 +8290,7 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode, And force_operand won't know whether to sign-extend or zero-extend. */ if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) - || mode != ptr_mode) + || mode != Pmode) { expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL); @@ -8333,7 +8333,7 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode, And force_operand won't know whether to sign-extend or zero-extend. */ if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) - || mode != ptr_mode) + || mode != Pmode) goto binop; expand_operands (treeop0, treeop1, diff --git a/gcc/testsuite/gcc.target/i386/pr55142.c b/gcc/testsuite/gcc.target/i386/pr55142.c new file mode 100644 index 0000000..c8a9625 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr55142.c @@ -0,0 +1,34 @@ +/* { dg-do compile { target { ! { ia32 } } } } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -mx32 -maddress-mode=long -fpic" } */ + +typedef int int32_t; +typedef unsigned int uint32_t; +typedef int32_t Elf32_Sword; +typedef struct +{ + Elf32_Sword d_tag; +} Elf32_Dyn; +struct link_map +{ + Elf32_Dyn *l_ld; + Elf32_Dyn *l_info[34]; +}; +extern struct link_map _dl_rtld_map __attribute__ ((visibility ("hidden"))); +static void elf_get_dynamic_info (struct link_map *l) +{ + Elf32_Dyn *dyn = l->l_ld; + Elf32_Dyn **info; + info = l->l_info; + while (dyn->d_tag != 0) + { + if ((uint32_t) (0x6ffffeff - dyn->d_tag) < 11) + info[0x6ffffeff - dyn->d_tag + 12] = dyn; + ++dyn; + } +} +void +foo (void) +{ + elf_get_dynamic_info (&_dl_rtld_map); +}