2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-01-11 21:05:36 +08:00

cp-tree.h (language_function): Add cannot_inline.

* cp-tree.h (language_function): Add cannot_inline.
	* decl.c (start_function): Restore current_function_cannot_inline
	from the saved value.
	(save_function_data): Save current_function_cannot_inline.
	* decl2.c (start_objects): Change prototype.  Build the function
	in function-at-a-time mode.
	(finish_objects): Likewise.
	(generate_ctor_or_dtor_function): Adjust accordingly.

From-SVN: r29646
This commit is contained in:
Mark Mitchell 1999-09-24 01:29:29 +00:00 committed by Mark Mitchell
parent 0fa5e05c2f
commit 914653a2a7
4 changed files with 42 additions and 19 deletions

View File

@ -1,5 +1,14 @@
1999-09-23 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (language_function): Add cannot_inline.
* decl.c (start_function): Restore current_function_cannot_inline
from the saved value.
(save_function_data): Save current_function_cannot_inline.
* decl2.c (start_objects): Change prototype. Build the function
in function-at-a-time mode.
(finish_objects): Likewise.
(generate_ctor_or_dtor_function): Adjust accordingly.
* cp-tree.h (DECL_ANON_UNION_ELEMS): New macro.
* decl2.c (finish_anon_union): Set DECL_ANON_UNION_ELEMS.
Don't call expand_anon_union_decl here

View File

@ -678,6 +678,8 @@ struct language_function
struct named_label_list *x_named_label_uses;
struct binding_level *bindings;
const char *cannot_inline;
};
/* The current C++-specific per-function global variables. */

View File

@ -12944,6 +12944,11 @@ start_function (declspecs, declarator, attrs, flags)
already did semantic analysis. */
current_function->x_whole_function_mode_p = 1;
/* If we decided that we didn't want to inline this function,
make sure the back-end knows that. */
if (!current_function_cannot_inline)
current_function_cannot_inline = cp_function_chain->cannot_inline;
/* We don't need the saved data anymore. */
free (DECL_SAVED_FUNCTION_DATA (decl1));
DECL_SAVED_FUNCTION_DATA (decl1) = NULL;
@ -13305,6 +13310,11 @@ save_function_data (decl)
/* When we get back here again, we will be expanding. */
f->x_expanding_p = 1;
/* If we've already decided that we cannot inline this function, we
must remember that fact when we actually go to expand the
function. */
f->cannot_inline = current_function_cannot_inline;
}
/* At the end of every destructor we generate code to restore virtual

View File

@ -78,8 +78,8 @@ static tree ambiguous_decl PROTO((tree, tree, tree,int));
static tree build_anon_union_vars PROTO((tree, tree*, int, int));
static int acceptable_java_type PROTO((tree));
static void output_vtable_inherit PROTO((tree));
static void start_objects PROTO((int, int));
static void finish_objects PROTO((int, int));
static tree start_objects PROTO((int, int));
static void finish_objects PROTO((int, int, tree));
static tree merge_functions PROTO((tree, tree));
static tree decl_namespace PROTO((tree));
static tree validate_nonmember_using_decl PROTO((tree, tree *, tree *));
@ -2758,11 +2758,12 @@ get_sentry (base)
/* Start the process of running a particular set of global constructors
or destructors. Subroutine of do_[cd]tors. */
static void
static tree
start_objects (method_type, initp)
int method_type, initp;
{
tree fnname;
tree body;
char type[10];
/* Make ctor or dtor function. METHOD_TYPE may be 'I' or 'D'. */
@ -2787,7 +2788,7 @@ start_objects (method_type, initp)
start_function (void_list_node,
make_call_declarator (fnname, void_list_node, NULL_TREE,
NULL_TREE),
NULL_TREE, SF_DEFAULT | SF_EXPAND);
NULL_TREE, SF_DEFAULT);
#if defined(ASM_OUTPUT_CONSTRUCTOR) && defined(ASM_OUTPUT_DESTRUCTOR)
/* It can be a static function as long as collect2 does not have
@ -2798,11 +2799,7 @@ start_objects (method_type, initp)
/* Mark this declaration as used to avoid spurious warnings. */
TREE_USED (current_function_decl) = 1;
store_parm_decls ();
pushlevel (0);
clear_last_expr ();
push_momentary ();
expand_start_bindings (0);
body = begin_compound_stmt (/*has_no_scope=*/0);
/* We cannot allow these functions to be elided, even if they do not
have external linkage. And, there's no point in deferring
@ -2810,23 +2807,27 @@ start_objects (method_type, initp)
out anyhow. */
current_function_cannot_inline
= "static constructors and destructors cannot be inlined";
return body;
}
/* Finish the process of running a particular set of global constructors
or destructors. Subroutine of do_[cd]tors. */
static void
finish_objects (method_type, initp)
finish_objects (method_type, initp, body)
int method_type, initp;
tree body;
{
char *fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
char *fnname;
tree fn;
/* Finish up. */
expand_end_bindings (getdecls (), 1, 0);
poplevel (1, 0, 0);
pop_momentary ();
finish_function (lineno, 0);
finish_compound_stmt(/*has_no_scope=*/0, body);
fn = finish_function (lineno, 0);
expand_body (fn);
fnname = XSTR (XEXP (DECL_RTL (fn), 0), 0);
if (initp == DEFAULT_INIT_PRIORITY)
{
if (method_type == 'I')
@ -3338,6 +3339,7 @@ generate_ctor_or_dtor_function (constructor_p, priority)
{
char function_key;
tree arguments;
tree body;
size_t i;
/* We use `I' to indicate initialization and `D' to indicate
@ -3348,7 +3350,7 @@ generate_ctor_or_dtor_function (constructor_p, priority)
function_key = 'D';
/* Begin the function. */
start_objects (function_key, priority);
body = start_objects (function_key, priority);
/* Call the static storage duration function with appropriate
arguments. */
@ -3358,7 +3360,7 @@ generate_ctor_or_dtor_function (constructor_p, priority)
NULL_TREE);
arguments = tree_cons (NULL_TREE, build_int_2 (constructor_p, 0),
arguments);
expand_expr_stmt (build_function_call (VARRAY_TREE (ssdf_decls, i),
finish_expr_stmt (build_function_call (VARRAY_TREE (ssdf_decls, i),
arguments));
}
@ -3372,11 +3374,11 @@ generate_ctor_or_dtor_function (constructor_p, priority)
for (fns = constructor_p ? static_ctors : static_dtors;
fns;
fns = TREE_CHAIN (fns))
expand_expr_stmt (build_function_call (TREE_VALUE (fns), NULL_TREE));
finish_expr_stmt (build_function_call (TREE_VALUE (fns), NULL_TREE));
}
/* Close out the function. */
finish_objects (function_key, priority);
finish_objects (function_key, priority, body);
}
/* Generate constructor and destructor functions for the priority