Patchwork [rx] Add builtin-decl support

login
register
mail settings
Submitter DJ Delorie
Date Oct. 29, 2010, 6:01 a.m.
Message ID <201010290601.o9T61T7u028311@greed.delorie.com>
Download mbox | patch
Permalink /patch/69557/
State New
Headers show

Comments

DJ Delorie - Oct. 29, 2010, 6:01 a.m.
I've had this in my tree for a while, it's for LTO.  Ok?

	* config/rx/rx.c (rx_init_builtins): Save all decls.
	(rx_builtin_decl): New, return them as requested.
Richard Guenther - Oct. 29, 2010, 1:24 p.m.
On Fri, Oct 29, 2010 at 8:01 AM, DJ Delorie <dj@redhat.com> wrote:
>
> I've had this in my tree for a while, it's for LTO.  Ok?
>
>        * config/rx/rx.c (rx_init_builtins): Save all decls.
>        (rx_builtin_decl): New, return them as requested.
>
> Index: rx.c
> ===================================================================
> --- rx.c        (revision 166029)
> +++ rx.c        (working copy)
> @@ -1820,34 +1820,39 @@ enum rx_builtin
>   RX_BUILTIN_SAT,
>   RX_BUILTIN_SETPSW,
>   RX_BUILTIN_WAIT,
>   RX_BUILTIN_max
>  };
>
> +static tree rx_builtins[RX_BUILTIN_max];
> +

Needs GTY markers, otherwise it'll crash when in lto1.

Richard.

