Makefile.in (OBJS): Added tree-inline.o.

* Makefile.in (OBJS): Added tree-inline.o.
(c-common.o): Depend on tree-inline.h.
(tree-inline.o): New target.
* c-common.c: Include tree-inline.h.
(c_mark_lang_decl): Don't mark saved_tree.
(c_common_lang_init): Set lang_anon_aggr_type_p.
* c-common.h (walk_tree_fn, DECL_SAVED_TREE): Moved to tree.h.
(struct c_lang_decl): Moved saved_tree to tree_decl.
* ggc-common.c: Mark saved_tree and inlined_fns of FUNCTION_DECLs.
* integrate.h (function_attribute_inlinable_p): Declare it.
* integrate.c (function_attribute_inlinable_p): Export it.
* tree-inline.c: New file.  Define variables declared in...
* tree-inline.h: New file.  Declare functions to be moved to
tree-inline.c.  Define macros and declare types and hooks for
language-specific tree inlining.
(flag_inline_trees): Moved definition from cp/decl2.c.
* tree.h (walk_tree_fn, DECL_SAVED_TREE): Moved from c-common.h.
(TREE_READONLY_DECL_P, DECL_INLINED_FNS): Moved from cp/cp-tree.h.
(struct tree_decl): Moved saved_tree from c_lang_decl and
inlined_fns from C++'s lang_decl.

From-SVN: r46021
This commit is contained in:
Alexandre Oliva 2001-10-05 02:49:16 +00:00 committed by Alexandre Oliva
parent 25af851255
commit 588d3ade13
10 changed files with 250 additions and 23 deletions

View File

@ -1,3 +1,26 @@
2001-10-04 Alexandre Oliva <aoliva@redhat.com>
* Makefile.in (OBJS): Added tree-inline.o.
(c-common.o): Depend on tree-inline.h.
(tree-inline.o): New target.
* c-common.c: Include tree-inline.h.
(c_mark_lang_decl): Don't mark saved_tree.
(c_common_lang_init): Set lang_anon_aggr_type_p.
* c-common.h (walk_tree_fn, DECL_SAVED_TREE): Moved to tree.h.
(struct c_lang_decl): Moved saved_tree to tree_decl.
* ggc-common.c: Mark saved_tree and inlined_fns of FUNCTION_DECLs.
* integrate.h (function_attribute_inlinable_p): Declare it.
* integrate.c (function_attribute_inlinable_p): Export it.
* tree-inline.c: New file. Define variables declared in...
* tree-inline.h: New file. Declare functions to be moved to
tree-inline.c. Define macros and declare types and hooks for
language-specific tree inlining.
(flag_inline_trees): Moved definition from cp/decl2.c.
* tree.h (walk_tree_fn, DECL_SAVED_TREE): Moved from c-common.h.
(TREE_READONLY_DECL_P, DECL_INLINED_FNS): Moved from cp/cp-tree.h.
(struct tree_decl): Moved saved_tree from c_lang_decl and
inlined_fns from C++'s lang_decl.
2001-10-04 Loren J. Rittle <ljrittle@acm.org>
* Makefile.in (STAGE2_FLAGS_TO_PASS): Remove patches which

View File

@ -748,7 +748,7 @@ OBJS = \
sdbout.o sibcall.o simplify-rtx.o splay-tree.o ssa.o ssa-ccp.o \
ssa-dce.o stmt.o stor-layout.o stringpool.o timevar.o toplev.o tree.o \
unroll.o varasm.o varray.o version.o xcoffout.o cfg.o cfganal.o \
cfgbuild.o cfgcleanup.o cfgloop.o cfgrtl.o \
cfgbuild.o cfgcleanup.o cfgloop.o cfgrtl.o tree-inline.o \
$(GGC) $(out_object_file) $(EXTRA_OBJS)
BACKEND = main.o libbackend.a
@ -1249,7 +1249,8 @@ s-under: $(GCC_PASSES)
c-common.o : c-common.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(OBSTACK_H) \
$(C_COMMON_H) flags.h toplev.h output.h c-pragma.h $(RTL_H) $(GGC_H) \
$(EXPR_H) $(TM_P_H) builtin-types.def builtin-attrs.def $(TARGET_H)
$(EXPR_H) $(TM_P_H) builtin-types.def builtin-attrs.def $(TARGET_H) \
tree-inline.h
# A file used by all variants of C and some other languages.
@ -1350,6 +1351,8 @@ convert.o: convert.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) flags.h convert.h toplev.
tree.o : tree.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) flags.h function.h toplev.h \
$(GGC_H) $(HASHTAB_H) $(TARGET_H) output.h $(TM_P_H)
tree-inline.o : tree-inline.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
tree-inline.h
print-tree.o : print-tree.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(GGC_H)
stor-layout.o : stor-layout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) flags.h \
function.h $(EXPR_H) $(RTL_H) toplev.h $(GGC_H) $(TM_P_H)

