From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 868 invoked by alias); 8 Jun 2011 03:55:19 -0000 Received: (qmail 859 invoked by uid 22791); 8 Jun 2011 03:55:19 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mo11.iij4u.or.jp (HELO mo.iij4u.or.jp) (210.138.174.79) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 08 Jun 2011 03:55:04 +0000 Received: by mo.iij4u.or.jp (mo11) id p583t2rB015656; Wed, 8 Jun 2011 12:55:02 +0900 Received: from localhost (238.152.138.210.bn.2iij.net [210.138.152.238]) by mbox.iij4u.or.jp (mbox11) id p583t1SG023464; Wed, 8 Jun 2011 12:55:02 +0900 Date: Wed, 08 Jun 2011 06:23:00 -0000 Message-Id: <20110608.125501.471617072.kkojima@rr.iij4u.or.jp> To: gcc-patches@gcc.gnu.org Subject: [patch committed] [SH] Allow non-pic local and global dynamic tls models From: Kaz Kojima Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-06/txt/msg00608.txt.bz2 Hi, The attached patch allows SH target to use local and global dynamic tls models without -fpic/-fpie. Tested on sh4-unknown-linux-gnu with no new failures. Applied on trunk. Regards, kaz -- 2011-06-08 Kaz Kojima * config/sh/sh.c (prepare_move_operands): Set pic register appropriately for global and local dynamic tls models even if flag_pic is unset. --- ORIG/trunk/gcc/config/sh/sh.c 2011-06-02 09:41:16.000000000 +0900 +++ trunk/gcc/config/sh/sh.c 2011-06-07 22:32:02.000000000 +0900 @@ -1844,12 +1844,30 @@ prepare_move_operands (rtx operands[], e { rtx tga_op1, tga_ret, tmp, tmp2; + if (! flag_pic + && (tls_kind == TLS_MODEL_GLOBAL_DYNAMIC + || tls_kind == TLS_MODEL_LOCAL_DYNAMIC + || tls_kind == TLS_MODEL_INITIAL_EXEC)) + { + /* Don't schedule insns for getting GOT address when + the first scheduling is enabled, to avoid spill + failures for R0. */ + if (flag_schedule_insns) + emit_insn (gen_blockage ()); + emit_insn (gen_GOTaddr2picreg ()); + emit_use (gen_rtx_REG (SImode, PIC_REG)); + if (flag_schedule_insns) + emit_insn (gen_blockage ()); + } + switch (tls_kind) { case TLS_MODEL_GLOBAL_DYNAMIC: tga_ret = gen_rtx_REG (Pmode, R0_REG); emit_call_insn (gen_tls_global_dynamic (tga_ret, op1)); - op1 = tga_ret; + tmp = gen_reg_rtx (Pmode); + emit_move_insn (tmp, tga_ret); + op1 = tmp; break; case TLS_MODEL_LOCAL_DYNAMIC: @@ -1869,18 +1887,6 @@ prepare_move_operands (rtx operands[], e break; case TLS_MODEL_INITIAL_EXEC: - if (! flag_pic) - { - /* Don't schedule insns for getting GOT address when - the first scheduling is enabled, to avoid spill - failures for R0. */ - if (flag_schedule_insns) - emit_insn (gen_blockage ()); - emit_insn (gen_GOTaddr2picreg ()); - emit_use (gen_rtx_REG (SImode, PIC_REG)); - if (flag_schedule_insns) - emit_insn (gen_blockage ()); - } tga_op1 = !can_create_pseudo_p () ? op0 : gen_reg_rtx (Pmode); tmp = gen_sym2GOTTPOFF (op1); emit_insn (gen_tls_initial_exec (tga_op1, tmp));