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: [PATCH] Repair __builtin_setjmp/__builtin_longjmp


> 2006-09-21  Eric Botcazou  <ebotcazou@adacore.com>
>
> 	* builtins.c (expand_builtin_setjmp): Delete.
> 	(expand_builtin) <BUILT_IN_SETJMP>: Mark as unreachable.
> 	<BUILT_IN_SETJMP_SETUP>: New case.
> 	<BUILT_IN_SETJMP_DISPATCHER>: Likewise.
> 	<BUILT_IN_SETJMP_RECEIVER>: Likewise.
> 	* builtins.def (BUILT_IN_SETJMP_SETUP): New built-in stub.
> 	(BUILT_IN_SETJMP_DISPATCHER): Likewise.
> 	(BUILT_IN_SETJMP_RECEIVER): Likewise.
> 	* gimple-low.c (struct lower_data): New field calls_builtin_setjmp.
> 	(lower_function_body): Initialize it to false.  If it is set to true
> 	at the end of the processing, emit the setjmp dispatcher.
> 	(lower_stmt) <CALL_EXPR>: Invoke lower_builtin_setjmp if the callee
> 	is __builtin_setjmp and set calls_builtin_setjmp to true as well.
> 	<MODIFY_EXPR>: Fall through to above case if there is a CALL_EXPR
> 	on the rhs of the assignment.
> 	(lower_builtin_setjmp): New function.
> 	* tree.c (build_common_builtin_nodes): Build BUILT_IN_SETJMP_SETUP,
> 	BUILT_IN_SETJMP_DISPATCHER and BUILT_IN_SETJMP_RECEIVER nodes.
> 	* tree-cfg.c (make_exit_edges) <CALL_EXPR>: Use specific predicate
> 	to detect calls that can go to non-local labels.  Use specific
> 	helper to create the abnormal edges associated with them.
> 	<MODIFY_EXPR>: Likewise.
> 	(make_abnormal_goto_edges): New function extracted from...
> 	(make_goto_expr_edges): ...here.  Call it for computed gotos.
> 	(simple_goto_p): Minor tweak.
> 	(tree_can_make_abnormal_goto): New predicate.
> 	(tree_redirect_edge_and_branch): Return zero on all abnormal edges.
> 	(tree_purge_dead_abnormal_call_edges): New function.
> 	* tree-flow.h (tree_can_make_abnormal_goto): Declare.
> 	(tree_purge_dead_abnormal_call_edges): Likewise.
> 	(make_abnormal_goto_edges): Likewise.
> 	* tree-inline.c (expand_call_inline): Simplify statement frobbing.
> 	Purge all dead abnormal edges if the call was in the last statement.
> 	* tree-optimize.c (has_abnormal_outgoing_edge_p): New predicate.
> 	(execute_fixup_cfg): If there are non-local labels in the function,
> 	scan the basic blocks and split them at calls that can go to non-local
> 	labels or add missing abnormal call edges.  Write down the CFG in the
> 	dump file.
> 	(pass_fixup_cfg): Remove TODO_dump_func flag.
>
> ada/
>         * decl.c (gnat_to_gnu_entity) <E_Procedure>: Do not DECL_IS_PURE on
>         the node of the callee if SJLJ exceptions are used.
>         * trans.c (Handled_Sequence_Of_Statements_to_gnu): Set
> TREE_NO_WARNING on the declaration node of JMPBUF_SAVE.
>         * utils.c (init_gigi_decls): Set DECL_IS_PURE on the declaration
> nodes of Get_Jmpbuf_Address_Soft and Get_GNAT_Exception.
>         * utils2.c (build_call_0_expr): Do not set TREE_SIDE_EFFECTS.
>
>
> 2006-09-21  Eric Botcazou  <ebotcazou@adacore.com>
>
> 	* gcc.dg/non-local-goto-1.c: New test.
> 	* gcc.dg/non-local-goto-2.c: Likewise.
> 	* gcc.dg/setjmp-3.c: Likewise.
> 	* gcc.dg/setjmp-4.c: Likewise.

Installed with a couple of expanded comments as suggested by Steven.

-- 
Eric Botcazou


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