View File

@ -22,6 +22,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "config.h"
#include "system.h"
#include "tree.h"
#include "tree-inline.h"
#include "flags.h"
#include "toplev.h"
#include "output.h"
@ -3331,7 +3332,6 @@ void
c_mark_lang_decl (c)
struct c_lang_decl *c;
{
ggc_mark_tree (c->saved_tree);
}
/* Mark F for GC. */
@ -3831,6 +3831,8 @@ c_common_lang_init ()
if (flag_bounds_check < 0)
flag_bounds_check = flag_bounded_pointers;
lang_anon_aggr_type_p = anon_aggr_type_p;
/* Special format checking options don't work without -Wformat; warn if
they are used. */
if (warn_format_y2k && !warn_format)

View File

@ -316,12 +316,6 @@ extern void (*lang_expand_function_end) PARAMS ((void));
extern int (*lang_missing_noreturn_ok_p) PARAMS ((tree));
/* The type of a function that walks over tree structure. */
typedef tree (*walk_tree_fn) PARAMS ((tree *,
int *,
void *));
extern stmt_tree current_stmt_tree PARAMS ((void));
extern tree *current_scope_stmt_stack PARAMS ((void));
extern void begin_stmt_tree PARAMS ((tree *));
@ -344,17 +338,9 @@ extern void mark_stmt_tree PARAMS ((void *));
DECL_LANG_SPECIFIC field. */
struct c_lang_decl {
/* In a FUNCTION_DECL, this is DECL_SAVED_TREE. */
tree saved_tree;
char dummy;
};
/* In a FUNCTION_DECL, the saved representation of the body of the
entire function. Usually a COMPOUND_STMT, but in C++ this may also
be a RETURN_INIT, CTOR_INITIALIZER, or TRY_BLOCK. */
#define DECL_SAVED_TREE(NODE) \
(((struct c_lang_decl *) DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE))) \
->saved_tree)
/* In a FUNCTION_DECL for which DECL_BUILT_IN does not hold, this is
the approximate number of statements in this function. There is
no need for this number to be exact; it is only used in various

View File

@ -463,8 +463,13 @@ ggc_mark_trees ()
ggc_mark_tree (DECL_VINDEX (t));
if (DECL_ASSEMBLER_NAME_SET_P (t))
ggc_mark_tree (DECL_ASSEMBLER_NAME (t));
if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_INSNS (t))
ggc_mark_struct_function (DECL_SAVED_INSNS (t));
if (TREE_CODE (t) == FUNCTION_DECL)
{
ggc_mark_tree (DECL_SAVED_TREE (t));
ggc_mark_tree (DECL_INLINED_FNS (t));
if (DECL_SAVED_INSNS (t))
ggc_mark_struct_function (DECL_SAVED_INSNS (t));
}
lang_mark_tree (t);
break;

View File

@ -77,8 +77,6 @@ typedef struct initial_value_struct {
initial_value_pair *entries;
} initial_value_struct;
static bool function_attribute_inlinable_p PARAMS ((tree));
static void setup_initial_hard_reg_value_integration PARAMS ((struct function *, struct inline_remap *));
static rtvec initialize_for_inline PARAMS ((tree));
@ -129,7 +127,7 @@ get_label_from_map (map, i)
/* Return false if the function FNDECL cannot be inlined on account of its
attributes, true otherwise. */
static bool
bool
function_attribute_inlinable_p (fndecl)
tree fndecl;
{

View File

@ -152,6 +152,11 @@ extern union tree_node *copy_decl_for_inlining PARAMS ((union tree_node *,
union tree_node *,
union tree_node *));
/* Check whether there's any attribute in a function declaration that
makes the function uninlinable. Returns false if it finds any,
true otherwise. */
extern bool function_attribute_inlinable_p PARAMS ((union tree_node *));
extern void try_constants PARAMS ((rtx, struct inline_remap *));
/* Return the label indicated. */

43
gcc/tree-inline.c Normal file
View File

@ -0,0 +1,43 @@
/* Control and data flow functions for trees.
Copyright 2001 Free Software Foundation, Inc.
Contributed by Alexandre Oliva <aoliva@redhat.com>
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "tree.h"
#include "tree-inline.h"
/* Definitions of language hooks. */
treeopt_walk_subtrees_type *lang_walk_subtrees;
treeopt_cannot_inline_tree_fn_type *lang_cannot_inline_tree_fn;
treeopt_disregard_inline_limits_type *lang_disregard_inline_limits;
treeopt_add_pending_fn_decls_type *lang_add_pending_fn_decls;
treeopt_tree_chain_matters_p_type *lang_tree_chain_matters_p;
treeopt_auto_var_in_fn_p_type *lang_auto_var_in_fn_p;
treeopt_copy_res_decl_for_inlining_type *lang_copy_res_decl_for_inlining;
treeopt_anon_aggr_type_p *lang_anon_aggr_type_p;
/* 0 if we should not perform inlining.
1 if we should expand functions calls inline at the tree level.
2 if we should consider *all* functions to be inline
candidates. */
int flag_inline_trees = 0;

139
gcc/tree-inline.h Normal file
View File

@ -0,0 +1,139 @@
/* Tree inlining hooks and declarations.
Copyright 2001 Free Software Foundation, Inc.
Contributed by Alexandre Oliva <aoliva@redhat.com>
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef GCC_TREE_INLINE_H
#define GCC_TREE_INLINE_H
/* Function prototypes. */
void optimize_inline_calls PARAMS ((tree));
tree walk_tree PARAMS ((tree*, walk_tree_fn, void*, void*));
tree walk_tree_without_duplicates PARAMS ((tree*, walk_tree_fn, void*));
tree copy_tree_r PARAMS ((tree*, int*, void*));
void clone_body PARAMS ((tree, tree, void*));
void remap_save_expr PARAMS ((tree*, void*, tree, int*));
/* LANG_WALK_SUBTREES is called by walk_tree() after handling common
cases, but before walking code-specific sub-trees. If
lang_walk_subtrees is defined for a language, it should handle
language-specific tree codes, as well as language-specific
information associated to common tree codes. If a tree node is
completely handled within this function, it should set *SUBTREES to
0, so that generic handling isn't attempted. For language-specific
tree codes, generic handling would abort(), so make sure it is set
properly. Both SUBTREES and *SUBTREES is guaranteed to be non-zero
when the function is called. */
#define LANG_WALK_SUBTREES(TP,SUBTREES,FUNC,DATA,HTAB) \
(lang_walk_subtrees \
? (*lang_walk_subtrees)((TP),(SUBTREES),(FUNC),(DATA),(HTAB)) \
: 0)
typedef tree treeopt_walk_subtrees_type PARAMS ((tree*, int*, walk_tree_fn,
void*, void*));
extern treeopt_walk_subtrees_type *lang_walk_subtrees;
/* LANG_CANNOT_INLINE_TREE_FN is called to determine whether there are
language-specific reasons for not inlining a given function. */
#define LANG_CANNOT_INLINE_TREE_FN(FNP) \
(lang_cannot_inline_tree_fn ? (*lang_cannot_inline_tree_fn)(FNP) : 0)
typedef int treeopt_cannot_inline_tree_fn_type PARAMS ((tree*));
extern treeopt_cannot_inline_tree_fn_type *lang_cannot_inline_tree_fn;
/* LANG_DISREGARD_INLINE_LIMITS is called to determine whether a
function should be inlined even if it would exceed inlining limits. */
#define LANG_DISREGARD_INLINE_LIMITS(FN) \
(lang_disregard_inline_limits ? (*lang_disregard_inline_limits)(FN) : 0)
typedef int treeopt_disregard_inline_limits_type PARAMS ((tree));
extern treeopt_disregard_inline_limits_type *lang_disregard_inline_limits;
/* LANG_ADD_PENDING_FN_DECLS is called before starting to inline a
function, to push any language-specific functions that should not
be inlined into the current function, into VAFNP. PFN is the top
of varray, and should be returned if no functions are pushed into
VAFNP. The top of the varray should be returned. */
#define LANG_ADD_PENDING_FN_DECLS(VAFNP,PFN) \
(lang_add_pending_fn_decls \
? (*lang_add_pending_fn_decls)((VAFNP),(PFN)) \
: (PFN))
typedef tree treeopt_add_pending_fn_decls_type PARAMS ((void*,tree));
extern treeopt_add_pending_fn_decls_type *lang_add_pending_fn_decls;
/* LANG_TREE_CHAIN_MATTERS_P indicates whether the TREE_CHAIN of a
language-specific tree node is relevant, i.e., whether it should be
walked, copied and preserved across copies. */
#define LANG_TREE_CHAIN_MATTERS_P(T) \
(lang_tree_chain_matters_p ? (*lang_tree_chain_matters_p)(T) : 0)
typedef int treeopt_tree_chain_matters_p_type PARAMS ((tree));
extern treeopt_tree_chain_matters_p_type *lang_tree_chain_matters_p;
/* LANG_AUTO_VAR_IN_FN_P is called to determine whether VT is an
automatic variable defined in function FT. */
#define LANG_AUTO_VAR_IN_FN_P(VT,FT) \
(lang_auto_var_in_fn_p ? (*lang_auto_var_in_fn_p)((VT),(FT)) \
: (DECL_P (VT) && DECL_CONTEXT (VT) == (FT) \
&& (((TREE_CODE (VT) == VAR_DECL || TREE_CODE (VT) == PARM_DECL) \
&& ! TREE_STATIC (VT)) \
|| TREE_CODE (VT) == LABEL_DECL \
|| TREE_CODE (VT) == RESULT_DECL)))
typedef int treeopt_auto_var_in_fn_p_type PARAMS ((tree,tree));
extern treeopt_auto_var_in_fn_p_type *lang_auto_var_in_fn_p;
/* LANG_COPY_RES_DECL_FOR_INLINING should return a declaration for the
result RES of function FN to be inlined into CALLER. NDP points to
an integer that should be set in case a new declaration wasn't
created (presumably because RES was of aggregate type, such that a
TARGET_EXPR is used for the result). TEXPS is a pointer to a
varray with the stack of TARGET_EXPRs seen while inlining functions
into caller; the top of TEXPS is supposed to match RES. */
#define LANG_COPY_RES_DECL_FOR_INLINING(RES,FN,CALLER,DM,NDP,TEXPS) \
(lang_copy_res_decl_for_inlining \
? (*lang_copy_res_decl_for_inlining)((RES),(FN),(CALLER),\
(DM),(NDP),(TEXPS)) \
: copy_decl_for_inlining ((RES), (FN), (CALLER)))
typedef tree treeopt_copy_res_decl_for_inlining_type PARAMS ((tree, tree,
tree, void*,
int*, void*));
extern treeopt_copy_res_decl_for_inlining_type
*lang_copy_res_decl_for_inlining;
/* LANG_ANON_AGGR_TYPE_P determines whether T is a type node
representing an anonymous aggregate (union, struct, etc), i.e., one
whose members are in the same scope as the union itself. */
#define LANG_ANON_AGGR_TYPE_P(T) \
(lang_anon_aggr_type_p ? (*lang_anon_aggr_type_p)(T) : 0)
typedef int treeopt_anon_aggr_type_p PARAMS ((tree));
extern treeopt_anon_aggr_type_p *lang_anon_aggr_type_p;
/* 0 if we should not perform inlining.
1 if we should expand functions calls inline at the tree level.
2 if we should consider *all* functions to be inline
candidates. */
extern int flag_inline_trees;
#endif /* GCC_TREE_INLINE_H */

View File

@ -560,6 +560,10 @@ extern void tree_class_check_failed PARAMS ((const tree, int,
when the node is a type). */
#define TREE_READONLY(NODE) ((NODE)->common.readonly_flag)
/* Non-zero if NODE is a _DECL with TREE_READONLY set. */
#define TREE_READONLY_DECL_P(NODE) \
(TREE_READONLY (NODE) && DECL_P (NODE))
/* Value of expression is constant.
Always appears in all ..._CST nodes.
May also appear in an arithmetic expression, an ADDR_EXPR or a CONSTRUCTOR
@ -1547,6 +1551,14 @@ struct tree_type
/* In a FUNCTION_DECL, nonzero if the function cannot be inlined. */
#define DECL_UNINLINABLE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.uninlinable)
/* In a FUNCTION_DECL, the saved representation of the body of the
entire function. Usually a COMPOUND_STMT, but in C++ this may also
be a RETURN_INIT, CTOR_INITIALIZER, or TRY_BLOCK. */
#define DECL_SAVED_TREE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.saved_tree)
/* List of FUNCION_DECLs inlined into this function's body. */
#define DECL_INLINED_FNS(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.inlined_fns)
/* Nonzero in a FUNCTION_DECL means this is a built-in function
that is not specified by ansi C and that users are supposed to be allowed
to redefine for any purpose whatever. */
@ -1769,6 +1781,13 @@ struct tree_decl
int i;
} u2;
/* In a FUNCTION_DECL, this is DECL_SAVED_TREE. */
tree saved_tree;
/* In a FUNCTION_DECL, these are function data which is to be kept
as long as FUNCTION_DECL is kept. */
tree inlined_fns;
tree vindex;
HOST_WIDE_INT pointer_alias_set;
/* Points to a structure whose details depend on the language in use. */
@ -3050,6 +3069,10 @@ extern void dwarf2out_return_save PARAMS ((const char *, long));
extern void dwarf2out_return_reg PARAMS ((const char *, unsigned));
/* The type of a function that walks over tree structure. */
typedef tree (*walk_tree_fn) PARAMS ((tree *, int *, void *));
/* Redefine abort to report an internal error w/o coredump, and
reporting the location of the error in the source file. This logic