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 applied: fix sh64-elf libstdc++-v3 build


2003-11-07  J"orn Rennecke <joern.rennecke@superh.com>

	* sh-protos.h (sh_pch_valid_p): Declare.
	* sh.c ("intl.h"): Include.
	(TARGET_PCH_VALID_P): Override.
	(sh_target_switches): New variable.
	(target_switches): Define.
	(sh_pch_valid_p): New function.

	* sh.h (MODE_AFTER): Don't change mode unless TARGET_HITACHI.

Index: sh-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/sh/sh-protos.h,v
retrieving revision 1.49
diff -p -r1.49 sh-protos.h
*** sh-protos.h	30 Oct 2003 02:02:47 -0000	1.49
--- sh-protos.h	7 Nov 2003 17:33:25 -0000
*************** extern rtx sh_get_pr_initial_val (void);
*** 138,142 ****
--- 138,143 ----
  extern rtx sh_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
  extern void sh_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
  extern int sh_pass_in_reg_p (CUMULATIVE_ARGS *, enum machine_mode, tree);
+ extern const char *sh_pch_valid_p (const void *data_p, size_t sz);
  
  #endif /* ! GCC_SH_PROTOS_H */
Index: sh.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.c,v
retrieving revision 1.238
diff -p -r1.238 sh.c
*** sh.c	30 Oct 2003 02:02:47 -0000	1.238
--- sh.c	7 Nov 2003 17:33:26 -0000
*************** Boston, MA 02111-1307, USA.  */
*** 48,53 ****
--- 48,54 ----
  #include "basic-block.h"
  #include "ra.h"
  #include "cfglayout.h"
+ #include "intl.h"
  
  int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
  
*************** static tree sh_build_builtin_va_list (vo
*** 349,354 ****
--- 350,358 ----
  #undef TARGET_BUILD_BUILTIN_VA_LIST
  #define TARGET_BUILD_BUILTIN_VA_LIST sh_build_builtin_va_list
  
+ #undef TARGET_PCH_VALID_P
+ #define TARGET_PCH_VALID_P sh_pch_valid_p
+ 
  struct gcc_target targetm = TARGET_INITIALIZER;
  
  /* Print the operand address in x to the stream.  */
*************** sh_cfun_interrupt_handler_p (void)
*** 6836,6841 ****
--- 6840,6929 ----
    return (lookup_attribute ("interrupt_handler",
  			    DECL_ATTRIBUTES (current_function_decl))
  	  != NULL_TREE);
+ }
+ 
+ /* ??? target_switches in toplev.c is static, hence we have to duplicate it.  */
+ static const struct
+ {
+   const char *const name;
+   const int value;
+   const char *const description;
+ }
+ sh_target_switches[] = TARGET_SWITCHES;
+ #define target_switches sh_target_switches
+ 
+ /* Like default_pch_valid_p, but take flag_mask into account.  */
+ const char *
+ sh_pch_valid_p (const void *data_p, size_t len)
+ {
+   const char *data = (const char *)data_p;
+   const char *flag_that_differs = NULL;
+   size_t i;
+   int old_flags;
+   int flag_mask
+     = (SH1_BIT | SH2_BIT | SH3_BIT | SH_E_BIT | HARD_SH4_BIT | FPU_SINGLE_BIT
+        | SH4_BIT | HITACHI_BIT | LITTLE_ENDIAN_BIT);
+   
+   /* -fpic and -fpie also usually make a PCH invalid.  */
+   if (data[0] != flag_pic)
+     return _("created and used with different settings of -fpic");
+   if (data[1] != flag_pie)
+     return _("created and used with different settings of -fpie");
+   data += 2;
+ 
+   /* Check target_flags.  */
+   memcpy (&old_flags, data, sizeof (target_flags));
+   if (((old_flags ^ target_flags) & flag_mask) != 0)
+     {
+       for (i = 0; i < ARRAY_SIZE (target_switches); i++)
+ 	{
+ 	  int bits;
+ 
+ 	  bits = target_switches[i].value;
+ 	  if (bits < 0)
+ 	    bits = -bits;
+ 	  bits &= flag_mask;
+ 	  if ((target_flags & bits) != (old_flags & bits))
+ 	    {
+ 	      flag_that_differs = target_switches[i].name;
+ 	      goto make_message;
+ 	    }
+ 	}
+       abort ();
+     }
+   data += sizeof (target_flags);
+   len -= sizeof (target_flags);
+   
+   /* Check string options.  */
+ #ifdef TARGET_OPTIONS
+   for (i = 0; i < ARRAY_SIZE (target_options); i++)
+     {
+       const char *str = *target_options[i].variable;
+       size_t l;
+       if (! str)
+ 	str = "";
+       l = strlen (str) + 1;
+       if (len < l || memcmp (data, str, l) != 0)
+ 	{
+ 	  flag_that_differs = target_options[i].prefix;
+ 	  goto make_message;
+ 	}
+       data += l;
+       len -= l;
+     }
+ #endif
+ 
+   return NULL;
+   
+  make_message:
+   {
+     char *r;
+     asprintf (&r, _("created and used with differing settings of `-m%s'"),
+ 		  flag_that_differs);
+     if (r == NULL)
+       return _("out of memory");
+     return r;
+   }
  }
  
  /* Predicates used by the templates.  */
Index: sh.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.h,v
retrieving revision 1.226
diff -p -r1.226 sh.h
*** sh.h	30 Oct 2003 02:02:48 -0000	1.226
--- sh.h	7 Nov 2003 17:33:26 -0000
*************** extern int rtx_equal_function_value_matt
*** 3242,3248 ****
     : FP_MODE_NONE)
  
  #define MODE_AFTER(MODE, INSN)                  \
!      (recog_memoized (INSN) >= 0                \
        && get_attr_fp_set (INSN) != FP_SET_NONE  \
        ? get_attr_fp_set (INSN)                  \
        : (MODE))
--- 3242,3249 ----
     : FP_MODE_NONE)
  
  #define MODE_AFTER(MODE, INSN)                  \
!      (TARGET_HITACHI				\
!       && recog_memoized (INSN) >= 0		\
        && get_attr_fp_set (INSN) != FP_SET_NONE  \
        ? get_attr_fp_set (INSN)                  \
        : (MODE))


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