OSDN Git Service

ch:
[pf3gnuchains/gcc-fork.git] / gcc / c-common.h
index 6f442c4..24db762 100644 (file)
@@ -22,6 +22,8 @@ Boston, MA 02111-1307, USA.  */
 #ifndef GCC_C_COMMON_H
 #define GCC_C_COMMON_H
 
+#include "splay-tree.h"
+
 /* Usage of TREE_LANG_FLAG_?:
    0: COMPOUND_STMT_NO_SCOPE (in COMPOUND_STMT).
       TREE_NEGATED_INT (in INTEGER_CST).
@@ -194,6 +196,10 @@ enum c_tree_index
 
 extern tree c_global_trees[CTI_MAX];
 
+/* Mark which labels are explicitly declared.
+   These may be shadowed, and may be referenced from nested functions.  */
+#define C_DECLARED_LABEL_FLAG(label) TREE_LANG_FLAG_1 (label)
+
 typedef enum c_language_kind
 {
   clk_c,           /* A dialect of C: K&R C, ANSI/ISO C89, C2000,
@@ -237,6 +243,11 @@ struct language_function {
   /* While we are parsing the function, this contains information
      about the statement-tree that we are building.  */
   struct stmt_tree_s x_stmt_tree;
+  /* The stack of SCOPE_STMTs for the current function.  */
+  tree x_scope_stmt_stack;
+  /* Nonzero if __FUNCTION__ and its ilk have been declared in this
+     function.  */
+  int x_function_name_declared_p;
 };
 
 /* When building a statement-tree, this is the last statement added to
@@ -248,6 +259,25 @@ struct language_function {
 
 #define last_expr_type (current_stmt_tree ()->x_last_expr_type)
 
+/* LAST_TREE contains the last statement parsed.  These are chained
+   together through the TREE_CHAIN field, but often need to be
+   re-organized since the parse is performed bottom-up.  This macro
+   makes LAST_TREE the indicated SUBSTMT of STMT.  */
+
+#define RECHAIN_STMTS(stmt, substmt)           \
+  do {                                         \
+    substmt = TREE_CHAIN (stmt);               \
+    TREE_CHAIN (stmt) = NULL_TREE;             \
+    last_tree = stmt;                          \
+  } while (0)
+
+/* Language-specific hooks.  */
+
+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));
+
 /* The type of a function that walks over tree structure.  */
 
 typedef tree (*walk_tree_fn)                    PARAMS ((tree *, 
@@ -255,15 +285,39 @@ typedef tree (*walk_tree_fn)                    PARAMS ((tree *,
                                                         void *));
 
 extern stmt_tree current_stmt_tree              PARAMS ((void));
+extern tree *current_scope_stmt_stack           PARAMS ((void));
 extern void begin_stmt_tree                     PARAMS ((tree *));
-extern void add_stmt                           PARAMS ((tree));
+extern tree add_stmt                           PARAMS ((tree));
+extern void add_decl_stmt                       PARAMS ((tree));
+extern tree add_scope_stmt                      PARAMS ((int, int));
 extern void finish_stmt_tree                    PARAMS ((tree *));
 
 extern int statement_code_p                     PARAMS ((enum tree_code));
-extern int (*lang_statement_code_p)             PARAMS ((enum tree_code));
 extern tree walk_stmt_tree                     PARAMS ((tree *,
                                                         walk_tree_fn,
                                                         void *));
+extern void prep_stmt                           PARAMS ((tree));
+extern void expand_stmt                         PARAMS ((tree));
+extern void mark_stmt_tree                      PARAMS ((void *));
+
+/* Extra information associated with a DECL.  Other C dialects extend
+   this structure in various ways.  The C front-end only uses this
+   structure for FUNCTION_DECLs; all other DECLs have a NULL
+   DECL_LANG_SPECIFIC field.  */
+
+struct c_lang_decl {
+  /* In a FUNCTION_DECL, this is DECL_SAVED_TREE.  */
+  tree saved_tree;
+};
+
+/* In a FUNCTION_DECL, the saved representation of the body of the
+   entire function.  Usually a COMPOUND_STMT, but in C++ this may also
+   be a RETURN_INIT, CTOR_INITIALIZER, or TRY_BLOCK.  */
+#define DECL_SAVED_TREE(NODE)                                              \
+  (((struct c_lang_decl *) DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE))) \
+   ->saved_tree)
+
+extern void c_mark_lang_decl                    PARAMS ((struct c_lang_decl *));
 
 /* The variant of the C language being processed.  Each C language
    front-end defines this variable.  */
