diff options
author | Mark Mitchell <mark@codesourcery.com> | 2000-09-17 07:38:23 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2000-09-17 07:38:23 +0000 |
commit | 8f17b5c5cbf15d0f3a548e94928caff9ffcfd7b8 (patch) | |
tree | 45edb9dcda813de0e477165a8b093d17332bda80 /gcc/c-common.h | |
parent | 4797e955c6b44df4bef1d8d1c2ae9074480c6cf4 (diff) | |
download | gcc-8f17b5c5cbf15d0f3a548e94928caff9ffcfd7b8.zip gcc-8f17b5c5cbf15d0f3a548e94928caff9ffcfd7b8.tar.gz gcc-8f17b5c5cbf15d0f3a548e94928caff9ffcfd7b8.tar.bz2 |
splay-tree.c (splay_tree_predecessor): Fix typo in comment.
* splay-tree.c (splay_tree_predecessor): Fix typo in comment.
Convert the C front-end to use function-at-a-time mode.
* c-common.h: Include splay-tree.h.
(C_DECLARED_LABEL_FLAG): New macro.
(struct language_function): Add x_scope_stmt_stack and
x_function_name_declared_p.
(RECHAIN_STMTS): Move definition.
(lang_statment_code_p): Likewise.
(lang_expand_stmt): Likewise.
(lang_expand_decl_stmt): New variable.
(lang_expand_function_end): Likewise.
(current_scope_stmt_stack): New function.
(add_decl_stmt): Likewise.
(add_scope_stmt): Likewise.
(mark_stmt_tree): Likewise.
(struct c_lang_decl): New structure.
(DECL_SAVED_TREE): Define.
(c_mark_lang_decl): New function.
(c_expand_start_cond): Change prototype.
(c_finish_then): New function.
(c_finish_else): Likewise.
(current_function_name_declared): Remove.
(set_current_function_name_declared): Likewise.
(mark_c_language_function): Declare.
(case_compare): Likewise.
(c_add_case_label): Likewise.
(c_expand_expr): Likewise.
(c_safe_from_p): Likewise.
* c-common.c (lang_expand_function_end): New variable.
(struct if_elt): Add if_stmt.
(c_expand_start_cond): Add the if-statement to the statement-tree,
rather than generating RTL.
(c_finish_then): New function.
(c_expand_start_else): Don't generate RTL.
(c_finish_else): New function.
(c_expand_expr_stmt): Don't generate RTL.
(statement_code_p): Add SCOPE_STMT.
(case_compare): New function.
(c_add_case_label): Likewise.
(mark_stmt_tree): Likewise.
(c_mark_lang_decl): Likewise.
(mark_c_language_function): Likewise.
(c_expand_expr): Likewise.
(c_safe_from_p): Likewise.
* c-decl.c (c_stmt_tree): New variable
(c_scope_stmt_stack): Likewise.
(c_function_name_declared_p): Likewise.
(lang_expand_expr_stmt): Remove.
(poplevel): Don't call output_inline_function for nested
functions.
(pushdecl): Don't set DECL_CONTEXT for a local declaration of an
`extern' function.
(redeclaration_error_message): Change means of computing whether
or not a function is nested.
(lookup_label): Don't call label_rtx.
(init_decl_processing): Add more GC roots.
(start_decl): Add DECL_STMTs to the statement-tree, rather than
calling rest_of_decl_compilation.
(finish_decl): Don't call expand_decl.
(store_parm_decls): Begin the statement-tree, but don't generate
RTL.
(finish_function): Tie off the statement-tree. Call c_expand_body
if appropriate.
(c_expand_body): New function.
(push_c_function_context): Save more information.
(pop_c_function_contxt): Likewise.
(copy_lang_decl): Now that we use DECL_LANG_SPECIFIC, copy it.
(lang_mark_tree): Mark it.
(current_stmt_tree): Adjust.
(current_scope_stmt_stack): New function.
(do_case): Remove.
(set_current_name_declared): Likewise.
(c_begin_compound_stmt): Define.
(c_expand_decl_stmt): Likewise.
* c-lang.c: Include rtl.h and expr.h.
(lang_init): Set more language-specific hooks.
* c-lex.c: Include expr.h.
* c-parse.in: Changes throughout to add statements to the
statement-tree, rather than generating RTL after every statement.
* c-semantics.c (lang_expand_decl_stmt): Define.
(add_decl_stmt): New function.
(add_scope_stmt): Likewise.
(finish_stmt_tree): Tweak.
(genrtl_expr_stmt): Likewise.
(genrtl_decl_stmt): Handle local labels, and call
lang_expand_decl_stmt if required.
(genrtl_for_stmt): Fix line-number handling.
(genrtl_case_label): Handle cleanups.
(genrtl_asm_stmt): Don't call combine_strings.
(genrtl_compound_stmt): Simplify.
(expand_stmt): Handle SCOPE_STMTs.
* c-tree.h (struct lang_decl): New structure.
(C_DECLARED_LABEL_FLAG): Remove.
(c_begin_compound_stmt): Declare.
(c_expand_decl_stmt): Likewise.
(c_expand_start_case): Rename to c_start_case.
(c_finish_case): New function.
* c-typeck.c (start_init): Tweak setting of
constructor_incremental.
(c_expand_asm_operands): Tweak error-handling. Add to the
statement-tree.
(c_expand_return): Add to the statement-tree.
(c_expand_start_case): Rename to ...
(c_start_case): ... this.
(struct c_switch): New type.
(switch_stack): New variable.
(do_case): Simplify.
(c_finish_case): New function.
* dependence.c: Include expr.h.
(enum dependence_type): Change spelling of enumerals.
(check_node_dependence): Adjust.
* expr.h (lang_safe_from_p): Declare.
(safe_from_p): Likewise.
* expr.c (lang_safe_from_p): New variable.
(safe_from_p): Give it external linkage. Use lang_safe_from_p.
* stmt.c (expand_expr_stmt): Avoid clobberring of last_expr_type.
* toplev.c (rest_of_decl_compilation): Robustify.
* tree.c (contains_placeholder_p): Likewise.
* Makefile.in: Update dependencies.
* objc/objc-act.h: Adjust calculation of value for dummy_tree_code.
* objc/objc-act.c: Include rtl.h, expr.h, and c-common.h.
(objc_expand_function_end): New function.
(finish_method_def): Use it.
(init_objc): Initialize more language-specific hooks.
* objc/Make-lang.in: Update dependencies.
* cp-tree.h (struct cp_language_function): Remove
x_scope_stmt_stack and name_declared.
(current_scope_stmt_stack): Remove.
(function_name_declared_p): New macro.
(struct lang_decl_flags): Use c_lang_decl as a base class.
(context): Remove.
(struct lang_decl): Replace saved_tree with context.
(DECL_FRIEND_CONTEXT): Adjust accordingly.
(SET_DECL_FRIEND_CONTEXT): Likewise.
(DECL_VIRTUAL_CONTEXT): Likewise.
(DECL_SAVED_TREE): Remove.
(C_DECLARED_LABEL_FLAG): Likewise.
(cplus_expand_expr_stmt): Don't declare.
(add_decl_stmt): Likewise.
(add_scope_stmt): Likewise.
* decl.c (mark_stmt_tree): Remove.
(case_compare): Likewise.
(finish_case_label): Use c_add_case_label.
(init_decl_processing): Set more language-specific hooks.
(build_enumerator): Fix typo in comment.
(cplus_expand_expr_stmt): Remove.
(mark_lang_function): Use mark_c_language_function.
(lang_mark_tree): Use c_mark_lang_decl.
* decl2.c: Change order of inclusion.
* except.c: Likewise.
* expr.c (cplus_expand_expr): Remove handling of STMT_EXPR. Fall
back on c_expand_expr.
* friend.c: Include expr.h.
* init.c: Change order of inclusion.
* Makefile.in: Update dependencies.
* lex.h (free_lang_decl_chain): Remove.
* optimize.c (maybe_clone_body): Use function_name_declared_p.
* pt.c (build_template_decl): Don't copy DECL_VIRTUAL_CONTEXT if
it doesn't exist.
(instantiate_decl): Use function_name_declared_p.
* semantics.c (lang_expand_expr_stmt): Remove.
(set_current_function_name_declared): Likewise.
(current_function_name_declared): Likewise.
(begin_compound_stmt): Use function_name_declared_p.
(add_decl_stmt): Remove.
(setup_vtbl_ptr): Use function_name_declared_p.
(add_scope_stmt): Remove.
(current_scope_stmt_stack): New function.
(cp_expand_stmt): Don't handle SCOPE_STMTs.
(expand_body): Use function_name_declared_p.
* tree.c (cp_statement_code_p): Don't include SCOPE_STMT.
* typeck.c: Change order of includes.
(convert_sequence): Remove.
From-SVN: r36464
Diffstat (limited to 'gcc/c-common.h')
-rw-r--r-- | gcc/c-common.h | 90 |
1 files changed, 73 insertions, 17 deletions
diff --git a/gcc/c-common.h b/gcc/c-common.h index 389f32a..2477a0f 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -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,30 +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 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 (*lang_expand_stmt) PARAMS ((tree)); extern void expand_stmt PARAMS ((tree)); +extern void mark_stmt_tree PARAMS ((void *)); -/* 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. */ +/* 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. */ -#define RECHAIN_STMTS(stmt, substmt) \ - do { \ - substmt = TREE_CHAIN (stmt); \ - TREE_CHAIN (stmt) = NULL_TREE; \ - last_tree = stmt; \ - } while (0) +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. */ @@ -363,8 +402,10 @@ extern void c_apply_type_quals_to_decl PARAMS ((int, tree)); 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)); @@ -589,8 +630,6 @@ extern void genrtl_asm_stmt PARAMS ((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 @@ -611,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. */ @@ -637,6 +674,25 @@ extern tree decl_constant_value PARAMS ((tree)); 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)); + +#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 |