mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-26 12:23:59 +08:00
langhooks-def.h (LANG_HOOKS_UNSAVE_EXPR_NOW): Remove.
2004-08-19 Eric Christopher <echristo@redhat.com> * langhooks-def.h (LANG_HOOKS_UNSAVE_EXPR_NOW): Remove. * langhooks.h (unsave_expr_now): Ditto. * tree.h (unsave_expr_1): Remove prototype. (lhd_unsave_expr_now): Rename to unsave_expr_now. * tree-inline.c (unsave_expr_1): Move here from tree.c. Make static. (unsave_expr_now): Rename from lhd_unsave_expr_now. * tree-sra.c: Fix up for rename. * tree-ssa-copy.c: Ditto. * tree-eh.c: Ditto. * tree.c (unsave_expr_1): Move to tree-inline.c. 2004-08-19 Eric Christopher <echristo@redhat.com> * cp-tree.h (cxx_unsave_expr_now): Delete prototype. * tree.c (cxx_unsave_expr_now): Delete. (cp_unsave_r): Ditto. From-SVN: r86277
This commit is contained in:
parent
b850582895
commit
19114537c5
@ -1,12 +1,26 @@
|
||||
2004-08-19 Eric Christopher <echristo@redhat.com>
|
||||
|
||||
* langhooks-def.h (LANG_HOOKS_UNSAVE_EXPR_NOW): Remove.
|
||||
* langhooks.h (unsave_expr_now): Ditto.
|
||||
* tree.h (unsave_expr_1): Remove prototype.
|
||||
(lhd_unsave_expr_now): Rename to unsave_expr_now.
|
||||
* tree-inline.c (unsave_expr_1): Move here
|
||||
from tree.c. Make static.
|
||||
(unsave_expr_now): Rename from lhd_unsave_expr_now.
|
||||
* tree-sra.c: Fix up for rename.
|
||||
* tree-ssa-copy.c: Ditto.
|
||||
* tree-eh.c: Ditto.
|
||||
* tree.c (unsave_expr_1): Move to tree-inline.c.
|
||||
|
||||
2004-08-19 Caroline Tice <ctice@apple.com>
|
||||
|
||||
* config/i386/cygming.h (switch_to_section): Fix typo (change
|
||||
in_unlikely_text_section to in_unlikely_executed_text).
|
||||
|
||||
|
||||
2004-08-19 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
* vec.h (VEC_lower_bound): New macro.
|
||||
|
||||
|
||||
2004-08-19 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
PR target/16446
|
||||
@ -55,7 +69,7 @@
|
||||
* params.def (PARAM_INTEGER_SHARE_LIMIT): New.
|
||||
* params.h (INTEGER_SHARE_LIMIT): New.
|
||||
* Makefile.in (tree.o, stor-layout.o): Depend on PARAMS_H.
|
||||
|
||||
|
||||
2004-08-19 Paolo Bonzini <bonzini@gnu.org>
|
||||
|
||||
* gimplify.c (gimplify_minimax_expr): Remove.
|
||||
@ -63,7 +77,7 @@
|
||||
|
||||
2004-08-19 Dorit Naishlos <dorit@il.ibm.com>
|
||||
|
||||
* tree-vectorizer.c (vect_can_force_dr_alignment_p): Replace
|
||||
* tree-vectorizer.c (vect_can_force_dr_alignment_p): Replace
|
||||
STACK_BOUDARY with PREFERRED_STACK_BOUNDARY.
|
||||
|
||||
2004-08-19 Mark Mitchell <mark@codesourcery.com>
|
||||
@ -153,7 +167,7 @@
|
||||
(divsf3+1, divsf3+2): Change type to frdiv.
|
||||
* config/mips/sb1.md (ir_sb1_recipsf_2pipes, ir_sb1_recipsf_1pipe,
|
||||
ir_sb1_recipdf_2pipes, ir_sb1_recipdf_1pipe): New.
|
||||
|
||||
|
||||
* config/mips/3000.md (r3k_fdiv_single, r3k_fdiv_double): Add frdiv.
|
||||
* config/mips/4300.md (r4300_fdiv_single, r4300_fdiv_double): Likewise.
|
||||
* config/mips/4600.md (r4600_fdiv_single, f4600_fdiv_double): Likewise.
|
||||
@ -2604,7 +2618,7 @@
|
||||
* config/i386/xmmintrin.h: Include <mm_malloc.h>.
|
||||
|
||||
2004-08-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||
Tanguy Fautrà <tfautre@pandora.be>
|
||||
Tanguy FautrÃ? <tfautre@pandora.be>
|
||||
|
||||
* config/i386/pmm_malloc.h: New file.
|
||||
|
||||
|
@ -1,3 +1,9 @@
|
||||
2004-08-19 Eric Christopher <echristo@redhat.com>
|
||||
|
||||
* cp-tree.h (cxx_unsave_expr_now): Delete prototype.
|
||||
* tree.c (cxx_unsave_expr_now): Delete.
|
||||
(cp_unsave_r): Ditto.
|
||||
|
||||
2004-08-19 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/15890
|
||||
@ -16,7 +22,7 @@
|
||||
* decl.c (finish_enum): Do not copy value node early, copy
|
||||
later.
|
||||
* lex.c (cxx_init): Force null_node to be unique.
|
||||
|
||||
|
||||
2004-08-19 Joseph S. Myers <jsm@polyomino.org.uk>
|
||||
|
||||
PR c++/17041
|
||||
@ -191,7 +197,7 @@
|
||||
PR c++/16929
|
||||
* pt.c (tsubst_default_argument): Clear out current_class_ptr and
|
||||
current_class_ref while tsubsting.
|
||||
|
||||
|
||||
2004-08-10 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/16971
|
||||
@ -415,7 +421,7 @@
|
||||
static_dtors to ...
|
||||
(expand_or_defer_fn): ... here.
|
||||
* tree.c (no_linkage_check): Add relaxed_p parameter.
|
||||
|
||||
|
||||
2004-07-28 Eric Christopher <echristo@redhat.com>
|
||||
|
||||
* cp-lang.c (LANG_HOOKS_UNSAFE_FOR_REEVAL): Delete.
|
||||
|
@ -126,7 +126,7 @@ struct diagnostic_context;
|
||||
of the base class.
|
||||
|
||||
The BV_VCALL_INDEX of each node, if non-NULL, gives the vtable
|
||||
index of the vcall offset for this entry.
|
||||
index of the vcall offset for this entry.
|
||||
|
||||
The BV_FN is the declaration for the virtual function itself.
|
||||
|
||||
@ -290,8 +290,8 @@ struct tree_overload GTY(())
|
||||
a TEMPLATE_DECL, an OVERLOAD, or a TEMPLATE_ID_EXPR. */
|
||||
#define BASELINK_FUNCTIONS(NODE) \
|
||||
(((struct tree_baselink*) BASELINK_CHECK (NODE))->functions)
|
||||
/* The BINFO in which the search for the functions indicated by this baselink
|
||||
began. This base is used to determine the accessibility of functions
|
||||
/* The BINFO in which the search for the functions indicated by this baselink
|
||||
began. This base is used to determine the accessibility of functions
|
||||
selected by overload resolution. */
|
||||
#define BASELINK_ACCESS_BINFO(NODE) \
|
||||
(((struct tree_baselink*) BASELINK_CHECK (NODE))->access_binfo)
|
||||
@ -987,7 +987,7 @@ struct lang_type_header GTY(())
|
||||
struct lang_type_class GTY(())
|
||||
{
|
||||
struct lang_type_header h;
|
||||
|
||||
|
||||
unsigned char align;
|
||||
|
||||
unsigned has_mutable : 1;
|
||||
@ -1061,7 +1061,7 @@ struct lang_type_ptrmem GTY(())
|
||||
|
||||
struct lang_type GTY(())
|
||||
{
|
||||
union lang_type_u
|
||||
union lang_type_u
|
||||
{
|
||||
struct lang_type_header GTY((skip (""))) h;
|
||||
struct lang_type_class GTY((tag ("1"))) c;
|
||||
@ -1306,7 +1306,7 @@ struct lang_type GTY(())
|
||||
#define CLASSTYPE_ALIGN_UNIT(NODE) \
|
||||
(CLASSTYPE_ALIGN (NODE) / BITS_PER_UNIT)
|
||||
|
||||
/* True if this a Java interface type, declared with
|
||||
/* True if this a Java interface type, declared with
|
||||
'__attribute__ ((java_interface))'. */
|
||||
#define TYPE_JAVA_INTERFACE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->java_interface)
|
||||
|
||||
@ -1586,13 +1586,13 @@ struct lang_decl GTY(())
|
||||
|
||||
union lang_decl_u4
|
||||
{
|
||||
struct full_lang_decl
|
||||
struct full_lang_decl
|
||||
{
|
||||
/* For a non-thunk function decl, this is a tree list of
|
||||
friendly classes. For a thunk function decl, it is the
|
||||
thunked to function decl. */
|
||||
tree befriending_classes;
|
||||
|
||||
|
||||
/* For a non-virtual FUNCTION_DECL, this is
|
||||
DECL_FRIEND_CONTEXT. For a virtual FUNCTION_DECL for which
|
||||
DECL_THIS_THUNK_P does not hold, this is DECL_THUNKS. Both
|
||||
@ -1603,7 +1603,7 @@ struct lang_decl GTY(())
|
||||
|
||||
/* In a FUNCTION_DECL, this is DECL_CLONED_FUNCTION. */
|
||||
tree cloned_function;
|
||||
|
||||
|
||||
/* In a FUNCTION_DECL for which THUNK_P holds, this is
|
||||
THUNK_FIXED_OFFSET. */
|
||||
HOST_WIDE_INT fixed_offset;
|
||||
@ -1614,13 +1614,13 @@ struct lang_decl GTY(())
|
||||
|
||||
unsigned u3sel : 1;
|
||||
unsigned pending_inline_p : 1;
|
||||
|
||||
|
||||
union lang_decl_u3
|
||||
{
|
||||
struct sorted_fields_type * GTY ((tag ("0"), reorder ("resort_sorted_fields")))
|
||||
struct sorted_fields_type * GTY ((tag ("0"), reorder ("resort_sorted_fields")))
|
||||
sorted_fields;
|
||||
struct cp_token_cache * GTY ((tag ("2"))) pending_inline_info;
|
||||
struct language_function * GTY ((tag ("1")))
|
||||
struct language_function * GTY ((tag ("1")))
|
||||
saved_language_function;
|
||||
} GTY ((desc ("%1.u3sel + %1.pending_inline_p"))) u;
|
||||
} GTY ((tag ("1"))) f;
|
||||
@ -1646,7 +1646,7 @@ struct lang_decl GTY(())
|
||||
declaration. Some entities (like a member function in a local
|
||||
class, or a local variable) do not have linkage at all, and this
|
||||
macro should not be used in those cases.
|
||||
|
||||
|
||||
Implementation note: A FUNCTION_DECL without DECL_LANG_SPECIFIC was
|
||||
created by language-independent code, and has C linkage. Most
|
||||
VAR_DECLs have C++ linkage, and do not have DECL_LANG_SPECIFIC, but
|
||||
@ -1730,7 +1730,7 @@ struct lang_decl GTY(())
|
||||
|
||||
/* Perform an action for each clone of FN, if FN is a function with
|
||||
clones. This macro should be used like:
|
||||
|
||||
|
||||
FOR_EACH_CLONE (clone, fn)
|
||||
{ ... }
|
||||
|
||||
@ -1824,14 +1824,14 @@ struct lang_decl GTY(())
|
||||
(TREE_LANG_FLAG_2 (VAR_DECL_CHECK (NODE)))
|
||||
|
||||
/* Nonzero for a VAR_DECL that can be used in an integral constant
|
||||
expression.
|
||||
expression.
|
||||
|
||||
[expr.const]
|
||||
|
||||
An integral constant-expression can only involve ... const
|
||||
variables of static or enumeration types initialized with
|
||||
constant expressions ...
|
||||
|
||||
|
||||
The standard does not require that the expression be non-volatile.
|
||||
G++ implements the proposed correction in DR 457. */
|
||||
#define DECL_INTEGRAL_CONSTANT_VAR_P(NODE) \
|
||||
@ -2819,7 +2819,7 @@ struct lang_decl GTY(())
|
||||
function, (or be implemented via passing some invisible parameter
|
||||
to the thunked function, which is modified to perform the
|
||||
adjustment just before returning).
|
||||
|
||||
|
||||
A thunk may perform either, or both, of the following operations:
|
||||
|
||||
o Adjust the this or result pointer by a constant offset.
|
||||
@ -2902,7 +2902,7 @@ struct lang_decl GTY(())
|
||||
#define ELSE_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
|
||||
|
||||
/* An enumeration of the kind of tags that C++ accepts. */
|
||||
enum tag_types {
|
||||
enum tag_types {
|
||||
none_type = 0, /* Not a tag type. */
|
||||
record_type, /* "struct" types. */
|
||||
class_type, /* "class" types. */
|
||||
@ -2967,8 +2967,8 @@ typedef enum special_function_kind {
|
||||
sfk_conversion /* A conversion operator. */
|
||||
} special_function_kind;
|
||||
|
||||
/* The various kinds of linkage. From [basic.link],
|
||||
|
||||
/* The various kinds of linkage. From [basic.link],
|
||||
|
||||
A name is said to have linkage when it might denote the same
|
||||
object, reference, function, type, template, namespace or value
|
||||
as a name introduced in another scope:
|
||||
@ -3705,7 +3705,7 @@ extern tree poplevel (int, int, int);
|
||||
extern void insert_block (tree);
|
||||
extern tree pushdecl (tree);
|
||||
extern void cxx_init_decl_processing (void);
|
||||
enum cp_tree_node_structure_enum cp_tree_node_structure
|
||||
enum cp_tree_node_structure_enum cp_tree_node_structure
|
||||
(union lang_tree_node *);
|
||||
extern bool cxx_mark_addressable (tree);
|
||||
extern void cxx_push_function_context (struct function *);
|
||||
@ -4169,7 +4169,7 @@ extern void check_multiple_declarators (void);
|
||||
extern void qualified_name_lookup_error (tree, tree, tree);
|
||||
extern tree finish_id_expression (tree, tree, tree,
|
||||
cp_id_kind *, tree *,
|
||||
bool, bool, bool *,
|
||||
bool, bool, bool *,
|
||||
const char **);
|
||||
extern tree finish_typeof (tree);
|
||||
extern void finish_decl_cleanup (tree, tree);
|
||||
@ -4192,7 +4192,6 @@ extern void lang_check_failed (const char *, int,
|
||||
extern tree stabilize_expr (tree, tree *);
|
||||
extern void stabilize_call (tree, tree *);
|
||||
extern bool stabilize_init (tree, tree *);
|
||||
extern tree cxx_unsave_expr_now (tree);
|
||||
extern tree cxx_maybe_build_cleanup (tree);
|
||||
extern void init_tree (void);
|
||||
extern int pod_type_p (tree);
|
||||
@ -4291,7 +4290,7 @@ extern tree build_indirect_ref (tree, const char *);
|
||||
extern tree build_array_ref (tree, tree);
|
||||
extern tree get_member_function_from_ptrfunc (tree *, tree);
|
||||
extern tree convert_arguments (tree, tree, tree, int);
|
||||
extern tree build_x_binary_op (enum tree_code, tree, tree,
|
||||
extern tree build_x_binary_op (enum tree_code, tree, tree,
|
||||
bool *);
|
||||
extern tree build_x_unary_op (enum tree_code, tree);
|
||||
extern tree unary_complex_lvalue (enum tree_code, tree);
|
||||
|
@ -43,7 +43,6 @@ static hashval_t list_hash_pieces (tree, tree, tree);
|
||||
static hashval_t list_hash (const void *);
|
||||
static cp_lvalue_kind lvalue_p_1 (tree, int);
|
||||
static tree mark_local_for_remap_r (tree *, int *, void *);
|
||||
static tree cp_unsave_r (tree *, int *, void *);
|
||||
static tree build_target_expr (tree, tree);
|
||||
static tree count_trees_r (tree *, int *, void *);
|
||||
static tree verify_stmt_tree_r (tree *, int *, void *);
|
||||
@ -2171,65 +2170,6 @@ mark_local_for_remap_r (tree* tp,
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Called via walk_tree when an expression is unsaved. Using the
|
||||
splay_tree pointed to by ST (which is really a `splay_tree'),
|
||||
remaps all local declarations to appropriate replacements. */
|
||||
|
||||
static tree
|
||||
cp_unsave_r (tree* tp,
|
||||
int* walk_subtrees,
|
||||
void* data)
|
||||
{
|
||||
splay_tree st = (splay_tree) data;
|
||||
splay_tree_node n;
|
||||
|
||||
/* Only a local declaration (variable or label). */
|
||||
if (nonstatic_local_decl_p (*tp))
|
||||
{
|
||||
/* Lookup the declaration. */
|
||||
n = splay_tree_lookup (st, (splay_tree_key) *tp);
|
||||
|
||||
/* If it's there, remap it. */
|
||||
if (n)
|
||||
*tp = (tree) n->value;
|
||||
}
|
||||
else if (TREE_CODE (*tp) == SAVE_EXPR)
|
||||
remap_save_expr (tp, st, walk_subtrees);
|
||||
else
|
||||
{
|
||||
copy_tree_r (tp, walk_subtrees, NULL);
|
||||
|
||||
/* Do whatever unsaving is required. */
|
||||
unsave_expr_1 (*tp);
|
||||
}
|
||||
|
||||
/* Keep iterating. */
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Called whenever an expression needs to be unsaved. */
|
||||
|
||||
tree
|
||||
cxx_unsave_expr_now (tree tp)
|
||||
{
|
||||
splay_tree st;
|
||||
|
||||
/* Create a splay-tree to map old local variable declarations to new
|
||||
ones. */
|
||||
st = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
|
||||
|
||||
/* Walk the tree once figuring out what needs to be remapped. */
|
||||
walk_tree (&tp, mark_local_for_remap_r, st, NULL);
|
||||
|
||||
/* Walk the tree again, copying, remapping, and unsaving. */
|
||||
walk_tree (&tp, cp_unsave_r, st, NULL);
|
||||
|
||||
/* Clean up. */
|
||||
splay_tree_delete (st);
|
||||
|
||||
return tp;
|
||||
}
|
||||
|
||||
/* Returns the kind of special function that DECL (a FUNCTION_DECL)
|
||||
is. Note that sfk_none is zero, so this function can be used as a
|
||||
predicate to test whether or not DECL is a special function. */
|
||||
|
@ -107,7 +107,6 @@ extern int lhd_gimplify_expr (tree *, tree *, tree *);
|
||||
#define LANG_HOOKS_FINISH_INCOMPLETE_DECL lhd_do_nothing_t
|
||||
#define LANG_HOOKS_STATICP lhd_staticp
|
||||
#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL lhd_do_nothing_t
|
||||
#define LANG_HOOKS_UNSAVE_EXPR_NOW lhd_unsave_expr_now
|
||||
#define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME lhd_set_decl_assembler_name
|
||||
#define LANG_HOOKS_CAN_USE_BIT_FIELDS_P lhd_can_use_bit_fields_p
|
||||
#define LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS false
|
||||
@ -271,7 +270,6 @@ extern tree lhd_make_node (enum tree_code);
|
||||
LANG_HOOKS_MARK_ADDRESSABLE, \
|
||||
LANG_HOOKS_STATICP, \
|
||||
LANG_HOOKS_DUP_LANG_SPECIFIC_DECL, \
|
||||
LANG_HOOKS_UNSAVE_EXPR_NOW, \
|
||||
LANG_HOOKS_SET_DECL_ASSEMBLER_NAME, \
|
||||
LANG_HOOKS_CAN_USE_BIT_FIELDS_P, \
|
||||
LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS, \
|
||||
|
@ -305,11 +305,6 @@ struct lang_hooks
|
||||
DECL_NODE with a newly GC-allocated copy. */
|
||||
void (*dup_lang_specific_decl) (tree);
|
||||
|
||||
/* Reset argument so that it can be expanded again.
|
||||
Modify it in-place so that all the evaluate only once
|
||||
things are cleared out. */
|
||||
tree (*unsave_expr_now) (tree);
|
||||
|
||||
/* Set the DECL_ASSEMBLER_NAME for a node. If it is the sort of
|
||||
thing that the assembler should talk about, set
|
||||
DECL_ASSEMBLER_NAME to an appropriate IDENTIFIER_NODE.
|
||||
|
@ -77,7 +77,7 @@ struct_ptr_hash (const void *a)
|
||||
we get to rtl. Once we're done with lowering here, if we lose
|
||||
the information there's no way to recover it!
|
||||
|
||||
(2) There are many more statements that *cannot* throw as
|
||||
(2) There are many more statements that *cannot* throw as
|
||||
compared to those that can. We should be saving some amount
|
||||
of space by only allocating memory for those that can throw. */
|
||||
|
||||
@ -265,7 +265,7 @@ outside_finally_tree (tree start, tree target)
|
||||
|
||||
struct leh_state
|
||||
{
|
||||
/* What's "current" while constructing the eh region tree. These
|
||||
/* What's "current" while constructing the eh region tree. These
|
||||
correspond to variables of the same name in cfun->eh, which we
|
||||
don't have easy access to. */
|
||||
struct eh_region *cur_region;
|
||||
@ -280,7 +280,7 @@ struct leh_state
|
||||
struct leh_tf_state
|
||||
{
|
||||
/* Pointer to the TRY_FINALLY node under discussion. The try_finally_expr
|
||||
is the original TRY_FINALLY_EXPR. We need to retain this so that
|
||||
is the original TRY_FINALLY_EXPR. We need to retain this so that
|
||||
outside_finally_tree can reliably reference the tree used in the
|
||||
collect_finally_tree data structures. */
|
||||
tree try_finally_expr;
|
||||
@ -311,7 +311,7 @@ struct leh_tf_state
|
||||
though subsequent transformations may have cleared that flag. */
|
||||
tree fallthru_label;
|
||||
|
||||
/* A label that has been registered with except.c to be the
|
||||
/* A label that has been registered with except.c to be the
|
||||
landing pad for this try block. */
|
||||
tree eh_label;
|
||||
|
||||
@ -330,7 +330,7 @@ struct leh_tf_state
|
||||
static void lower_eh_filter (struct leh_state *, tree *);
|
||||
static void lower_eh_constructs_1 (struct leh_state *, tree *);
|
||||
|
||||
/* Comparison function for qsort/bsearch. We're interested in
|
||||
/* Comparison function for qsort/bsearch. We're interested in
|
||||
searching goto queue elements for source statements. */
|
||||
|
||||
static int
|
||||
@ -383,7 +383,7 @@ replace_goto_queue_cond_clause (tree *tp, struct leh_tf_state *tf,
|
||||
tsi_link_after (tsi, new, TSI_CONTINUE_LINKING);
|
||||
}
|
||||
|
||||
/* The real work of replace_goto_queue. Returns with TSI updated to
|
||||
/* The real work of replace_goto_queue. Returns with TSI updated to
|
||||
point to the next statement. */
|
||||
|
||||
static void replace_goto_queue_stmt_list (tree, struct leh_tf_state *);
|
||||
@ -471,7 +471,7 @@ maybe_record_in_goto_queue (struct leh_state *state, tree stmt)
|
||||
{
|
||||
tree lab = GOTO_DESTINATION (stmt);
|
||||
|
||||
/* Computed and non-local gotos do not get processed. Given
|
||||
/* Computed and non-local gotos do not get processed. Given
|
||||
their nature we can neither tell whether we've escaped the
|
||||
finally block nor redirect them if we knew. */
|
||||
if (TREE_CODE (lab) != LABEL_DECL)
|
||||
@ -480,7 +480,7 @@ maybe_record_in_goto_queue (struct leh_state *state, tree stmt)
|
||||
/* No need to record gotos that don't leave the try block. */
|
||||
if (! outside_finally_tree (lab, tf->try_finally_expr))
|
||||
return;
|
||||
|
||||
|
||||
if (! tf->dest_array)
|
||||
{
|
||||
VARRAY_TREE_INIT (tf->dest_array, 10, "dest_array");
|
||||
@ -520,7 +520,7 @@ maybe_record_in_goto_queue (struct leh_state *state, tree stmt)
|
||||
|
||||
q = &tf->goto_queue[active];
|
||||
tf->goto_queue_active = active + 1;
|
||||
|
||||
|
||||
memset (q, 0, sizeof (*q));
|
||||
q->stmt = stmt;
|
||||
q->index = index;
|
||||
@ -709,7 +709,7 @@ lower_try_finally_dup_block (tree t, struct leh_state *outer_state)
|
||||
{
|
||||
tree region = NULL;
|
||||
|
||||
t = lhd_unsave_expr_now (t);
|
||||
t = unsave_expr_now (t);
|
||||
|
||||
if (outer_state->tf)
|
||||
region = outer_state->tf->try_finally_expr;
|
||||
@ -731,7 +731,7 @@ lower_try_finally_fallthru_label (struct leh_tf_state *tf)
|
||||
label = create_artificial_label ();
|
||||
tf->fallthru_label = label;
|
||||
if (tf->outer->tf)
|
||||
record_in_finally_tree (label, tf->outer->tf->try_finally_expr);
|
||||
record_in_finally_tree (label, tf->outer->tf->try_finally_expr);
|
||||
}
|
||||
return label;
|
||||
}
|
||||
@ -752,7 +752,7 @@ lower_try_finally_fallthru_label (struct leh_tf_state *tf)
|
||||
|
||||
where "fintmp" is the temporary used in the switch statement generation
|
||||
alternative considered below. For the nonce, we always choose the first
|
||||
option.
|
||||
option.
|
||||
|
||||
THIS_STATE may be null if if this is a try-cleanup, not a try-finally. */
|
||||
|
||||
@ -937,7 +937,7 @@ lower_try_finally_onedest (struct leh_state *state, struct leh_tf_state *tf)
|
||||
append_to_statement_list (x, tf->top_p);
|
||||
|
||||
append_to_statement_list (finally, tf->top_p);
|
||||
|
||||
|
||||
x = build1 (RESX_EXPR, void_type_node,
|
||||
build_int_cst (NULL_TREE,
|
||||
get_eh_region_number (tf->region), 0));
|
||||
@ -977,7 +977,7 @@ lower_try_finally_onedest (struct leh_state *state, struct leh_tf_state *tf)
|
||||
for (; q < qe; ++q)
|
||||
do_goto_redirection (q, finally_label, NULL);
|
||||
replace_goto_queue (tf);
|
||||
|
||||
|
||||
if (VARRAY_TREE (tf->dest_array, 0) == tf->fallthru_label)
|
||||
{
|
||||
/* Reachable by goto to fallthru label only. Redirect it
|
||||
@ -1284,7 +1284,7 @@ decide_copy_try_finally (int ndests, tree finally)
|
||||
|
||||
/* A subroutine of lower_eh_constructs_1. Lower a TRY_FINALLY_EXPR nodes
|
||||
to a sequence of labels and blocks, plus the exception region trees
|
||||
that record all the magic. This is complicated by the need to
|
||||
that record all the magic. This is complicated by the need to
|
||||
arrange for the FINALLY block to be executed on all exits. */
|
||||
|
||||
static void
|
||||
@ -1374,7 +1374,7 @@ lower_try_finally (struct leh_state *state, tree *tp)
|
||||
}
|
||||
|
||||
/* A subroutine of lower_eh_constructs_1. Lower a TRY_CATCH_EXPR with a
|
||||
list of CATCH_EXPR nodes to a sequence of labels and blocks, plus the
|
||||
list of CATCH_EXPR nodes to a sequence of labels and blocks, plus the
|
||||
exception region trees that record all the magic. */
|
||||
|
||||
static void
|
||||
@ -1444,7 +1444,7 @@ lower_eh_filter (struct leh_state *state, tree *tp)
|
||||
struct eh_region *this_region;
|
||||
tree inner = expr_first (TREE_OPERAND (*tp, 1));
|
||||
tree eh_label;
|
||||
|
||||
|
||||
if (EH_FILTER_MUST_NOT_THROW (inner))
|
||||
this_region = gen_eh_region_must_not_throw (state->cur_region);
|
||||
else
|
||||
@ -1452,7 +1452,7 @@ lower_eh_filter (struct leh_state *state, tree *tp)
|
||||
EH_FILTER_TYPES (inner));
|
||||
this_state = *state;
|
||||
this_state.cur_region = this_region;
|
||||
|
||||
|
||||
lower_eh_constructs_1 (&this_state, &TREE_OPERAND (*tp, 0));
|
||||
|
||||
if (!get_eh_region_may_contain_throw (this_region))
|
||||
@ -1568,7 +1568,7 @@ lower_eh_constructs_1 (struct leh_state *state, tree *tp)
|
||||
record_stmt_eh_region (state->cur_region, t);
|
||||
note_eh_region_may_contain_throw (state->cur_region);
|
||||
|
||||
/* ??? For the benefit of calls.c, converting all this to rtl,
|
||||
/* ??? For the benefit of calls.c, converting all this to rtl,
|
||||
we need to record the call expression, not just the outer
|
||||
modify statement. */
|
||||
op = get_call_expr_in (t);
|
||||
@ -1647,7 +1647,7 @@ lower_eh_constructs (void)
|
||||
collect_eh_region_array ();
|
||||
}
|
||||
|
||||
struct tree_opt_pass pass_lower_eh =
|
||||
struct tree_opt_pass pass_lower_eh =
|
||||
{
|
||||
"eh", /* name */
|
||||
NULL, /* gate */
|
||||
@ -1680,7 +1680,7 @@ make_eh_edge (struct eh_region *region, void *data)
|
||||
|
||||
make_edge (src, dst, EDGE_ABNORMAL | EDGE_EH);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
make_eh_edges (tree stmt)
|
||||
{
|
||||
|
@ -135,6 +135,7 @@ static void remap_block (tree *, inline_data *);
|
||||
static tree remap_decls (tree, inline_data *);
|
||||
static void copy_bind_expr (tree *, int *, inline_data *);
|
||||
static tree mark_local_for_remap_r (tree *, int *, void *);
|
||||
static void unsave_expr_1 (tree);
|
||||
static tree unsave_r (tree *, int *, void *);
|
||||
static void declare_inline_vars (tree bind_expr, tree vars);
|
||||
|
||||
@ -2370,6 +2371,31 @@ mark_local_for_remap_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Perform any modifications to EXPR required when it is unsaved. Does
|
||||
not recurse into EXPR's subtrees. */
|
||||
|
||||
static void
|
||||
unsave_expr_1 (tree expr)
|
||||
{
|
||||
switch (TREE_CODE (expr))
|
||||
{
|
||||
case TARGET_EXPR:
|
||||
/* Don't mess with a TARGET_EXPR that hasn't been expanded.
|
||||
It's OK for this to happen if it was part of a subtree that
|
||||
isn't immediately expanded, such as operand 2 of another
|
||||
TARGET_EXPR. */
|
||||
if (TREE_OPERAND (expr, 1))
|
||||
break;
|
||||
|
||||
TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 3);
|
||||
TREE_OPERAND (expr, 3) = NULL_TREE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Called via walk_tree when an expression is unsaved. Using the
|
||||
splay_tree pointed to by ST (which is really a `splay_tree'),
|
||||
remaps all local declarations to appropriate replacements. */
|
||||
@ -2411,11 +2437,11 @@ unsave_r (tree *tp, int *walk_subtrees, void *data)
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Default lang hook for "unsave_expr_now". Copies everything in EXPR and
|
||||
replaces variables, labels and SAVE_EXPRs local to EXPR. */
|
||||
/* Copies everything in EXPR and replaces variables, labels
|
||||
and SAVE_EXPRs local to EXPR. */
|
||||
|
||||
tree
|
||||
lhd_unsave_expr_now (tree expr)
|
||||
unsave_expr_now (tree expr)
|
||||
{
|
||||
inline_data id;
|
||||
|
||||
|
@ -5,17 +5,17 @@
|
||||
Contributed by Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
||||
GCC 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.
|
||||
|
||||
|
||||
GCC 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 GCC; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
@ -52,7 +52,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
|
||||
/* This object of this pass is to replace a non-addressable aggregate with a
|
||||
set of independent variables. Most of the time, all of these variables
|
||||
will be scalars. But a secondary objective is to break up larger
|
||||
will be scalars. But a secondary objective is to break up larger
|
||||
aggregates into smaller aggregates. In the process we may find that some
|
||||
bits of the larger aggregate can be deleted as unreferenced.
|
||||
|
||||
@ -405,7 +405,7 @@ sra_elt_hash (const void *x)
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
|
||||
/* Equality function for type SRA_PAIR. */
|
||||
|
||||
static int
|
||||
@ -533,7 +533,7 @@ is_valid_const_index (tree expr)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Create or return the SRA_ELT structure for EXPR if the expression
|
||||
/* Create or return the SRA_ELT structure for EXPR if the expression
|
||||
refers to a scalarizable variable. */
|
||||
|
||||
static struct sra_elt *
|
||||
@ -682,7 +682,7 @@ sra_walk_expr (tree *expr_p, block_stmt_iterator *bsi, bool is_output,
|
||||
index reference inside a loop being overridden by several constant
|
||||
index references during loop setup. It's possible that this could
|
||||
be avoided by using dynamic usage counts based on BB trip counts
|
||||
(based on loop analysis or profiling), but that hardly seems worth
|
||||
(based on loop analysis or profiling), but that hardly seems worth
|
||||
the effort. */
|
||||
/* ??? Hack. Figure out how to push this into the scan routines
|
||||
without duplicating too much code. */
|
||||
@ -716,7 +716,7 @@ sra_walk_expr (tree *expr_p, block_stmt_iterator *bsi, bool is_output,
|
||||
|
||||
case BIT_FIELD_REF:
|
||||
/* A bit field reference (access to *multiple* fields simultaneously)
|
||||
is not currently scalarized. Consider this an access to the
|
||||
is not currently scalarized. Consider this an access to the
|
||||
complete outer element, to which walk_tree will bring us next. */
|
||||
goto use_all;
|
||||
|
||||
@ -828,7 +828,7 @@ sra_walk_modify_expr (tree expr, block_stmt_iterator *bsi,
|
||||
the function multiple times, and other evil things. */
|
||||
else if (!lhs_elt->is_scalar && is_gimple_addressable (rhs))
|
||||
fns->ldst (lhs_elt, rhs, bsi, true);
|
||||
|
||||
|
||||
/* Otherwise we're being used in some context that requires the
|
||||
aggregate to be seen as a whole. Invoke USE. */
|
||||
else
|
||||
@ -946,7 +946,7 @@ find_candidates_for_sra (void)
|
||||
any_set = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return any_set;
|
||||
}
|
||||
|
||||
@ -1294,7 +1294,7 @@ decide_block_copy (struct sra_elt *elt)
|
||||
|
||||
full_size = tree_low_cst (size_tree, 1);
|
||||
|
||||
/* ??? What to do here. If there are two fields, and we've only
|
||||
/* ??? What to do here. If there are two fields, and we've only
|
||||
instantiated one, then instantiating the other is clearly a win.
|
||||
If there are a large number of fields then the size of the copy
|
||||
is much more of a factor. */
|
||||
@ -1377,9 +1377,9 @@ decide_instantiations (void)
|
||||
|
||||
if (cleared_any)
|
||||
{
|
||||
bitmap_operation (sra_candidates, sra_candidates, &done_head,
|
||||
bitmap_operation (sra_candidates, sra_candidates, &done_head,
|
||||
BITMAP_AND_COMPL);
|
||||
bitmap_operation (needs_copy_in, needs_copy_in, &done_head,
|
||||
bitmap_operation (needs_copy_in, needs_copy_in, &done_head,
|
||||
BITMAP_AND_COMPL);
|
||||
}
|
||||
bitmap_clear (&done_head);
|
||||
@ -1697,7 +1697,7 @@ insert_edge_copies (tree stmt, basic_block bb)
|
||||
first_copy = false;
|
||||
}
|
||||
else
|
||||
bsi_insert_on_edge (e, lhd_unsave_expr_now (stmt));
|
||||
bsi_insert_on_edge (e, unsave_expr_now (stmt));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1816,7 +1816,7 @@ scalarize_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt,
|
||||
else if (lhs_elt->use_block_copy || rhs_elt->use_block_copy)
|
||||
{
|
||||
/* If either side requires a block copy, then sync the RHS back
|
||||
to the original structure, leave the original assignment
|
||||
to the original structure, leave the original assignment
|
||||
statement (which will perform the block copy), then load the
|
||||
LHS values out of its now-updated original structure. */
|
||||
/* ??? Could perform a modified pair-wise element copy. That
|
||||
@ -1978,7 +1978,7 @@ scalarize_ldst (struct sra_elt *elt, tree other,
|
||||
|
||||
/* Replace the old statement with this new representative. */
|
||||
bsi_replace (bsi, first, true);
|
||||
|
||||
|
||||
if (!tsi_end_p (tsi))
|
||||
{
|
||||
/* If any reference would trap, then they all would. And more
|
||||
@ -2010,7 +2010,7 @@ scalarize_parms (void)
|
||||
size_t i;
|
||||
|
||||
EXECUTE_IF_SET_IN_BITMAP (needs_copy_in, 0, i,
|
||||
{
|
||||
{
|
||||
tree var = referenced_var (i);
|
||||
struct sra_elt *elt = lookup_element (NULL, var, NULL, NO_INSERT);
|
||||
generate_copy_inout (elt, true, var, &list);
|
||||
@ -2107,7 +2107,7 @@ gate_sra (void)
|
||||
return flag_tree_sra != 0;
|
||||
}
|
||||
|
||||
struct tree_opt_pass pass_sra =
|
||||
struct tree_opt_pass pass_sra =
|
||||
{
|
||||
"sra", /* name */
|
||||
gate_sra, /* gate */
|
||||
|
@ -70,7 +70,7 @@ may_propagate_copy (tree dest, tree orig)
|
||||
/* FIXME. GIMPLE is allowing pointer assignments and comparisons of
|
||||
pointers that have different alias sets. This means that these
|
||||
pointers will have different memory tags associated to them.
|
||||
|
||||
|
||||
If we allow copy propagation in these cases, statements de-referencing
|
||||
the new pointer will now have a reference to a different memory tag
|
||||
with potentially incorrect SSA information.
|
||||
@ -161,7 +161,7 @@ may_propagate_copy (tree dest, tree orig)
|
||||
/* Given two SSA_NAMEs pointers ORIG and NEW such that we are copy
|
||||
propagating NEW into ORIG, consolidate aliasing information so that
|
||||
they both share the same memory tags. */
|
||||
|
||||
|
||||
static void
|
||||
merge_alias_info (tree orig, tree new)
|
||||
{
|
||||
@ -191,12 +191,12 @@ merge_alias_info (tree orig, tree new)
|
||||
orig_ann->type_mem_tag = new_ann->type_mem_tag;
|
||||
else if (new_ann->type_mem_tag != orig_ann->type_mem_tag)
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Common code for propagate_value and replace_exp.
|
||||
|
||||
Replace use operand OP_P with VAL. FOR_PROPAGATION indicates if the
|
||||
Replace use operand OP_P with VAL. FOR_PROPAGATION indicates if the
|
||||
replacement is done to propagate a value or not. */
|
||||
|
||||
static void
|
||||
@ -220,7 +220,7 @@ replace_exp_1 (use_operand_p op_p, tree val,
|
||||
SET_USE (op_p, val);
|
||||
}
|
||||
else
|
||||
SET_USE (op_p, lhd_unsave_expr_now (val));
|
||||
SET_USE (op_p, unsave_expr_now (val));
|
||||
}
|
||||
|
||||
|
||||
@ -240,8 +240,8 @@ propagate_value (use_operand_p op_p, tree val)
|
||||
/* Propagate the value VAL (assumed to be a constant or another SSA_NAME)
|
||||
into the tree pointed by OP_P.
|
||||
|
||||
Use this version for const/copy propagation when SSA operands are not
|
||||
available. It will perform the additional checks to ensure validity of
|
||||
Use this version for const/copy propagation when SSA operands are not
|
||||
available. It will perform the additional checks to ensure validity of
|
||||
the const/copy propagation, but will not update any operand information.
|
||||
Be sure to mark the stmt as modified. */
|
||||
|
||||
@ -262,7 +262,7 @@ propagate_tree_value (tree *op_p, tree val)
|
||||
*op_p = val;
|
||||
}
|
||||
else
|
||||
*op_p = lhd_unsave_expr_now (val);
|
||||
*op_p = unsave_expr_now (val);
|
||||
}
|
||||
|
||||
|
||||
|
39
gcc/tree.c
39
gcc/tree.c
@ -433,7 +433,7 @@ build_int_cst (tree type, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
|
||||
|
||||
if (!type)
|
||||
type = integer_type_node;
|
||||
|
||||
|
||||
switch (TREE_CODE (type))
|
||||
{
|
||||
case POINTER_TYPE:
|
||||
@ -445,14 +445,14 @@ build_int_cst (tree type, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
|
||||
ix = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case BOOLEAN_TYPE:
|
||||
/* Cache false or true. */
|
||||
limit = 2;
|
||||
if (!hi && low < 2)
|
||||
ix = low;
|
||||
break;
|
||||
|
||||
|
||||
case INTEGER_TYPE:
|
||||
case CHAR_TYPE:
|
||||
case OFFSET_TYPE:
|
||||
@ -476,7 +476,7 @@ build_int_cst (tree type, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (ix >= 0)
|
||||
{
|
||||
if (!TYPE_CACHED_VALUES_P (type))
|
||||
@ -484,7 +484,7 @@ build_int_cst (tree type, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
|
||||
TYPE_CACHED_VALUES_P (type) = 1;
|
||||
TYPE_CACHED_VALUES (type) = make_tree_vec (limit);
|
||||
}
|
||||
|
||||
|
||||
t = TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix);
|
||||
if (t)
|
||||
{
|
||||
@ -496,7 +496,7 @@ build_int_cst (tree type, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
t = make_node (INTEGER_CST);
|
||||
|
||||
TREE_INT_CST_LOW (t) = low;
|
||||
@ -505,7 +505,7 @@ build_int_cst (tree type, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
|
||||
|
||||
if (ix >= 0)
|
||||
TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix) = t;
|
||||
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
@ -1564,31 +1564,6 @@ tree_node_structure (tree t)
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform any modifications to EXPR required when it is unsaved. Does
|
||||
not recurse into EXPR's subtrees. */
|
||||
|
||||
void
|
||||
unsave_expr_1 (tree expr)
|
||||
{
|
||||
switch (TREE_CODE (expr))
|
||||
{
|
||||
case TARGET_EXPR:
|
||||
/* Don't mess with a TARGET_EXPR that hasn't been expanded.
|
||||
It's OK for this to happen if it was part of a subtree that
|
||||
isn't immediately expanded, such as operand 2 of another
|
||||
TARGET_EXPR. */
|
||||
if (TREE_OPERAND (expr, 1))
|
||||
break;
|
||||
|
||||
TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 3);
|
||||
TREE_OPERAND (expr, 3) = NULL_TREE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
|
||||
or offset that depends on a field within a record. */
|
||||
|
@ -3203,11 +3203,6 @@ extern int first_rtl_op (enum tree_code);
|
||||
|
||||
enum tree_node_structure_enum tree_node_structure (tree);
|
||||
|
||||
/* Reset EXP in place so that it can be expanded again. Does not
|
||||
recurse into subtrees. */
|
||||
|
||||
extern void unsave_expr_1 (tree);
|
||||
|
||||
/* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
|
||||
or offset that depends on a field within a record.
|
||||
|
||||
@ -3362,7 +3357,6 @@ extern tree get_set_constructor_bytes (tree, unsigned char *, int);
|
||||
extern tree get_callee_fndecl (tree);
|
||||
extern void change_decl_assembler_name (tree, tree);
|
||||
extern int type_num_arguments (tree);
|
||||
extern tree lhd_unsave_expr_now (tree);
|
||||
extern bool associative_tree_code (enum tree_code);
|
||||
extern bool commutative_tree_code (enum tree_code);
|
||||
|
||||
@ -3551,6 +3545,9 @@ extern void indent_to (FILE *, int);
|
||||
|
||||
/* In tree-inline.c: */
|
||||
extern bool debug_find_tree (tree, tree);
|
||||
/* This is in tree-inline.c since the routine uses
|
||||
data structures from the inliner. */
|
||||
extern tree unsave_expr_now (tree);
|
||||
|
||||
/* In expr.c */
|
||||
extern rtx expand_builtin_return_addr (enum built_in_function, int, rtx);
|
||||
|
Loading…
Reference in New Issue
Block a user