Committed, CRIS: Fix PR target/19806

Hans-Peter Nilsson hans-peter.nilsson@axis.com
Tue Feb 8 23:19:00 GMT 2005


This bug was due to the CRIS variant of output_addr_const
getting out of sync; a mark_decl_referenced call was missing.
The ASM_OUTPUT_LABEL_REF macro (from later the same day the CRIS
port was committed!) made the local variant unnecessary.  I see
there's now both an ASM_OUTPUT_LABEL_REF and ASM_OUTPUT_LABELREF.
Huh.

Sure, I could have just added the mark_decl_referenced call as a
less invasive change, this being stage 3, but that'd just cause
sync problems later.  This is better; it affects no other
target.

This fixes in one fell swoop the following testsuite failures:
FAIL: gcc.c-torture/execute/20001130-1.c compilation,  -O0
FAIL: gcc.c-torture/execute/20010605-1.c compilation,  -O0
FAIL: gcc.c-torture/execute/20030313-1.c compilation,  -O0
FAIL: gcc.c-torture/execute/20050106-1.c compilation,  -O0
FAIL: gcc.c-torture/execute/920721-3.c compilation,  -O0
FAIL: gcc.c-torture/execute/941202-1.c compilation,  -O0
FAIL: gcc.c-torture/execute/941202-1.c compilation,  -O1
FAIL: gcc.c-torture/execute/960116-1.c compilation,  -O0
FAIL: gcc.c-torture/execute/980526-2.c compilation,  -O0
FAIL: gcc.c-torture/execute/990208-1.c compilation,  -O0
FAIL: gcc.c-torture/execute/cvt-1.c compilation,  -O0
FAIL: gcc.c-torture/execute/simd-4.c compilation,  -O0
FAIL: objc/execute/IMP.m compilation,  -O0
FAIL: objc/execute/class-1.m compilation,  -O0
FAIL: objc/execute/class-10.m compilation,  -O0
FAIL: objc/execute/class-11.m compilation,  -O0
FAIL: objc/execute/class-12.m compilation,  -O0
FAIL: objc/execute/class-13.m compilation,  -O0
FAIL: objc/execute/class-14.m compilation,  -O0
FAIL: objc/execute/class-2.m compilation,  -O0
FAIL: objc/execute/class-3.m compilation,  -O0
FAIL: objc/execute/class-4.m compilation,  -O0
FAIL: objc/execute/class-5.m compilation,  -O0
FAIL: objc/execute/class-6.m compilation,  -O0
FAIL: objc/execute/class-7.m compilation,  -O0
FAIL: objc/execute/class-8.m compilation,  -O0
FAIL: objc/execute/class-9.m compilation,  -O0
FAIL: objc/execute/nested-2.m compilation,  -O0
FAIL: objc/execute/object_is_class.m compilation,  -O0
FAIL: objc/execute/object_is_meta_class.m compilation,  -O0

No regressions on cross to cris-elf or cris-linux.

	PR target/19806
	* config/cris/cris.c (in_code): New variable.
	(cris_output_addr_const): Now a static function, a wrapper for
	output_addr_const.
	(cris_asm_output_symbol_ref): New function, broken out SYMBOL_REF
	case from old cris_output_addr_const.
	(cris_asm_output_label_ref): Similar for LABEL_REF.
	(cris_output_addr_const_extra): Similar for UNSPEC.
	* config/cris/cris.h (OUTPUT_ADDR_CONST_EXTRA)
	(ASM_OUTPUT_SYMBOL_REF, ASM_OUTPUT_LABEL_REF): Define.
	* config/cris/cris-protos.h (cris_output_addr_const): Remove
	declaration.
	(cris_asm_output_symbol_ref, cris_output_addr_const_extra)
	(cris_asm_output_label_ref): Declare.



