This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: lang_expand_expr langhook
Richard Henderson wrote:-
> Previously, in the default case, we'd abort. Now it looks like
> we'll recurse and hit the default again. Not good.
>
> As for the expand_modifier thing... Hum. I don't _really_ like
> any of the solutions. Why don't we ignore the problem and make
> the fourth lang_hooks.expand_expr argument be an int?
Does this look better? I've assumed that all compilers can convert
enum->int and int->enum without error. If that's not true, I'll
need to add some casts.
Neil.
* c-common.c (c_expand_expr): Fix prototype.
* c-common.h (c_expand_expr): Always declare, update.
* c-lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine.
* c-objc-common.c (c_objc_common_init): No global hook.
* expr.c (expand_expr): Use langhook.
* expr.h (enum expand_modifier): Conditionally declare.
* langhooks-def.h (lhd_expand_expr, LANG_HOOKS_EXPAND_EXPR): New.
(LANG_HOOKS_INITIALIZER): Update.
* langhooks.c (lhd_expand_expr): New.
* langhooks.h (struct lang_hooks): New hook.
* toplev.c (lang_expand_expr_t, lang_expand_expr): Delete.
(lang_independent_init): Don't default hook.
* tree.h (enum expand_modifier): Conditionally declare.
ada:
* misc.c (LANG_HOOKS_EXPAND_EXPR): Redefine.
(gnat_init): Don't set hook.
(gnat_expand_expr): Fix prototype.
cp:
* cp-lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine.
* cp-tree.h (init_cplus_expand): Remove.
(cxx_expand_expr): New.
* expr.c (cplus_expand_expr): Rename cxx_expand_expr,
fix prototype.
(init_cplus_expand): Remove.
* lex.c (cxx_init): Don't call init_cplus_expand.
java:
* expr.c (java_lang_expand_expr): Rename java_expand_expr,
fix prototype.
* java-tree.h (java_lang_expand_expr): Similarly.
* lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine.
(java_init): Don't set hook.
objc:
* objc-lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine.
============================================================
Index: gcc/c-common.c
--- gcc/c-common.c 2002/03/24 12:27:27 1.303
+++ gcc/c-common.c 2002/03/27 06:57:39
@@ -3588,7 +3588,7 @@ c_expand_expr (exp, target, tmode, modif
tree exp;
rtx target;
enum machine_mode tmode;
- enum expand_modifier modifier;
+ int modifier; /* Actually enum_modifier. */
{
switch (TREE_CODE (exp))
{
============================================================
Index: gcc/c-common.h
--- gcc/c-common.h 2002/03/24 12:27:27 1.121
+++ gcc/c-common.h 2002/03/27 06:57:41
@@ -842,12 +842,9 @@ extern tree finish_label_address_expr P
different implementations. Used in c-common.c. */
extern tree lookup_label PARAMS ((tree));
-/* enum expand_modified is in expr.h, as is the macro below. */
-
-#ifdef QUEUED_VAR
-extern rtx c_expand_expr PARAMS ((tree, rtx, enum machine_mode,
- enum expand_modifier));
-#endif
+extern rtx c_expand_expr PARAMS ((tree, rtx,
+ enum machine_mode,
+ int));
extern int c_safe_from_p PARAMS ((rtx, tree));
============================================================
Index: gcc/c-lang.c
--- gcc/c-lang.c 2002/03/26 07:15:35 1.79
+++ gcc/c-lang.c 2002/03/27 06:57:41
@@ -52,6 +52,8 @@ static void c_post_options PARAMS ((void
#define LANG_HOOKS_SAFE_FROM_P c_safe_from_p
#undef LANG_HOOKS_MARK_TREE
#define LANG_HOOKS_MARK_TREE c_mark_tree
+#undef LANG_HOOKS_EXPAND_EXPR
+#define LANG_HOOKS_EXPAND_EXPR c_expand_expr
#undef LANG_HOOKS_PARSE_FILE
#define LANG_HOOKS_PARSE_FILE c_common_parse_file
#undef LANG_HOOKS_STATICP
============================================================
Index: gcc/c-objc-common.c
--- gcc/c-objc-common.c 2002/03/24 12:27:28 1.7
+++ gcc/c-objc-common.c 2002/03/27 06:57:42
@@ -225,7 +225,6 @@ c_objc_common_init (filename)
save_lang_status = &push_c_function_context;
restore_lang_status = &pop_c_function_context;
mark_lang_status = &mark_c_function_context;
- lang_expand_expr = c_expand_expr;
lang_expand_decl_stmt = c_expand_decl_stmt;
/* These were not defined in the Objective-C front end, but I'm
============================================================
Index: gcc/expr.c
--- gcc/expr.c 2002/03/25 19:10:40 1.437
+++ gcc/expr.c 2002/03/27 06:58:13
@@ -7240,7 +7240,8 @@ expand_expr (exp, target, tmode, modifie
{
if (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
== BUILT_IN_FRONTEND)
- return (*lang_expand_expr) (exp, original_target, tmode, modifier);
+ return (*lang_hooks.expand_expr)
+ (exp, original_target, tmode, modifier);
else
return expand_builtin (exp, target, subtarget, tmode, ignore);
}
@@ -8800,7 +8801,7 @@ expand_expr (exp, target, tmode, modifie
abort ();
default:
- return (*lang_expand_expr) (exp, original_target, tmode, modifier);
+ return (*lang_hooks.expand_expr) (exp, original_target, tmode, modifier);
}
/* Here to do an ordinary binary operator, generating an instruction
============================================================
Index: gcc/langhooks-def.h
--- gcc/langhooks-def.h 2002/03/26 07:15:36 1.16
+++ gcc/langhooks-def.h 2002/03/27 06:58:13
@@ -49,6 +49,7 @@ extern void lhd_clear_binding_stack PARA
extern void lhd_print_tree_nothing PARAMS ((FILE *, tree, int));
extern const char *lhd_decl_printable_name PARAMS ((tree, int));
extern void lhd_set_yydebug PARAMS ((int));
+extern rtx lhd_expand_expr PARAMS ((tree, rtx, enum machine_mode, int));
/* Declarations of default tree inlining hooks. */
tree lhd_tree_inlining_walk_subtrees PARAMS ((tree *, int *,
@@ -78,6 +79,7 @@ tree lhd_tree_inlining_convert_parm_for_
#define LANG_HOOKS_POST_OPTIONS lhd_do_nothing
#define LANG_HOOKS_GET_ALIAS_SET lhd_get_alias_set
#define LANG_HOOKS_EXPAND_CONSTANT lhd_return_tree
+#define LANG_HOOKS_EXPAND_EXPR lhd_expand_expr
#define LANG_HOOKS_SAFE_FROM_P lhd_safe_from_p
#define LANG_HOOKS_STATICP lhd_staticp
#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL lhd_do_nothing_t
@@ -174,6 +176,7 @@ int lhd_tree_dump_type_quals PARAMS ((
LANG_HOOKS_CLEAR_BINDING_STACK, \
LANG_HOOKS_GET_ALIAS_SET, \
LANG_HOOKS_EXPAND_CONSTANT, \
+ LANG_HOOKS_EXPAND_EXPR, \
LANG_HOOKS_SAFE_FROM_P, \
LANG_HOOKS_STATICP, \
LANG_HOOKS_DUP_LANG_SPECIFIC_DECL, \
============================================================
Index: gcc/langhooks.c
--- gcc/langhooks.c 2002/03/25 19:10:41 1.22
+++ gcc/langhooks.c 2002/03/27 06:58:14
@@ -143,6 +143,18 @@ hook_get_alias_set_0 (t)
return 0;
}
+/* This is the default expand_expr function. */
+
+rtx
+lhd_expand_expr (t, r, mm, em)
+ tree t ATTRIBUTE_UNUSED;
+ rtx r ATTRIBUTE_UNUSED;
+ enum machine_mode mm ATTRIBUTE_UNUSED;
+ int em ATTRIBUTE_UNUSED;
+{
+ abort ();
+}
+
/* This is the default decl_printable_name function. */
const char *
============================================================
Index: gcc/langhooks.h
--- gcc/langhooks.h 2002/03/26 07:15:36 1.23
+++ gcc/langhooks.h 2002/03/27 06:58:15
@@ -21,6 +21,8 @@ Boston, MA 02111-1307, USA. */
#ifndef GCC_LANG_HOOKS_H
#define GCC_LANG_HOOKS_H
+/* This file should be #include-d after tree.h. */
+
/* A print hook for print_tree (). */
typedef void (*lang_print_tree_hook) PARAMS ((FILE *, tree, int indent));
@@ -158,6 +160,10 @@ struct lang_hooks
Returns either the same expression or a language-independent
constant equivalent to its input. */
tree (*expand_constant) PARAMS ((tree));
+
+ /* Called by expand_expr for language-specific tree codes.
+ Fourth argument is actually an enum expand_modifier. */
+ rtx (*expand_expr) PARAMS ((tree, rtx, enum machine_mode, int));
/* Hook called by safe_from_p for language-specific tree codes. It is
up to the language front-end to install a hook if it has any such
============================================================
Index: gcc/toplev.c
--- gcc/toplev.c 2002/03/26 22:07:42 1.605
+++ gcc/toplev.c 2002/03/27 06:58:31
@@ -349,14 +349,6 @@ tree current_function_decl;
if none. */
tree current_function_func_begin_label;
-/* Pointer to function to compute rtl for a language-specific tree code. */
-
-typedef rtx (*lang_expand_expr_t)
- PARAMS ((union tree_node *, rtx, enum machine_mode,
- enum expand_modifier modifier));
-
-lang_expand_expr_t lang_expand_expr = 0;
-
/* Pointer to function to finish handling an incomplete decl at the
end of compilation. */
@@ -4945,8 +4937,6 @@ process_options ()
static void
lang_independent_init ()
{
- lang_expand_expr = (lang_expand_expr_t) do_abort;
-
/* Initialize the garbage-collector, and string pools. */
init_ggc ();
ggc_add_rtx_root (&stack_limit_rtx, 1);
============================================================
Index: gcc/ada/misc.c
--- gcc/ada/misc.c 2002/03/26 07:15:51 1.26
+++ gcc/ada/misc.c 2002/03/27 06:58:33
@@ -108,6 +108,8 @@ static void gnat_mark_tree PARAMS ((tre
#define LANG_HOOKS_HONOR_READONLY 1
#undef LANG_HOOKS_GET_ALIAS_SET
#define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
+#undef LANG_HOOKS_EXPAND_EXPR
+#define LANG_HOOKS_EXPAND_EXPR gnat_expand_expr
#undef LANG_HOOKS_PRINT_DECL
#define LANG_HOOKS_PRINT_DECL gnat_print_decl
#undef LANG_HOOKS_PRINT_TYPE
@@ -167,7 +169,7 @@ int ggc_p = 1;
static void internal_error_function PARAMS ((const char *, va_list *));
static rtx gnat_expand_expr PARAMS ((tree, rtx, enum machine_mode,
- enum expand_modifier));
+ int));
static void gnat_adjust_rli PARAMS ((record_layout_info));
/* Declare functions we use as part of startup. */
@@ -362,8 +364,6 @@ gnat_init (filename)
Define the additional tree codes here. This isn't the best place to put
it, but it's where g++ does it. */
- lang_expand_expr = gnat_expand_expr;
-
gnat_init_decl_processing ();
/* Add the input filename as the last argument. */
@@ -507,7 +507,7 @@ gnat_expand_expr (exp, target, tmode, mo
tree exp;
rtx target;
enum machine_mode tmode;
- enum expand_modifier modifier;
+ int modifier; /* Actually an enum expand_modifier. */
{
tree type = TREE_TYPE (exp);
tree new;
============================================================
Index: gcc/cp/cp-lang.c
--- gcc/cp/cp-lang.c 2002/03/26 07:15:54 1.17
+++ gcc/cp/cp-lang.c 2002/03/27 06:58:33
@@ -49,6 +49,8 @@ static bool ok_to_generate_alias_set_for
#define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set
#undef LANG_HOOKS_EXPAND_CONSTANT
#define LANG_HOOKS_EXPAND_CONSTANT cplus_expand_constant
+#undef LANG_HOOKS_EXPAND_EXPR
+#define LANG_HOOKS_EXPAND_EXPR cxx_expand_expr
#undef LANG_HOOKS_SAFE_FROM_P
#define LANG_HOOKS_SAFE_FROM_P c_safe_from_p
#undef LANG_HOOKS_PARSE_FILE
============================================================
Index: gcc/cp/cp-tree.h
--- gcc/cp/cp-tree.h 2002/03/26 18:16:19 1.697
+++ gcc/cp/cp-tree.h 2002/03/27 06:58:51
@@ -3907,8 +3907,10 @@ extern void check_handlers PARAMS ((tr
extern void choose_personality_routine PARAMS ((enum languages));
/* in expr.c */
-extern void init_cplus_expand PARAMS ((void));
extern int extract_init PARAMS ((tree, tree));
+extern rtx cxx_expand_expr PARAMS ((tree, rtx,
+ enum machine_mode,
+ int));
extern tree cplus_expand_constant PARAMS ((tree));
/* friend.c */
============================================================
Index: gcc/cp/expr.c
--- gcc/cp/expr.c 2002/01/23 14:25:56 1.63
+++ gcc/cp/expr.c 2002/03/27 06:58:51
@@ -32,9 +32,6 @@ Boston, MA 02111-1307, USA. */
#include "except.h"
#include "tm_p.h"
-static rtx cplus_expand_expr PARAMS ((tree, rtx, enum machine_mode,
- enum expand_modifier));
-
/* Hook used by output_constant to expand language-specific
constants. */
@@ -79,12 +76,12 @@ cplus_expand_constant (cst)
/* Hook used by expand_expr to expand language-specific tree codes. */
-static rtx
-cplus_expand_expr (exp, target, tmode, modifier)
+rtx
+cxx_expand_expr (exp, target, tmode, modifier)
tree exp;
rtx target;
enum machine_mode tmode;
- enum expand_modifier modifier;
+ int modifier; /* Actually an enum expand_modifier. */
{
tree type = TREE_TYPE (exp);
register enum machine_mode mode = TYPE_MODE (type);
@@ -129,12 +126,6 @@ cplus_expand_expr (exp, target, tmode, m
abort ();
/* NOTREACHED */
return NULL;
-}
-
-void
-init_cplus_expand ()
-{
- lang_expand_expr = cplus_expand_expr;
}
int
============================================================
Index: gcc/cp/lex.c
--- gcc/cp/lex.c 2002/03/24 12:27:42 1.271
+++ gcc/cp/lex.c 2002/03/27 06:58:55
@@ -647,7 +647,6 @@ cxx_init (filename)
init_reswords ();
init_spew ();
init_tree ();
- init_cplus_expand ();
init_cp_semantics ();
lang_unsafe_for_reeval = c_unsafe_for_reeval;
============================================================
Index: gcc/java/expr.c
--- gcc/java/expr.c 2002/03/23 01:19:40 1.138
+++ gcc/java/expr.c 2002/03/27 06:59:06
@@ -2490,11 +2490,11 @@ get_primitive_array_vtable (tree elt)
}
struct rtx_def *
-java_lang_expand_expr (exp, target, tmode, modifier)
+java_expand_expr (exp, target, tmode, modifier)
register tree exp;
rtx target;
enum machine_mode tmode;
- enum expand_modifier modifier;
+ int modifier; /* Actually an enum expand_modifier. */
{
tree current;
============================================================
Index: gcc/java/java-tree.h
--- gcc/java/java-tree.h 2002/03/26 07:16:00 1.141
+++ gcc/java/java-tree.h 2002/03/27 06:59:13
@@ -1247,12 +1247,10 @@ extern void append_gpp_mangled_name PARA
extern void add_predefined_file PARAMS ((tree));
extern int predefined_filename_p PARAMS ((tree));
-/* We use ARGS_SIZE_RTX to indicate that gcc/expr.h has been included
- to declare `enum expand_modifier'. */
-#if defined (TREE_CODE) && defined(RTX_CODE) && defined (HAVE_MACHINE_MODES) && defined (ARGS_SIZE_RTX)
-struct rtx_def * java_lang_expand_expr PARAMS ((tree, rtx, enum machine_mode,
- enum expand_modifier));
-#endif /* TREE_CODE && RTX_CODE && HAVE_MACHINE_MODES && ARGS_SIZE_RTX */
+#if defined(RTX_CODE) && defined (HAVE_MACHINE_MODES)
+struct rtx_def * java_expand_expr PARAMS ((tree, rtx, enum machine_mode,
+ int));
+#endif
#define DECL_FINAL(DECL) DECL_LANG_FLAG_3 (DECL)
============================================================
Index: gcc/java/lang.c
--- gcc/java/lang.c 2002/03/26 07:16:00 1.92
+++ gcc/java/lang.c 2002/03/27 06:59:13
@@ -225,6 +225,8 @@ static int dependency_tracking = 0;
#define LANG_HOOKS_PARSE_FILE java_parse_file
#undef LANG_HOOKS_MARK_TREE
#define LANG_HOOKS_MARK_TREE java_mark_tree
+#undef LANG_HOOKS_EXPAND_EXPR
+#define LANG_HOOKS_EXPAND_EXPR java_expand_expr
#undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL
#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL java_dup_lang_specific_decl
#undef LANG_HOOKS_DECL_PRINTABLE_NAME
@@ -511,7 +513,6 @@ java_init (filename)
jcf_path_seal (version_flag);
print_error_function = lang_print_error;
- lang_expand_expr = java_lang_expand_expr;
java_init_decl_processing ();
============================================================
Index: gcc/objc/objc-lang.c
--- gcc/objc/objc-lang.c 2002/03/26 07:16:01 1.8
+++ gcc/objc/objc-lang.c 2002/03/27 06:59:13
@@ -48,6 +48,8 @@ static void objc_post_options
#define LANG_HOOKS_PARSE_FILE c_common_parse_file
#undef LANG_HOOKS_MARK_TREE
#define LANG_HOOKS_MARK_TREE c_mark_tree
+#undef LANG_HOOKS_EXPAND_EXPR
+#define LANG_HOOKS_EXPAND_EXPR c_expand_expr
#undef LANG_HOOKS_STATICP
#define LANG_HOOKS_STATICP c_staticp
#undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL