[RFA] Next batch of langhooks

Neil Booth neil@daikokuya.demon.co.uk
Wed Mar 20 15:27:00 GMT 2002


This does symbol-table related langhooks.  To keep this patch small,
I've done the minimum necessary to get the hooks working, so I've kept
the old global names, but removed them from the global namespace
(i.e. they are no longer declared in tree.h, but in front-end specific
headers).

In a follow-up patch, I will "localize" these names for C (and maybe C++)
with a c_ and cxx_ prefix, since we don't want confusion during a future
front-end merge.  Is it worthwhile doing follow-up patches that e.g.
prefix gnat_ on e.g. Ada versions, or should I just leave them as
they are?

Bootstrapping x86 Linux.  OK on a successful completion?

Neil.

	* 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.
cp:
	* cp-tree.h (pushdecl, pushlevel, poplevel, set_block,
	insert_block, getdecls, global_bindings_p): New.
java:
	* cp-tree.h (pushdecl, pushlevel, poplevel, set_block,
	insert_block, getdecls, kept_level_p, global_bindings_p): New.
f:
	* cp-tree.h (pushdecl, pushlevel, poplevel, set_block,
	insert_block, getdecls, global_bindings_p): New.

============================================================
Index: gcc/Makefile.in
--- gcc/Makefile.in	2002/03/20 07:58:17	1.841
+++ gcc/Makefile.in	2002/03/20 23:12:51
@@ -1335,9 +1335,10 @@ tree-inline.o : tree-inline.c $(CONFIG_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) $(SY
    $(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) $(
 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) $(SY
    $(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 \
============================================================
Index: gcc/c-common.c
--- gcc/c-common.c	2002/03/20 07:58:18	1.299
+++ gcc/c-common.c	2002/03/20 23:13:02
@@ -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));
-
-  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_va_list"),
+		 va_list_type_node));
+
+  (*lang_hooks.decls.pushdecl)
+    (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"),
+		 ptrdiff_type_node));
+
+  (*lang_hooks.decls.pushdecl)
+    (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"),
+		 sizetype));
 
   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
     {
============================================================
Index: gcc/c-common.h
--- gcc/c-common.h	2002/03/17 20:41:34	1.119
+++ gcc/c-common.h	2002/03/20 23:13:05
@@ -320,6 +320,7 @@ extern int (*lang_statement_code_p)     
 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.  */
============================================================
Index: gcc/c-tree.h
--- gcc/c-tree.h	2002/03/19 08:47:10	1.85
+++ gcc/c-tree.h	2002/03/20 23:13:07
@@ -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          
 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));
============================================================
Index: gcc/dbxout.c
--- gcc/dbxout.c	2002/03/12 05:40:32	1.119
+++ gcc/dbxout.c	2002/03/20 23:13:13
@@ -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;
 
============================================================
Index: gcc/expr.c
--- gcc/expr.c	2002/03/20 09:41:40	1.432
+++ gcc/expr.c	2002/03/20 23:13:39
@@ -6526,7 +6526,7 @@ expand_expr (exp, target, tmode, modifie
 	/* 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)
============================================================
Index: gcc/fold-const.c
--- gcc/fold-const.c	2002/03/20 02:37:21	1.188
+++ gcc/fold-const.c	2002/03/20 23:13:55
@@ -52,6 +52,7 @@ Software Foundation, 59 Temple Place - S
 #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 (cod
      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);
============================================================
Index: gcc/integrate.c
--- gcc/integrate.c	2002/03/12 05:40:32	1.186
+++ gcc/integrate.c	2002/03/20 23:14:06
@@ -1240,7 +1240,7 @@ expand_inline_function (fndecl, parms, t
        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)
============================================================
Index: gcc/langhooks-def.h
--- gcc/langhooks-def.h	2002/03/20 07:58:20	1.13
+++ gcc/langhooks-def.h	2002/03/20 23:14:06
@@ -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 ((
 #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 ((
   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 */
============================================================
Index: gcc/langhooks.c
--- gcc/langhooks.c	2002/03/20 07:58:21	1.19
+++ gcc/langhooks.c	2002/03/20 23:14:06
@@ -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);
 }
 
============================================================
Index: gcc/langhooks.h
--- gcc/langhooks.h	2002/03/20 07:58:21	1.20
+++ gcc/langhooks.h	2002/03/20 23:14:09
@@ -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
@@ -176,6 +213,8 @@ struct lang_hooks
   struct lang_hooks_for_tree_inlining tree_inlining;
   
   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.  */
============================================================
Index: gcc/profile.c
--- gcc/profile.c	2002/03/06 10:17:20	1.81
+++ gcc/profile.c	2002/03/20 23:14:09
@@ -49,6 +49,7 @@ Software Foundation, 59 Temple Place - S
 #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
============================================================
Index: gcc/sdbout.c
--- gcc/sdbout.c	2002/03/12 05:40:33	1.66
+++ gcc/sdbout.c	2002/03/20 23:14:15
@@ -58,6 +58,7 @@ AT&T C compiler.  From the example below
 #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);
============================================================
Index: gcc/stmt.c
--- gcc/stmt.c	2002/02/22 21:09:07	1.248
+++ gcc/stmt.c	2002/03/20 23:14:31
@@ -53,6 +53,7 @@ Software Foundation, 59 Temple Place - S
 #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, las
 	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, cle
 	     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, cle
 	     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, cle
 	  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
============================================================
Index: gcc/stor-layout.c
--- gcc/stor-layout.c	2002/03/03 14:07:20	1.119
+++ gcc/stor-layout.c	2002/03/20 23:14:36
@@ -31,6 +31,7 @@ Software Foundation, 59 Temple Place - S
 #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");
============================================================
Index: gcc/toplev.c
--- gcc/toplev.c	2002/03/20 07:58:21	1.598
+++ gcc/toplev.c	2002/03/20 23:14:50
@@ -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
============================================================
Index: gcc/tree-inline.c
--- gcc/tree-inline.c	2002/03/19 08:47:11	1.17
+++ gcc/tree-inline.c	2002/03/20 23:14:53
@@ -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
============================================================
Index: gcc/tree.h
--- gcc/tree.h	2002/03/20 07:58:21	1.316
+++ gcc/tree.h	2002/03/20 23:15:04
@@ -2847,30 +2847,6 @@ extern tree invert_truthvalue	PARAMS ((t
 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));
============================================================
Index: gcc/cp/cp-tree.h
--- gcc/cp/cp-tree.h	2002/03/20 07:58:33	1.693
+++ gcc/cp/cp-tree.h	2002/03/20 23:15:16
@@ -3659,12 +3659,18 @@ extern void clone_function_decl         
 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));
============================================================
Index: gcc/f/com.h
--- gcc/f/com.h	2002/03/17 23:52:16	1.24
+++ gcc/f/com.h	2002/03/20 23:15:18
@@ -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. */
 
============================================================
Index: gcc/java/java-tree.h
--- gcc/java/java-tree.h	2002/03/17 20:41:45	1.139
+++ gcc/java/java-tree.h	2002/03/20 23:15:22
@@ -1072,6 +1072,14 @@ extern tree ident_subst PARAMS ((const c
 				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));



More information about the Gcc-patches mailing list