Index: cris/cris-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/cris/cris-protos.h,v
retrieving revision 1.13
diff -c -p -r1.13 cris-protos.h
*** cris/cris-protos.h	15 Sep 2004 17:03:02 -0000	1.13
--- cris/cris-protos.h	8 Feb 2005 15:35:45 -0000
*************** extern int cris_legitimate_pic_operand (
*** 42,50 ****
  extern int cris_gotless_symbol (rtx);
  extern int cris_got_symbol (rtx);
  extern int cris_symbol (rtx);
! extern void cris_output_addr_const (FILE *, rtx);
  extern int cris_cfun_uses_pic_table (void);
  #endif /* RTX_CODE */
  extern void cris_target_asm_named_section (const char *, unsigned int, tree);
  
  extern int cris_return_address_on_stack (void);
--- 42,52 ----
  extern int cris_gotless_symbol (rtx);
  extern int cris_got_symbol (rtx);
  extern int cris_symbol (rtx);
! extern void cris_asm_output_symbol_ref (FILE *, rtx);
! extern bool cris_output_addr_const_extra (FILE *, rtx);
  extern int cris_cfun_uses_pic_table (void);
  #endif /* RTX_CODE */
+ extern void cris_asm_output_label_ref (FILE *, char *);
  extern void cris_target_asm_named_section (const char *, unsigned int, tree);
  
  extern int cris_return_address_on_stack (void);
Index: cris/cris.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/cris/cris.c,v
retrieving revision 1.62
diff -c -p -r1.62 cris.c
*** cris/cris.c	30 Dec 2004 03:07:44 -0000	1.62
--- cris/cris.c	8 Feb 2005 15:35:45 -0000
*************** static char cris_output_insn_is_bound = 
*** 83,88 ****
--- 83,92 ----
     just the "sym:GOTOFF" part.  */
  static int cris_pic_sympart_only = 0;
  
+ /* In code for output macros, this is how we know whether e.g. constant
+    goes in code or in a static initializer.  */
+ static int in_code = 0;
+ 
  /* Fix for reg_overlap_mentioned_p.  */
  static int cris_reg_overlap_mentioned_p (rtx, rtx);
  
*************** static void cris_print_base (rtx, FILE *
*** 90,95 ****
--- 94,101 ----
  
  static void cris_print_index (rtx, FILE *);
  
+ static void cris_output_addr_const (FILE *, rtx);
+ 
  static struct machine_function * cris_init_machine_status (void);
  
  static rtx cris_struct_value_rtx (tree, int);
*************** cris_split_movdx (rtx *operands)
*** 2972,3149 ****
    return val;
  }
  
! /* This is in essence a copy of output_addr_const altered to output
!    symbolic operands as PIC.
! 
!    FIXME: Add hooks similar to ASM_OUTPUT_SYMBOL_REF to get this effect in
!    the "real" output_addr_const.  All we need is one for LABEL_REF (and
!    one for CODE_LABEL?).  */
  
! void
  cris_output_addr_const (FILE *file, rtx x)
  {
!   int is_plt = 0;
! 
! restart:
!   switch (GET_CODE (x))
!     {
!     case UNSPEC:
!       ASSERT_PLT_UNSPEC (x);
!       x = XVECEXP (x, 0, 0);
!       is_plt = 1;
! 
!       /* Fall through.  */
!     case SYMBOL_REF:
!       if (flag_pic)
! 	{
! 	  const char *origstr = XSTR (x, 0);
! 	  const char *str;
  
! 	  str = (* targetm.strip_name_encoding) (origstr);
  
! 	  if (is_plt)
! 	    {
! 	      if (cris_pic_sympart_only)
! 		{
! 		  assemble_name (file, str);
! 		  fprintf (file, ":PLTG");
! 		}
! 	      else
! 		{
! 		  if (TARGET_AVOID_GOTPLT)
! 		    /* We shouldn't get here.  */
! 		    abort ();
  
! 		  fprintf (file, "[$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
! 		  assemble_name (file, XSTR (x, 0));
  
! 		  if (flag_pic == 1)
! 		    fprintf (file, ":GOTPLT16]");
! 		  else
! 		    fprintf (file, ":GOTPLT]");
! 		}
! 	    }
! 	  else if (cris_gotless_symbol (x))
! 	    {
! 	      if (! cris_pic_sympart_only)
! 		fprintf (file, "$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
! 	      assemble_name (file, str);
! 	      fprintf (file, ":GOTOFF");
! 	    }
! 	  else if (cris_got_symbol (x))
! 	    {
! 	      if (cris_pic_sympart_only)
! 		abort ();
! 	      fprintf (file, "[$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
! 	      assemble_name (file, XSTR (x, 0));
  
! 	      if (flag_pic == 1)
! 		fprintf (file, ":GOT16]");
! 	      else
! 		fprintf (file, ":GOT]");
! 	    }
  	  else
! 	    LOSE_AND_RETURN ("unexpected PIC symbol", x);
! 
! 	  /* Sanity check.  */
! 	  if (! current_function_uses_pic_offset_table)
! 	    output_operand_lossage ("PIC register isn't set up");
  	}
        else
! 	assemble_name (file, XSTR (x, 0));
!       break;
  
!     case LABEL_REF:
!       /* If we get one of those here, it should be dressed as PIC.  Branch
! 	 labels are normally output with the 'l' specifier, which means it
! 	 will go directly to output_asm_label and not end up here.  */
!       if (GET_CODE (XEXP (x, 0)) != CODE_LABEL
! 	  && (GET_CODE (XEXP (x, 0)) != NOTE
! 	      || NOTE_LINE_NUMBER (XEXP (x, 0)) != NOTE_INSN_DELETED_LABEL))
! 	fatal_insn ("unexpected address expression", x);
  
!       if (flag_pic)
! 	{
! 	  if (cris_gotless_symbol (x))
! 	    {
! 	      if (! cris_pic_sympart_only)
! 		fprintf (file, "$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
! 	      cris_output_addr_const (file, XEXP (x, 0));
  
! 	      fprintf (file, ":GOTOFF");
! 	    }
! 	  else
! 	    /* Labels are never marked as global symbols.  */
! 	    fatal_insn ("unexpected PIC symbol", x);
  
! 	  /* Sanity check.  */
! 	  if (! current_function_uses_pic_offset_table)
! 	    internal_error ("emitting PIC operand, but PIC register isn't set up");
! 	  break;
! 	}
  
!       output_addr_const (file, x);
!       break;
  
!     case NOTE:
!       if (NOTE_LINE_NUMBER (x) != NOTE_INSN_DELETED_LABEL)
! 	fatal_insn ("unexpected NOTE as addr_const:", x);
!     case CODE_LABEL:
!     case CONST_INT:
!     case CONST_DOUBLE:
!     case ZERO_EXTEND:
!     case SIGN_EXTEND:
!       output_addr_const (file, x);
!       break;
  
!     case CONST:
!       /* This used to output parentheses around the expression,
! 	 but that does not work on the 386 (either ATT or BSD assembler).  */
!       cris_output_addr_const (file, XEXP (x, 0));
!       break;
  
!     case PLUS:
!       /* Some assemblers need integer constants to appear last (e.g. masm).  */
!       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
  	{
! 	  cris_output_addr_const (file, XEXP (x, 1));
! 	  if (INTVAL (XEXP (x, 0)) >= 0)
! 	    fprintf (file, "+");
! 	  output_addr_const (file, XEXP (x, 0));
  	}
        else
  	{
! 	  cris_output_addr_const (file, XEXP (x, 0));
! 	  if (GET_CODE (XEXP (x, 1)) != CONST_INT
! 	      || INTVAL (XEXP (x, 1)) >= 0)
! 	    fprintf (file, "+");
! 	  cris_output_addr_const (file, XEXP (x, 1));
! 	}
!       break;
  
!     case MINUS:
!       /* Avoid outputting things like x-x or x+5-x,
! 	 since some assemblers can't handle that.  */
!       x = simplify_subtraction (x);
!       if (GET_CODE (x) != MINUS)
! 	goto restart;
! 
!       cris_output_addr_const (file, XEXP (x, 0));
!       fprintf (file, "-");
!       if ((GET_CODE (XEXP (x, 1)) == CONST_INT
! 	   && INTVAL (XEXP (x, 1)) < 0)
! 	  || GET_CODE (XEXP (x, 1)) != CONST_INT)
! 	{
! 	  fprintf (file, "%s", targetm.asm_out.open_paren);
! 	  cris_output_addr_const (file, XEXP (x, 1));
! 	  fprintf (file, "%s", targetm.asm_out.close_paren);
  	}
!       else
! 	output_addr_const (file, XEXP (x, 1));
!       break;
  
      default:
!       LOSE_AND_RETURN ("unexpected address expression", x);
      }
  }
  
--- 2978,3097 ----
    return val;
  }
  
! /* Use from within code, from e.g. PRINT_OPERAND and
!    PRINT_OPERAND_ADDRESS.  Macros used in output_addr_const need to emit
!    different things depending on whether code operand or constant is
!    emitted.  */
  
! static void
  cris_output_addr_const (FILE *file, rtx x)
  {
!   in_code++;
!   output_addr_const (file, x);
!   in_code--;
! }
  
! /* Worker function for ASM_OUTPUT_SYMBOL_REF.  */
  
! void
! cris_asm_output_symbol_ref (FILE *file, rtx x)
! {
!   if (flag_pic && in_code > 0)
!     {
!       const char *origstr = XSTR (x, 0);
!       const char *str;
  
!       str = (* targetm.strip_name_encoding) (origstr);
  
!       if (cris_gotless_symbol (x))
! 	{
! 	  if (! cris_pic_sympart_only)
! 	    fprintf (file, "$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
! 	  assemble_name (file, str);
! 	  fprintf (file, ":GOTOFF");
! 	}
!       else if (cris_got_symbol (x))
! 	{
! 	  if (cris_pic_sympart_only)
! 	    abort ();
! 	  fprintf (file, "[$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
! 	  assemble_name (file, XSTR (x, 0));
  
! 	  if (flag_pic == 1)
! 	    fprintf (file, ":GOT16]");
  	  else
! 	    fprintf (file, ":GOT]");
  	}
        else
! 	LOSE_AND_RETURN ("unexpected PIC symbol", x);
  
!       /* Sanity check.  */
!       if (! current_function_uses_pic_offset_table)
! 	output_operand_lossage ("PIC register isn't set up");
!     }
!   else
!     assemble_name (file, XSTR (x, 0));
! }
  
! /* Worker function for ASM_OUTPUT_LABEL_REF.  */
  
! void
! cris_asm_output_label_ref (FILE *file, char *buf)
! {
!   if (flag_pic && in_code > 0)
!     {
!       if (! cris_pic_sympart_only)
! 	fprintf (file, "$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
!       assemble_name (file, buf);
  
!       fprintf (file, ":GOTOFF");
  
!       /* Sanity check.  */
!       if (! current_function_uses_pic_offset_table)
! 	internal_error ("emitting PIC operand, but PIC register isn't set up");
!     }
!   else
!     assemble_name (file, buf);
! }
  
! /* Worker function for OUTPUT_ADDR_CONST_EXTRA.  */
  
! bool
! cris_output_addr_const_extra (FILE *file, rtx x)
! {
!   switch (GET_CODE (x))
!     {
!       const char *origstr;
!       const char *str;
  
!     case UNSPEC:
!       ASSERT_PLT_UNSPEC (x);
!       x = XVECEXP (x, 0, 0);
!       origstr = XSTR (x, 0);
!       str = (* targetm.strip_name_encoding) (origstr);
!       if (cris_pic_sympart_only)
  	{
! 	  assemble_name (file, str);
! 	  fprintf (file, ":PLTG");
  	}
        else
  	{
! 	  if (TARGET_AVOID_GOTPLT)
! 	    /* We shouldn't get here.  */
! 	    abort ();
  
! 	  fprintf (file, "[$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
! 	  assemble_name (file, XSTR (x, 0));
! 
! 	  if (flag_pic == 1)
! 	    fprintf (file, ":GOTPLT16]");
! 	  else
! 	    fprintf (file, ":GOTPLT]");
  	}
!       return true;
  
      default:
!       return false;
      }
  }
  
Index: cris/cris.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/cris/cris.h,v
retrieving revision 1.83
diff -c -p -r1.83 cris.h
*** cris/cris.h	27 Jan 2005 18:22:28 -0000	1.83
--- cris/cris.h	8 Feb 2005 15:35:45 -0000
*************** struct cum_args {int regs;};
*** 1352,1357 ****
--- 1352,1360 ----
  
  /* Node: Data Output */
  
+ #define OUTPUT_ADDR_CONST_EXTRA(STREAM, X, FAIL) \
+   do { if (!cris_output_addr_const_extra (STREAM, X)) goto FAIL; } while (0)
+ 
  #define IS_ASM_LOGICAL_LINE_SEPARATOR(C) (C) == '@'
  
  /* Node: Uninitialized Data */
*************** struct cum_args {int regs;};
*** 1422,1427 ****
--- 1425,1436 ----
  
  #define SUPPORTS_WEAK 1
  
+ #define ASM_OUTPUT_SYMBOL_REF(STREAM, SYM) \
+  cris_asm_output_symbol_ref (STREAM, SYM)
+ 
+ #define ASM_OUTPUT_LABEL_REF(STREAM, BUF) \
+  cris_asm_output_label_ref (STREAM, BUF)
+ 
  /* Remove any previous definition (elfos.h).  */
  #undef ASM_GENERATE_INTERNAL_LABEL
  #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)	\

brgds, H-P



More information about the Gcc-patches mailing list