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]

Re: [tree-ssa] lower nested functions


> 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.

Thanks!
> 
> 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

Just to clarify a bit.
There is no one decl per object rule (anoyingly).  Even C frontend
creates many decls for single function (forward declarations get
different decl than the definition in K&R, local declarations are also
different and frontend is (used to?) making local copy of each decl when
producing the call).  Cgraph is using DECL_ASSEMBLER_NAME for lookup of
the nodes.  So as long as the decls are compatible (IE call with one
copy of decl can be inlined by other decl), everything is supposed to
work well.

The strategy if cgraph is to pick the declaration passed to
cgraph_finalize_function as the "true" one and it lookups the node and
gets to this decl when doing stuff that depends on the copy.

Honza
> 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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]