Commit 0cba764e by Richard Kenner

calls.c (ECF_SP_DEPRESSED): New macro.

	* calls.c (ECF_SP_DEPRESSED): New macro.
	(calls_function_1): Treat calling sp-depressed function as alloca.
	(emit_call_1): Don't adjust SP if calling sp-depressed function.
	(expand_call): Set ECF_SP_DEPRESSED if TYPE_RETURNS_STACK_DEPRESSED.
	If sp-depressed, ensure block saves and restores SP.
	* fold-const.c (extract_muldiv): Only check TYPE_IS_SIZETYPE
	for INTEGER_TYPE.
	* function.c (keep_stack_depressed): New function.
	(thread_prologue_and_epilogue_insns): Call it.
	* print-tree.c (print_node): Use HOST_WIDE_INT_PRINT_UNSIGNED
	to print DECL_OFFSET_ALIGN.
	Print no-force-blk and transparent-union flags properly.
	* stmt.c (expand_goto_internal): Don't restore stack if last block
	and function returns with sp depressed.
	(fixup_gotos): Likewise.
	(save_stack_pointer): New function, from code in expand_decl.
	(expand_decl): Call new function.
	* tree.h (TYPE_IS_SIZETYPE): Call INTEGER_TYPE_CHECK.
	(TYPE_RETURNS_STACK_DEPRESSED): New macro.
	(save_stack_pointer): New declaration.

From-SVN: r35735
parent 7393c642
...@@ -412,7 +412,11 @@ print_node (file, prefix, node, indent) ...@@ -412,7 +412,11 @@ print_node (file, prefix, node, indent)
{ {
fprintf (file, " align %d", DECL_ALIGN (node)); fprintf (file, " align %d", DECL_ALIGN (node));
if (TREE_CODE (node) == FIELD_DECL) if (TREE_CODE (node) == FIELD_DECL)
fprintf (file, " offset_align %d", DECL_OFFSET_ALIGN (node)); {
fprintf (file, " offset_align ");
fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
DECL_OFFSET_ALIGN (node));
}
} }
else if (DECL_INLINE (node)) else if (DECL_INLINE (node))
{ {
...@@ -478,23 +482,36 @@ print_node (file, prefix, node, indent) ...@@ -478,23 +482,36 @@ print_node (file, prefix, node, indent)
break; break;
case 't': case 't':
if (TYPE_NO_FORCE_BLK (node)) /* The no-force-blk flag is used for different things in
different types. */
if ((TREE_CODE (node) == RECORD_TYPE
|| TREE_CODE (node) == UNION_TYPE
|| TREE_CODE (node) == QUAL_UNION_TYPE)
&& TYPE_NO_FORCE_BLK (node))
fputs (" no-force-blk", file); fputs (" no-force-blk", file);
else if (TREE_CODE (node) == INTEGER_TYPE
&& TYPE_IS_SIZETYPE (node))
fputs (" sizetype", file);
else if (TREE_CODE (node) == FUNCTION_TYPE
&& TYPE_RETURNS_STACK_DEPRESSED (node))
fputs (" returns-stack-depressed", file);
if (TYPE_STRING_FLAG (node)) if (TYPE_STRING_FLAG (node))
fputs (" string-flag", file); fputs (" string-flag", file);
if (TYPE_NEEDS_CONSTRUCTING (node)) if (TYPE_NEEDS_CONSTRUCTING (node))
fputs (" needs-constructing", file); fputs (" needs-constructing", file);
/* The transparent-union flag is used for different things in /* The transparent-union flag is used for different things in
different nodes. */ different nodes. */
if (TYPE_CHECK (node)->type.transparent_union_flag) if (TREE_CODE (node) == UNION_TYPE && TYPE_TRANSPARENT_UNION (node))
{ fputs (" transparent-union", file);
if (TREE_CODE (node) == UNION_TYPE) else if (TREE_CODE (node) == ARRAY_TYPE
fputs (" transparent-union", file); && TYPE_NONALIASED_COMPONENT (node))
else if (TREE_CODE (node) == ARRAY_TYPE) fputs (" nonaliased-component", file);
fputs (" nonaliased-component", file); else if (TREE_CODE (node) == FUNCTION_TYPE
else && TYPE_AMBIENT_BOUNDEDNESS (node))
fputs (" tu-flag", file); fputs (" ambient-boundedness", file);
}
if (TYPE_PACKED (node)) if (TYPE_PACKED (node))
fputs (" packed", file); fputs (" packed", file);
...@@ -550,10 +567,12 @@ print_node (file, prefix, node, indent) ...@@ -550,10 +567,12 @@ print_node (file, prefix, node, indent)
|| TREE_CODE (node) == UNION_TYPE || TREE_CODE (node) == UNION_TYPE
|| TREE_CODE (node) == QUAL_UNION_TYPE) || TREE_CODE (node) == QUAL_UNION_TYPE)
print_node (file, "fields", TYPE_FIELDS (node), indent + 4); print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
else if (TREE_CODE (node) == FUNCTION_TYPE || TREE_CODE (node) == METHOD_TYPE) else if (TREE_CODE (node) == FUNCTION_TYPE
|| TREE_CODE (node) == METHOD_TYPE)
{ {
if (TYPE_METHOD_BASETYPE (node)) if (TYPE_METHOD_BASETYPE (node))
print_node_brief (file, "method basetype", TYPE_METHOD_BASETYPE (node), indent + 4); print_node_brief (file, "method basetype",
TYPE_METHOD_BASETYPE (node), indent + 4);
print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4); print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
} }
else if (TREE_CODE (node) == OFFSET_TYPE) else if (TREE_CODE (node) == OFFSET_TYPE)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment