This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
The following implements a scheme I posted some months ago: http://gcc.gnu.org/ml/gcc/2003-09/msg01164.html Tested on i686, alphaev67 and x86-64-linux. More interesting would have been ia64, but none of our ia64 machines seem to be able to make it through a bootstrap (before or after) without panicing. Oh well. There is one expected C regression, compile/20010605-1.c. This is a nasty gimplification problem. While looking at this, I came up with a number of related test cases that ICE on *any* version of gcc. I'll have to think about that I want to do here. Unfortunately, this also exposes some bugs in the Fortran front end. The end result isn't as bad as I feared earlier this weekend -- we get about 20 new failures on i686. The problems stem from having to convert the front end to use the cgraph interfaces, but the front end itself violates the one decl per object rule, which results in much confusion. I talked with pbrook and stevenb about the problem on irc yesterday; they were aware of the pre-existing condition, just hadn't gotten around to fixing it yet. I promised to get "close", and then Steven would pick up what's left. r~ * tree-nested.c: New file. * Makefile.in (OBJS-common, GTFILES, tree-nested.o): Add it. * builtin-types.def (BT_FN_VOID_PTR_PTR, BT_FN_VOID_PTR_PTR_PTR): New. * builtins.c (expand_builtin_nonlocal_goto): New. (expand_builtin_apply): Fix prepare_call_address args. (round_trampoline_addr): Move from function.c. (expand_builtin_init_trampoline): New. (expand_builtin_adjust_trampoline): New. (expand_builtin): Invoke them. (build_function_call_expr): Add CALL_EXPR chain operand. * builtins.def (BUILT_IN_INIT_TRAMPOLINE, BUILT_IN_ADJUST_TRAMPOLINE, BUILT_IN_NONLOCAL_GOTO): New. * c-decl.c (finish_function): Call lower_nested_functions. (c_expand_decl): Don't declare_nonlocal_label. * calls.c (prepare_call_address): Replace fndecl arg with a precomputed static chain value. (expand_call): Precompute the static chain value. Use update_nonlocal_goto_save_area. * cgraph.c (cgraph_mark_reachable_node): Don't force nested functions to be reachable. (cgraph_clone_node): Don't abort cloning functions containing nested functions. * cgraphunit.c (cgraph_assemble_pending_functions): Don't do anything special for nested functions. (cgraph_mark_functions_to_output): Likewise. (cgraph_estimate_growth, cgraph_clone_inlined_nodes): Likewise. (cgraph_optimize): Likewise. (cgraph_finalize_function): Don't zap DECL_SAVED_INSNS. (cgraph_expand_function): Allow functions to not be emitted. * defaults.h (TRAMPOLINE_ALIGNMENT): Move from function.c. * dwarf2out.c (gen_subprogram_die): Generate DW_AT_static_link. * emit-rtl.c (maybe_set_first_label_num): New. * explow.c (update_nonlocal_goto_save_area): New. (allocate_dynamic_stack_space): Use it. * expr.c (expand_expr_real_1) <LABEL_DECL>: Don't force_label_rtx. <COND_EXPR>: Ignore the possibility of non-local labels. <ADDR_EXPR>: Don't do trampoline_address. * expr.h (lookup_static_chain): Remove. (prepare_call_address): Update 2nd arg. (update_nonlocal_goto_save_area): Declare. * final.c (profile_function): Update static chain test. * function.c (TRAMPOLINE_ALIGNMENT): Move to defaults.h. (trampolines_created): Move to varasm.c. (free_after_compilation): Update for removed fields. (allocate_struct_function): Likewise. (delete_handlers, lookup_static_chain): Remove. (fix_lexical_addr): Don't consider non-local variable refs. (trampoline_address): Remove. (round_trampoline_addr): Move to builtins.c. (adjust_trampoline_addr): Remove. (expand_function_start): Update for changes to static chain and nonlocal goto handling. (initial_trampoline): Move to varasm.c. (expand_function_end): Don't build trampolines or kill unreferenced nonlocal goto labels. * function.h (struct function): Remove x_nonlocal_labels, x_nonlocal_goto_handler_slots, x_nonlocal_goto_stack_level, x_context_display, x_trampoline_list, needs_context. Add static_chain_decl, nonlocal_goto_save_area. * gimple-low.c (record_vars): Don't record functions. * gimplify.c (declare_tmp_vars): Export. (create_artificial_label): Set type. (gimplify_expr): Don't consider nonlocal gotos. * integrate.c (expand_inline_function): Kill lookup_static_chain ref. * jump.c (any_uncondjump_p): Reject nonlocal goto. * rtl.h (maybe_set_first_label_num): Declare. * stmt.c (label_rtx): Set LABEL_PRESERVE_P appropriately. (expand_label): Handle DECL_NONLOCAL and FORCED_LABEL. (declare_nonlocal_label): Remove. (expand_goto): Don't handle nonlocal gotos. (expand_nl_handler_label): Remove. (expand_nl_goto_receivers): Remove. (expand_end_bindings): Don't expand_nl_goto_receivers. Use update_nonlocal_goto_save_area. * tree-cfg.c (make_edges): Handle abnormal edges out of block falling through to EXIT. (make_ctrl_stmt_edges): Don't check GOTO_EXPR for nonlocal goto. Handle computed goto with no destinations. (tree_can_merge_blocks_p): Don't merge blocks with nonlocal labels. (remove_useless_stmts_label, stmt_starts_bb_p): Likewise. (tree_forwarder_block_p): Likewise. (nonlocal_goto_p): Remove. (tree_verify_flow_info): Update to match. * tree-dump.c (dump_files): Add tree-nested. * tree-flow.h (nonlocal_goto_p): Remove. * tree-inline.c (setup_one_parameter): Split out from ... (initialize_inlined_parameters): ... here. Handle static chain. (inline_forbidden_p_1): Update nonlocal goto check. (expand_call_inline): Disable mysterious cgraph abort. * tree-optimize.c (tree_rest_of_compilation): Save DECL_SAVED_INSNS. * tree-pretty-print.c (dump_generic_node): Print static chain and nonlocal label. * tree-simple.h (declare_tmp_vars): Declare. (lower_nested_functions): Declare. * tree-ssa-dom.c (propagate_value): Avoid sharing problems. * tree-ssa-operands.c (get_expr_operands): Walk static chain field of call_expr. * tree.def (CALL_EXPR): Add static chain operand. * tree.h (NONLOCAL_LABEL): Remove. (TDI_nested): New. * varasm.c (TRAMPOLINE_ALIGNMENT): Remove. (initial_trampoline): Move from function.c. (assemble_trampoline_template): Set and return it. (trampolines_created): Move from function.c. ada/ * utils.c (max_size): Add static chain op for call_expr. cp/ * call.c (build_call, build_over_call, build_new_method_call): Add static chain operand to call_expr. * decl.c (build_offset_ref_call_from_tree): Likewise. * parser.c (cp_parser_postfix_expression): Likewise. * semantics.c (finish_call_expr): Likewise. * cp-lang.c (cp_expand_decl): Don't declare_nonlocal_label. fortran/ * Make-lang.in (f95-lang.o, trans-decl.o): Depend on cgraph.h. * f95-lang.c (LANG_HOOKS_EXPAND_DECL): Remove. (LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION): New. (gfc_expand_function): Rename from expand_function_body, make static, don't do anything except invoke tree_rest_of_compilation. (gfc_be_parse_file): Invoke cgraph. (gfc_expand_decl): Remove. (gfc_init_builtin_functions): Add __builtin_init_trampoline and __builtin_adjust_trampoline. * trans-decl.c (gfc_get_extern_function_decl): Don't set DECL_CONTEXT. (gfc_finalize): New. (gfc_generate_function_code): Use it. Lower nested functions. * trans-expr.c (gfc_conv_function_call): Add static chain operand to call_expr. * trans.c (gfc_build_function_call): Likewise. * trans.h (expand_function_body): Remove. java/ * builtins.c (java_build_function_call_expr): Add static chain operand to call_expr.
Attachment:
d-nest-6.gz
Description: GNU Zip compressed data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |