This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] sh-elf, -mrenesas, FUNCTION_VALUE


This file:

char bar(int);

void foo (char *f, int i)
{
  f[i] = bar(i);
}

Fails thusly:

$ ./cc1 -quiet -mrenesas -O2 -m4 dj.c
dj.c: In function `foo':

dj.c:5: internal compiler error: in emit_move_insn, at expr.c:2792


The failure is due to bar()'s return value being mispromoted, leading
to a (set (QI) (SI)).  Proposed patch follows.  Comments?


2003-10-24  DJ Delorie  <dj@redhat.com>

	* config/sh/sh.h (FUNCTION_VALUE): Support renesas attribute.

Index: config/sh/sh.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.h,v
retrieving revision 1.225
diff -p -2 -r1.225 sh.h
*** config/sh/sh.h	13 Oct 2003 21:16:32 -0000	1.225
--- config/sh/sh.h	25 Oct 2003 02:35:39 -0000
*************** extern enum reg_class reg_class_from_let
*** 1634,1646 ****
  #define FUNCTION_VALUE(VALTYPE, FUNC)					\
    gen_rtx (REG,								\
! 	   ((GET_MODE_CLASS (TYPE_MODE (VALTYPE)) == MODE_INT		\
! 	     && GET_MODE_SIZE (TYPE_MODE (VALTYPE)) < UNITS_PER_WORD	\
! 	     && (TREE_CODE (VALTYPE) == INTEGER_TYPE			\
! 		 || TREE_CODE (VALTYPE) == ENUMERAL_TYPE		\
! 		 || TREE_CODE (VALTYPE) == BOOLEAN_TYPE			\
! 		 || TREE_CODE (VALTYPE) == CHAR_TYPE			\
! 		 || TREE_CODE (VALTYPE) == REAL_TYPE			\
! 		 || TREE_CODE (VALTYPE) == OFFSET_TYPE))		\
! 	    ? (TARGET_SHMEDIA ? DImode : SImode) : TYPE_MODE (VALTYPE)), \
  	   BASE_RETURN_VALUE_REG (TYPE_MODE (VALTYPE)))
  
--- 1634,1648 ----
  #define FUNCTION_VALUE(VALTYPE, FUNC)					\
    gen_rtx (REG,								\
!            sh_attr_renesas_p (FUNC)					\
! 	   ? TYPE_MODE (VALTYPE)					\
! 	   : ((GET_MODE_CLASS (TYPE_MODE (VALTYPE)) == MODE_INT		\
! 	       && GET_MODE_SIZE (TYPE_MODE (VALTYPE)) < UNITS_PER_WORD	\
! 	       && (TREE_CODE (VALTYPE) == INTEGER_TYPE			\
! 		   || TREE_CODE (VALTYPE) == ENUMERAL_TYPE		\
! 		   || TREE_CODE (VALTYPE) == BOOLEAN_TYPE		\
! 		   || TREE_CODE (VALTYPE) == CHAR_TYPE			\
! 		   || TREE_CODE (VALTYPE) == REAL_TYPE			\
! 		   || TREE_CODE (VALTYPE) == OFFSET_TYPE))		\
! 	      ? (TARGET_SHMEDIA ? DImode : SImode) : TYPE_MODE (VALTYPE)), \
  	   BASE_RETURN_VALUE_REG (TYPE_MODE (VALTYPE)))
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]