>  static void
>  rx_init_builtins (void)
>  {
>  #define ADD_RX_BUILTIN1(UC_NAME, LC_NAME, RET_TYPE, ARG_TYPE)          \
> -  add_builtin_function ("__builtin_rx_" LC_NAME,                       \
> +  rx_builtins[RX_BUILTIN_##UC_NAME] =                                  \
> +    add_builtin_function ("__builtin_rx_" LC_NAME,                     \
>                        build_function_type_list (RET_TYPE##_type_node, \
>                                                  ARG_TYPE##_type_node, \
>                                                  NULL_TREE),           \
>                        RX_BUILTIN_##UC_NAME,                           \
>                        BUILT_IN_MD, NULL, NULL_TREE)
>
>  #define ADD_RX_BUILTIN2(UC_NAME, LC_NAME, RET_TYPE, ARG_TYPE1, ARG_TYPE2) \
> -  add_builtin_function ("__builtin_rx_" LC_NAME,                       \
> +  rx_builtins[RX_BUILTIN_##UC_NAME] =                                  \
> +    add_builtin_function ("__builtin_rx_" LC_NAME,                     \
>                        build_function_type_list (RET_TYPE##_type_node, \
>                                                  ARG_TYPE1##_type_node,\
>                                                  ARG_TYPE2##_type_node,\
>                                                  NULL_TREE),           \
>                        RX_BUILTIN_##UC_NAME,                           \
>                        BUILT_IN_MD, NULL, NULL_TREE)
>
>  #define ADD_RX_BUILTIN3(UC_NAME,LC_NAME,RET_TYPE,ARG_TYPE1,ARG_TYPE2,ARG_TYPE3) \
> -  add_builtin_function ("__builtin_rx_" LC_NAME,                       \
> +  rx_builtins[RX_BUILTIN_##UC_NAME] =                                  \
> +    add_builtin_function ("__builtin_rx_" LC_NAME,                     \
>                        build_function_type_list (RET_TYPE##_type_node, \
>                                                  ARG_TYPE1##_type_node,\
>                                                  ARG_TYPE2##_type_node,\
>                                                  ARG_TYPE3##_type_node,\
>                                                  NULL_TREE),           \
>                        RX_BUILTIN_##UC_NAME,                           \
> @@ -1873,12 +1878,23 @@ rx_init_builtins (void)
>   ADD_RX_BUILTIN1 (ROUND,   "round",   intSI, float);
>   ADD_RX_BUILTIN1 (REVW,    "revw",    intSI, intSI);
>   ADD_RX_BUILTIN1 (SAT,     "sat",     intSI, intSI);
>   ADD_RX_BUILTIN1 (WAIT,    "wait",    void,  void);
>  }
>
> +/* Return the RX builtin for CODE.  */
> +
> +static tree
> +rx_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
> +{
> +  if (code >= RX_BUILTIN_max)
> +    return error_mark_node;
> +
> +  return rx_builtins[code];
> +}
> +
>  static rtx
>  rx_expand_void_builtin_1_arg (rtx arg, rtx (* gen_func)(rtx), bool reg)
>  {
>   if (reg && ! REG_P (arg))
>     arg = force_reg (SImode, arg);
>
> @@ -2770,12 +2786,15 @@ rx_memory_move_cost (enum machine_mode m
>  #undef TARGET_ASM_SELECT_SECTION
>  #define        TARGET_ASM_SELECT_SECTION       rx_select_section
>
>  #undef  TARGET_INIT_BUILTINS
>  #define TARGET_INIT_BUILTINS           rx_init_builtins
>
> +#undef  TARGET_BUILTIN_DECL
> +#define TARGET_BUILTIN_DECL            rx_builtin_decl
> +
>  #undef  TARGET_EXPAND_BUILTIN
>  #define TARGET_EXPAND_BUILTIN          rx_expand_builtin
>
>  #undef  TARGET_ASM_CONSTRUCTOR
>  #define TARGET_ASM_CONSTRUCTOR         rx_elf_asm_constructor
>
>
DJ Delorie - Oct. 29, 2010, 6:12 p.m.
> Needs GTY markers, otherwise it'll crash when in lto1.

Was that always the case?  I copied i386 back when, and it didn't have
it.  Of course, I re-copied i386 now :-)

static GTY(()) tree rx_builtins[(int) RX_BUILTIN_max];

Patch

Index: rx.c
===================================================================
--- rx.c	(revision 166029)
+++ rx.c	(working copy)
@@ -1820,34 +1820,39 @@  enum rx_builtin
   RX_BUILTIN_SAT,
   RX_BUILTIN_SETPSW,
   RX_BUILTIN_WAIT,
   RX_BUILTIN_max
 };
 
+static tree rx_builtins[RX_BUILTIN_max];
+
 static void
 rx_init_builtins (void)
 {
 #define ADD_RX_BUILTIN1(UC_NAME, LC_NAME, RET_TYPE, ARG_TYPE)		\
-  add_builtin_function ("__builtin_rx_" LC_NAME,			\
+  rx_builtins[RX_BUILTIN_##UC_NAME] =					\
+    add_builtin_function ("__builtin_rx_" LC_NAME,			\
 			build_function_type_list (RET_TYPE##_type_node, \
 						  ARG_TYPE##_type_node, \
 						  NULL_TREE),		\
 			RX_BUILTIN_##UC_NAME,				\
 			BUILT_IN_MD, NULL, NULL_TREE)
 
 #define ADD_RX_BUILTIN2(UC_NAME, LC_NAME, RET_TYPE, ARG_TYPE1, ARG_TYPE2) \
-  add_builtin_function ("__builtin_rx_" LC_NAME,			\
+  rx_builtins[RX_BUILTIN_##UC_NAME] =					\
+    add_builtin_function ("__builtin_rx_" LC_NAME,			\
 			build_function_type_list (RET_TYPE##_type_node, \
 						  ARG_TYPE1##_type_node,\
 						  ARG_TYPE2##_type_node,\
 						  NULL_TREE),		\
 			RX_BUILTIN_##UC_NAME,				\
 			BUILT_IN_MD, NULL, NULL_TREE)
 
 #define ADD_RX_BUILTIN3(UC_NAME,LC_NAME,RET_TYPE,ARG_TYPE1,ARG_TYPE2,ARG_TYPE3) \
-  add_builtin_function ("__builtin_rx_" LC_NAME,			\
+  rx_builtins[RX_BUILTIN_##UC_NAME] =					\
+    add_builtin_function ("__builtin_rx_" LC_NAME,			\
 			build_function_type_list (RET_TYPE##_type_node, \
 						  ARG_TYPE1##_type_node,\
 						  ARG_TYPE2##_type_node,\
 						  ARG_TYPE3##_type_node,\
 						  NULL_TREE),		\
 			RX_BUILTIN_##UC_NAME,				\
@@ -1873,12 +1878,23 @@  rx_init_builtins (void)
   ADD_RX_BUILTIN1 (ROUND,   "round",   intSI, float);
   ADD_RX_BUILTIN1 (REVW,    "revw",    intSI, intSI);
   ADD_RX_BUILTIN1 (SAT,     "sat",     intSI, intSI);
   ADD_RX_BUILTIN1 (WAIT,    "wait",    void,  void);
 }
 
+/* Return the RX builtin for CODE.  */
+
+static tree
+rx_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
+{
+  if (code >= RX_BUILTIN_max)
+    return error_mark_node;
+
+  return rx_builtins[code];
+}
+
 static rtx
 rx_expand_void_builtin_1_arg (rtx arg, rtx (* gen_func)(rtx), bool reg)
 {
   if (reg && ! REG_P (arg))
     arg = force_reg (SImode, arg);
 
@@ -2770,12 +2786,15 @@  rx_memory_move_cost (enum machine_mode m
 #undef	TARGET_ASM_SELECT_SECTION
 #define	TARGET_ASM_SELECT_SECTION	rx_select_section
 
 #undef  TARGET_INIT_BUILTINS
 #define TARGET_INIT_BUILTINS		rx_init_builtins
 
+#undef  TARGET_BUILTIN_DECL
+#define TARGET_BUILTIN_DECL		rx_builtin_decl
+
 #undef  TARGET_EXPAND_BUILTIN
 #define TARGET_EXPAND_BUILTIN		rx_expand_builtin
 
 #undef  TARGET_ASM_CONSTRUCTOR
 #define TARGET_ASM_CONSTRUCTOR		rx_elf_asm_constructor