summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog37
-rw-r--r--gcc/Makefile.in13
-rw-r--r--gcc/c-common.c75
-rw-r--r--gcc/c-common.h1
-rw-r--r--gcc/c-tree.h10
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-tree.h10
-rw-r--r--gcc/dbxout.c2
-rw-r--r--gcc/expr.c2
-rw-r--r--gcc/f/ChangeLog5
-rw-r--r--gcc/f/com.h9
-rw-r--r--gcc/fold-const.c12
-rw-r--r--gcc/integrate.c2
-rw-r--r--gcc/java/ChangeLog5
-rw-r--r--gcc/java/java-tree.h8
-rw-r--r--gcc/langhooks-def.h26
-rw-r--r--gcc/langhooks.c4
-rw-r--r--gcc/langhooks.h41
-rw-r--r--gcc/profile.c7
-rw-r--r--gcc/sdbout.c5
-rw-r--r--gcc/stmt.c15
-rw-r--r--gcc/stor-layout.c6
-rw-r--r--gcc/toplev.c2
-rw-r--r--gcc/tree-inline.c2
-rw-r--r--gcc/tree.h26
25 files changed, 236 insertions, 94 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dcdee3ff9b8..de97f031a94 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,40 @@
+2002-03-21 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * Makefile.in (fold-const.o, stor-layout.o, stmt.o,
+ sdbout.o, profile.o): Update.
+ * c-common.c (c_common_nodes_and_builtins): Use pushdecl
+ langhook.
+ * c-common.h (gettags): Move here from tree.h.
+ * c-tree.h (pushdecl, pushlevel, poplevel, set_block,
+ insert_block, getdecls, kept_level_p, global_bindings_p): New.
+ * dbxout.c (dbxout_init): Use getdecls langhook.
+ * expr.c (expand_expr): Use insert_block langhook.
+ * fold-const.c: Include langhooks.h.
+ (fold_range_test, fold_binary_op_with_conditional_arg,
+ fold): Use global_bindings_p langhook.
+ * integrate.c (expand_inline_function): Use insert_block langhook.
+ * langhooks-def.h (LANG_HOOKS_DECLS, LANG_HOOKS_PUSHLEVEL,
+ LANG_HOOKS_POPLEVEL, LANG_HOOKS_GLOBAL_BINDINGS_P,
+ LANG_HOOKS_INSERT_BLOCK, LANG_HOOKS_SET_BLOCK, LANG_HOOKS_PUSHDECL,
+ LANG_HOOKS_GETDECLS): New.
+ (LANG_HOOKS_INITIALIZER): Update.
+ * langhooks.c (lhd_clear_binding_stack): Use global_bindings_p
+ langhook.
+ * langhooks.h (struct lang_hooks_for_decls): New.
+ (struct lang_hooks): Update.
+ * profile.c: Include langhooks.h.
+ (output_func_start_profiler): Use new langhooks.
+ * sdbout.c: Include langhooks.h.
+ (sdbout_init, sdbout_finish): Use getdecls langhook.
+ * stmt.c: Include langhooks.h.
+ (expand_fixup, fixup_gotos): Use new langhooks.
+ * stor-layout.c: Include langhooks.h.
+ (variable_size): Use global_bindings_p langhook.
+ * toplev.c (compile_file): Use getdecls langhook.
+ * tree-inline.c (remap_block): Use insert_block langhook.
+ * tree.h (pushdecl, pushlevel, poplevel, set_block, gettags,
+ insert_block, getdecls, kept_level_p, global_bindings_p): Remove.
+
2002-03-21 Richard Henderson <rth@redhat.com>
* config/rs6000/rs6000.c (rs6000_select_rtx_section): Put symbolic
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 2f967dfe0b1..2a9df4901fa 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1335,9 +1335,10 @@ tree-inline.o : tree-inline.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) \
print-tree.o : print-tree.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(GGC_H) \
langhooks.h
stor-layout.o : stor-layout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) flags.h \
- function.h $(EXPR_H) $(RTL_H) toplev.h $(GGC_H) $(TM_P_H) $(TARGET_H)
+ function.h $(EXPR_H) $(RTL_H) toplev.h $(GGC_H) $(TM_P_H) $(TARGET_H) \
+ langhooks.h
fold-const.o : fold-const.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) flags.h \
- toplev.h $(HASHTAB_H) $(EXPR_H) $(RTL_H) $(GGC_H) $(TM_P_H)
+ toplev.h $(HASHTAB_H) $(EXPR_H) $(RTL_H) $(GGC_H) $(TM_P_H) langhooks.h
diagnostic.o : diagnostic.c diagnostic.h real.h diagnostic.def \
$(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(TM_P_H) flags.h $(GGC_H) \
input.h toplev.h intl.h langhooks.h
@@ -1379,7 +1380,8 @@ function.o : function.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h \
$(TM_P_H) langhooks.h
stmt.o : stmt.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h function.h \
insn-config.h hard-reg-set.h $(EXPR_H) libfuncs.h except.h \
- $(LOOP_H) $(RECOG_H) toplev.h output.h varray.h $(GGC_H) $(TM_P_H)
+ $(LOOP_H) $(RECOG_H) toplev.h output.h varray.h $(GGC_H) $(TM_P_H) \
+ langhooks.h
except.o : except.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h \
except.h function.h $(EXPR_H) libfuncs.h integrate.h \
insn-config.h hard-reg-set.h $(BASIC_BLOCK_H) output.h \
@@ -1410,7 +1412,7 @@ debug.o : debug.c debug.h $(CONFIG_H) $(SYSTEM_H)
sdbout.o : sdbout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) flags.h \
function.h $(EXPR_H) output.h hard-reg-set.h $(REGS_H) real.h \
insn-config.h $(OBSTACK_H) xcoffout.h c-pragma.h ggc.h \
- sdbout.h toplev.h $(TM_P_H) except.h debug.h
+ sdbout.h toplev.h $(TM_P_H) except.h debug.h langhooks.h
dwarfout.o : dwarfout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) dwarf.h \
flags.h insn-config.h reload.h output.h toplev.h $(TM_P_H) \
debug.h langhooks.h
@@ -1472,7 +1474,8 @@ conflict.o : conflict.c $(CONFIG_H) $(SYSTEM_H) $(OBSTACK_H) $(HASHTAB_H) \
$(RTL_H) hard-reg-set.h $(BASIC_BLOCK_H)
profile.o : profile.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h \
insn-config.h output.h $(REGS_H) $(EXPR_H) function.h \
- gcov-io.h toplev.h $(GGC_H) hard-reg-set.h $(BASIC_BLOCK_H) $(TARGET_H)
+ gcov-io.h toplev.h $(GGC_H) hard-reg-set.h $(BASIC_BLOCK_H) $(TARGET_H) \
+ langhooks.h
loop.o : loop.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) flags.h $(LOOP_H) \
insn-config.h $(REGS_H) hard-reg-set.h $(RECOG_H) $(EXPR_H) \
real.h $(PREDICT_H) $(BASIC_BLOCK_H) function.h \
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 28920599dea..cae7ca8240d 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -2575,31 +2575,43 @@ c_common_nodes_and_builtins ()
record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
/* These are types that type_for_size and type_for_mode use. */
- pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node));
- pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node));
- pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node));
- pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ intQI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ intHI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ intSI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ intDI_type_node));
#if HOST_BITS_PER_WIDE_INT >= 64
- pushdecl (build_decl (TYPE_DECL, get_identifier ("__int128_t"), intTI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+ get_identifier ("__int128_t"),
+ intTI_type_node));
#endif
- pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node));
- pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node));
- pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node));
- pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ unsigned_intQI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ unsigned_intHI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ unsigned_intSI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ unsigned_intDI_type_node));
#if HOST_BITS_PER_WIDE_INT >= 64
- pushdecl (build_decl (TYPE_DECL, get_identifier ("__uint128_t"), unsigned_intTI_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+ get_identifier ("__uint128_t"),
+ unsigned_intTI_type_node));
#endif
/* Create the widest literal types. */
widest_integer_literal_type_node
= make_signed_type (HOST_BITS_PER_WIDE_INT * 2);
- pushdecl (build_decl (TYPE_DECL, NULL_TREE,
- widest_integer_literal_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ widest_integer_literal_type_node));
widest_unsigned_literal_type_node
= make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2);
- pushdecl (build_decl (TYPE_DECL, NULL_TREE,
- widest_unsigned_literal_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
+ widest_unsigned_literal_type_node));
/* `unsigned long' is the standard type for sizeof.
Note that stddef.h uses `unsigned long',
@@ -2615,14 +2627,18 @@ c_common_nodes_and_builtins ()
record_builtin_type (RID_DOUBLE, NULL, double_type_node);
record_builtin_type (RID_MAX, "long double", long_double_type_node);
- pushdecl (build_decl (TYPE_DECL, get_identifier ("complex int"),
- complex_integer_type_node));
- pushdecl (build_decl (TYPE_DECL, get_identifier ("complex float"),
- complex_float_type_node));
- pushdecl (build_decl (TYPE_DECL, get_identifier ("complex double"),
- complex_double_type_node));
- pushdecl (build_decl (TYPE_DECL, get_identifier ("complex long double"),
- complex_long_double_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+ get_identifier ("complex int"),
+ complex_integer_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+ get_identifier ("complex float"),
+ complex_float_type_node));
+ (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+ get_identifier ("complex double"),
+ complex_double_type_node));
+ (*lang_hooks.decls.pushdecl)
+ (build_decl (TYPE_DECL, get_identifier ("complex long double"),
+ complex_long_double_type_node));
record_builtin_type (RID_VOID, NULL, void_type_node);
@@ -2692,14 +2708,17 @@ c_common_nodes_and_builtins ()
= TREE_TYPE (identifier_global_value (get_identifier (PTRDIFF_TYPE)));
unsigned_ptrdiff_type_node = unsigned_type (ptrdiff_type_node);
- pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"),
- va_list_type_node));
+ (*lang_hooks.decls.pushdecl)
+ (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"),
+ va_list_type_node));
- pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"),
- ptrdiff_type_node));
+ (*lang_hooks.decls.pushdecl)
+ (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"),
+ ptrdiff_type_node));
- pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"),
- sizetype));
+ (*lang_hooks.decls.pushdecl)
+ (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"),
+ sizetype));
if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
{
diff --git a/gcc/c-common.h b/gcc/c-common.h
index f93e6fe29cf..0e8fa954ace 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -320,6 +320,7 @@ extern int (*lang_statement_code_p) PARAMS ((enum tree_code));
extern void (*lang_expand_stmt) PARAMS ((tree));
extern void (*lang_expand_decl_stmt) PARAMS ((tree));
extern void (*lang_expand_function_end) PARAMS ((void));
+extern tree gettags PARAMS ((void));
/* Callback that determines if it's ok for a function to have no
noreturn attribute. */
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index f01b5238d0e..8ce73aa48a5 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -166,6 +166,15 @@ extern void c_set_yydebug PARAMS ((int));
extern void gen_aux_info_record PARAMS ((tree, int, int, int));
/* in c-decl.c */
+extern int global_bindings_p PARAMS ((void));
+extern int kept_level_p PARAMS ((void));
+extern tree getdecls PARAMS ((void));
+extern void pushlevel PARAMS ((int));
+extern tree poplevel PARAMS ((int,int, int));
+extern void insert_block PARAMS ((tree));
+extern void set_block PARAMS ((tree));
+extern tree pushdecl PARAMS ((tree));
+
extern void c_init_decl_processing PARAMS ((void));
extern void c_dup_lang_specific_decl PARAMS ((tree));
extern void c_print_identifier PARAMS ((FILE *, tree, int));
@@ -191,7 +200,6 @@ extern tree implicitly_declare PARAMS ((tree));
extern void implicit_decl_warning PARAMS ((tree));
extern int in_parm_level_p PARAMS ((void));
extern void keep_next_level PARAMS ((void));
-extern int kept_level_p PARAMS ((void));
extern tree lookup_name PARAMS ((tree));
extern tree lookup_name_current_level PARAMS ((tree));
extern void parmlist_tags_warning PARAMS ((void));
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 96b7f46cbaa..6cd614cc81e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2002-03-21 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cp-tree.h (pushdecl, pushlevel, poplevel, set_block,
+ insert_block, getdecls, global_bindings_p): New.
+
2002-03-20 Nathan Sidwell <nathan@codesourcery.com>
PR c++/4361
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 35e1da9d9f5..f213f7bf2ea 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3659,12 +3659,18 @@ extern void clone_function_decl PARAMS ((tree, int));
extern void adjust_clone_args PARAMS ((tree));
/* decl.c */
-/* resume_binding_level */
+extern int global_bindings_p PARAMS ((void));
+extern int kept_level_p PARAMS ((void));
+extern tree getdecls PARAMS ((void));
+extern void pushlevel PARAMS ((int));
+extern tree poplevel PARAMS ((int,int, int));
+extern void insert_block PARAMS ((tree));
+extern void set_block PARAMS ((tree));
+extern tree pushdecl PARAMS ((tree));
extern void cxx_init_decl_processing PARAMS ((void));
extern int toplevel_bindings_p PARAMS ((void));
extern int namespace_bindings_p PARAMS ((void));
extern void keep_next_level PARAMS ((int));
-extern int kept_level_p PARAMS ((void));
extern int template_parm_scope_p PARAMS ((void));
extern void set_class_shadows PARAMS ((tree));
extern void maybe_push_cleanup_level PARAMS ((tree));
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index b74aa1269a4..da3c8421ee4 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -412,7 +412,7 @@ dbxout_init (input_file_name)
const char *input_file_name;
{
char ltext_label_name[100];
- tree syms = getdecls ();
+ tree syms = (*lang_hooks.decls.getdecls) ();
asmfile = asm_out_file;
diff --git a/gcc/expr.c b/gcc/expr.c
index 130657ec8ba..876dfb9e3ab 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6526,7 +6526,7 @@ expand_expr (exp, target, tmode, modifier)
/* Mark the corresponding BLOCK for output in its proper place. */
if (TREE_OPERAND (exp, 2) != 0
&& ! TREE_USED (TREE_OPERAND (exp, 2)))
- insert_block (TREE_OPERAND (exp, 2));
+ (*lang_hooks.decls.insert_block) (TREE_OPERAND (exp, 2));
/* If VARS have not yet been expanded, expand them now. */
while (vars)
diff --git a/gcc/f/ChangeLog b/gcc/f/ChangeLog
index 690a4ee5d5e..48888e2b8cd 100644
--- a/gcc/f/ChangeLog
+++ b/gcc/f/ChangeLog
@@ -1,3 +1,8 @@
+Thu Mar 21 18:55:41 2002 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cp-tree.h (pushdecl, pushlevel, poplevel, set_block,
+ insert_block, getdecls, global_bindings_p): New.
+
Wed Mar 20 08:03:42 2002 Neil Booth <neil@daikokuya.demon.co.uk>
* com.c (lang_printable_name): Rename.
diff --git a/gcc/f/com.h b/gcc/f/com.h
index 6fe003eb088..90d231cfeca 100644
--- a/gcc/f/com.h
+++ b/gcc/f/com.h
@@ -157,8 +157,13 @@ struct _ffecom_symbol_
#include "storag.h"
#include "symbol.h"
-/* Structure definitions. */
-
+extern int global_bindings_p PARAMS ((void));
+extern tree getdecls PARAMS ((void));
+extern void pushlevel PARAMS ((int));
+extern tree poplevel PARAMS ((int,int, int));
+extern void insert_block PARAMS ((tree));
+extern void set_block PARAMS ((tree));
+extern tree pushdecl PARAMS ((tree));
/* Global objects accessed by users of this module. */
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 054cd45d11d..39d18bb30fa 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -52,6 +52,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "ggc.h"
#include "hashtab.h"
+#include "langhooks.h"
static void encode PARAMS ((HOST_WIDE_INT *,
unsigned HOST_WIDE_INT,
@@ -3336,7 +3337,7 @@ fold_range_test (exp)
TREE_TYPE (exp), TREE_OPERAND (exp, 0),
TREE_OPERAND (exp, 1));
- else if (global_bindings_p () == 0
+ else if ((*lang_hooks.decls.global_bindings_p) () == 0
&& ! contains_placeholder_p (lhs))
{
tree common = save_expr (lhs);
@@ -4341,7 +4342,7 @@ fold_binary_op_with_conditional_arg (code, type, cond, arg, cond_first_p)
in that case. */
if (TREE_CODE (arg) != SAVE_EXPR && ! TREE_CONSTANT (arg)
- && global_bindings_p () == 0
+ && (*lang_hooks.decls.global_bindings_p) () == 0
&& ((TREE_CODE (arg) != VAR_DECL
&& TREE_CODE (arg) != PARM_DECL)
|| TREE_SIDE_EFFECTS (arg)))
@@ -4623,7 +4624,7 @@ fold (expr)
&& (TREE_CODE (arg0) != COND_EXPR
|| count_cond (arg0, 25) + count_cond (arg1, 25) <= 25)
&& (! TREE_SIDE_EFFECTS (arg0)
- || (global_bindings_p () == 0
+ || ((*lang_hooks.decls.global_bindings_p) () == 0
&& ! contains_placeholder_p (arg0))))
return
fold_binary_op_with_conditional_arg (code, type, arg1, arg0,
@@ -4637,7 +4638,7 @@ fold (expr)
&& (TREE_CODE (arg1) != COND_EXPR
|| count_cond (arg0, 25) + count_cond (arg1, 25) <= 25)
&& (! TREE_SIDE_EFFECTS (arg1)
- || (global_bindings_p () == 0
+ || ((*lang_hooks.decls.global_bindings_p) () == 0
&& ! contains_placeholder_p (arg1))))
return
fold_binary_op_with_conditional_arg (code, type, arg0, arg1,
@@ -5249,7 +5250,8 @@ fold (expr)
if (real_onep (arg1))
return non_lvalue (convert (type, arg0));
/* x*2 is x+x */
- if (! wins && real_twop (arg1) && global_bindings_p () == 0
+ if (! wins && real_twop (arg1)
+ && (*lang_hooks.decls.global_bindings_p) () == 0
&& ! contains_placeholder_p (arg0))
{
tree arg = save_expr (arg0);
diff --git a/gcc/integrate.c b/gcc/integrate.c
index 8646859e4f6..96366e35a12 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -1240,7 +1240,7 @@ expand_inline_function (fndecl, parms, target, ignore, type,
this block to the list of blocks at this binding level. We
can't do it the way it's done for function-at-a-time mode the
superblocks have not been created yet. */
- insert_block (block);
+ (*lang_hooks.decls.insert_block) (block);
else
{
BLOCK_CHAIN (block)
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index ebbdc1dcf2c..7afd69d28f1 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,8 @@
+2002-03-21 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cp-tree.h (pushdecl, pushlevel, poplevel, set_block,
+ insert_block, getdecls, kept_level_p, global_bindings_p): New.
+
2002-03-20 Nic Ferrier <nferrier@tapsellferrier.co.uk>
* gcj.texi: @code{gcj} becomes @command{gcj}.
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index aa92f2718be..5fde938b663 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -1072,6 +1072,14 @@ extern tree ident_subst PARAMS ((const char*, int,
const char*, int, int, const char*));
extern tree identifier_subst PARAMS ((const tree,
const char *, int, int, const char *));
+extern int global_bindings_p PARAMS ((void));
+extern int kept_level_p PARAMS ((void));
+extern tree getdecls PARAMS ((void));
+extern void pushlevel PARAMS ((int));
+extern tree poplevel PARAMS ((int,int, int));
+extern void insert_block PARAMS ((tree));
+extern void set_block PARAMS ((tree));
+extern tree pushdecl PARAMS ((tree));
extern void java_init_decl_processing PARAMS ((void));
extern void java_dup_lang_specific_decl PARAMS ((tree));
extern tree build_java_signature PARAMS ((tree));
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index 404b4bc3689..f70963e9ebf 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -1,5 +1,5 @@
/* Default macros to initialize the lang_hooks data structure.
- Copyright 2001 Free Software Foundation, Inc.
+ Copyright 2001, 2002 Free Software Foundation, Inc.
Contributed by Alexandre Oliva <aoliva@redhat.com>
This file is part of GNU CC.
@@ -137,7 +137,26 @@ int lhd_tree_dump_type_quals PARAMS ((tree));
#define LANG_HOOKS_TREE_DUMP_INITIALIZER { \
LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN, \
LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN \
-} \
+}
+
+/* Declaration hooks. */
+#define LANG_HOOKS_PUSHLEVEL pushlevel
+#define LANG_HOOKS_POPLEVEL poplevel
+#define LANG_HOOKS_GLOBAL_BINDINGS_P global_bindings_p
+#define LANG_HOOKS_INSERT_BLOCK insert_block
+#define LANG_HOOKS_SET_BLOCK set_block
+#define LANG_HOOKS_PUSHDECL pushdecl
+#define LANG_HOOKS_GETDECLS getdecls
+
+#define LANG_HOOKS_DECLS { \
+ LANG_HOOKS_PUSHLEVEL, \
+ LANG_HOOKS_POPLEVEL, \
+ LANG_HOOKS_GLOBAL_BINDINGS_P, \
+ LANG_HOOKS_INSERT_BLOCK, \
+ LANG_HOOKS_SET_BLOCK, \
+ LANG_HOOKS_PUSHDECL, \
+ LANG_HOOKS_GETDECLS \
+}
/* The whole thing. The structure is defined in langhooks.h. */
#define LANG_HOOKS_INITIALIZER { \
@@ -165,7 +184,8 @@ int lhd_tree_dump_type_quals PARAMS ((tree));
LANG_HOOKS_DECL_PRINTABLE_NAME, \
LANG_HOOKS_SET_YYDEBUG, \
LANG_HOOKS_TREE_INLINING_INITIALIZER, \
- LANG_HOOKS_TREE_DUMP_INITIALIZER \
+ LANG_HOOKS_TREE_DUMP_INITIALIZER, \
+ LANG_HOOKS_DECLS \
}
#endif /* GCC_LANG_HOOKS_DEF_H */
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index cd36889a322..4416ba937a5 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -1,5 +1,5 @@
/* Default language-specific hooks.
- Copyright 2001 Free Software Foundation, Inc.
+ Copyright 2001, 2002 Free Software Foundation, Inc.
Contributed by Alexandre Oliva <aoliva@redhat.com>
This file is part of GNU CC.
@@ -110,7 +110,7 @@ lhd_set_yydebug (value)
void
lhd_clear_binding_stack ()
{
- while (! global_bindings_p ())
+ while (! (*lang_hooks.decls.global_bindings_p) ())
poplevel (0, 0, 0);
}
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 49c2c6803a1..d2a3e482ad8 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -1,5 +1,5 @@
/* The lang_hooks data structure.
- Copyright 2001 Free Software Foundation, Inc.
+ Copyright 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -65,6 +65,43 @@ struct lang_hooks_for_tree_dump
int (*type_quals) PARAMS ((tree));
};
+/* Language hooks related to decls and the symbol table. */
+
+struct lang_hooks_for_decls
+{
+ /* Enter a new lexical scope. Argument is always zero when called
+ from outside the front end. */
+ void (*pushlevel) PARAMS ((int));
+
+ /* Exit a lexical scope and return a BINDING for that scope.
+ Takes three arguments:
+ KEEP -- nonzero if there were declarations in this scope.
+ REVERSE -- reverse the order of decls before returning them.
+ FUNCTIONBODY -- nonzero if this level is the body of a function. */
+ tree (*poplevel) PARAMS ((int, int, int));
+
+ /* Returns non-zero if we are in the global binding level. Ada
+ returns -1 for an undocumented reason used in stor-layout.c. */
+ int (*global_bindings_p) PARAMS ((void));
+
+ /* Insert BLOCK at the end of the list of subblocks of the
+ current binding level. This is used when a BIND_EXPR is expanded,
+ to handle the BLOCK node inside the BIND_EXPR. */
+ void (*insert_block) PARAMS ((tree));
+
+ /* Set the BLOCK node for the current scope level. */
+ void (*set_block) PARAMS ((tree));
+
+ /* Function to add a decl to the current scope level. Takes one
+ argument, a decl to add. Returns that decl, or, if the same
+ symbol is already declared, may return a different decl for that
+ name. */
+ tree (*pushdecl) PARAMS ((tree));
+
+ /* Returns the chain of decls so far in the current scope level. */
+ tree (*getdecls) PARAMS ((void));
+};
+
/* Language-specific hooks. See langhooks-def.h for defaults. */
struct lang_hooks
@@ -177,6 +214,8 @@ struct lang_hooks
struct lang_hooks_for_tree_dump tree_dump;
+ struct lang_hooks_for_decls decls;
+
/* Whenever you add entries here, make sure you adjust langhooks-def.h
and langhooks.c accordingly. */
};
diff --git a/gcc/profile.c b/gcc/profile.c
index 09fab359a89..881604e1e27 100644
--- a/gcc/profile.c
+++ b/gcc/profile.c
@@ -49,6 +49,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "basic-block.h"
#include "gcov-io.h"
#include "target.h"
+#include "langhooks.h"
/* Additional information about the edges we need. */
struct edge_info
@@ -1153,14 +1154,14 @@ output_func_start_profiler ()
DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
- fndecl = pushdecl (fndecl);
+ fndecl = (*lang_hooks.decls.pushdecl) (fndecl);
rest_of_decl_compilation (fndecl, 0, 1, 0);
announce_function (fndecl);
current_function_decl = fndecl;
DECL_INITIAL (fndecl) = error_mark_node;
make_decl_rtl (fndecl, NULL);
init_function_start (fndecl, input_filename, lineno);
- pushlevel (0);
+ (*lang_hooks.decls.pushlevel) (0);
expand_function_start (fndecl, 0);
/* Actually generate the code to call __bb_init_func. */
@@ -1171,7 +1172,7 @@ output_func_start_profiler ()
mode, 1, table_address, Pmode);
expand_function_end (input_filename, lineno, 0);
- poplevel (1, 0, 1);
+ (*lang_hooks.decls.poplevel) (1, 0, 1);
/* Since fndecl isn't in the list of globals, it would never be emitted
when it's considered to be 'safe' for inlining, so turn off
diff --git a/gcc/sdbout.c b/gcc/sdbout.c
index 473d9b98969..bb21ae7a3b3 100644
--- a/gcc/sdbout.c
+++ b/gcc/sdbout.c
@@ -58,6 +58,7 @@ AT&T C compiler. From the example below I would conclude the following:
#include "tm_p.h"
#include "gsyms.h"
#include "debug.h"
+#include "langhooks.h"
/* 1 if PARM is passed to this function in memory. */
@@ -1516,7 +1517,7 @@ static void
sdbout_finish (main_filename)
const char *main_filename ATTRIBUTE_UNUSED;
{
- tree decl = getdecls ();
+ tree decl = (*lang_hooks.decls.getdecls) ();
unsigned int len = list_length (decl);
tree *vec = (tree *) xmalloc (sizeof (tree) * len);
unsigned int i;
@@ -1754,7 +1755,7 @@ sdbout_init (input_file_name)
#ifdef RMS_QUICK_HACK_1
tree t;
- for (t = getdecls (); t; t = TREE_CHAIN (t))
+ for (t = (*lang_hooks.decls.getdecls) (); t; t = TREE_CHAIN (t))
if (DECL_NAME (t) && IDENTIFIER_POINTER (DECL_NAME (t)) != 0
&& !strcmp (IDENTIFIER_POINTER (DECL_NAME (t)), "__vtbl_ptr_type"))
sdbout_symbol (t, 0);
diff --git a/gcc/stmt.c b/gcc/stmt.c
index b41b62bb8d0..559795df092 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -53,6 +53,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "output.h"
#include "ggc.h"
+#include "langhooks.h"
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
@@ -1054,7 +1055,7 @@ expand_fixup (tree_label, rtl_label, last_insn)
TREE_USED (block) = 1;
if (!cfun->x_whole_function_mode_p)
- insert_block (block);
+ (*lang_hooks.decls.insert_block) (block);
else
{
BLOCK_CHAIN (block)
@@ -1175,8 +1176,8 @@ fixup_gotos (thisblock, stack_level, cleanup_list, first_insn, dont_jump_in)
logically be inserting the fixup code. We do this for the
sake of getting the debugging information right. */
- pushlevel (0);
- set_block (f->context);
+ (*lang_hooks.decls.pushlevel) (0);
+ (*lang_hooks.decls.set_block) (f->context);
/* Expand the cleanups for blocks this jump exits. */
if (f->cleanup_list_list)
@@ -1215,7 +1216,7 @@ fixup_gotos (thisblock, stack_level, cleanup_list, first_insn, dont_jump_in)
destructed are still "in scope". */
cleanup_insns = get_insns ();
- poplevel (1, 0, 0);
+ (*lang_hooks.decls.poplevel) (1, 0, 0);
end_sequence ();
emit_insns_after (cleanup_insns, f->before_jump);
@@ -1249,12 +1250,12 @@ fixup_gotos (thisblock, stack_level, cleanup_list, first_insn, dont_jump_in)
if (TREE_CHAIN (lists) == thisblock->data.block.outer_cleanups)
{
start_sequence ();
- pushlevel (0);
- set_block (f->context);
+ (*lang_hooks.decls.pushlevel) (0);
+ (*lang_hooks.decls.set_block) (f->context);
expand_cleanups (TREE_VALUE (lists), NULL_TREE, 1, 1);
do_pending_stack_adjust ();
cleanup_insns = get_insns ();
- poplevel (1, 0, 0);
+ (*lang_hooks.decls.poplevel) (1, 0, 0);
end_sequence ();
if (cleanup_insns != 0)
f->before_jump
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 4a8d7d019a1..829500007be 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -31,6 +31,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "ggc.h"
#include "target.h"
+#include "langhooks.h"
/* Set to one when set_sizetype has been called. */
static int sizetype_set;
@@ -151,7 +152,8 @@ variable_size (size)
just return SIZE unchanged. Likewise for self-referential sizes and
constant sizes. */
if (TREE_CONSTANT (size)
- || global_bindings_p () < 0 || contains_placeholder_p (size))
+ || (*lang_hooks.decls.global_bindings_p) () < 0
+ || contains_placeholder_p (size))
return size;
size = save_expr (size);
@@ -167,7 +169,7 @@ variable_size (size)
if (TREE_CODE (size) == SAVE_EXPR)
SAVE_EXPR_PERSISTENT_P (size) = 1;
- if (global_bindings_p ())
+ if ((*lang_hooks.decls.global_bindings_p) ())
{
if (TREE_CONSTANT (size))
error ("type size can't be explicitly evaluated");
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 134541734cc..0f70fe13dec 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -2098,7 +2098,7 @@ compile_file ()
if (flag_syntax_only)
return;
- globals = getdecls ();
+ globals = (*lang_hooks.decls.getdecls) ();
/* Really define vars that have had only a tentative definition.
Really output inline functions that must actually be callable
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 831f6019c7b..46ea052fb82 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -257,7 +257,7 @@ remap_block (scope_stmt, decls, id)
/* We're building a clone; DECL_INITIAL is still
error_mark_node, and current_binding_level is the parm
binding level. */
- insert_block (new_block);
+ (*lang_hooks.decls.insert_block) (new_block);
else
{
/* Attach this new block after the DECL_INITIAL block for the
diff --git a/gcc/tree.h b/gcc/tree.h
index 6c03df798cc..04e12763efe 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2847,30 +2847,6 @@ extern tree invert_truthvalue PARAMS ((tree));
extern tree (*lang_type_promotes_to) PARAMS ((tree));
extern tree fold_builtin PARAMS ((tree));
-/* The language front-end must define these functions. */
-
-/* Functions for processing symbol declarations. */
-/* Function to enter a new lexical scope.
- Takes one argument: always zero when called from outside the front end. */
-extern void pushlevel PARAMS ((int));
-/* Function to exit a lexical scope. It returns a BINDING for that scope.
- Takes three arguments:
- KEEP -- nonzero if there were declarations in this scope.
- REVERSE -- reverse the order of decls before returning them.
- FUNCTIONBODY -- nonzero if this level is the body of a function. */
-extern tree poplevel PARAMS ((int, int, int));
-/* Set the BLOCK node for the current scope level. */
-extern void set_block PARAMS ((tree));
-/* Function to add a decl to the current scope level.
- Takes one argument, a decl to add.
- Returns that decl, or, if the same symbol is already declared, may
- return a different decl for that name. */
-extern tree pushdecl PARAMS ((tree));
-/* Function to return the chain of decls so far in the current scope level. */
-extern tree getdecls PARAMS ((void));
-/* Function to return the chain of structure tags in the current scope level. */
-extern tree gettags PARAMS ((void));
-
extern tree build_range_type PARAMS ((tree, tree, tree));
/* In alias.c */
@@ -3024,8 +3000,6 @@ extern int lang_attribute_common;
extern int mark_addressable PARAMS ((tree));
extern void incomplete_type_error PARAMS ((tree, tree));
extern tree truthvalue_conversion PARAMS ((tree));
-extern int global_bindings_p PARAMS ((void));
-extern void insert_block PARAMS ((tree));
/* In integrate.c */
extern void save_for_inline PARAMS ((tree));