Patchwork [RS6000] PR 45807 r2 eh_frame info error

login
register
mail settings
Submitter Alan Modra
Date Oct. 1, 2010, 3:27 a.m.
Message ID <20101001032712.GE16376@bubble.grove.modra.org>
Download mbox | patch
Permalink /patch/66301/
State New
Headers show

Comments

Alan Modra - Oct. 1, 2010, 3:27 a.m.
Fixes breakage when building on 64-bit hosts.  Committed.

	PR target/45807
	* config/rs6000/rs6000.c (rs6000_emit_prologue): Properly sign
	extend toc_restore_insn.
Richard Henderson - Oct. 1, 2010, 5:15 p.m.
On 09/30/2010 08:27 PM, Alan Modra wrote:
> Fixes breakage when building on 64-bit hosts.  Committed.
> 
> 	PR target/45807
> 	* config/rs6000/rs6000.c (rs6000_emit_prologue): Properly sign
> 	extend toc_restore_insn.
> 
> Index: gcc/config/rs6000/rs6000.c
> ===================================================================
> --- gcc/config/rs6000/rs6000.c	(revision 164818)
> +++ gcc/config/rs6000/rs6000.c	(working copy)
> @@ -20234,8 +20242,8 @@ rs6000_emit_prologue (void)
>  	 be updated if we arrived at this function via a plt call or
>  	 toc adjusting stub.  */
>        emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
> -      toc_restore_insn = ((TARGET_32BIT ? 0x80410014 : 0xE8410028)
> -			  ^ 0x80000000) - 0x80000000;
> +      toc_restore_insn = TARGET_32BIT ? 0x80410014 : 0xE8410028;
> +      toc_restore_insn = (toc_restore_insn ^ 0x80000000) - 0x80000000;
>        emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si,
>  			     GEN_INT (toc_restore_insn & ~0xffff)));

Better, maybe, to use gen_int_mode here instead of the
explicit sign-extension trick.


r~

Patch

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 164818)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -20234,8 +20242,8 @@  rs6000_emit_prologue (void)
 	 be updated if we arrived at this function via a plt call or
 	 toc adjusting stub.  */
       emit_move_insn (tmp_reg_si, gen_rtx_MEM (SImode, tmp_reg));
-      toc_restore_insn = ((TARGET_32BIT ? 0x80410014 : 0xE8410028)
-			  ^ 0x80000000) - 0x80000000;
+      toc_restore_insn = TARGET_32BIT ? 0x80410014 : 0xE8410028;
+      toc_restore_insn = (toc_restore_insn ^ 0x80000000) - 0x80000000;
       emit_insn (gen_xorsi3 (tmp_reg_si, tmp_reg_si,
 			     GEN_INT (toc_restore_insn & ~0xffff)));
       compare_result = gen_rtx_REG (CCUNSmode, CR0_REGNO);