@@ -342,14 +396,16 @@ extern tree (*make_fname_decl)                  PARAMS ((tree, const char *, int
 extern void declare_function_name              PARAMS ((void));
 extern void decl_attributes                    PARAMS ((tree, tree, tree));
 extern void init_function_format_info          PARAMS ((void));
-extern void check_function_format              PARAMS ((tree, tree, tree));
+extern void check_function_format              PARAMS ((int *, tree, tree, tree));
 extern void c_apply_type_quals_to_decl         PARAMS ((int, tree));
 /* Print an error message for invalid operands to arith operation CODE.
    NOP_EXPR is used as a special case (see truthvalue_conversion).  */
 extern void binary_op_error                    PARAMS ((enum tree_code));
 extern void c_expand_expr_stmt                 PARAMS ((tree));
-extern void c_expand_start_cond                        PARAMS ((tree, int, int));
+extern void c_expand_start_cond                        PARAMS ((tree, int));
+extern void c_finish_then                       PARAMS ((void));
 extern void c_expand_start_else                        PARAMS ((void));
+extern void c_finish_else                   PARAMS ((void));
 extern void c_expand_end_cond                  PARAMS ((void));
 /* Validate the expression after `case' and apply default promotions.  */
 extern tree check_case_value                   PARAMS ((tree));
@@ -454,6 +510,7 @@ extern tree simple_type_promotes_to         PARAMS ((tree));
    of a case label, respectively. */
 #define CASE_LOW(NODE)          TREE_OPERAND (CASE_LABEL_CHECK (NODE), 0)
 #define CASE_HIGH(NODE)         TREE_OPERAND (CASE_LABEL_CHECK (NODE), 1)
+#define CASE_LABEL_DECL(NODE)   TREE_OPERAND (CASE_LABEL_CHECK (NODE), 2)
 
 /* GOTO_STMT accessor. This gives access to the label associated with
    a goto statement. */
@@ -554,7 +611,6 @@ enum c_tree_code {
 
 extern void add_c_tree_codes                   PARAMS ((void));
 extern void genrtl_do_pushlevel                 PARAMS ((void));
-extern void genrtl_clear_out_block              PARAMS ((void));
 extern void genrtl_goto_stmt                    PARAMS ((tree));
 extern void genrtl_expr_stmt                    PARAMS ((tree));
 extern void genrtl_decl_stmt                    PARAMS ((tree));
@@ -567,15 +623,13 @@ extern void genrtl_break_stmt                   PARAMS ((void));
 extern void genrtl_continue_stmt                PARAMS ((void));
 extern void genrtl_scope_stmt                   PARAMS ((tree));
 extern void genrtl_switch_stmt                  PARAMS ((tree));
-extern void genrtl_case_label                   PARAMS ((tree, tree));
+extern void genrtl_case_label                   PARAMS ((tree));
 extern void genrtl_compound_stmt                PARAMS ((tree));
 extern void genrtl_asm_stmt                     PARAMS ((tree, tree,
                                                         tree, tree,
                                                         tree));
 extern void genrtl_decl_cleanup                 PARAMS ((tree, tree));
 extern int stmts_are_full_exprs_p               PARAMS ((void));
-typedef void (*expand_expr_stmt_fn)             PARAMS ((tree));
-extern expand_expr_stmt_fn lang_expand_expr_stmt;
 extern int anon_aggr_type_p                     PARAMS ((tree));
 
 /* For a VAR_DECL that is an anonymous union, these are the various
@@ -585,13 +639,10 @@ extern int anon_aggr_type_p                     PARAMS ((tree));
 extern void emit_local_var                      PARAMS ((tree));
 extern void make_rtl_for_local_static           PARAMS ((tree));
 extern tree expand_cond                         PARAMS ((tree));
-extern tree expand_stmt                         PARAMS ((tree));
-extern tree lang_expand_stmt                    PARAMS ((tree));
 extern void c_expand_return                    PARAMS ((tree));
-extern tree c_expand_start_case                        PARAMS ((tree));
 extern void do_case                            PARAMS ((tree, tree));
 extern tree build_stmt                          PARAMS ((enum tree_code, ...));
-extern tree build_case_label                    PARAMS ((tree, tree));
+extern tree build_case_label                    PARAMS ((tree, tree, tree));
 extern tree build_continue_stmt                 PARAMS ((void));
 extern tree build_break_stmt                    PARAMS ((void));
 extern tree build_return_stmt                   PARAMS ((tree));
@@ -599,8 +650,6 @@ extern tree build_return_stmt                   PARAMS ((tree));
 #define COMPOUND_STMT_NO_SCOPE(NODE)   TREE_LANG_FLAG_0 (NODE)
 
 extern void c_expand_asm_operands              PARAMS ((tree, tree, tree, tree, int, const char *, int));
-extern int current_function_name_declared       PARAMS ((void));
-extern void set_current_function_name_declared  PARAMS ((int));
 
 /* These functions must be defined by each front-end which implements
    a variant of the C language.  They are used in c-common.c.  */
@@ -619,10 +668,33 @@ extern tree common_type                         PARAMS ((tree, tree));
 
 extern tree expand_tree_builtin                 PARAMS ((tree, tree, tree));
 
+extern tree decl_constant_value                PARAMS ((tree));
+
 /* Hook currently used only by the C++ front end to reset internal state
    after entering or leaving a header file.  */
 extern void extract_interface_info             PARAMS ((void));
 
+extern void mark_c_language_function            PARAMS ((struct language_function *));
+
+extern int case_compare                         PARAMS ((splay_tree_key, 
+                                                        splay_tree_key));
+
+extern tree c_add_case_label                    PARAMS ((splay_tree,
+                                                        tree, tree,
+                                                        tree));
+
+extern tree build_function_call                        PARAMS ((tree, tree));
+
+#ifdef RTX_CODE
+
+extern struct rtx_def *c_expand_expr            PARAMS ((tree, rtx,
+                                                        enum machine_mode,
+                                                        enum expand_modifier));
+
+extern int c_safe_from_p                        PARAMS ((rtx, tree));
+
+#endif
+
 /* Information recorded about each file examined during compilation.  */
 
 struct c_fileinfo