Patchwork [PowerPC] Fix setjmp test fails

login
register
mail settings
Submitter Alan Modra
Date Oct. 31, 2010, 8:47 a.m.
Message ID <20101031084734.GT31277@bubble.grove.modra.org>
Download mbox | patch
Permalink /patch/69701/
State New
Headers show

Comments

Alan Modra - Oct. 31, 2010, 8:47 a.m.
gcc.dg/stackalign/setup-{1,3,4}.c exposed two bugs in my -msecure-plt
support for powerpc-linux.  First, rs6000_pic_labelno can only be used
when rs6000_emit_load_toc_table is called from the prologue.  Using it
again in the body of a function results in
  Error: symbol `.LCF1' is already defined.
Fixed easily by using a normal label, rather than the special one for
-mrelocatable.  Secondly, load_toc_v4_PIC_3b had its constraints
reversed, allowing gcc to choose r0 as the input to an addis
instruction.

Bootstrapped and regression tested powerpc-linux.  OK to apply
everywhere?

	* config/rs6000/rs6000.c (rs6000_pic_labelno): Make static.
	(rs6000_emit_load_toc_table): Don't use rs6000_pic_labelno when
	TARGET_SECURE_PLT.
	* config/rs6000/sysv4.h (rs6000_pic_labelno): Don't declare.
	* config/rs6000/rs6000.md (load_toc_v4_PIC_3b): Use "b" constraint
	on input, "r" on output.
David Edelsohn - Nov. 2, 2010, 7:31 p.m.
On Sun, Oct 31, 2010 at 4:47 AM, Alan Modra <amodra@gmail.com> wrote:
> gcc.dg/stackalign/setup-{1,3,4}.c exposed two bugs in my -msecure-plt
> support for powerpc-linux.  First, rs6000_pic_labelno can only be used
> when rs6000_emit_load_toc_table is called from the prologue.  Using it
> again in the body of a function results in
>  Error: symbol `.LCF1' is already defined.
> Fixed easily by using a normal label, rather than the special one for
> -mrelocatable.  Secondly, load_toc_v4_PIC_3b had its constraints
> reversed, allowing gcc to choose r0 as the input to an addis
> instruction.
>
> Bootstrapped and regression tested powerpc-linux.  OK to apply
> everywhere?
>
>        * config/rs6000/rs6000.c (rs6000_pic_labelno): Make static.
>        (rs6000_emit_load_toc_table): Don't use rs6000_pic_labelno when
>        TARGET_SECURE_PLT.
>        * config/rs6000/sysv4.h (rs6000_pic_labelno): Don't declare.
>        * config/rs6000/rs6000.md (load_toc_v4_PIC_3b): Use "b" constraint
>        on input, "r" on output.

Okay.

Thanks, David

Patch

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 166086)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -191,7 +191,7 @@  static GTY(()) int common_mode_defined;
 
 /* Label number of label created for -mrelocatable, to call to so we can
    get the address of the GOT section */
-int rs6000_pic_labelno;
+static int rs6000_pic_labelno;
 
 #ifdef USING_ELFOS_H
 /* Which abi to adhere to */
@@ -18778,7 +18778,8 @@  rs6000_emit_load_toc_table (int fromprol
       char buf[30];
       rtx lab, tmp1, tmp2, got;
 
-      ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
+      lab = gen_label_rtx ();
+      ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (lab));
       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
       if (flag_pic == 2)
 	got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
@@ -18791,8 +18792,7 @@  rs6000_emit_load_toc_table (int fromprol
 	  tmp2 = gen_reg_rtx (Pmode);
 	}
       emit_insn (gen_load_toc_v4_PIC_1 (lab));
-      emit_move_insn (tmp1,
-			     gen_rtx_REG (Pmode, LR_REGNO));
+      emit_move_insn (tmp1, gen_rtx_REG (Pmode, LR_REGNO));
       emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
       emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
     }
@@ -18819,8 +18819,7 @@  rs6000_emit_load_toc_table (int fromprol
 	  symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
 
 	  emit_insn (gen_load_toc_v4_PIC_1 (symF));
-	  emit_move_insn (dest,
-			  gen_rtx_REG (Pmode, LR_REGNO));
+	  emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
 	  emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, symL, symF));
 	}
       else
Index: gcc/config/rs6000/sysv4.h
===================================================================
--- gcc/config/rs6000/sysv4.h	(revision 166086)
+++ gcc/config/rs6000/sysv4.h	(working copy)
@@ -402,8 +402,6 @@  do {									\
    Some svr4 assemblers need to also have something extra said about the
    function's return value.  We allow for that here.  */
 
-extern int rs6000_pic_labelno;
-
 /* Override elfos.h definition.  */
 #undef	ASM_DECLARE_FUNCTION_NAME
 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
Index: gcc/config/rs6000/rs6000.md
===================================================================
--- gcc/config/rs6000/rs6000.md	(revision 166086)
+++ gcc/config/rs6000/rs6000.md	(working copy)
@@ -12187,8 +12187,8 @@  (define_insn "load_toc_v4_PIC_2"
   [(set_attr "type" "load")])
 
 (define_insn "load_toc_v4_PIC_3b"
-  [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
-	(plus:SI (match_operand:SI 1 "gpc_reg_operand" "r")
+  [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
+	(plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
 		 (high:SI
 		   (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
 			     (match_operand:SI 3 "symbol_ref_operand" "s")))))]