alias.c (find_base_decl): Remove unreachable case '3' block.
2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com> Zack Weinberg <zack@codesourcery.com> * alias.c (find_base_decl): Remove unreachable case '3' block. * expr.c (safe_from_p): Abort if passed a type. * tree-gimple.c (recalculate_side_effects): Abort if passed anything other than an expression. * tree-ssa-pre.c (phi_translate): Return expr immediately if is_gimple_min_invariant is true for it. Reorder cases for clarity. Abort on un-handled tree classes. (valid_in_set): Likewise. * tree.c (tree_code_class_strings): New static data. * tree.h (enum tree_code_class): New. (tree_code_class_strings): Declare. (TREE_CODE_CLASS_STRING, EXCEPTIONAL_CLASS_P, CONSTANT_CLASS_P) (REFERENCE_CLASS_P, COMPARISON_CLASS_P, UNARY_CLASS_P, BINARY_CLASS_P) (STATEMENT_CLASS_P, EXPRESSION_CLASS_P, IS_TYPE_OR_DECL_P): New macros. (TYPE_P, DECL_P, IS_NON_TYPE_CODE_CLASS, IS_EXPR_CODE_CLASS) (checking macros, EXPR_LOCATION, SET_EXPR_LOCATION, EXPR_LOCUS): Update. * tree.def, c-common.def, objc/objc-tree.def: Use tree_code_class enumeration constants instead of code letters. * alias.c, builtins.c, c-common.c, c-format.c, c-lang.c, c-pragma.c * c-typeck.c, cgraphunit.c, convert.c, dbxout.c, dwarf2out.c * emit-rtl.c expr.c, fold-const.c, gimplify.c, lambda-code.c * langhooks.c, langhooks.h, predict.c, print-tree.c, reload1.c, stmt.c * tree-browser.c, tree-cfg.c, tree-chrec.c, tree-complex.c, tree-dfa.c * tree-dump.c, tree-eh.c, tree-gimple.c, tree-inline.c, tree-nested.c * tree-outof-ssa.c, tree-pretty-print.c, tree-sra.c, tree-ssa-ccp.c * tree-ssa-dce.c, tree-ssa-dom.c, tree-ssa-forwprop.c, tree-ssa-live.c * tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c, tree-ssa-operands.c * tree-ssa-phiopt.c, tree-ssa-pre.c, tree-ssa-propagate.c * tree-ssa.c, tree-ssanames.c, tree-tailcall.c, tree.c, varasm.c * config/sol2-c.c, config/arm/arm.c, config/i386/winnt.c * config/pa/pa.c, config/pa/pa.h, config/sh/sh.c, objc/objc-lang.c Update to match. * LANGUAGES: Add note about change. ada: * ada-tree.def: Use tree_code_class enumeration constants instead of code letters. * ada-tree.h, decl.c, misc.c, trans.c, utils.c, utils2.c: Update for new tree-class enumeration constants. cp: * cp-tree.def: Use tree_code_class enumeration constants instead of code letters. * call.c, class.c, cp-gimplify.c, cp-lang.c, cxx-pretty-print.c * mangle.c, pt.c, semantics.c, tree.c, typeck.c: Update for new tree-class enumeration constants. fortran: * f95-lang.c, trans-expr.c, trans.c: Update for new tree-class enumeration constants. java: * java-tree.def: Use tree_code_class enumeration constants instead of code letters. * java-gimplify.c, jcf-write.c, lang.c, parse.y: Update for new tree-class enumeration constants. treelang: * treetree.c: Update for new tree-class enumeration constants. From-SVN: r87675
This commit is contained in:
parent
ade2298233
commit
6615c44615
97 changed files with 1212 additions and 1038 deletions
|
@ -1,3 +1,44 @@
|
|||
2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com>
|
||||
Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* alias.c (find_base_decl): Remove unreachable case '3' block.
|
||||
* expr.c (safe_from_p): Abort if passed a type.
|
||||
* tree-gimple.c (recalculate_side_effects): Abort if passed
|
||||
anything other than an expression.
|
||||
* tree-ssa-pre.c (phi_translate): Return expr immediately if
|
||||
is_gimple_min_invariant is true for it. Reorder cases for clarity.
|
||||
Abort on un-handled tree classes.
|
||||
(valid_in_set): Likewise.
|
||||
* tree.c (tree_code_class_strings): New static data.
|
||||
|
||||
* tree.h (enum tree_code_class): New.
|
||||
(tree_code_class_strings): Declare.
|
||||
(TREE_CODE_CLASS_STRING, EXCEPTIONAL_CLASS_P, CONSTANT_CLASS_P)
|
||||
(REFERENCE_CLASS_P, COMPARISON_CLASS_P, UNARY_CLASS_P, BINARY_CLASS_P)
|
||||
(STATEMENT_CLASS_P, EXPRESSION_CLASS_P, IS_TYPE_OR_DECL_P): New macros.
|
||||
(TYPE_P, DECL_P, IS_NON_TYPE_CODE_CLASS, IS_EXPR_CODE_CLASS)
|
||||
(checking macros, EXPR_LOCATION, SET_EXPR_LOCATION, EXPR_LOCUS): Update.
|
||||
|
||||
* tree.def, c-common.def, objc/objc-tree.def: Use
|
||||
tree_code_class enumeration constants instead of code letters.
|
||||
|
||||
* alias.c, builtins.c, c-common.c, c-format.c, c-lang.c, c-pragma.c
|
||||
* c-typeck.c, cgraphunit.c, convert.c, dbxout.c, dwarf2out.c
|
||||
* emit-rtl.c expr.c, fold-const.c, gimplify.c, lambda-code.c
|
||||
* langhooks.c, langhooks.h, predict.c, print-tree.c, reload1.c, stmt.c
|
||||
* tree-browser.c, tree-cfg.c, tree-chrec.c, tree-complex.c, tree-dfa.c
|
||||
* tree-dump.c, tree-eh.c, tree-gimple.c, tree-inline.c, tree-nested.c
|
||||
* tree-outof-ssa.c, tree-pretty-print.c, tree-sra.c, tree-ssa-ccp.c
|
||||
* tree-ssa-dce.c, tree-ssa-dom.c, tree-ssa-forwprop.c, tree-ssa-live.c
|
||||
* tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c, tree-ssa-operands.c
|
||||
* tree-ssa-phiopt.c, tree-ssa-pre.c, tree-ssa-propagate.c
|
||||
* tree-ssa.c, tree-ssanames.c, tree-tailcall.c, tree.c, varasm.c
|
||||
* config/sol2-c.c, config/arm/arm.c, config/i386/winnt.c
|
||||
* config/pa/pa.c, config/pa/pa.h, config/sh/sh.c, objc/objc-lang.c
|
||||
Update to match.
|
||||
|
||||
* LANGUAGES: Add note about change.
|
||||
|
||||
2004-09-17 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
PR tree-optimization/17319
|
||||
|
@ -33,7 +74,7 @@
|
|||
(dbxout_init): Include lang number in N_SO stab.
|
||||
* dbxout.h (N_SO_AS, N_SO_C, N_SO_ANSI_C, N_SO_CC, N_SO_FORTRAN,
|
||||
N_SO_PASCAL, N_SO_FORTRAN90, N_SO_OBJC, N_SO_OBJCPLUS): New #define.
|
||||
|
||||
|
||||
2004-09-17 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
PR tree-optimization/17273
|
||||
|
@ -63,7 +104,7 @@
|
|||
|
||||
2004-09-17 Sylvain Pion <Sylvain.Pion@sophia.inria.fr>
|
||||
|
||||
* doc/extend.texi: Fix duplicated word.
|
||||
* doc/extend.texi: Fix duplicated word.
|
||||
|
||||
2004-09-17 Toon Moene <toon@moene.indiv.nluug.nl>
|
||||
|
||||
|
@ -115,7 +156,7 @@
|
|||
|
||||
2004-09-17 Steven Bosscher <stevenb@suse.de>
|
||||
|
||||
PR tree-optimization/17513
|
||||
PR tree-optimization/17513
|
||||
* cfgexpand.c (construct_init_block): Clear EDGE_EXECUTABLE
|
||||
for successors of the entry block.
|
||||
|
||||
|
@ -208,11 +249,11 @@
|
|||
2004-09-16 Andrew MacLeod <amacleod@redhat.com>
|
||||
|
||||
PR tree-optimization/17517
|
||||
* tree-ssa-copyrename.c (copy_rename_partition_coalesce): Don't
|
||||
* tree-ssa-copyrename.c (copy_rename_partition_coalesce): Don't
|
||||
coalesce same-root variables without checking for abnormal PHI usage.
|
||||
|
||||
2004-09-16 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
|
||||
* cfgloop.h (duplicate_loop): Add prototype.
|
||||
* cfgloopmanip.c (duplicate_loop): Make non-static.
|
||||
* lambda-code.c (perfect_nestify): Factor out test whether
|
||||
|
@ -229,7 +270,7 @@
|
|||
loop invariant as well.
|
||||
(perfect_nestify): new function.
|
||||
(gcc_loop_to_lambda_loop): New parameters to track lower bounds,
|
||||
upper bounds, and steps.
|
||||
upper bounds, and steps.
|
||||
Set outerinductionvar properly.
|
||||
(gcc_loopnest_to_lambda_loopnest): Add loops and need_perfect
|
||||
parameters.
|
||||
|
@ -254,9 +295,9 @@
|
|||
2004-09-16 Sebastian Pop <pop@cri.ensmp.fr>
|
||||
|
||||
* tree-loop-linear.c (gather_interchange_stats): Add more comments.
|
||||
Gather also strides of accessed data. Pass in the data references
|
||||
Gather also strides of accessed data. Pass in the data references
|
||||
array.
|
||||
(try_interchange_loops): Add a new heuristic for handling the temporal
|
||||
(try_interchange_loops): Add a new heuristic for handling the temporal
|
||||
locality. Pass in the data references array.
|
||||
(linear_transform_loops): Pass the data references array to
|
||||
try_interchange_loops.
|
||||
|
@ -369,7 +410,7 @@
|
|||
|
||||
* Makefile.in (tree-ssa-dom.o): Depend on tree-ssa-propagate.h.
|
||||
* tree-ssa-dom.c (cprop_into_stmt): Recompute TREE_INVARIANT
|
||||
after propagating into an ADDR_EXPR.
|
||||
after propagating into an ADDR_EXPR.
|
||||
|
||||
2004-09-15 Andrew Pinski <apinski@apple.com>
|
||||
|
||||
|
@ -587,7 +628,7 @@
|
|||
2004-09-14 Jeff Law <law@redhat.com>
|
||||
|
||||
* tree-ssa-dom.c (stmts_to_rescan): Move from a block-local
|
||||
to a global varray.
|
||||
to a global varray.
|
||||
(tree_ssa_dominator_optimize): Allocate stmts_to_rescan.
|
||||
(dom_opt_initialize_block_local_data): No longer test state
|
||||
of stmts_to_rescan.
|
||||
|
@ -824,7 +865,7 @@
|
|||
PR tree-optimization/17400
|
||||
* tree-ssa-copyrename.c (copy_rename_partition_coalesce): Don't
|
||||
coalesce partitions when one occurs in an abnormal PHI.
|
||||
|
||||
|
||||
2004-09-13 Andrew Pinski <apinski@apple.com>
|
||||
|
||||
* config/rs6000/darwin.h (ASM_OUTPUT_COMMON): Change variable size's
|
||||
|
|
|
@ -6,6 +6,18 @@ time as we can formally start documenting the interface this file will
|
|||
serve as a repository for information on these interface and any incompatable
|
||||
changes we've made.
|
||||
|
||||
2004-09-09:
|
||||
In an effort to decrease execution time, single char tree code
|
||||
classes were changed to enumerated values.
|
||||
|
||||
Old way:
|
||||
|
||||
DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0)
|
||||
|
||||
New way:
|
||||
|
||||
DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", tcc_declaration, 0)
|
||||
|
||||
2001-02-26:
|
||||
A DECL_INITIAL of NULL_TREE or error_mark_node in a VAR_DECL is no longer
|
||||
taken to signify a tentative definition which should not be emitted until
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com>
|
||||
Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* ada-tree.def: Use tree_code_class enumeration constants
|
||||
instead of code letters.
|
||||
* ada-tree.h, decl.c, misc.c, trans.c, utils.c, utils2.c:
|
||||
Update for new tree-class enumeration constants.
|
||||
|
||||
2004-09-17 Vincent Celier <celier@gnat.com>
|
||||
|
||||
* prj-attr-pm.ads, prj-attr-pm.adb: New files, to split some private
|
||||
|
@ -456,7 +464,7 @@
|
|||
|
||||
2004-08-25 Nathan Sidwell <nathan@codesourcery.com>
|
||||
Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
||||
|
||||
|
||||
* ada-tree.h (TYPE_RM_SIZE_INT): Use TYPE_LANG_SLOT_1.
|
||||
|
||||
2004-08-25 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
@ -465,7 +473,7 @@
|
|||
* trans.c (Exception_Handler_to_gnu_sjlj, gnat_to_gnu): Likewise.
|
||||
* utils.c (init_gigi_decls): Likewise.
|
||||
* utils2.c (build_call_raise, build_allocator): Likewise.
|
||||
|
||||
|
||||
2004-08-24 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* utils.c (gnat_init_decl_processing): Adjust
|
||||
|
@ -589,7 +597,7 @@
|
|||
GNAT.Sockets.Thin.Is_Socket_In_Set to account for new specification
|
||||
and test explicitly for non-zero return value.
|
||||
|
||||
* g-socthi-vms.ads, g-socthi-mingw.ads, g-socthi-vxworks.ads:
|
||||
* g-socthi-vms.ads, g-socthi-mingw.ads, g-socthi-vxworks.ads:
|
||||
(Is_Socket_In_Set): Declare imported function as returning C.int, to
|
||||
avoid using a derived boolean type.
|
||||
|
||||
|
@ -1264,7 +1272,7 @@
|
|||
(gnat_to_gnu, case N_Compilation_Unit): Just handle nested case here.
|
||||
(add_stmt): Force walking of sizes and DECL_INITIAL for DECL_EXPR.
|
||||
(mark_visited): Don't mark dummy type.
|
||||
(tree_transform <N_Procedure_Call_Statement>): Unless this is an In
|
||||
(tree_transform <N_Procedure_Call_Statement>): Unless this is an In
|
||||
parameter, we must remove any LJM building from GNU_NAME.
|
||||
(gnat_to_gnu, case N_String_Literal): Fill in indices in CONSTRUCTOR.
|
||||
(pos_to_constructor): Use int_const_binop.
|
||||
|
@ -1471,7 +1479,7 @@
|
|||
(gnat_to_gnu): If statement and not in procedure, go into elab proc.
|
||||
Delete calls to add_decl_expr; add arg to create_*_decl.
|
||||
(gnat_to_gnu, case N_Loop): Recalculate side effects on COND_EXPR.
|
||||
(gnat_to_gnu, case N_Subprogram_Body): Move some code to
|
||||
(gnat_to_gnu, case N_Subprogram_Body): Move some code to
|
||||
begin_subprog_body and call it.
|
||||
Don't push and pop ggc context.
|
||||
(gnat_to_gnu, case N_Compilation_Unit): Rework to support elab proc.
|
||||
|
@ -1497,7 +1505,7 @@
|
|||
(function_nesting_depth): Deleted.
|
||||
(begin_subprog_body): Delete obsolete code.
|
||||
* utils2.c (build_call_alloc_dealloc): Add new arg to create_var_decl.
|
||||
|
||||
|
||||
2004-06-28 Robert Dewar <dewar@gnat.com>
|
||||
|
||||
* mlib-tgt-tru64.adb, mlib-tgt-aix.adb, mlib-tgt-irix.adb,
|
||||
|
@ -1629,8 +1637,8 @@
|
|||
Lib_Address and Relocatable.
|
||||
(Default_DLL_Address): Removed.
|
||||
|
||||
* mlib-tgt-tru64.adb, mlib-tgt-aix.adb, mlib-tgt-irix.adb,
|
||||
mlib-tgt-hpux.adb, mlib-tgt-linux.adb, mlib-tgt-solaris.adb,
|
||||
* mlib-tgt-tru64.adb, mlib-tgt-aix.adb, mlib-tgt-irix.adb,
|
||||
mlib-tgt-hpux.adb, mlib-tgt-linux.adb, mlib-tgt-solaris.adb,
|
||||
mlib-tgt-vms-alpha.adb, mlib-tgt-vms-ia64.adb, mlib-tgt-vxworks.adb:
|
||||
(Build_Dynamic_Library): Remove parameter Lib_Address and Relocatable.
|
||||
(Default_DLL_Address): Removed.
|
||||
|
@ -1827,7 +1835,7 @@
|
|||
(Compile_Sources.Compile): Add switch -gnatez as the last option
|
||||
(Display): Never display -gnatez
|
||||
|
||||
* Makefile.generic:
|
||||
* Makefile.generic:
|
||||
When using $(MAIN_OBJECT), always use $(OBJ_DIR)/$(MAIN_OBJECT)
|
||||
|
||||
* gnatcmd.adb (Check_Project): New function
|
||||
|
@ -2402,7 +2410,7 @@
|
|||
opt.adb, par.adb, opt.ads, par-ch11.adb, par-ch3.adb, par-ch4.adb,
|
||||
par-ch5.adb, par-ch6.adb, par-ch8.adb, par-ch9.adb, par-prag.adb,
|
||||
par-util.adb, scng.adb, sem_aggr.adb, sem_attr.adb, sem_cat.adb,
|
||||
sem_ch10.adb, sem_ch10.adb, sem_ch11.adb, sem_ch12.adb, sem_ch2.adb,
|
||||
sem_ch10.adb, sem_ch10.adb, sem_ch11.adb, sem_ch12.adb, sem_ch2.adb,
|
||||
sem_ch3.adb, sem_ch3.ads, sem_ch4.adb, sem_ch5.adb, sem_ch6.adb,
|
||||
sem_ch7.adb, sem_ch8.adb, sem_ch9.adb, sem_eval.adb, sem_prag.adb,
|
||||
sem_res.adb, sem_type.adb, sem_util.adb, sinfo.ads, snames.adb,
|
||||
|
@ -3027,7 +3035,7 @@
|
|||
|
||||
Renaming of target specific files for clarity
|
||||
|
||||
* Makefile.in: Rename GNAT target specific files.
|
||||
* Makefile.in: Rename GNAT target specific files.
|
||||
|
||||
* 31soccon.ads, 31soliop.ads 35soccon.ads, 3asoccon.ads,
|
||||
3bsoccon.ads, 3gsoccon.ads, 3hsoccon.ads, 3psoccon.ads,
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* *
|
||||
* Specification *
|
||||
* *
|
||||
* Copyright (C) 1992-2003 Free Software Foundation, Inc. *
|
||||
* Copyright (C) 1992-2004 Free Software Foundation, Inc. *
|
||||
* *
|
||||
* GNAT is free software; you can redistribute it and/or modify it under *
|
||||
* terms of the GNU General Public License as published by the Free Soft- *
|
||||
|
@ -28,23 +28,24 @@
|
|||
to GCC. TREE_TYPE is the type of the fat pointer and TYPE_OBJECT_RECORD_TYPE
|
||||
is the type of a record containing the template and data. */
|
||||
|
||||
DEFTREECODE (UNCONSTRAINED_ARRAY_TYPE, "unconstrained_array_type", 't', 0)
|
||||
DEFTREECODE (UNCONSTRAINED_ARRAY_TYPE, "unconstrained_array_type", tcc_type, 0)
|
||||
|
||||
/* A reference to an unconstrained array. This node only exists as an
|
||||
intermediate node during the translation of a GNAT tree to a GCC tree;
|
||||
it is never passed to GCC. The only field used is operand 0, which
|
||||
is the fat pointer object. */
|
||||
|
||||
DEFTREECODE (UNCONSTRAINED_ARRAY_REF, "unconstrained_array_ref", 'r', 1)
|
||||
DEFTREECODE (UNCONSTRAINED_ARRAY_REF, "unconstrained_array_ref",
|
||||
tcc_reference, 1)
|
||||
|
||||
/* An expression that returns an RTL suitable for its type. Operand 0
|
||||
is an expression to be evaluated for side effects only. */
|
||||
DEFTREECODE (NULL_EXPR, "null_expr", 'e', 1)
|
||||
DEFTREECODE (NULL_EXPR, "null_expr", tcc_expression, 1)
|
||||
|
||||
/* Same as ADDR_EXPR, except that if the operand represents a bit field,
|
||||
return the address of the byte containing the bit. This is used
|
||||
for the 'Address attribute and never shows up in the tree. */
|
||||
DEFTREECODE (ATTR_ADDR_EXPR, "attr_addr_expr", 'r', 1)
|
||||
DEFTREECODE (ATTR_ADDR_EXPR, "attr_addr_expr", tcc_reference, 1)
|
||||
|
||||
/* Here are the tree codes for the statement types known to Ada. These
|
||||
must be at the end of this file to allow IS_ADA_STMT to work. */
|
||||
|
@ -53,32 +54,32 @@ DEFTREECODE (ATTR_ADDR_EXPR, "attr_addr_expr", 'r', 1)
|
|||
makes this tree node, whose operand is a statement. The latter inserts
|
||||
the actual statements into this node. Gimplification consists of
|
||||
just returning the inner statement. */
|
||||
DEFTREECODE (STMT_STMT, "stmt_stmt", 's', 1)
|
||||
DEFTREECODE (STMT_STMT, "stmt_stmt", tcc_statement, 1)
|
||||
|
||||
/* A loop. LOOP_STMT_TOP_COND and LOOP_STMT_BOT_COND are the tests to exit a
|
||||
loop at the top and bottom, respectively. LOOP_STMT_UPDATE is the statement
|
||||
to update the loop iterator at the continue point. LOOP_STMT_BODY are the
|
||||
statements in the body of the loop. LOOP_STMT_LABEL points to the LABEL_DECL
|
||||
of the end label of the loop. */
|
||||
DEFTREECODE (LOOP_STMT, "loop_stmt", 's', 5)
|
||||
DEFTREECODE (LOOP_STMT, "loop_stmt", tcc_statement, 5)
|
||||
|
||||
/* Conditionally exit a loop. EXIT_STMT_COND is the condition, which, if
|
||||
true, will cause the loop to be exited. If no condition is specified,
|
||||
the loop is unconditionally exited. EXIT_STMT_LABEL is the end label
|
||||
corresponding to the loop to exit. */
|
||||
DEFTREECODE (EXIT_STMT, "exit_stmt", 's', 2)
|
||||
DEFTREECODE (EXIT_STMT, "exit_stmt", tcc_statement, 2)
|
||||
|
||||
/* A exception region. REGION_STMT_BODY is the statement to be executed
|
||||
inside the region. REGION_STMT_HANDLE is a statement that represents
|
||||
the exception handlers (usually a BLOCK_STMT of HANDLE_STMTs).
|
||||
REGION_STMT_BLOCK is the BLOCK node for the declarative region, if any. */
|
||||
DEFTREECODE (REGION_STMT, "region_stmt", 's', 3)
|
||||
DEFTREECODE (REGION_STMT, "region_stmt", tcc_statement, 3)
|
||||
|
||||
/* An exception handler. HANDLER_STMT_ARG is the value to pass to
|
||||
expand_start_catch, HANDLER_STMT_LIST is the list of statements for the
|
||||
handler itself, and HANDLER_STMT_BLOCK is the BLOCK node for this
|
||||
binding. */
|
||||
DEFTREECODE (HANDLER_STMT, "handler_stmt", 's', 3)
|
||||
DEFTREECODE (HANDLER_STMT, "handler_stmt", tcc_statement, 3)
|
||||
|
||||
/* A statement that emits a USE for its single operand. */
|
||||
DEFTREECODE (USE_STMT, "use_expr", 's', 1)
|
||||
DEFTREECODE (USE_STMT, "use_expr", tcc_statement, 1)
|
||||
|
|
|
@ -273,7 +273,7 @@ struct lang_type GTY(()) {tree t; };
|
|||
/* Define fields and macros for statements.
|
||||
|
||||
Start by defining which tree codes are used for statements. */
|
||||
#define IS_STMT(NODE) (TREE_CODE_CLASS (TREE_CODE (NODE)) == 's')
|
||||
#define IS_STMT(NODE) (STATEMENT_CLASS_P (NODE))
|
||||
#define IS_ADA_STMT(NODE) (IS_STMT (NODE) \
|
||||
&& TREE_CODE (NODE) >= STMT_STMT)
|
||||
|
||||
|
|
|
@ -761,7 +761,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
|
|||
just use that declaration or reference as this entity unless
|
||||
the latter has to be materialized. */
|
||||
else if ((DECL_P (gnu_expr)
|
||||
|| TREE_CODE_CLASS (TREE_CODE (gnu_expr)) == 'r')
|
||||
|| (REFERENCE_CLASS_P (gnu_expr) == tcc_reference))
|
||||
&& !Materialize_Entity (gnat_entity)
|
||||
&& (!global_bindings_p ()
|
||||
|| (staticp (gnu_expr)
|
||||
|
@ -4553,7 +4553,7 @@ elaborate_expression_1 (Node_Id gnat_expr, Entity_Id gnat_entity,
|
|||
rely here on the fact that an expression cannot contain both the
|
||||
discriminant and some other variable. */
|
||||
|
||||
expr_variable = (TREE_CODE_CLASS (TREE_CODE (gnu_expr)) != 'c'
|
||||
expr_variable = (!CONSTANT_CLASS_P (gnu_expr)
|
||||
&& !(TREE_CODE (gnu_inner_expr) == VAR_DECL
|
||||
&& TREE_READONLY (gnu_inner_expr))
|
||||
&& !CONTAINS_PLACEHOLDER_P (gnu_expr));
|
||||
|
@ -5565,8 +5565,7 @@ annotate_value (tree gnu_size)
|
|||
return No_Uint;
|
||||
|
||||
/* See if we've already saved the value for this node. */
|
||||
if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (gnu_size)))
|
||||
&& TREE_COMPLEXITY (gnu_size))
|
||||
if (EXPR_P (gnu_size) && TREE_COMPLEXITY (gnu_size))
|
||||
return (Node_Ref_Or_Val) TREE_COMPLEXITY (gnu_size);
|
||||
|
||||
/* If we do not return inside this switch, TCODE will be set to the
|
||||
|
|
|
@ -173,9 +173,9 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
|
|||
|
||||
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
|
||||
|
||||
const char tree_code_type[] = {
|
||||
const enum tree_code_class tree_code_type[] = {
|
||||
#include "tree.def"
|
||||
'x',
|
||||
tcc_exceptional,
|
||||
#include "ada-tree.def"
|
||||
};
|
||||
#undef DEFTREECODE
|
||||
|
|
|
@ -3219,7 +3219,7 @@ gnat_to_gnu (Node_Id gnat_node)
|
|||
/* If this is a comparison operator, convert any references to
|
||||
an unconstrained array value into a reference to the
|
||||
actual array. */
|
||||
if (TREE_CODE_CLASS (code) == '<')
|
||||
if (TREE_CODE_CLASS (code) == tcc_comparison)
|
||||
{
|
||||
gnu_lhs = maybe_unconstrained_array (gnu_lhs);
|
||||
gnu_rhs = maybe_unconstrained_array (gnu_rhs);
|
||||
|
@ -4035,7 +4035,7 @@ gnat_to_gnu (Node_Id gnat_node)
|
|||
/* Set the location information into the result. If we're supposed to
|
||||
return something of void_type, it means we have something we're
|
||||
elaborating for effect, so just return. */
|
||||
if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (gnu_result))))
|
||||
if (EXPR_P (gnu_result))
|
||||
annotate_with_node (gnu_result, gnat_node);
|
||||
|
||||
if (TREE_CODE (gnu_result_type) == VOID_TYPE)
|
||||
|
@ -5712,13 +5712,13 @@ gnat_stabilize_reference_1 (tree e, bool force)
|
|||
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'x':
|
||||
case 't':
|
||||
case 'd':
|
||||
case '<':
|
||||
case 's':
|
||||
case 'e':
|
||||
case 'r':
|
||||
case tcc_exceptional:
|
||||
case tcc_type:
|
||||
case tcc_declaration:
|
||||
case tcc_comparison:
|
||||
case tcc_statement:
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
/* If this is a COMPONENT_REF of a fat pointer, save the entire
|
||||
fat pointer. This may be more efficient, but will also allow
|
||||
us to more easily find the match for the PLACEHOLDER_EXPR. */
|
||||
|
@ -5734,12 +5734,12 @@ gnat_stabilize_reference_1 (tree e, bool force)
|
|||
return e;
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
case tcc_constant:
|
||||
/* Constants need no processing. In fact, we should never reach
|
||||
here. */
|
||||
return e;
|
||||
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
/* Recursively stabilize each operand. */
|
||||
result = build2 (code, type,
|
||||
gnat_stabilize_reference_1 (TREE_OPERAND (e, 0), force),
|
||||
|
@ -5747,7 +5747,7 @@ gnat_stabilize_reference_1 (tree e, bool force)
|
|||
force));
|
||||
break;
|
||||
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
/* Recursively stabilize each operand. */
|
||||
result = build1 (code, type,
|
||||
gnat_stabilize_reference_1 (TREE_OPERAND (e, 0),
|
||||
|
|
|
@ -2009,11 +2009,11 @@ max_size (tree exp, bool max_p)
|
|||
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'd':
|
||||
case 'c':
|
||||
case tcc_declaration:
|
||||
case tcc_constant:
|
||||
return exp;
|
||||
|
||||
case 'x':
|
||||
case tcc_exceptional:
|
||||
if (code == TREE_LIST)
|
||||
return tree_cons (TREE_PURPOSE (exp),
|
||||
max_size (TREE_VALUE (exp), max_p),
|
||||
|
@ -2021,7 +2021,7 @@ max_size (tree exp, bool max_p)
|
|||
? max_size (TREE_CHAIN (exp), max_p) : NULL_TREE);
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
case tcc_reference:
|
||||
/* If this contains a PLACEHOLDER_EXPR, it is the thing we want to
|
||||
modify. Otherwise, we treat it like a variable. */
|
||||
if (!CONTAINS_PLACEHOLDER_P (exp))
|
||||
|
@ -2031,12 +2031,12 @@ max_size (tree exp, bool max_p)
|
|||
return
|
||||
max_size (max_p ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type), true);
|
||||
|
||||
case '<':
|
||||
case tcc_comparison:
|
||||
return max_p ? size_one_node : size_zero_node;
|
||||
|
||||
case '1':
|
||||
case '2':
|
||||
case 'e':
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_expression:
|
||||
switch (TREE_CODE_LENGTH (code))
|
||||
{
|
||||
case 1:
|
||||
|
@ -2087,6 +2087,10 @@ max_size (tree exp, bool max_p)
|
|||
return build3 (CALL_EXPR, type, TREE_OPERAND (exp, 0),
|
||||
max_size (TREE_OPERAND (exp, 1), max_p), NULL);
|
||||
}
|
||||
|
||||
/* Other tree classes cannot happen. */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
abort ();
|
||||
|
|
|
@ -290,17 +290,18 @@ contains_null_expr (tree exp)
|
|||
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (exp)))
|
||||
{
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
return contains_null_expr (TREE_OPERAND (exp, 0));
|
||||
|
||||
case '<': case '2':
|
||||
case tcc_comparison:
|
||||
case tcc_binary:
|
||||
tem = contains_null_expr (TREE_OPERAND (exp, 0));
|
||||
if (tem)
|
||||
return tem;
|
||||
|
||||
return contains_null_expr (TREE_OPERAND (exp, 1));
|
||||
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
switch (TREE_CODE (exp))
|
||||
{
|
||||
case SAVE_EXPR:
|
||||
|
|
23
gcc/alias.c
23
gcc/alias.c
|
@ -342,13 +342,13 @@ objects_must_conflict_p (tree t1, tree t2)
|
|||
static tree
|
||||
find_base_decl (tree t)
|
||||
{
|
||||
tree d0, d1, d2;
|
||||
tree d0, d1;
|
||||
|
||||
if (t == 0 || t == error_mark_node || ! POINTER_TYPE_P (TREE_TYPE (t)))
|
||||
return 0;
|
||||
|
||||
/* If this is a declaration, return it. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (t)) == 'd')
|
||||
if (DECL_P (t))
|
||||
return t;
|
||||
|
||||
/* Handle general expressions. It would be nice to deal with
|
||||
|
@ -356,10 +356,10 @@ find_base_decl (tree t)
|
|||
same, then `a->f' and `b->f' are also the same. */
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (t)))
|
||||
{
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
return find_base_decl (TREE_OPERAND (t, 0));
|
||||
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
/* Return 0 if found in neither or both are the same. */
|
||||
d0 = find_base_decl (TREE_OPERAND (t, 0));
|
||||
d1 = find_base_decl (TREE_OPERAND (t, 1));
|
||||
|
@ -372,21 +372,6 @@ find_base_decl (tree t)
|
|||
else
|
||||
return 0;
|
||||
|
||||
case '3':
|
||||
d0 = find_base_decl (TREE_OPERAND (t, 0));
|
||||
d1 = find_base_decl (TREE_OPERAND (t, 1));
|
||||
d2 = find_base_decl (TREE_OPERAND (t, 2));
|
||||
|
||||
/* Set any nonzero values from the last, then from the first. */
|
||||
if (d1 == 0) d1 = d2;
|
||||
if (d0 == 0) d0 = d1;
|
||||
if (d1 == 0) d1 = d0;
|
||||
if (d2 == 0) d2 = d1;
|
||||
|
||||
/* At this point all are nonzero or all are zero. If all three are the
|
||||
same, return it. Otherwise, return zero. */
|
||||
return (d0 == d1 && d1 == d2) ? d0 : 0;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -248,7 +248,7 @@ get_pointer_alignment (tree exp, unsigned int max_align)
|
|||
else if (DECL_P (exp))
|
||||
align = DECL_ALIGN (exp);
|
||||
#ifdef CONSTANT_ALIGNMENT
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c')
|
||||
else if (CONSTANT_CLASS_P (exp))
|
||||
align = CONSTANT_ALIGNMENT (exp, align);
|
||||
#endif
|
||||
return MIN (align, max_align);
|
||||
|
@ -6205,7 +6205,7 @@ fold_builtin_constant_p (tree arglist)
|
|||
STRIP_NOPS (arglist);
|
||||
|
||||
/* If we know this is a constant, emit the constant of one. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (arglist)) == 'c'
|
||||
if (CONSTANT_CLASS_P (arglist)
|
||||
|| (TREE_CODE (arglist) == CONSTRUCTOR
|
||||
&& TREE_CONSTANT (arglist))
|
||||
|| (TREE_CODE (arglist) == ADDR_EXPR
|
||||
|
@ -8513,7 +8513,7 @@ fold_builtin (tree exp, bool ignore)
|
|||
if (exp)
|
||||
{
|
||||
/* ??? Don't clobber shared nodes such as integer_zero_node. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c')
|
||||
if (CONSTANT_CLASS_P (exp))
|
||||
exp = build1 (NOP_EXPR, TREE_TYPE (exp), exp);
|
||||
TREE_NO_WARNING (exp) = 1;
|
||||
}
|
||||
|
|
|
@ -1196,7 +1196,7 @@ verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp,
|
|||
{
|
||||
struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3;
|
||||
enum tree_code code;
|
||||
char cl;
|
||||
enum tree_code_class cl;
|
||||
|
||||
/* X may be NULL if it is the operand of an empty statement expression
|
||||
({ }). */
|
||||
|
@ -1345,39 +1345,32 @@ verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp,
|
|||
add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (cl == '1')
|
||||
{
|
||||
if (first_rtl_op (code) == 0)
|
||||
return;
|
||||
x = TREE_OPERAND (x, 0);
|
||||
writer = 0;
|
||||
goto restart;
|
||||
}
|
||||
|
||||
switch (cl)
|
||||
{
|
||||
case 'r':
|
||||
case '<':
|
||||
case '2':
|
||||
case 'e':
|
||||
case 's':
|
||||
case 'x':
|
||||
{
|
||||
int lp;
|
||||
int max = first_rtl_op (TREE_CODE (x));
|
||||
for (lp = 0; lp < max; lp++)
|
||||
{
|
||||
tmp_before = tmp_nosp = 0;
|
||||
verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, NULL_TREE);
|
||||
merge_tlist (&tmp_nosp, tmp_before, 0);
|
||||
add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* For other expressions, simply recurse on their operands.
|
||||
Manual tail recursion for unary expressions.
|
||||
Other non-expressions need not be processed. */
|
||||
if (cl == tcc_unary)
|
||||
{
|
||||
if (first_rtl_op (code) == 0)
|
||||
return;
|
||||
x = TREE_OPERAND (x, 0);
|
||||
writer = 0;
|
||||
goto restart;
|
||||
}
|
||||
else if (IS_EXPR_CODE_CLASS (cl))
|
||||
{
|
||||
int lp;
|
||||
int max = first_rtl_op (TREE_CODE (x));
|
||||
for (lp = 0; lp < max; lp++)
|
||||
{
|
||||
tmp_before = tmp_nosp = 0;
|
||||
verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, 0);
|
||||
merge_tlist (&tmp_nosp, tmp_before, 0);
|
||||
add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,46 +25,46 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
/* Tree nodes relevant to both C and C++. These were originally in
|
||||
cp-tree.def in the cp subdir. */
|
||||
|
||||
DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", '1', 1)
|
||||
DEFTREECODE (ARROW_EXPR, "arrow_expr", 'e', 1)
|
||||
DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", '1', 1)
|
||||
DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_unary, 1)
|
||||
DEFTREECODE (ARROW_EXPR, "arrow_expr", tcc_expression, 1)
|
||||
DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_unary, 1)
|
||||
|
||||
/* Used to represent an expression statement. Use `EXPR_STMT_EXPR' to
|
||||
obtain the expression. */
|
||||
DEFTREECODE (EXPR_STMT, "expr_stmt", 'e', 1)
|
||||
DEFTREECODE (EXPR_STMT, "expr_stmt", tcc_expression, 1)
|
||||
|
||||
/* Used to represent a `for' statement. The operands are
|
||||
FOR_INIT_STMT, FOR_COND, FOR_EXPR, and FOR_BODY, respectively. */
|
||||
DEFTREECODE (FOR_STMT, "for_stmt", 'e', 4)
|
||||
DEFTREECODE (FOR_STMT, "for_stmt", tcc_expression, 4)
|
||||
|
||||
/* Used to represent a 'while' statement. The operands are WHILE_COND
|
||||
and WHILE_BODY, respectively. */
|
||||
DEFTREECODE (WHILE_STMT, "while_stmt", 'e', 2)
|
||||
DEFTREECODE (WHILE_STMT, "while_stmt", tcc_expression, 2)
|
||||
|
||||
/* Used to represent a 'do' statement. The operands are DO_BODY and
|
||||
DO_COND, respectively. */
|
||||
DEFTREECODE (DO_STMT, "do_stmt", 'e', 2)
|
||||
DEFTREECODE (DO_STMT, "do_stmt", tcc_expression, 2)
|
||||
|
||||
/* Used to represent a 'break' statement. */
|
||||
DEFTREECODE (BREAK_STMT, "break_stmt", 'e', 0)
|
||||
DEFTREECODE (BREAK_STMT, "break_stmt", tcc_expression, 0)
|
||||
|
||||
/* Used to represent a 'continue' statement. */
|
||||
DEFTREECODE (CONTINUE_STMT, "continue_stmt", 'e', 0)
|
||||
DEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_expression, 0)
|
||||
|
||||
/* Used to represent a 'switch' statement. The operands are
|
||||
SWITCH_COND, SWITCH_BODY and SWITCH_TYPE, respectively. */
|
||||
DEFTREECODE (SWITCH_STMT, "switch_stmt", 'e', 3)
|
||||
DEFTREECODE (SWITCH_STMT, "switch_stmt", tcc_expression, 3)
|
||||
|
||||
/* A STMT_EXPR represents a statement-expression. The
|
||||
STMT_EXPR_STMT is the statement given by the expression. */
|
||||
DEFTREECODE (STMT_EXPR, "stmt_expr", 'e', 1)
|
||||
DEFTREECODE (STMT_EXPR, "stmt_expr", tcc_expression, 1)
|
||||
|
||||
/* A COMPOUND_LITERAL_EXPR represents a C99 compound literal. The
|
||||
COMPOUND_LITERAL_EXPR_DECL_STMT is the a DECL_STMT containing the decl
|
||||
for the anonymous object represented by the COMPOUND_LITERAL;
|
||||
the DECL_INITIAL of that decl is the CONSTRUCTOR that initializes
|
||||
the compound literal. */
|
||||
DEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", 'e', 1)
|
||||
DEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", tcc_expression, 1)
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
|
|
|
@ -2094,7 +2094,7 @@ check_format_types (format_wanted_type *types, const char *format_start,
|
|||
&& i == 0
|
||||
&& (TYPE_READONLY (cur_type)
|
||||
|| (cur_param != 0
|
||||
&& (TREE_CODE_CLASS (TREE_CODE (cur_param)) == 'c'
|
||||
&& (CONSTANT_CLASS_P (cur_param)
|
||||
|| (DECL_P (cur_param)
|
||||
&& TREE_READONLY (cur_param))))))
|
||||
warning ("writing into constant object (arg %d)", arg_num);
|
||||
|
|
|
@ -54,9 +54,9 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
|
|||
|
||||
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
|
||||
|
||||
const char tree_code_type[] = {
|
||||
const enum tree_code_class tree_code_type[] = {
|
||||
#include "tree.def"
|
||||
'x',
|
||||
tcc_exceptional,
|
||||
#include "c-common.def"
|
||||
};
|
||||
#undef DEFTREECODE
|
||||
|
|
|
@ -316,7 +316,7 @@ handle_pragma_weak (cpp_reader * ARG_UNUSED (dummy))
|
|||
warning ("junk at end of #pragma weak");
|
||||
|
||||
decl = identifier_global_value (name);
|
||||
if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
|
||||
if (decl && DECL_P (decl))
|
||||
{
|
||||
apply_pragma_weak (decl, value);
|
||||
if (value)
|
||||
|
|
|
@ -744,18 +744,24 @@ same_translation_unit_p (tree t1, tree t2)
|
|||
while (t1 && TREE_CODE (t1) != TRANSLATION_UNIT_DECL)
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (t1)))
|
||||
{
|
||||
case 'd': t1 = DECL_CONTEXT (t1); break;
|
||||
case 't': t1 = TYPE_CONTEXT (t1); break;
|
||||
case 'x': t1 = BLOCK_SUPERCONTEXT (t1); break; /* assume block */
|
||||
case tcc_declaration:
|
||||
t1 = DECL_CONTEXT (t1); break;
|
||||
case tcc_type:
|
||||
t1 = TYPE_CONTEXT (t1); break;
|
||||
case tcc_exceptional:
|
||||
t1 = BLOCK_SUPERCONTEXT (t1); break; /* assume block */
|
||||
default: gcc_unreachable ();
|
||||
}
|
||||
|
||||
while (t2 && TREE_CODE (t2) != TRANSLATION_UNIT_DECL)
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (t2)))
|
||||
{
|
||||
case 'd': t2 = DECL_CONTEXT (t2); break;
|
||||
case 't': t2 = TYPE_CONTEXT (t2); break;
|
||||
case 'x': t2 = BLOCK_SUPERCONTEXT (t2); break; /* assume block */
|
||||
case tcc_declaration:
|
||||
t2 = DECL_CONTEXT (t2); break;
|
||||
case tcc_type:
|
||||
t2 = TYPE_CONTEXT (t2); break;
|
||||
case tcc_exceptional:
|
||||
t2 = BLOCK_SUPERCONTEXT (t2); break; /* assume block */
|
||||
default: gcc_unreachable ();
|
||||
}
|
||||
|
||||
|
@ -1200,7 +1206,7 @@ default_function_array_conversion (tree exp)
|
|||
int volatilep = 0;
|
||||
int lvalue_array_p;
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'r' || DECL_P (exp))
|
||||
if (REFERENCE_CLASS_P (exp) || DECL_P (exp))
|
||||
{
|
||||
constp = TREE_READONLY (exp);
|
||||
volatilep = TREE_THIS_VOLATILE (exp);
|
||||
|
@ -2232,7 +2238,8 @@ parser_build_binary_op (enum tree_code code, struct c_expr arg1,
|
|||
|| code2 == PLUS_EXPR || code2 == MINUS_EXPR)
|
||||
warning ("suggest parentheses around arithmetic in operand of |");
|
||||
/* Check cases like x|y==z */
|
||||
if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
|
||||
if (TREE_CODE_CLASS (code1) == tcc_comparison
|
||||
|| TREE_CODE_CLASS (code2) == tcc_comparison)
|
||||
warning ("suggest parentheses around comparison in operand of |");
|
||||
}
|
||||
|
||||
|
@ -2244,7 +2251,8 @@ parser_build_binary_op (enum tree_code code, struct c_expr arg1,
|
|||
|| code2 == PLUS_EXPR || code2 == MINUS_EXPR)
|
||||
warning ("suggest parentheses around arithmetic in operand of ^");
|
||||
/* Check cases like x^y==z */
|
||||
if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
|
||||
if (TREE_CODE_CLASS (code1) == tcc_comparison
|
||||
|| TREE_CODE_CLASS (code2) == tcc_comparison)
|
||||
warning ("suggest parentheses around comparison in operand of ^");
|
||||
}
|
||||
|
||||
|
@ -2254,13 +2262,14 @@ parser_build_binary_op (enum tree_code code, struct c_expr arg1,
|
|||
|| code2 == PLUS_EXPR || code2 == MINUS_EXPR)
|
||||
warning ("suggest parentheses around + or - in operand of &");
|
||||
/* Check cases like x&y==z */
|
||||
if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
|
||||
if (TREE_CODE_CLASS (code1) == tcc_comparison
|
||||
|| TREE_CODE_CLASS (code2) == tcc_comparison)
|
||||
warning ("suggest parentheses around comparison in operand of &");
|
||||
}
|
||||
/* Similarly, check for cases like 1<=i<=10 that are probably errors. */
|
||||
if (TREE_CODE_CLASS (code) == '<'
|
||||
&& (TREE_CODE_CLASS (code1) == '<'
|
||||
|| TREE_CODE_CLASS (code2) == '<'))
|
||||
if (TREE_CODE_CLASS (code) == tcc_comparison
|
||||
&& (TREE_CODE_CLASS (code1) == tcc_comparison
|
||||
|| TREE_CODE_CLASS (code2) == tcc_comparison))
|
||||
warning ("comparisons like X<=Y<=Z do not have their mathematical meaning");
|
||||
|
||||
}
|
||||
|
@ -2604,7 +2613,7 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
|
|||
to which the address will point. Note that you can't get a
|
||||
restricted pointer by taking the address of something, so we
|
||||
only have to deal with `const' and `volatile' here. */
|
||||
if ((DECL_P (arg) || TREE_CODE_CLASS (TREE_CODE (arg)) == 'r')
|
||||
if ((DECL_P (arg) || REFERENCE_CLASS_P (arg))
|
||||
&& (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg)))
|
||||
argtype = c_build_type_variant (argtype,
|
||||
TREE_READONLY (arg),
|
||||
|
@ -3208,7 +3217,7 @@ build_c_cast (tree type, tree expr)
|
|||
else
|
||||
TREE_OVERFLOW (value) = 0;
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (ovalue)) == 'c')
|
||||
if (CONSTANT_CLASS_P (ovalue))
|
||||
/* Similarly, constant_overflow cannot have become
|
||||
cleared. */
|
||||
TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
|
||||
|
@ -6396,7 +6405,7 @@ c_finish_return (tree retval)
|
|||
case ADDR_EXPR:
|
||||
inner = TREE_OPERAND (inner, 0);
|
||||
|
||||
while (TREE_CODE_CLASS (TREE_CODE (inner)) == 'r'
|
||||
while (REFERENCE_CLASS_P (inner)
|
||||
&& TREE_CODE (inner) != INDIRECT_REF)
|
||||
inner = TREE_OPERAND (inner, 0);
|
||||
|
||||
|
@ -6744,7 +6753,7 @@ c_process_expr_stmt (tree expr)
|
|||
|
||||
/* If the expression is not of a type to which we cannot assign a line
|
||||
number, wrap the thing in a no-op NOP_EXPR. */
|
||||
if (DECL_P (expr) || TREE_CODE_CLASS (TREE_CODE (expr)) == 'c')
|
||||
if (DECL_P (expr) || CONSTANT_CLASS_P (expr))
|
||||
expr = build1 (NOP_EXPR, TREE_TYPE (expr), expr);
|
||||
|
||||
if (EXPR_P (expr))
|
||||
|
|
|
@ -671,7 +671,7 @@ record_call_1 (tree *tp, int *walk_subtrees, void *data)
|
|||
default:
|
||||
/* Save some cycles by not walking types and declaration as we
|
||||
won't find anything useful there anyway. */
|
||||
if (DECL_P (*tp) || TYPE_P (*tp))
|
||||
if (IS_TYPE_OR_DECL_P (*tp))
|
||||
{
|
||||
*walk_subtrees = 0;
|
||||
break;
|
||||
|
@ -740,7 +740,7 @@ verify_cgraph_node_1 (tree *tp, int *walk_subtrees, void *data)
|
|||
|
||||
/* Save some cycles by not walking types and declaration as we
|
||||
won't find anything useful there anyway. */
|
||||
if (DECL_P (*tp) || TYPE_P (*tp))
|
||||
if (IS_TYPE_OR_DECL_P (*tp))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
return NULL_TREE;
|
||||
|
@ -2225,18 +2225,18 @@ scan_for_static_refs (tree *tp,
|
|||
check_lhs_var (fn, TREE_OPERAND (t, 0));
|
||||
/* Next check the operands on the rhs to see if they are ok. */
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (rhs))) {
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
check_rhs_var (fn, TREE_OPERAND (rhs, 0));
|
||||
check_rhs_var (fn, TREE_OPERAND (rhs, 1));
|
||||
break;
|
||||
case '1':
|
||||
case 'r':
|
||||
case tcc_unary:
|
||||
case tcc_reference:
|
||||
check_rhs_var (fn, TREE_OPERAND (rhs, 0));
|
||||
break;
|
||||
case 'd':
|
||||
case tcc_declaration:
|
||||
check_rhs_var (fn, rhs);
|
||||
break;
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
switch (TREE_CODE (rhs)) {
|
||||
case ADDR_EXPR:
|
||||
check_rhs_var (fn, rhs);
|
||||
|
|
|
@ -13788,7 +13788,7 @@ arm_encode_section_info (tree decl, rtx rtl, int first)
|
|||
/* If we are referencing a function that is weak then encode a long call
|
||||
flag in the function name, otherwise if the function is static or
|
||||
or known to be defined in this file then encode a short call flag. */
|
||||
if (first && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
|
||||
if (first && DECL_P (decl))
|
||||
{
|
||||
if (TREE_CODE (decl) == FUNCTION_DECL && DECL_WEAK (decl))
|
||||
arm_encode_call_attribute (decl, LONG_CALL_FLAG_CHAR);
|
||||
|
|
|
@ -99,8 +99,7 @@ associated_type (tree decl)
|
|||
t = TYPE_MAIN_VARIANT
|
||||
(TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
|
||||
}
|
||||
else if (DECL_CONTEXT (decl)
|
||||
&& TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (decl))) == 't')
|
||||
else if (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl)))
|
||||
t = DECL_CONTEXT (decl);
|
||||
|
||||
return t;
|
||||
|
|
|
@ -9342,8 +9342,7 @@ pa_select_section (tree exp, int reloc,
|
|||
else
|
||||
readonly_data_section ();
|
||||
}
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c'
|
||||
&& !reloc)
|
||||
else if (CONSTANT_CLASS_P (exp) && !reloc)
|
||||
readonly_data_section ();
|
||||
else if (TARGET_SOM
|
||||
&& TREE_CODE (exp) == VAR_DECL
|
||||
|
|
|
@ -1770,7 +1770,7 @@ forget_section (void) \
|
|||
&& TREE_READONLY (DECL) && ! TREE_SIDE_EFFECTS (DECL) \
|
||||
&& (! DECL_INITIAL (DECL) || ! reloc_needed (DECL_INITIAL (DECL))) \
|
||||
&& !flag_pic) \
|
||||
|| (TREE_CODE_CLASS (TREE_CODE (DECL)) == 'c'))
|
||||
|| CONSTANT_CLASS_P (DECL))
|
||||
|
||||
#define FUNCTION_NAME_P(NAME) (*(NAME) == '@')
|
||||
|
||||
|
|
|
@ -7065,7 +7065,7 @@ sh_insert_attributes (tree node, tree *attributes)
|
|||
return;
|
||||
|
||||
/* We are only interested in fields. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (node)) != 'd')
|
||||
if (!DECL_P (node))
|
||||
return;
|
||||
|
||||
/* Add a 'handle_interrupt' attribute. */
|
||||
|
|
|
@ -113,7 +113,7 @@ solaris_pragma_align (cpp_reader *pfile ATTRIBUTE_UNUSED)
|
|||
while (1)
|
||||
{
|
||||
tree decl = identifier_global_value (t);
|
||||
if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
|
||||
if (decl && DECL_P (decl))
|
||||
warning ("%<#pragma align%> must appear before the declaration of "
|
||||
"%D, ignoring", decl);
|
||||
else
|
||||
|
@ -168,7 +168,7 @@ solaris_pragma_init (cpp_reader *pfile ATTRIBUTE_UNUSED)
|
|||
while (1)
|
||||
{
|
||||
tree decl = identifier_global_value (t);
|
||||
if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
|
||||
if (decl && DECL_P (decl))
|
||||
{
|
||||
tree init_list = build_tree_list (get_identifier ("init"),
|
||||
NULL);
|
||||
|
@ -226,7 +226,7 @@ solaris_pragma_fini (cpp_reader *pfile ATTRIBUTE_UNUSED)
|
|||
while (1)
|
||||
{
|
||||
tree decl = identifier_global_value (t);
|
||||
if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
|
||||
if (decl && DECL_P (decl))
|
||||
{
|
||||
tree fini_list = build_tree_list (get_identifier ("fini"),
|
||||
NULL);
|
||||
|
|
|
@ -401,7 +401,7 @@ convert_to_integer (tree type, tree expr)
|
|||
we must also change the types of the operands to maintain type
|
||||
correctness. */
|
||||
|
||||
if (TREE_CODE_CLASS (ex_form) == '<')
|
||||
if (TREE_CODE_CLASS (ex_form) == tcc_comparison)
|
||||
{
|
||||
expr = copy_node (expr);
|
||||
TREE_TYPE (expr) = type;
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com>
|
||||
Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* cp-tree.def: Use tree_code_class enumeration constants
|
||||
instead of code letters.
|
||||
* call.c, class.c, cp-gimplify.c, cp-lang.c, cxx-pretty-print.c
|
||||
* mangle.c, pt.c, semantics.c, tree.c, typeck.c:
|
||||
Update for new tree-class enumeration constants.
|
||||
|
||||
2004-09-16 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/16002
|
||||
|
@ -16,7 +25,7 @@
|
|||
|
||||
2004-09-16 Andrew MacLeod <amacleod@redhat.com>
|
||||
|
||||
* error.c (dump_decl): Make sure there is lang_specific info before
|
||||
* error.c (dump_decl): Make sure there is lang_specific info before
|
||||
checking for DTOR and CTOR decls.
|
||||
|
||||
2004-09-16 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
@ -106,9 +115,9 @@
|
|||
2004-09-11 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR c++/17404
|
||||
* pt.c (cur_stmt_expr): Move from tsubst_expr.
|
||||
(tsubst_expr) <case STMT_EXPR>: Move ...
|
||||
(tsubst_copy_and_build): ... here.
|
||||
* pt.c (cur_stmt_expr): Move from tsubst_expr.
|
||||
(tsubst_expr) <case STMT_EXPR>: Move ...
|
||||
(tsubst_copy_and_build): ... here.
|
||||
|
||||
2004-09-10 Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
|
|
|
@ -5867,7 +5867,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
|
|||
/* If we have two pseudo-candidates for conversions to the same type,
|
||||
or two candidates for the same function, arbitrarily pick one. */
|
||||
if (cand1->fn == cand2->fn
|
||||
&& (TYPE_P (cand1->fn) || DECL_P (cand1->fn)))
|
||||
&& (IS_TYPE_OR_DECL_P (cand1->fn)))
|
||||
return 1;
|
||||
|
||||
/* a viable function F1
|
||||
|
|
|
@ -6272,11 +6272,11 @@ get_enclosing_class (tree type)
|
|||
{
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (node)))
|
||||
{
|
||||
case 'd':
|
||||
case tcc_declaration:
|
||||
node = DECL_CONTEXT (node);
|
||||
break;
|
||||
|
||||
case 't':
|
||||
case tcc_type:
|
||||
if (node != type)
|
||||
return node;
|
||||
node = TYPE_CONTEXT (node);
|
||||
|
|
|
@ -303,7 +303,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
|
|||
&& is_invisiref_parm (TREE_OPERAND (stmt, 0)))
|
||||
/* Don't dereference an invisiref RESULT_DECL inside a RETURN_EXPR. */
|
||||
*walk_subtrees = 0;
|
||||
else if (DECL_P (stmt) || TYPE_P (stmt))
|
||||
else if (IS_TYPE_OR_DECL_P (stmt))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
/* Due to the way voidify_wrapper_expr is written, we don't get a chance
|
||||
|
|
|
@ -57,11 +57,11 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
|
|||
|
||||
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
|
||||
|
||||
const char tree_code_type[] = {
|
||||
const enum tree_code_class tree_code_type[] = {
|
||||
#include "tree.def"
|
||||
'x',
|
||||
tcc_exceptional,
|
||||
#include "c-common.def"
|
||||
'x',
|
||||
tcc_exceptional,
|
||||
#include "cp-tree.def"
|
||||
};
|
||||
#undef DEFTREECODE
|
||||
|
|
|
@ -42,56 +42,56 @@ Boston, MA 02111-1307, USA. */
|
|||
2. An expression of the form `x.*p'. In this case, operand 0 will
|
||||
be an expression corresponding to `x' and operand 1 will be an
|
||||
expression with pointer-to-member type. */
|
||||
DEFTREECODE (OFFSET_REF, "offset_ref", 'r', 2)
|
||||
DEFTREECODE (OFFSET_REF, "offset_ref", tcc_reference, 2)
|
||||
|
||||
/* A pointer-to-member constant. For a pointer-to-member constant
|
||||
`X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the
|
||||
PTRMEM_CST_MEMBER is the _DECL for `Y'. */
|
||||
DEFTREECODE (PTRMEM_CST, "ptrmem_cst", 'c', 0)
|
||||
DEFTREECODE (PTRMEM_CST, "ptrmem_cst", tcc_constant, 0)
|
||||
|
||||
/* For NEW_EXPR, operand 0 is the placement list.
|
||||
Operand 1 is the new-declarator.
|
||||
Operand 2 is the number of elements in the array.
|
||||
Operand 3 is the initializer. */
|
||||
DEFTREECODE (NEW_EXPR, "nw_expr", 'e', 4)
|
||||
DEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", 'e', 3)
|
||||
DEFTREECODE (NEW_EXPR, "nw_expr", tcc_expression, 4)
|
||||
DEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", tcc_expression, 3)
|
||||
|
||||
/* For DELETE_EXPR, operand 0 is the store to be destroyed.
|
||||
Operand 1 is the value to pass to the destroying function
|
||||
saying whether the store should be deallocated as well. */
|
||||
DEFTREECODE (DELETE_EXPR, "dl_expr", 'e', 2)
|
||||
DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", 'e', 2)
|
||||
DEFTREECODE (DELETE_EXPR, "dl_expr", tcc_expression, 2)
|
||||
DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", tcc_expression, 2)
|
||||
|
||||
/* Value is reference to particular overloaded class method.
|
||||
Operand 0 is the class, operand 1 is the field
|
||||
The COMPLEXITY field holds the class level (usually 0). */
|
||||
DEFTREECODE (SCOPE_REF, "scope_ref", 'r', 2)
|
||||
DEFTREECODE (SCOPE_REF, "scope_ref", tcc_reference, 2)
|
||||
|
||||
/* When composing an object with a member, this is the result.
|
||||
Operand 0 is the object. Operand 1 is the member (usually
|
||||
a dereferenced pointer to member). */
|
||||
DEFTREECODE (MEMBER_REF, "member_ref", 'r', 2)
|
||||
DEFTREECODE (MEMBER_REF, "member_ref", tcc_reference, 2)
|
||||
|
||||
/* Type conversion operator in C++. TREE_TYPE is type that this
|
||||
operator converts to. Operand is expression to be converted. */
|
||||
DEFTREECODE (TYPE_EXPR, "type_expr", 'e', 1)
|
||||
DEFTREECODE (TYPE_EXPR, "type_expr", tcc_expression, 1)
|
||||
|
||||
/* For AGGR_INIT_EXPR, operand 0 is function which performs initialization,
|
||||
operand 1 is argument list to initialization function,
|
||||
and operand 2 is the slot which was allocated for this expression. */
|
||||
DEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", 'e', 3)
|
||||
DEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", tcc_expression, 3)
|
||||
|
||||
/* A throw expression. operand 0 is the expression, if there was one,
|
||||
else it is NULL_TREE. */
|
||||
DEFTREECODE (THROW_EXPR, "throw_expr", 'e', 1)
|
||||
DEFTREECODE (THROW_EXPR, "throw_expr", tcc_expression, 1)
|
||||
|
||||
/* An empty class object. The TREE_TYPE gives the class type. We use
|
||||
these to avoid actually creating instances of the empty classes. */
|
||||
DEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", 'e', 0)
|
||||
DEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", tcc_expression, 0)
|
||||
|
||||
/* A DECL which is really just a placeholder for an expression. Used to
|
||||
implement non-class scope anonymous unions. */
|
||||
DEFTREECODE (ALIAS_DECL, "alias_decl", 'd', 0)
|
||||
DEFTREECODE (ALIAS_DECL, "alias_decl", tcc_declaration, 0)
|
||||
|
||||
/* A reference to a member function or member functions from a base
|
||||
class. BASELINK_FUNCTIONS gives the FUNCTION_DECL,
|
||||
|
@ -105,7 +105,7 @@ DEFTREECODE (ALIAS_DECL, "alias_decl", 'd', 0)
|
|||
the type of the expression. This type is either a FUNCTION_TYPE,
|
||||
METHOD_TYPE, or `unknown_type_node' indicating that the function is
|
||||
overloaded. */
|
||||
DEFTREECODE (BASELINK, "baselink", 'x', 0)
|
||||
DEFTREECODE (BASELINK, "baselink", tcc_exceptional, 0)
|
||||
|
||||
/* Template definition. The following fields have the specified uses,
|
||||
although there are other macros in cp-tree.h that should be used for
|
||||
|
@ -122,7 +122,7 @@ DEFTREECODE (BASELINK, "baselink", 'x', 0)
|
|||
DECL_TEMPLATE_RESULT decl for object to be created
|
||||
(e.g., FUNCTION_DECL with tmpl parms used)
|
||||
*/
|
||||
DEFTREECODE (TEMPLATE_DECL, "template_decl", 'd', 0)
|
||||
DEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0)
|
||||
|
||||
/* Index into a template parameter list. The TEMPLATE_PARM_IDX gives
|
||||
the index (from 0) of the parameter, while the TEMPLATE_PARM_LEVEL
|
||||
|
@ -157,11 +157,11 @@ DEFTREECODE (TEMPLATE_DECL, "template_decl", 'd', 0)
|
|||
The LEVEL is the level of the parameter when we are worrying about
|
||||
the types of things; the ORIG_LEVEL is the level when we are
|
||||
worrying about instantiating things. */
|
||||
DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", 'x', 0)
|
||||
DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", tcc_exceptional, 0)
|
||||
|
||||
/* Index into a template parameter list. This parameter must be a type.
|
||||
The type.value field will be a TEMPLATE_PARM_INDEX. */
|
||||
DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", 't', 0)
|
||||
DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", tcc_type, 0)
|
||||
|
||||
/* Index into a template parameter list for template template parameters.
|
||||
This parameter must be a type. The TYPE_FIELDS value will be a
|
||||
|
@ -170,13 +170,14 @@ DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", 't', 0)
|
|||
It is used without template arguments like TT in C<TT>,
|
||||
TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO is NULL_TREE
|
||||
and TYPE_NAME is a TEMPLATE_DECL. */
|
||||
DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", 't', 0)
|
||||
DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", tcc_type, 0)
|
||||
|
||||
/* Like TEMPLATE_TEMPLATE_PARM it is used with bound template arguments
|
||||
like TT<int>.
|
||||
In this case, TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO contains the
|
||||
template name and its bound arguments. TYPE_NAME is a TYPE_DECL. */
|
||||
DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm", 't', 0)
|
||||
DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm",
|
||||
tcc_type, 0)
|
||||
|
||||
/* A type designated by `typename T::t'. TYPE_CONTEXT is `T',
|
||||
TYPE_NAME is an IDENTIFIER_NODE for `t'. If the type was named via
|
||||
|
@ -184,51 +185,51 @@ DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm", 't',
|
|||
If TREE_TYPE is present, this type was generated by the implicit
|
||||
typename extension, and the TREE_TYPE is a _TYPE from a baseclass
|
||||
of `T'. */
|
||||
DEFTREECODE (TYPENAME_TYPE, "typename_type", 't', 0)
|
||||
DEFTREECODE (TYPENAME_TYPE, "typename_type", tcc_type, 0)
|
||||
|
||||
/* For template template argument of the form `T::template C'.
|
||||
TYPE_CONTEXT is `T', the template parameter dependent object.
|
||||
TYPE_NAME is an IDENTIFIER_NODE for `C', the member class template. */
|
||||
DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", 't', 0)
|
||||
DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0)
|
||||
|
||||
/* A type designated by `__typeof (expr)'. TYPEOF_TYPE_EXPR is the
|
||||
expression in question. */
|
||||
DEFTREECODE (TYPEOF_TYPE, "typeof_type", 't', 0)
|
||||
DEFTREECODE (TYPEOF_TYPE, "typeof_type", tcc_type, 0)
|
||||
|
||||
/* A using declaration. DECL_INITIAL contains the specified scope.
|
||||
This is not an alias, but is later expanded into multiple aliases.
|
||||
The decl will have a NULL_TYPE iff the scope is a dependent scope,
|
||||
otherwise it will have a void type. */
|
||||
DEFTREECODE (USING_DECL, "using_decl", 'd', 0)
|
||||
DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0)
|
||||
|
||||
/* A using directive. The operand is USING_STMT_NAMESPACE. */
|
||||
DEFTREECODE (USING_STMT, "using_directive", 'e', 1)
|
||||
DEFTREECODE (USING_STMT, "using_directive", tcc_expression, 1)
|
||||
|
||||
/* An un-parsed default argument. Looks like an IDENTIFIER_NODE. */
|
||||
DEFTREECODE (DEFAULT_ARG, "default_arg", 'x', 0)
|
||||
DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)
|
||||
|
||||
/* A template-id, like foo<int>. The first operand is the template.
|
||||
The second is NULL if there are no explicit arguments, or a
|
||||
TREE_VEC of arguments. The template will be a FUNCTION_DECL,
|
||||
TEMPLATE_DECL, or an OVERLOAD. If the template-id refers to a
|
||||
member template, the template may be an IDENTIFIER_NODE. */
|
||||
DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", 'e', 2)
|
||||
DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", tcc_expression, 2)
|
||||
|
||||
/* A list-like node for chaining overloading candidates. TREE_TYPE is
|
||||
the original name, and the parameter is the FUNCTION_DECL. */
|
||||
DEFTREECODE (OVERLOAD, "overload", 'x', 0)
|
||||
DEFTREECODE (OVERLOAD, "overload", tcc_exceptional, 0)
|
||||
|
||||
/* A whole bunch of tree codes for the initial, superficial parsing of
|
||||
templates. */
|
||||
DEFTREECODE (MODOP_EXPR, "modop_expr", 'e', 3)
|
||||
DEFTREECODE (CAST_EXPR, "cast_expr", '1', 1)
|
||||
DEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", '1', 1)
|
||||
DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", '1', 1)
|
||||
DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", '1', 1)
|
||||
DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", '1', 1)
|
||||
DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", 'e', 2)
|
||||
DEFTREECODE (TYPEID_EXPR, "typeid_expr", 'e', 1)
|
||||
DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", 'e', 3)
|
||||
DEFTREECODE (MODOP_EXPR, "modop_expr", tcc_expression, 3)
|
||||
DEFTREECODE (CAST_EXPR, "cast_expr", tcc_unary, 1)
|
||||
DEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", tcc_unary, 1)
|
||||
DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", tcc_unary, 1)
|
||||
DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", tcc_unary, 1)
|
||||
DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", tcc_unary, 1)
|
||||
DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", tcc_expression, 2)
|
||||
DEFTREECODE (TYPEID_EXPR, "typeid_expr", tcc_expression, 1)
|
||||
DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", tcc_expression, 3)
|
||||
|
||||
/* A placeholder for an expression that is not type-dependent, but
|
||||
does occur in a template. When an expression that is not
|
||||
|
@ -239,38 +240,38 @@ DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", 'e', 3)
|
|||
that situation, we create a NON_DEPENDENT_EXPR to take the place of
|
||||
the original expression. The expression is the only operand -- it
|
||||
is only needed for diagnostics. */
|
||||
DEFTREECODE (NON_DEPENDENT_EXPR, "non_dependent_expr", 'e', 1)
|
||||
DEFTREECODE (NON_DEPENDENT_EXPR, "non_dependent_expr", tcc_expression, 1)
|
||||
|
||||
/* CTOR_INITIALIZER is a placeholder in template code for a call to
|
||||
setup_vtbl_pointer (and appears in all functions, not just ctors). */
|
||||
DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 1)
|
||||
DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", tcc_expression, 1)
|
||||
|
||||
DEFTREECODE (TRY_BLOCK, "try_block", 'e', 2)
|
||||
DEFTREECODE (TRY_BLOCK, "try_block", tcc_expression, 2)
|
||||
|
||||
DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", 'e', 2)
|
||||
DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", tcc_expression, 2)
|
||||
|
||||
/* A HANDLER wraps a catch handler for the HANDLER_TYPE. If this is
|
||||
CATCH_ALL_TYPE, then the handler catches all types. The declaration of
|
||||
the catch variable is in HANDLER_PARMS, and the body block in
|
||||
HANDLER_BODY. */
|
||||
DEFTREECODE (HANDLER, "handler", 'e', 2)
|
||||
DEFTREECODE (HANDLER, "handler", tcc_expression, 2)
|
||||
|
||||
/* A MUST_NOT_THROW_EXPR wraps an expression that may not
|
||||
throw, and must call terminate if it does. */
|
||||
DEFTREECODE (MUST_NOT_THROW_EXPR, "must_not_throw_expr", 'e', 1)
|
||||
DEFTREECODE (MUST_NOT_THROW_EXPR, "must_not_throw_expr", tcc_expression, 1)
|
||||
|
||||
/* A CLEANUP_STMT marks the point at which a declaration is fully
|
||||
constructed. The CLEANUP_EXPR is run on behalf of CLEANUP_DECL
|
||||
when CLEANUP_BODY completes. */
|
||||
DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", 'e', 3)
|
||||
DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", tcc_expression, 3)
|
||||
|
||||
/* Represents an 'if' statement. The operands are IF_COND,
|
||||
THEN_CLAUSE, and ELSE_CLAUSE, respectively. */
|
||||
/* ??? It is currently still necessary to distinguish between IF_STMT
|
||||
and COND_EXPR for the benefit of templates. */
|
||||
DEFTREECODE (IF_STMT, "if_stmt", 'e', 3)
|
||||
DEFTREECODE (IF_STMT, "if_stmt", tcc_expression, 3)
|
||||
|
||||
DEFTREECODE (TAG_DEFN, "tag_defn", 'e', 0)
|
||||
DEFTREECODE (TAG_DEFN, "tag_defn", tcc_expression, 0)
|
||||
|
||||
/* Template instantiation level node.
|
||||
|
||||
|
@ -280,10 +281,10 @@ DEFTREECODE (TAG_DEFN, "tag_defn", 'e', 0)
|
|||
A stack of template instantiation nodes is kept through the TREE_CHAIN
|
||||
fields of these nodes. */
|
||||
|
||||
DEFTREECODE (TINST_LEVEL, "TINST_LEVEL", 'x', 0)
|
||||
DEFTREECODE (TINST_LEVEL, "TINST_LEVEL", tcc_exceptional, 0)
|
||||
|
||||
/* Represents an 'offsetof' expression during template expansion. */
|
||||
DEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", 'e', 1)
|
||||
DEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", tcc_expression, 1)
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
|
|
|
@ -1154,7 +1154,8 @@ static void
|
|||
pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
|
||||
{
|
||||
tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
|
||||
tree types = TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
|
||||
tree types =
|
||||
TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
|
||||
const bool abstract = args == NULL
|
||||
|| pp_c_base (pp)->flags & pp_c_flag_abstract;
|
||||
bool first = true;
|
||||
|
@ -1441,7 +1442,7 @@ pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
|
|||
if (i != 0)
|
||||
pp_cxx_separate_with (pp, ',');
|
||||
if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
|
||||
&& TYPE_P (DECL_TEMPLATE_RESULT (arg))))
|
||||
&& TYPE_P (DECL_TEMPLATE_RESULT (arg))))
|
||||
pp_cxx_type_id (pp, arg);
|
||||
else
|
||||
pp_cxx_expression (pp, arg);
|
||||
|
|
|
@ -1997,7 +1997,7 @@ write_expression (tree expr)
|
|||
|| code == TEMPLATE_PARM_INDEX)
|
||||
write_template_param (expr);
|
||||
/* Handle literals. */
|
||||
else if (TREE_CODE_CLASS (code) == 'c'
|
||||
else if (TREE_CODE_CLASS (code) == tcc_constant
|
||||
|| (abi_version_at_least (2) && code == CONST_DECL))
|
||||
write_template_arg_literal (expr);
|
||||
else if (DECL_P (expr))
|
||||
|
@ -2260,7 +2260,7 @@ write_template_arg (tree node)
|
|||
else if (code == TEMPLATE_DECL)
|
||||
/* A template appearing as a template arg is a template template arg. */
|
||||
write_template_template_arg (node);
|
||||
else if ((TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST)
|
||||
else if ((TREE_CODE_CLASS (code) == tcc_constant && code != PTRMEM_CST)
|
||||
|| (abi_version_at_least (2) && code == CONST_DECL))
|
||||
write_template_arg_literal (node);
|
||||
else if (DECL_P (node))
|
||||
|
|
27
gcc/cp/pt.c
27
gcc/cp/pt.c
|
@ -4891,7 +4891,7 @@ uses_template_parms (tree t)
|
|||
|| TREE_CODE (t) == TEMPLATE_PARM_INDEX
|
||||
|| TREE_CODE (t) == OVERLOAD
|
||||
|| TREE_CODE (t) == BASELINK
|
||||
|| TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
|
||||
|| CONSTANT_CLASS_P (t))
|
||||
dependent_p = (type_dependent_expression_p (t)
|
||||
|| value_dependent_expression_p (t));
|
||||
else
|
||||
|
@ -10109,7 +10109,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
|
|||
return 1;
|
||||
|
||||
default:
|
||||
gcc_assert (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (parm))));
|
||||
gcc_assert (EXPR_P (parm));
|
||||
|
||||
/* We must be looking at an expression. This can happen with
|
||||
something like:
|
||||
|
@ -11586,9 +11586,9 @@ dependent_type_p_r (tree type)
|
|||
|
||||
A type is dependent if it is:
|
||||
|
||||
-- a template parameter. Template template parameters are
|
||||
types for us (since TYPE_P holds true for them) so we
|
||||
handle them here. */
|
||||
-- a template parameter. Template template parameters are types
|
||||
for us (since TYPE_P holds true for them) so we handle
|
||||
them here. */
|
||||
if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
|
||||
|| TREE_CODE (type) == TEMPLATE_TEMPLATE_PARM)
|
||||
return true;
|
||||
|
@ -11819,20 +11819,20 @@ value_dependent_expression_p (tree expression)
|
|||
|| value_dependent_expression_p (TREE_OPERAND (expression, 1)));
|
||||
/* A constant expression is value-dependent if any subexpression is
|
||||
value-dependent. */
|
||||
if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (expression))))
|
||||
if (EXPR_P (expression))
|
||||
{
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (expression)))
|
||||
{
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
return (value_dependent_expression_p
|
||||
(TREE_OPERAND (expression, 0)));
|
||||
case '<':
|
||||
case '2':
|
||||
case tcc_comparison:
|
||||
case tcc_binary:
|
||||
return ((value_dependent_expression_p
|
||||
(TREE_OPERAND (expression, 0)))
|
||||
|| (value_dependent_expression_p
|
||||
(TREE_OPERAND (expression, 1))));
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < first_rtl_op (TREE_CODE (expression)); ++i)
|
||||
|
@ -11846,6 +11846,13 @@ value_dependent_expression_p (tree expression)
|
|||
return true;
|
||||
return false;
|
||||
}
|
||||
case tcc_reference:
|
||||
case tcc_statement:
|
||||
/* These cannot be value dependent. */
|
||||
return false;
|
||||
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1239,7 +1239,7 @@ finish_mem_initializers (tree mem_inits)
|
|||
tree
|
||||
finish_parenthesized_expr (tree expr)
|
||||
{
|
||||
if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (expr))))
|
||||
if (EXPR_P (expr))
|
||||
/* This inhibits warnings in c_common_truthvalue_conversion. */
|
||||
TREE_NO_WARNING (expr) = 1;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Language-dependent node constructors for parse phase of GNU compiler.
|
||||
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
||||
1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
Hacked by Michael Tiemann (tiemann@cygnus.com)
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -1554,12 +1554,12 @@ cp_tree_equal (tree t1, tree t2)
|
|||
|
||||
switch (TREE_CODE_CLASS (code1))
|
||||
{
|
||||
case '1':
|
||||
case '2':
|
||||
case '<':
|
||||
case 'e':
|
||||
case 'r':
|
||||
case 's':
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
case tcc_statement:
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -1570,11 +1570,12 @@ cp_tree_equal (tree t1, tree t2)
|
|||
return true;
|
||||
}
|
||||
|
||||
case 't':
|
||||
case tcc_type:
|
||||
return same_type_p (t1, t2);
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
gcc_unreachable ();
|
||||
/* We can get here with --disable-checking. */
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -4956,7 +4956,7 @@ build_c_cast (tree type, tree expr)
|
|||
{
|
||||
TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (ovalue)) == 'c')
|
||||
if (CONSTANT_CLASS_P (ovalue))
|
||||
TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1318,7 +1318,7 @@ dbxout_type (tree type, int full)
|
|||
|| TREE_CODE (type) == QUAL_UNION_TYPE
|
||||
|| TREE_CODE (type) == ENUMERAL_TYPE)
|
||||
&& TYPE_STUB_DECL (type)
|
||||
&& TREE_CODE_CLASS (TREE_CODE (TYPE_STUB_DECL (type))) == 'd'
|
||||
&& DECL_P (TYPE_STUB_DECL (type))
|
||||
&& ! DECL_IGNORED_P (TYPE_STUB_DECL (type)))
|
||||
debug_queue_symbol (TYPE_STUB_DECL (type));
|
||||
else if (TYPE_NAME (type)
|
||||
|
@ -2179,19 +2179,19 @@ dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED)
|
|||
|| TREE_CODE (t) == ENUMERAL_TYPE)
|
||||
&& TYPE_STUB_DECL (t)
|
||||
&& TYPE_STUB_DECL (t) != decl
|
||||
&& TREE_CODE_CLASS (TREE_CODE (TYPE_STUB_DECL (t))) == 'd'
|
||||
&& DECL_P (TYPE_STUB_DECL (t))
|
||||
&& ! DECL_IGNORED_P (TYPE_STUB_DECL (t)))
|
||||
{
|
||||
debug_queue_symbol (TYPE_STUB_DECL (t));
|
||||
if (TYPE_NAME (t)
|
||||
&& TYPE_NAME (t) != TYPE_STUB_DECL (t)
|
||||
&& TYPE_NAME (t) != decl
|
||||
&& TREE_CODE_CLASS (TREE_CODE (TYPE_NAME (t))) == 'd')
|
||||
&& DECL_P (TYPE_NAME (t)))
|
||||
debug_queue_symbol (TYPE_NAME (t));
|
||||
}
|
||||
else if (TYPE_NAME (t)
|
||||
&& TYPE_NAME (t) != decl
|
||||
&& TREE_CODE_CLASS (TREE_CODE (TYPE_NAME (t))) == 'd')
|
||||
&& DECL_P (TYPE_NAME (t)))
|
||||
debug_queue_symbol (TYPE_NAME (t));
|
||||
}
|
||||
|
||||
|
|
|
@ -10918,7 +10918,7 @@ gen_formal_parameter_die (tree node, dw_die_ref context_die)
|
|||
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (node)))
|
||||
{
|
||||
case 'd':
|
||||
case tcc_declaration:
|
||||
origin = decl_ultimate_origin (node);
|
||||
if (origin != NULL)
|
||||
add_abstract_origin_attribute (parm_die, origin);
|
||||
|
@ -10939,7 +10939,7 @@ gen_formal_parameter_die (tree node, dw_die_ref context_die)
|
|||
|
||||
break;
|
||||
|
||||
case 't':
|
||||
case tcc_type:
|
||||
/* We were called with some kind of a ..._TYPE node. */
|
||||
add_type_attribute (parm_die, node, 0, 0, context_die);
|
||||
break;
|
||||
|
@ -12417,7 +12417,8 @@ force_type_die (tree type)
|
|||
static dw_die_ref
|
||||
setup_namespace_context (tree thing, dw_die_ref context_die)
|
||||
{
|
||||
tree context = DECL_P (thing) ? DECL_CONTEXT (thing) : TYPE_CONTEXT (thing);
|
||||
tree context = (DECL_P (thing)
|
||||
? DECL_CONTEXT (thing) : TYPE_CONTEXT (thing));
|
||||
if (context && TREE_CODE (context) == NAMESPACE_DECL)
|
||||
/* Force out the namespace. */
|
||||
context_die = force_decl_die (context);
|
||||
|
|
|
@ -1592,7 +1592,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
|
|||
}
|
||||
|
||||
/* If this is a constant, we know the alignment. */
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
|
||||
else if (CONSTANT_CLASS_P (t))
|
||||
{
|
||||
align = TYPE_ALIGN (type);
|
||||
#ifdef CONSTANT_ALIGNMENT
|
||||
|
|
34
gcc/expr.c
34
gcc/expr.c
|
@ -3527,7 +3527,7 @@ expand_assignment (tree to, tree from, int want_value)
|
|||
src = from;
|
||||
STRIP_NOPS (src);
|
||||
if (TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE
|
||||
|| TREE_CODE_CLASS (TREE_CODE (src)) != '2')
|
||||
|| !BINARY_CLASS_P (src))
|
||||
break;
|
||||
|
||||
op0 = TREE_OPERAND (src, 0);
|
||||
|
@ -5755,14 +5755,14 @@ safe_from_p (rtx x, tree exp, int top_p)
|
|||
/* Now look at our tree code and possibly recurse. */
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (exp)))
|
||||
{
|
||||
case 'd':
|
||||
case tcc_declaration:
|
||||
exp_rtl = DECL_RTL_IF_SET (exp);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
case tcc_constant:
|
||||
return 1;
|
||||
|
||||
case 'x':
|
||||
case tcc_exceptional:
|
||||
if (TREE_CODE (exp) == TREE_LIST)
|
||||
{
|
||||
while (1)
|
||||
|
@ -5781,7 +5781,7 @@ safe_from_p (rtx x, tree exp, int top_p)
|
|||
else
|
||||
return 0;
|
||||
|
||||
case 's':
|
||||
case tcc_statement:
|
||||
/* The only case we look at here is the DECL_INITIAL inside a
|
||||
DECL_EXPR. */
|
||||
return (TREE_CODE (exp) != DECL_EXPR
|
||||
|
@ -5789,17 +5789,17 @@ safe_from_p (rtx x, tree exp, int top_p)
|
|||
|| !DECL_INITIAL (DECL_EXPR_DECL (exp))
|
||||
|| safe_from_p (x, DECL_INITIAL (DECL_EXPR_DECL (exp)), 0));
|
||||
|
||||
case '2':
|
||||
case '<':
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0))
|
||||
return 0;
|
||||
/* Fall through. */
|
||||
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
|
||||
|
||||
case 'e':
|
||||
case 'r':
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
/* Now do code-specific tests. EXP_RTL is set to any rtx we find in
|
||||
the expression. If it is set, we conflict iff we are that rtx or
|
||||
both are in memory. Otherwise, we check all operands of the
|
||||
|
@ -5872,6 +5872,11 @@ safe_from_p (rtx x, tree exp, int top_p)
|
|||
>= (unsigned int) LAST_AND_UNUSED_TREE_CODE
|
||||
&& !lang_hooks.safe_from_p (x, exp))
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case tcc_type:
|
||||
/* Should never get a type here. */
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
/* If we have an rtl, find any enclosed object. Then see if we conflict
|
||||
|
@ -6068,7 +6073,7 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
|
|||
generating ADDR_EXPR of something that isn't an LVALUE. The only
|
||||
exception here is STRING_CST. */
|
||||
if (TREE_CODE (exp) == CONSTRUCTOR
|
||||
|| TREE_CODE_CLASS (TREE_CODE (exp)) == 'c')
|
||||
|| CONSTANT_CLASS_P (exp))
|
||||
return XEXP (output_constant_def (exp, 0), 0);
|
||||
|
||||
/* Everything must be something allowed by is_gimple_addressable. */
|
||||
|
@ -6400,12 +6405,13 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
|
|||
return const0_rtx;
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (code) == '1' || code == COMPONENT_REF
|
||||
|| code == INDIRECT_REF)
|
||||
if (TREE_CODE_CLASS (code) == tcc_unary
|
||||
|| code == COMPONENT_REF || code == INDIRECT_REF)
|
||||
return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
|
||||
modifier);
|
||||
|
||||
else if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<'
|
||||
else if (TREE_CODE_CLASS (code) == tcc_binary
|
||||
|| TREE_CODE_CLASS (code) == tcc_comparison
|
||||
|| code == ARRAY_REF || code == ARRAY_RANGE_REF)
|
||||
{
|
||||
expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier);
|
||||
|
|
167
gcc/fold-const.c
167
gcc/fold-const.c
|
@ -2281,7 +2281,7 @@ combine_comparisons (enum tree_code code, enum tree_code lcode,
|
|||
static int
|
||||
truth_value_p (enum tree_code code)
|
||||
{
|
||||
return (TREE_CODE_CLASS (code) == '<'
|
||||
return (TREE_CODE_CLASS (code) == tcc_comparison
|
||||
|| code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
|
||||
|| code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
|
||||
|| code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
|
||||
|
@ -2420,7 +2420,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
|
|||
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
|
||||
{
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
/* Two conversions are equal only if signedness and modes match. */
|
||||
switch (TREE_CODE (arg0))
|
||||
{
|
||||
|
@ -2441,8 +2441,8 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
|
|||
return operand_equal_p (TREE_OPERAND (arg0, 0),
|
||||
TREE_OPERAND (arg1, 0), flags);
|
||||
|
||||
case '<':
|
||||
case '2':
|
||||
case tcc_comparison:
|
||||
case tcc_binary:
|
||||
if (operand_equal_p (TREE_OPERAND (arg0, 0),
|
||||
TREE_OPERAND (arg1, 0), flags)
|
||||
&& operand_equal_p (TREE_OPERAND (arg0, 1),
|
||||
|
@ -2456,7 +2456,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
|
|||
&& operand_equal_p (TREE_OPERAND (arg0, 1),
|
||||
TREE_OPERAND (arg1, 0), flags));
|
||||
|
||||
case 'r':
|
||||
case tcc_reference:
|
||||
/* If either of the pointer (or reference) expressions we are
|
||||
dereferencing contain a side effect, these cannot be equal. */
|
||||
if (TREE_SIDE_EFFECTS (arg0)
|
||||
|
@ -2503,7 +2503,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
|
|||
return 0;
|
||||
}
|
||||
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
switch (TREE_CODE (arg0))
|
||||
{
|
||||
case ADDR_EXPR:
|
||||
|
@ -2570,7 +2570,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
|
|||
return 0;
|
||||
}
|
||||
|
||||
case 'd':
|
||||
case tcc_declaration:
|
||||
/* Consider __builtin_sqrt equal to sqrt. */
|
||||
return (TREE_CODE (arg0) == FUNCTION_DECL
|
||||
&& DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
|
||||
|
@ -2652,17 +2652,17 @@ static int
|
|||
twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
|
||||
{
|
||||
enum tree_code code = TREE_CODE (arg);
|
||||
char class = TREE_CODE_CLASS (code);
|
||||
enum tree_code_class class = TREE_CODE_CLASS (code);
|
||||
|
||||
/* We can handle some of the 'e' cases here. */
|
||||
if (class == 'e' && code == TRUTH_NOT_EXPR)
|
||||
class = '1';
|
||||
else if (class == 'e'
|
||||
/* We can handle some of the tcc_expression cases here. */
|
||||
if (class == tcc_expression && code == TRUTH_NOT_EXPR)
|
||||
class = tcc_unary;
|
||||
else if (class == tcc_expression
|
||||
&& (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
|
||||
|| code == COMPOUND_EXPR))
|
||||
class = '2';
|
||||
class = tcc_binary;
|
||||
|
||||
else if (class == 'e' && code == SAVE_EXPR
|
||||
else if (class == tcc_expression && code == SAVE_EXPR
|
||||
&& ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
|
||||
{
|
||||
/* If we've already found a CVAL1 or CVAL2, this expression is
|
||||
|
@ -2670,24 +2670,24 @@ twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
|
|||
if (*cval1 || *cval2)
|
||||
return 0;
|
||||
|
||||
class = '1';
|
||||
class = tcc_unary;
|
||||
*save_p = 1;
|
||||
}
|
||||
|
||||
switch (class)
|
||||
{
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
|
||||
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
|
||||
&& twoval_comparison_p (TREE_OPERAND (arg, 1),
|
||||
cval1, cval2, save_p));
|
||||
|
||||
case 'c':
|
||||
case tcc_constant:
|
||||
return 1;
|
||||
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
if (code == COND_EXPR)
|
||||
return (twoval_comparison_p (TREE_OPERAND (arg, 0),
|
||||
cval1, cval2, save_p)
|
||||
|
@ -2697,7 +2697,7 @@ twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
|
|||
cval1, cval2, save_p));
|
||||
return 0;
|
||||
|
||||
case '<':
|
||||
case tcc_comparison:
|
||||
/* First see if we can handle the first operand, then the second. For
|
||||
the second operand, we know *CVAL1 can't be zero. It must be that
|
||||
one side of the comparison is each of the values; test for the
|
||||
|
@ -2745,30 +2745,30 @@ eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
|
|||
{
|
||||
tree type = TREE_TYPE (arg);
|
||||
enum tree_code code = TREE_CODE (arg);
|
||||
char class = TREE_CODE_CLASS (code);
|
||||
enum tree_code_class class = TREE_CODE_CLASS (code);
|
||||
|
||||
/* We can handle some of the 'e' cases here. */
|
||||
if (class == 'e' && code == TRUTH_NOT_EXPR)
|
||||
class = '1';
|
||||
else if (class == 'e'
|
||||
/* We can handle some of the tcc_expression cases here. */
|
||||
if (class == tcc_expression && code == TRUTH_NOT_EXPR)
|
||||
class = tcc_unary;
|
||||
else if (class == tcc_expression
|
||||
&& (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
|
||||
class = '2';
|
||||
class = tcc_binary;
|
||||
|
||||
switch (class)
|
||||
{
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
return fold (build1 (code, type,
|
||||
eval_subst (TREE_OPERAND (arg, 0),
|
||||
old0, new0, old1, new1)));
|
||||
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
return fold (build2 (code, type,
|
||||
eval_subst (TREE_OPERAND (arg, 0),
|
||||
old0, new0, old1, new1),
|
||||
eval_subst (TREE_OPERAND (arg, 1),
|
||||
old0, new0, old1, new1)));
|
||||
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
switch (code)
|
||||
{
|
||||
case SAVE_EXPR:
|
||||
|
@ -2790,7 +2790,7 @@ eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
|
|||
}
|
||||
/* Fall through - ??? */
|
||||
|
||||
case '<':
|
||||
case tcc_comparison:
|
||||
{
|
||||
tree arg0 = TREE_OPERAND (arg, 0);
|
||||
tree arg1 = TREE_OPERAND (arg, 1);
|
||||
|
@ -2890,7 +2890,7 @@ invert_truthvalue (tree arg)
|
|||
floating-point non-equality comparisons, in which case we just
|
||||
enclose a TRUTH_NOT_EXPR around what we have. */
|
||||
|
||||
if (TREE_CODE_CLASS (code) == '<')
|
||||
if (TREE_CODE_CLASS (code) == tcc_comparison)
|
||||
{
|
||||
tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
|
||||
if (FLOAT_TYPE_P (op_type)
|
||||
|
@ -3413,7 +3413,7 @@ simple_operand_p (tree exp)
|
|||
== TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
|
||||
exp = TREE_OPERAND (exp, 0);
|
||||
|
||||
return (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c'
|
||||
return (CONSTANT_CLASS_P (exp)
|
||||
|| (DECL_P (exp)
|
||||
&& ! TREE_ADDRESSABLE (exp)
|
||||
&& ! TREE_THIS_VOLATILE (exp)
|
||||
|
@ -3484,7 +3484,7 @@ range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
|
|||
return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (code) != '<')
|
||||
if (TREE_CODE_CLASS (code) != tcc_comparison)
|
||||
return 0;
|
||||
|
||||
/* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
|
||||
|
@ -3555,13 +3555,13 @@ make_range (tree exp, int *pin_p, tree *plow, tree *phigh)
|
|||
{
|
||||
if (first_rtl_op (code) > 0)
|
||||
arg0 = TREE_OPERAND (exp, 0);
|
||||
if (TREE_CODE_CLASS (code) == '<'
|
||||
|| TREE_CODE_CLASS (code) == '1'
|
||||
|| TREE_CODE_CLASS (code) == '2')
|
||||
if (TREE_CODE_CLASS (code) == tcc_comparison
|
||||
|| TREE_CODE_CLASS (code) == tcc_unary
|
||||
|| TREE_CODE_CLASS (code) == tcc_binary)
|
||||
arg0_type = TREE_TYPE (arg0);
|
||||
if (TREE_CODE_CLASS (code) == '2'
|
||||
|| TREE_CODE_CLASS (code) == '<'
|
||||
|| (TREE_CODE_CLASS (code) == 'e'
|
||||
if (TREE_CODE_CLASS (code) == tcc_binary
|
||||
|| TREE_CODE_CLASS (code) == tcc_comparison
|
||||
|| (TREE_CODE_CLASS (code) == tcc_expression
|
||||
&& TREE_CODE_LENGTH (code) > 1))
|
||||
arg1 = TREE_OPERAND (exp, 1);
|
||||
}
|
||||
|
@ -4192,7 +4192,7 @@ fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
|
|||
tem = fold (build1 (ABS_EXPR, TREE_TYPE (arg1), arg1));
|
||||
return negate_expr (fold_convert (type, tem));
|
||||
default:
|
||||
gcc_assert (TREE_CODE_CLASS (comp_code) == '<');
|
||||
gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -4296,7 +4296,7 @@ fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
|
|||
return pedantic_non_lvalue (fold_convert (type, arg1));
|
||||
break;
|
||||
default:
|
||||
gcc_assert (TREE_CODE_CLASS (comp_code) == '<');
|
||||
gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -4569,7 +4569,8 @@ fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
|
|||
rcode = NE_EXPR;
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (lcode) != '<' || TREE_CODE_CLASS (rcode) != '<')
|
||||
if (TREE_CODE_CLASS (lcode) != tcc_comparison
|
||||
|| TREE_CODE_CLASS (rcode) != tcc_comparison)
|
||||
return 0;
|
||||
|
||||
ll_arg = TREE_OPERAND (lhs, 0);
|
||||
|
@ -5073,10 +5074,10 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
|
|||
if (integer_zerop (c))
|
||||
return NULL_TREE;
|
||||
|
||||
if (TREE_CODE_CLASS (tcode) == '1')
|
||||
if (TREE_CODE_CLASS (tcode) == tcc_unary)
|
||||
op0 = TREE_OPERAND (t, 0);
|
||||
|
||||
if (TREE_CODE_CLASS (tcode) == '2')
|
||||
if (TREE_CODE_CLASS (tcode) == tcc_binary)
|
||||
op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
|
||||
|
||||
/* Note that we need not handle conditional operations here since fold
|
||||
|
@ -5094,10 +5095,10 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
|
|||
|
||||
case CONVERT_EXPR: case NON_LVALUE_EXPR: case NOP_EXPR:
|
||||
/* If op0 is an expression ... */
|
||||
if ((TREE_CODE_CLASS (TREE_CODE (op0)) == '<'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (op0)) == '1'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (op0)) == '2'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (op0)) == 'e')
|
||||
if ((COMPARISON_CLASS_P (op0)
|
||||
|| UNARY_CLASS_P (op0)
|
||||
|| BINARY_CLASS_P (op0)
|
||||
|| EXPRESSION_CLASS_P (op0))
|
||||
/* ... and is unsigned, and its type is smaller than ctype,
|
||||
then we cannot pass through as widening. */
|
||||
&& ((TYPE_UNSIGNED (TREE_TYPE (op0))
|
||||
|
@ -5990,14 +5991,14 @@ fold (tree expr)
|
|||
tree tem;
|
||||
tree arg0 = NULL_TREE, arg1 = NULL_TREE;
|
||||
enum tree_code code = TREE_CODE (t);
|
||||
int kind = TREE_CODE_CLASS (code);
|
||||
enum tree_code_class kind = TREE_CODE_CLASS (code);
|
||||
|
||||
/* WINS will be nonzero when the switch is done
|
||||
if all operands are constant. */
|
||||
int wins = 1;
|
||||
|
||||
/* Return right away if a constant. */
|
||||
if (kind == 'c')
|
||||
if (kind == tcc_constant)
|
||||
return t;
|
||||
|
||||
if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
|
||||
|
@ -6046,7 +6047,7 @@ fold (tree expr)
|
|||
of the arguments so that their form can be studied. In any
|
||||
cases, the appropriate type conversions should be put back in
|
||||
the tree that will get out of the constant folder. */
|
||||
if (kind == '<')
|
||||
if (kind == tcc_comparison)
|
||||
STRIP_SIGN_NOPS (op);
|
||||
else
|
||||
STRIP_NOPS (op);
|
||||
|
@ -6118,7 +6119,7 @@ fold (tree expr)
|
|||
return tem;
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (code) == '1')
|
||||
if (TREE_CODE_CLASS (code) == tcc_unary)
|
||||
{
|
||||
if (TREE_CODE (arg0) == COMPOUND_EXPR)
|
||||
return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
|
||||
|
@ -6165,7 +6166,7 @@ fold (tree expr)
|
|||
TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
|
||||
return tem;
|
||||
}
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
|
||||
else if (COMPARISON_CLASS_P (arg0))
|
||||
{
|
||||
if (TREE_CODE (type) == BOOLEAN_TYPE)
|
||||
{
|
||||
|
@ -6181,16 +6182,16 @@ fold (tree expr)
|
|||
integer_zero_node))));
|
||||
}
|
||||
}
|
||||
else if (TREE_CODE_CLASS (code) == '<'
|
||||
else if (TREE_CODE_CLASS (code) == tcc_comparison
|
||||
&& TREE_CODE (arg0) == COMPOUND_EXPR)
|
||||
return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
|
||||
fold (build2 (code, type, TREE_OPERAND (arg0, 1), arg1)));
|
||||
else if (TREE_CODE_CLASS (code) == '<'
|
||||
else if (TREE_CODE_CLASS (code) == tcc_comparison
|
||||
&& TREE_CODE (arg1) == COMPOUND_EXPR)
|
||||
return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
|
||||
fold (build2 (code, type, arg0, TREE_OPERAND (arg1, 1))));
|
||||
else if (TREE_CODE_CLASS (code) == '2'
|
||||
|| TREE_CODE_CLASS (code) == '<')
|
||||
else if (TREE_CODE_CLASS (code) == tcc_binary
|
||||
|| TREE_CODE_CLASS (code) == tcc_comparison)
|
||||
{
|
||||
if (TREE_CODE (arg0) == COMPOUND_EXPR)
|
||||
return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
|
||||
|
@ -6202,8 +6203,7 @@ fold (tree expr)
|
|||
fold (build2 (code, type,
|
||||
arg0, TREE_OPERAND (arg1, 1))));
|
||||
|
||||
if (TREE_CODE (arg0) == COND_EXPR
|
||||
|| TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
|
||||
if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
|
||||
{
|
||||
tem = fold_binary_op_with_conditional_arg (code, type, arg0, arg1,
|
||||
/*cond_first_p=*/1);
|
||||
|
@ -6211,8 +6211,7 @@ fold (tree expr)
|
|||
return tem;
|
||||
}
|
||||
|
||||
if (TREE_CODE (arg1) == COND_EXPR
|
||||
|| TREE_CODE_CLASS (TREE_CODE (arg1)) == '<')
|
||||
if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
|
||||
{
|
||||
tem = fold_binary_op_with_conditional_arg (code, type, arg1, arg0,
|
||||
/*cond_first_p=*/0);
|
||||
|
@ -6382,7 +6381,7 @@ fold (tree expr)
|
|||
/* Convert (T1)((T2)X op Y) into (T1)X op Y, for pointer types T1 and
|
||||
T2 being pointers to types of the same size. */
|
||||
if (POINTER_TYPE_P (TREE_TYPE (t))
|
||||
&& TREE_CODE_CLASS (TREE_CODE (arg0)) == '2'
|
||||
&& BINARY_CLASS_P (arg0)
|
||||
&& TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
|
||||
&& POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))))
|
||||
{
|
||||
|
@ -8772,7 +8771,7 @@ fold (tree expr)
|
|||
for reasons given above each one.
|
||||
|
||||
Also try swapping the arguments and inverting the conditional. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
|
||||
if (COMPARISON_CLASS_P (arg0)
|
||||
&& operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
|
||||
arg1, TREE_OPERAND (arg0, 1))
|
||||
&& !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
|
||||
|
@ -8784,14 +8783,14 @@ fold (tree expr)
|
|||
return tem;
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
|
||||
if (COMPARISON_CLASS_P (arg0)
|
||||
&& operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
|
||||
TREE_OPERAND (t, 2),
|
||||
TREE_OPERAND (arg0, 1))
|
||||
&& !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 2)))))
|
||||
{
|
||||
tem = invert_truthvalue (arg0);
|
||||
if (TREE_CODE_CLASS (TREE_CODE (tem)) == '<')
|
||||
if (COMPARISON_CLASS_P (tem))
|
||||
{
|
||||
tem = fold_cond_expr_with_comparison (type, tem,
|
||||
TREE_OPERAND (t, 2),
|
||||
|
@ -9055,14 +9054,15 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
|
|||
return;
|
||||
*slot = expr;
|
||||
code = TREE_CODE (expr);
|
||||
if (TREE_CODE_CLASS (code) == 'd' && DECL_ASSEMBLER_NAME_SET_P (expr))
|
||||
if (TREE_CODE_CLASS (code) == tcc_declaration
|
||||
&& DECL_ASSEMBLER_NAME_SET_P (expr))
|
||||
{
|
||||
/* Allow DECL_ASSEMBLER_NAME to be modified. */
|
||||
memcpy (buf, expr, tree_size (expr));
|
||||
expr = (tree) buf;
|
||||
SET_DECL_ASSEMBLER_NAME (expr, NULL);
|
||||
}
|
||||
else if (TREE_CODE_CLASS (code) == 't'
|
||||
else if (TREE_CODE_CLASS (code) == tcc_type
|
||||
&& (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
|
||||
|| TYPE_CACHED_VALUES_P (expr)))
|
||||
{
|
||||
|
@ -9076,11 +9076,12 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
|
|||
}
|
||||
md5_process_bytes (expr, tree_size (expr), ctx);
|
||||
fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
|
||||
if (TREE_CODE_CLASS (code) != 't' && TREE_CODE_CLASS (code) != 'd')
|
||||
if (TREE_CODE_CLASS (code) != tcc_type
|
||||
&& TREE_CODE_CLASS (code) != tcc_declaration)
|
||||
fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'c':
|
||||
case tcc_constant:
|
||||
switch (code)
|
||||
{
|
||||
case STRING_CST:
|
||||
|
@ -9098,7 +9099,7 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
|
|||
break;
|
||||
}
|
||||
break;
|
||||
case 'x':
|
||||
case tcc_exceptional:
|
||||
switch (code)
|
||||
{
|
||||
case TREE_LIST:
|
||||
|
@ -9113,17 +9114,17 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
|
|||
break;
|
||||
}
|
||||
break;
|
||||
case 'e':
|
||||
case 'r':
|
||||
case '<':
|
||||
case '1':
|
||||
case '2':
|
||||
case 's':
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
case tcc_comparison:
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_statement:
|
||||
len = first_rtl_op (code);
|
||||
for (i = 0; i < len; ++i)
|
||||
fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
|
||||
break;
|
||||
case 'd':
|
||||
case tcc_declaration:
|
||||
fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
|
||||
fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
|
||||
fold_checksum_tree (DECL_NAME (expr), ctx, ht);
|
||||
|
@ -9136,7 +9137,7 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
|
|||
fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
|
||||
fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
|
||||
break;
|
||||
case 't':
|
||||
case tcc_type:
|
||||
if (TREE_CODE (expr) == ENUMERAL_TYPE)
|
||||
fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
|
||||
fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
|
||||
|
@ -9630,7 +9631,7 @@ tree_expr_nonzero_p (tree t)
|
|||
return !DECL_WEAK (base);
|
||||
|
||||
/* Constants are never weak. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (base)) == 'c')
|
||||
if (CONSTANT_CLASS_P (base))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -10554,12 +10555,12 @@ fold_ignored_result (tree t)
|
|||
for (;;)
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (t)))
|
||||
{
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
t = TREE_OPERAND (t, 0);
|
||||
break;
|
||||
|
||||
case '2':
|
||||
case '<':
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
|
||||
t = TREE_OPERAND (t, 0);
|
||||
else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
|
||||
|
@ -10568,7 +10569,7 @@ fold_ignored_result (tree t)
|
|||
return t;
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
switch (TREE_CODE (t))
|
||||
{
|
||||
case COMPOUND_EXPR:
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com>
|
||||
Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* f95-lang.c, trans-expr.c, trans.c: Update for new tree-class
|
||||
enumeration constants.
|
||||
|
||||
2004-09-17 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* gfortran.h (struct gfc_linebuf): Don't use C99 empty arrays.
|
||||
|
@ -312,30 +318,30 @@
|
|||
|
||||
2004-08-26 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* arith.c: Include system.h, not real system headers.
|
||||
(MPZ_NULL, MPF_NULL, DEF_GFC_INTEGER_KIND, DEF_GFC_LOGICAL_KIND,
|
||||
DEF_GFC_REAL_KIND, GFC_SP_KIND, GFC_SP_PREC, GFC_SP_EMIN, GFC_SP_EMAX,
|
||||
GFC_DP_KIND, GFC_DP_PREC, GFC_DP_EMIN, GFC_DP_EMAX, GFC_QP_KIND,
|
||||
GFC_QP_PREC, GFC_QP_EMIN, GFC_QP_EMAX): Remove.
|
||||
(gfc_integer_kinds, gfc_logical_kinds, gfc_real_kinds,
|
||||
gfc_index_integer_kind, gfc_default_integer_kind,
|
||||
gfc_default_real_kind,gfc_default_double_kind,
|
||||
gfc_default_character_kind, gfc_default_logical_kind,
|
||||
gfc_default_complex_kind, validate_integer, validate_real,
|
||||
validate_logical, validate_character,
|
||||
gfc_validate_kind): Move to trans-types.c.
|
||||
(gfc_set_model_kind): Use gfc_validate_kind.
|
||||
(gfc_set_model): Just copy the current precision to default.
|
||||
(gfc_arith_init_1): Use mpfr precision 128 for integer setup.
|
||||
* f95-lang.c (gfc_init_decl_processing): Invoke gfc_init_kinds.
|
||||
* gfortran.h: Update file commentary.
|
||||
* trans-types.c (MAX_INT_KINDS, MAX_REAL_KINDS): New.
|
||||
(gfc_default_integer_kind_1, gfc_default_real_kind_1,
|
||||
gfc_default_double_kind_1, gfc_default_character_kind_1,
|
||||
gfc_default_logical_kind_1, gfc_default_complex_kind_1): New.
|
||||
(gfc_init_kinds): New.
|
||||
(gfc_init_types): Don't set gfc_index_integer_kind here.
|
||||
* trans-types.h (gfc_init_kinds): Declare.
|
||||
* arith.c: Include system.h, not real system headers.
|
||||
(MPZ_NULL, MPF_NULL, DEF_GFC_INTEGER_KIND, DEF_GFC_LOGICAL_KIND,
|
||||
DEF_GFC_REAL_KIND, GFC_SP_KIND, GFC_SP_PREC, GFC_SP_EMIN, GFC_SP_EMAX,
|
||||
GFC_DP_KIND, GFC_DP_PREC, GFC_DP_EMIN, GFC_DP_EMAX, GFC_QP_KIND,
|
||||
GFC_QP_PREC, GFC_QP_EMIN, GFC_QP_EMAX): Remove.
|
||||
(gfc_integer_kinds, gfc_logical_kinds, gfc_real_kinds,
|
||||
gfc_index_integer_kind, gfc_default_integer_kind,
|
||||
gfc_default_real_kind,gfc_default_double_kind,
|
||||
gfc_default_character_kind, gfc_default_logical_kind,
|
||||
gfc_default_complex_kind, validate_integer, validate_real,
|
||||
validate_logical, validate_character,
|
||||
gfc_validate_kind): Move to trans-types.c.
|
||||
(gfc_set_model_kind): Use gfc_validate_kind.
|
||||
(gfc_set_model): Just copy the current precision to default.
|
||||
(gfc_arith_init_1): Use mpfr precision 128 for integer setup.
|
||||
* f95-lang.c (gfc_init_decl_processing): Invoke gfc_init_kinds.
|
||||
* gfortran.h: Update file commentary.
|
||||
* trans-types.c (MAX_INT_KINDS, MAX_REAL_KINDS): New.
|
||||
(gfc_default_integer_kind_1, gfc_default_real_kind_1,
|
||||
gfc_default_double_kind_1, gfc_default_character_kind_1,
|
||||
gfc_default_logical_kind_1, gfc_default_complex_kind_1): New.
|
||||
(gfc_init_kinds): New.
|
||||
(gfc_init_types): Don't set gfc_index_integer_kind here.
|
||||
* trans-types.h (gfc_init_kinds): Declare.
|
||||
* doc/invoke.texi: Clarify DOUBLE PRECISION behaviour wrt -r8.
|
||||
|
||||
2004-08-26 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
@ -422,7 +428,7 @@
|
|||
build.
|
||||
* trans-array.c (gfc_conv_descriptor_data,
|
||||
gfc_conv_descriptor_offset, gfc_conv_descriptor_dimension,
|
||||
gfc_conv_descriptor_stride, gfc_conv_descriptor_lbound,
|
||||
gfc_conv_descriptor_stride, gfc_conv_descriptor_lbound,
|
||||
gfc_conv_descriptor_ubound, gfc_trans_allocate_array_storage,
|
||||
gfc_trans_allocate_temp_array,
|
||||
gfc_trans_array_constructor_subarray,
|
||||
|
@ -480,7 +486,7 @@
|
|||
|
||||
2004-08-25 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* trans-const.c (gfc_conv_mpz_to_tree): Change call to
|
||||
* trans-const.c (gfc_conv_mpz_to_tree): Change call to
|
||||
build_int_cst to build_int_cst_wide in accordance to Nathan's
|
||||
previous patch.
|
||||
|
||||
|
@ -503,7 +509,7 @@
|
|||
|
||||
2004-08-24 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* trans-decl.c, trans-types.c: Add and remove blank lines as
|
||||
* trans-decl.c, trans-types.c: Add and remove blank lines as
|
||||
required.
|
||||
|
||||
2004-08-24 Richard Henderson <rth@redhat.com>
|
||||
|
@ -512,9 +518,9 @@
|
|||
|
||||
2004-08-24 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* resolve.c (merge_argument_lists): Revert unintentionally
|
||||
* resolve.c (merge_argument_lists): Revert unintentionally
|
||||
committed change.
|
||||
|
||||
|
||||
2004-08-24 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* trans-decl.c (build_function_decl): Fix spelling in comment.
|
||||
|
@ -545,15 +551,15 @@
|
|||
2004-08-22 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR 13465
|
||||
* data.c (find_con_by_offset): Search ordered list; handle
|
||||
elements with repeat counts.
|
||||
(gfc_assign_data_value_range): New.
|
||||
* gfortran.h (struct gfc_data_value): Make repeat unsigned.
|
||||
(gfc_assign_data_value_range): Declare.
|
||||
* match.c (top_val_list): Extract repeat count into a temporary.
|
||||
* resolve.c (values): Make left unsigned.
|
||||
(next_data_value): Don't decrement left.
|
||||
(check_data_variable): Use gfc_assign_data_value_range.
|
||||
* data.c (find_con_by_offset): Search ordered list; handle
|
||||
elements with repeat counts.
|
||||
(gfc_assign_data_value_range): New.
|
||||
* gfortran.h (struct gfc_data_value): Make repeat unsigned.
|
||||
(gfc_assign_data_value_range): Declare.
|
||||
* match.c (top_val_list): Extract repeat count into a temporary.
|
||||
* resolve.c (values): Make left unsigned.
|
||||
(next_data_value): Don't decrement left.
|
||||
(check_data_variable): Use gfc_assign_data_value_range.
|
||||
|
||||
2004-08-22 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
|
@ -1416,7 +1422,7 @@
|
|||
unused variables if they're use associated.
|
||||
|
||||
2004-06-14 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
Andrew Vaught <andyv@firstinter.net>
|
||||
Andrew Vaught <andyv@firstinter.net>
|
||||
|
||||
PR fortran/14928
|
||||
* gfortran.h (gfc_check_f): Add new field f3ml.
|
||||
|
@ -1769,7 +1775,7 @@
|
|||
2004-05-17 Steve Kargl <kargls@comcast.net>
|
||||
|
||||
* arith.c (gfc_real2complex): Range checking wrong part of complex
|
||||
number.
|
||||
number.
|
||||
|
||||
2004-05-16 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
|
@ -1911,15 +1917,15 @@
|
|||
|
||||
2004-05-14 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
PR fortran/14066
|
||||
PR fortran/14066
|
||||
* match.c (gfc_match_do): Allow infinite loops with
|
||||
label-do-stmt. Do not enforce space after comma.
|
||||
|
||||
2004-05-14 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
PR fortran/15051
|
||||
PR fortran/15051
|
||||
* parse.c (parse_interface): Allow empty INTERFACE, remove
|
||||
seen_body.
|
||||
seen_body.
|
||||
|
||||
2004-05-14 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
|
@ -1941,7 +1947,7 @@
|
|||
|
||||
PR fortran/14568
|
||||
* trans-decl.c (generate_local_decl): Don't warn for unused
|
||||
variables which are in common blocks.
|
||||
variables which are in common blocks.
|
||||
|
||||
2004-05-13 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
|
@ -2166,9 +2172,9 @@
|
|||
|
||||
2004-03-24 Bud Davis <bdavis9659@comcast.net>
|
||||
|
||||
PR 14055
|
||||
PR 14055
|
||||
* arith.c (gfc_convert_integer,gfc_convert_real): Removed leading '+'
|
||||
before conversion by gmp library call.
|
||||
before conversion by gmp library call.
|
||||
|
||||
2004-03-24 Bud Davis <bdavis9659@comcast.net>
|
||||
|
||||
|
@ -3103,8 +3109,8 @@
|
|||
* lang-options.h: Remove.
|
||||
|
||||
2003-07-23 Arnaud Desitter <arnaud.desitter@geography.oxford.ac.uk>
|
||||
* iresolve.c (g95_resolve_transpose): Proper variable in switch.
|
||||
* simplify.c (g95_simplify_nearest): Fix typo and use a correct test
|
||||
* iresolve.c (g95_resolve_transpose): Proper variable in switch.
|
||||
* simplify.c (g95_simplify_nearest): Fix typo and use a correct test
|
||||
on kind.
|
||||
|
||||
2003-07-22 Steven Bosscher <steven@gcc.gnu.org>
|
||||
|
@ -3749,21 +3755,21 @@
|
|||
|
||||
2003-04-10 Canqun Yang <canqun@yahoo.com.cn>
|
||||
|
||||
* trans-stmt.c (g95_trans_forall): Implement WHERE inside FORALL.
|
||||
(g95_trans_forall_body): New function.
|
||||
* trans-stmt.c (g95_trans_forall): Implement WHERE inside FORALL.
|
||||
(g95_trans_forall_body): New function.
|
||||
|
||||
2003-04-10 Canqun Yang <canqun@yahoo.com.cn>
|
||||
|
||||
* resolve.c (resove_where): New function.
|
||||
(resolve_where_shape): New function.
|
||||
(resolve_code): Add call to 'resolve_where'
|
||||
* trans-stmt.c (g95_trans_where): Modified.
|
||||
(g95_trans_where_2): New function.
|
||||
(g95_trans_where_assign): New function.
|
||||
(g95_evaluate_where_mask): New function.
|
||||
(g95_add_to_stmt_list): New function.
|
||||
(g95_get_temp_expr): New function.
|
||||
* trans.h (where_stmt_list): New structure.
|
||||
* resolve.c (resove_where): New function.
|
||||
(resolve_where_shape): New function.
|
||||
(resolve_code): Add call to 'resolve_where'
|
||||
* trans-stmt.c (g95_trans_where): Modified.
|
||||
(g95_trans_where_2): New function.
|
||||
(g95_trans_where_assign): New function.
|
||||
(g95_evaluate_where_mask): New function.
|
||||
(g95_add_to_stmt_list): New function.
|
||||
(g95_get_temp_expr): New function.
|
||||
* trans.h (where_stmt_list): New structure.
|
||||
|
||||
2003-04-10 Paul Brook <paul@nowt.org>
|
||||
|
||||
|
@ -3851,7 +3857,7 @@
|
|||
|
||||
* arith.c (validate_logical), g95.h, options.c (g95_init_options):
|
||||
Remove option l1.
|
||||
* g95.h, intrinsic.c(g95_get_intrinsic_sub_symbol): Add const.
|
||||
* g95.h, intrinsic.c(g95_get_intrinsic_sub_symbol): Add const.
|
||||
* iresolve.c(g95_resolve_cpu_time, g95_resolve_random_number): Add
|
||||
const.
|
||||
* lang-options.h: Remove -finline-repack-arrays. Add -fg77-calls.
|
||||
|
@ -4092,7 +4098,7 @@
|
|||
2003-02-05 Toon Moene <toon@moene.indiv.nluug.nl>
|
||||
|
||||
* lang-options.h: Fix warning involving C90 concatenated
|
||||
strings.
|
||||
strings.
|
||||
|
||||
2003-02-06 Steven Bosscher <s.bosscher@student.tudelft.nl>
|
||||
Arnaud Desitter <arnaud.desitter@geography.oxford.ac.uk>
|
||||
|
@ -4178,7 +4184,7 @@
|
|||
|
||||
2003-01-28 Steven Bosscher <s.bosscher@student.tudelft.n>
|
||||
|
||||
* Make-lang.in: Don't build with broken tree-ssa-pre.
|
||||
* Make-lang.in: Don't build with broken tree-ssa-pre.
|
||||
|
||||
2003-01-28 Steven Bosscher <s.bosscher@student.tudelft.nl>
|
||||
|
||||
|
@ -4515,7 +4521,7 @@
|
|||
|
||||
2003-01-10 Steven Bosscher <s.bosscher@student.tudelft.nl>
|
||||
|
||||
* dump-parse-tree.c (g95_show_namespace): Fixed another
|
||||
* dump-parse-tree.c (g95_show_namespace): Fixed another
|
||||
typo. Sorry, it's Friday...
|
||||
|
||||
2003-01-10 Steven Bosscher <s.bosscher@student.tudelft.nl>
|
||||
|
@ -5018,7 +5024,7 @@
|
|||
2002-09-01 Toon Moene <toon@moene.indiv.nluug.nl>
|
||||
|
||||
* g95_conv_mpz_to_tree: Free storage pointed to by q,
|
||||
not by buff.
|
||||
not by buff.
|
||||
|
||||
2002-08-30 Paul Brook <paul@nowt.org>
|
||||
|
||||
|
|
|
@ -153,7 +153,7 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
|
|||
|
||||
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
|
||||
|
||||
const char tree_code_type[] = {
|
||||
const enum tree_code_class tree_code_type[] = {
|
||||
#include "tree.def"
|
||||
};
|
||||
#undef DEFTREECODE
|
||||
|
@ -221,7 +221,7 @@ gfc_truthvalue_conversion (tree expr)
|
|||
case BOOLEAN_TYPE:
|
||||
if (TREE_TYPE (expr) == boolean_type_node)
|
||||
return expr;
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (expr)) == '<')
|
||||
else if (COMPARISON_CLASS_P (expr))
|
||||
{
|
||||
TREE_TYPE (expr) = boolean_type_node;
|
||||
return expr;
|
||||
|
|
|
@ -107,7 +107,7 @@ gfc_make_safe_expr (gfc_se * se)
|
|||
{
|
||||
tree var;
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (se->expr)) == 'c')
|
||||
if (CONSTANT_CLASS_P (se->expr))
|
||||
return;
|
||||
|
||||
/* We need a temporary for this result. */
|
||||
|
|
|
@ -127,7 +127,7 @@ gfc_evaluate_now (tree expr, stmtblock_t * pblock)
|
|||
{
|
||||
tree var;
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (expr)) == 'c')
|
||||
if (CONSTANT_CLASS_P (expr))
|
||||
return expr;
|
||||
|
||||
var = gfc_create_var (TREE_TYPE (expr), NULL);
|
||||
|
|
|
@ -562,9 +562,7 @@ should_carry_locus_p (tree stmt)
|
|||
static void
|
||||
annotate_one_with_locus (tree t, location_t locus)
|
||||
{
|
||||
if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t)))
|
||||
&& ! EXPR_HAS_LOCATION (t)
|
||||
&& should_carry_locus_p (t))
|
||||
if (EXPR_P (t) && ! EXPR_HAS_LOCATION (t) && should_carry_locus_p (t))
|
||||
SET_EXPR_LOCATION (t, locus);
|
||||
}
|
||||
|
||||
|
@ -599,9 +597,9 @@ mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
|
|||
{
|
||||
enum tree_code code = TREE_CODE (*tp);
|
||||
/* Don't unshare types, decls, constants and SAVE_EXPR nodes. */
|
||||
if (TREE_CODE_CLASS (code) == 't'
|
||||
|| TREE_CODE_CLASS (code) == 'd'
|
||||
|| TREE_CODE_CLASS (code) == 'c'
|
||||
if (TREE_CODE_CLASS (code) == tcc_type
|
||||
|| TREE_CODE_CLASS (code) == tcc_declaration
|
||||
|| TREE_CODE_CLASS (code) == tcc_constant
|
||||
|| code == SAVE_EXPR || code == TARGET_EXPR
|
||||
/* We can't do anything sensible with a BLOCK used as an expression,
|
||||
but we also can't abort when we see it because of non-expression
|
||||
|
@ -637,9 +635,9 @@ copy_if_shared_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
|
|||
types and the bounds of types. Mark them as visited so we properly
|
||||
unmark their subtrees on the unmark pass. If we've already seen them,
|
||||
don't look down further. */
|
||||
if (TREE_CODE_CLASS (code) == 't'
|
||||
|| TREE_CODE_CLASS (code) == 'd'
|
||||
|| TREE_CODE_CLASS (code) == 'c')
|
||||
if (TREE_CODE_CLASS (code) == tcc_type
|
||||
|| TREE_CODE_CLASS (code) == tcc_declaration
|
||||
|| TREE_CODE_CLASS (code) == tcc_constant)
|
||||
{
|
||||
if (TREE_VISITED (t))
|
||||
*walk_subtrees = 0;
|
||||
|
@ -2319,7 +2317,7 @@ gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
|
|||
&& alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
|
||||
return t;
|
||||
|
||||
if (DECL_P (t) || TYPE_P (t))
|
||||
if (IS_TYPE_OR_DECL_P (t))
|
||||
*walk_subtrees = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -3872,7 +3870,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
|
|||
default:
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
|
||||
{
|
||||
case '<':
|
||||
case tcc_comparison:
|
||||
/* If this is a comparison of objects of aggregate type,
|
||||
handle it specially (by converting to a call to
|
||||
memcmp). It would be nice to only have to do this
|
||||
|
@ -3886,12 +3884,12 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
|
|||
|
||||
/* If *EXPR_P does not need to be special-cased, handle it
|
||||
according to its class. */
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
|
||||
post_p, is_gimple_val, fb_rvalue);
|
||||
break;
|
||||
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
expr_2:
|
||||
{
|
||||
enum gimplify_status r0, r1;
|
||||
|
@ -3905,8 +3903,8 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
|
|||
break;
|
||||
}
|
||||
|
||||
case 'd':
|
||||
case 'c':
|
||||
case tcc_declaration:
|
||||
case tcc_constant:
|
||||
ret = GS_ALL_DONE;
|
||||
goto dont_recalculate;
|
||||
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com>
|
||||
Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* java-tree.def: Use tree_code_class enumeration constants
|
||||
instead of code letters.
|
||||
* java-gimplify.c, jcf-write.c, lang.c, parse.y: Update for
|
||||
new tree-class enumeration constants.
|
||||
|
||||
2004-09-13 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
PR java/17216:
|
||||
|
@ -131,7 +139,7 @@
|
|||
* class.c (build_utf8_ref, build_static_field_ref,
|
||||
make_field_value, make_method_value, get_dispatch_table,
|
||||
make_class_data, emit_symbol_table, emit_catch_table): Likewise.
|
||||
* constants.c (get_tag_node, build_ref_from_constant_pool,
|
||||
* constants.c (get_tag_node, build_ref_from_constant_pool,
|
||||
build_constants_constructor): Likewise.
|
||||
* decl.c (java_init_decl_processing): Likewise.
|
||||
* expr.c (build_java_array_length_access, build_newarray,
|
||||
|
@ -627,7 +635,7 @@
|
|||
set_nested_class_simple_name_value.
|
||||
|
||||
2004-06-22 Andrew Haley <aph@redhat.com>
|
||||
Ranjit Mathew <rmathew@hotmail.com>
|
||||
Ranjit Mathew <rmathew@hotmail.com>
|
||||
|
||||
Fixes PR java/16113.
|
||||
* decl.c (force_poplevels): Remove call to expand_end_bindings.
|
||||
|
@ -699,7 +707,7 @@
|
|||
of unordered conditionals. Add comment.
|
||||
|
||||
2004-05-29 Ranjit Mathew <rmathew@hotmail.com>
|
||||
Per Bothner <per@bothner.com>
|
||||
Per Bothner <per@bothner.com>
|
||||
|
||||
* java-tree.h (DECL_LOCAL_FINAL_IUD): New macro to test if a
|
||||
local variable was initialised upon declaration.
|
||||
|
|
|
@ -141,7 +141,8 @@ java_gimplify_expr (tree *expr_p, tree *pre_p ATTRIBUTE_UNUSED,
|
|||
Parameter lists, maybe? Or perhaps that's unnecessary because
|
||||
the front end already generates SAVE_EXPRs. */
|
||||
|
||||
if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<')
|
||||
if (TREE_CODE_CLASS (code) == tcc_binary
|
||||
|| TREE_CODE_CLASS (code) == tcc_comparison)
|
||||
{
|
||||
enum gimplify_status stat
|
||||
= gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
|
||||
|
|
|
@ -1,33 +1,34 @@
|
|||
/* Shift right, logical. */
|
||||
|
||||
DEFTREECODE (URSHIFT_EXPR, "urshift_expr", '2', 2)
|
||||
DEFTREECODE (URSHIFT_EXPR, "urshift_expr", tcc_binary, 2)
|
||||
|
||||
/* Return -1, 0, 1 depending on whether the first argument is
|
||||
less, equal, or greater to the second argument. */
|
||||
DEFTREECODE (COMPARE_EXPR, "compare_expr", '2', 2)
|
||||
DEFTREECODE (COMPARE_EXPR, "compare_expr", tcc_binary, 2)
|
||||
|
||||
/* Same as COMPARE_EXPR, but if either value is NaN, the result is -1. */
|
||||
DEFTREECODE (COMPARE_L_EXPR, "compare_l_expr", '2', 2)
|
||||
DEFTREECODE (COMPARE_L_EXPR, "compare_l_expr", tcc_binary, 2)
|
||||
/* Same as COMPARE_EXPR, but if either value is NaN, the result is 1. */
|
||||
DEFTREECODE (COMPARE_G_EXPR, "compare_g_expr", '2', 2)
|
||||
DEFTREECODE (COMPARE_G_EXPR, "compare_g_expr", tcc_binary, 2)
|
||||
|
||||
/* Unary plus. Operand 0 is the expression the unary plus is applied
|
||||
to */
|
||||
DEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", '1', 1)
|
||||
DEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", tcc_unary, 1)
|
||||
|
||||
/* New array creation expression.
|
||||
Operand 0 is the array base type.
|
||||
Operand 1 is the list of dimension expressions.
|
||||
Operand 2 is the number of other dimensions of unspecified range.
|
||||
Once patched, the node will bear the type of the created array. */
|
||||
DEFTREECODE (NEW_ARRAY_EXPR, "new_array_expr", 'e', 3)
|
||||
DEFTREECODE (NEW_ARRAY_EXPR, "new_array_expr", tcc_expression, 3)
|
||||
|
||||
/* New anonymous array creation expression.
|
||||
Operand 0 is the base type of the anonymous array.
|
||||
Operand 1 is the signature of the dimensions this array contains.
|
||||
Operand 2 is the anonymous array initializer.
|
||||
Once patched, the node will bear the type of the created array. */
|
||||
DEFTREECODE (NEW_ANONYMOUS_ARRAY_EXPR, "new_anonymous_array", 'e', 3)
|
||||
DEFTREECODE (NEW_ANONYMOUS_ARRAY_EXPR, "new_anonymous_array",
|
||||
tcc_expression, 3)
|
||||
|
||||
/* New class creation expression.
|
||||
Operand 0 is the name of the class to be created
|
||||
|
@ -35,68 +36,69 @@ DEFTREECODE (NEW_ANONYMOUS_ARRAY_EXPR, "new_anonymous_array", 'e', 3)
|
|||
There is no operand 2. That slot is used for the
|
||||
CALL_EXPR_RTL macro (see preexpand_calls).
|
||||
The type should be the one of the created class. */
|
||||
DEFTREECODE (NEW_CLASS_EXPR, "new_class_expr", 'e', 3)
|
||||
DEFTREECODE (NEW_CLASS_EXPR, "new_class_expr", tcc_expression, 3)
|
||||
|
||||
/* Defines `this' as an expression. */
|
||||
DEFTREECODE (THIS_EXPR, "this", '1', 0)
|
||||
DEFTREECODE (THIS_EXPR, "this", tcc_unary, 0)
|
||||
|
||||
/* Case statement expression.
|
||||
Operand 1 is the case value. */
|
||||
DEFTREECODE (CASE_EXPR, "case", 'e', 1)
|
||||
DEFTREECODE (CASE_EXPR, "case", tcc_expression, 1)
|
||||
|
||||
/* Default statement expression. */
|
||||
DEFTREECODE (DEFAULT_EXPR, "default", 'e', 0)
|
||||
DEFTREECODE (DEFAULT_EXPR, "default", tcc_expression, 0)
|
||||
|
||||
/* Try expression
|
||||
Operand 0 is the tried block,
|
||||
Operand 1 contains chained catch nodes. */
|
||||
DEFTREECODE (TRY_EXPR, "try-catch", 'e', 2)
|
||||
DEFTREECODE (TRY_EXPR, "try-catch", tcc_expression, 2)
|
||||
|
||||
/* Catch clause.
|
||||
Operand 0 is the catch clause block, which contains the declaration of
|
||||
the catch clause parameter. */
|
||||
DEFTREECODE (JAVA_CATCH_EXPR, "catch", '1', 1)
|
||||
DEFTREECODE (JAVA_CATCH_EXPR, "catch", tcc_unary, 1)
|
||||
|
||||
/* Synchronized statement.
|
||||
Operand 0 is the expression on which we wish to synchronize,
|
||||
Operand 1 is the synchronized expression block. */
|
||||
DEFTREECODE (SYNCHRONIZED_EXPR, "synchronized", 'e', 2)
|
||||
DEFTREECODE (SYNCHRONIZED_EXPR, "synchronized", tcc_expression, 2)
|
||||
|
||||
/* Throw statement.
|
||||
Operand 0 is the throw expression. */
|
||||
DEFTREECODE (THROW_EXPR, "throw", '1', 1)
|
||||
DEFTREECODE (THROW_EXPR, "throw", tcc_unary, 1)
|
||||
|
||||
/* Conditional operator.
|
||||
Operand 0 is the condition expression
|
||||
Operand 1 is the then-value
|
||||
Operand 2 is the else-value. */
|
||||
DEFTREECODE (CONDITIONAL_EXPR, "?:", 'e', 3)
|
||||
DEFTREECODE (CONDITIONAL_EXPR, "?:", tcc_expression, 3)
|
||||
|
||||
/* instanceof operator.
|
||||
Operand 0 is the expression that is getting tested
|
||||
Operand 1 is the class used for the test. */
|
||||
DEFTREECODE (INSTANCEOF_EXPR, "instanceof", 'e', 2)
|
||||
DEFTREECODE (INSTANCEOF_EXPR, "instanceof", tcc_expression, 2)
|
||||
|
||||
/* Array initializers.
|
||||
Operand 0 is the (sub) array target to initialize, left to NULL_TREE
|
||||
when the node is created.
|
||||
Operand 1 is a CONSTRUCTOR node. */
|
||||
DEFTREECODE (NEW_ARRAY_INIT, "new_array_init", '1', 1)
|
||||
DEFTREECODE (NEW_ARRAY_INIT, "new_array_init", tcc_unary, 1)
|
||||
|
||||
/* Class literal.
|
||||
Operand 0 is the name of the class we're trying to build a
|
||||
reference from. */
|
||||
DEFTREECODE (CLASS_LITERAL, "class_literal", '1', 1)
|
||||
DEFTREECODE (CLASS_LITERAL, "class_literal", tcc_unary, 1)
|
||||
|
||||
/* The Java object within the exception object from the runtime. */
|
||||
DEFTREECODE (JAVA_EXC_OBJ_EXPR, "java_exc_obj_expr", 'e', 0)
|
||||
DEFTREECODE (JAVA_EXC_OBJ_EXPR, "java_exc_obj_expr", tcc_expression, 0)
|
||||
|
||||
/* Annotates a tree node (usually an expression) with source location
|
||||
information: a file name (EXPR_WFL_FILENAME); a line number
|
||||
(EXPR_WFL_LINENO); and column number (EXPR_WFL_COLNO). It is
|
||||
expanded as the contained node (EXPR_WFL_NODE); a line note should
|
||||
be emitted first if EXPR_WFL_EMIT_LINE_NOTE. */
|
||||
DEFTREECODE (EXPR_WITH_FILE_LOCATION, "expr_with_file_location", 'e', 3)
|
||||
DEFTREECODE (EXPR_WITH_FILE_LOCATION, "expr_with_file_location",
|
||||
tcc_expression, 3)
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
|
|
|
@ -2036,8 +2036,7 @@ generate_bytecode_insns (tree exp, int target, struct jcf_partial *state)
|
|||
/* If the rhs is a binary expression and the left operand is
|
||||
`==' to the lhs then we have an OP= expression. In this
|
||||
case we must do some special processing. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (rhs)) == '2'
|
||||
&& lhs == TREE_OPERAND (rhs, 0))
|
||||
if (BINARY_CLASS_P (rhs) && lhs == TREE_OPERAND (rhs, 0))
|
||||
{
|
||||
if (TREE_CODE (lhs) == COMPONENT_REF)
|
||||
{
|
||||
|
|
|
@ -78,9 +78,9 @@ static void java_clear_binding_stack (void);
|
|||
|
||||
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
|
||||
|
||||
const char tree_code_type[] = {
|
||||
const enum tree_code_class tree_code_type[] = {
|
||||
#include "tree.def"
|
||||
'x',
|
||||
tcc_exceptional,
|
||||
#include "java-tree.def"
|
||||
};
|
||||
#undef DEFTREECODE
|
||||
|
@ -430,8 +430,7 @@ put_decl_node (tree node)
|
|||
node = TREE_TYPE (node);
|
||||
was_pointer = 1;
|
||||
}
|
||||
if (TREE_CODE_CLASS (TREE_CODE (node)) == 'd'
|
||||
&& DECL_NAME (node) != NULL_TREE)
|
||||
if (DECL_P (node) && DECL_NAME (node) != NULL_TREE)
|
||||
{
|
||||
if (TREE_CODE (node) == FUNCTION_DECL)
|
||||
{
|
||||
|
@ -464,8 +463,7 @@ put_decl_node (tree node)
|
|||
else
|
||||
put_decl_node (DECL_NAME (node));
|
||||
}
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (node)) == 't'
|
||||
&& TYPE_NAME (node) != NULL_TREE)
|
||||
else if (TYPE_P (node) && TYPE_NAME (node) != NULL_TREE)
|
||||
{
|
||||
if (TREE_CODE (node) == RECORD_TYPE && TYPE_ARRAY_P (node))
|
||||
{
|
||||
|
|
|
@ -1687,7 +1687,7 @@ do_statement:
|
|||
for_statement:
|
||||
for_begin SC_TK expression SC_TK for_update CP_TK statement
|
||||
{
|
||||
if (TREE_CODE_CLASS (TREE_CODE ($3)) == 'c')
|
||||
if (CONSTANT_CLASS_P ($3))
|
||||
$3 = build_wfl_node ($3);
|
||||
$$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);
|
||||
}
|
||||
|
@ -3126,7 +3126,7 @@ find_expr_with_wfl (tree node)
|
|||
{
|
||||
while (node)
|
||||
{
|
||||
char code;
|
||||
enum tree_code_class code;
|
||||
tree to_return;
|
||||
|
||||
switch (TREE_CODE (node))
|
||||
|
@ -3152,7 +3152,8 @@ find_expr_with_wfl (tree node)
|
|||
|
||||
default:
|
||||
code = TREE_CODE_CLASS (TREE_CODE (node));
|
||||
if (((code == '1') || (code == '2') || (code == 'e'))
|
||||
if (((code == tcc_unary) || (code == tcc_binary)
|
||||
|| (code == tcc_expression))
|
||||
&& EXPR_WFL_LINECOL (node))
|
||||
return node;
|
||||
return NULL_TREE;
|
||||
|
@ -14895,8 +14896,7 @@ finish_for_loop (int location, tree condition, tree update, tree body)
|
|||
{
|
||||
/* Try to detect constraint violations. These would be
|
||||
programming errors somewhere. */
|
||||
if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
|
||||
|| TREE_CODE (up2) == LOOP_EXPR)
|
||||
if (! EXPR_P (up2) || TREE_CODE (up2) == LOOP_EXPR)
|
||||
abort ();
|
||||
SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
|
||||
}
|
||||
|
|
|
@ -1420,7 +1420,7 @@ find_induction_var_from_exit_cond (struct loop *loop)
|
|||
if (TREE_CODE (expr) != COND_EXPR)
|
||||
return NULL_TREE;
|
||||
test = TREE_OPERAND (expr, 0);
|
||||
if (TREE_CODE_CLASS (TREE_CODE (test)) != '<')
|
||||
if (!COMPARISON_CLASS_P (test))
|
||||
return NULL_TREE;
|
||||
/* This is a guess. We say that for a <,!=,<= b, a is the induction
|
||||
variable.
|
||||
|
|
|
@ -422,7 +422,7 @@ lhd_tree_dump_type_quals (tree t)
|
|||
tree
|
||||
lhd_expr_size (tree exp)
|
||||
{
|
||||
if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
|
||||
if (DECL_P (exp)
|
||||
&& DECL_SIZE_UNIT (exp) != 0)
|
||||
return DECL_SIZE_UNIT (exp);
|
||||
else
|
||||
|
@ -439,8 +439,8 @@ lhd_gimplify_expr (tree *expr_p ATTRIBUTE_UNUSED, tree *pre_p ATTRIBUTE_UNUSED,
|
|||
}
|
||||
|
||||
/* lang_hooks.tree_size: Determine the size of a tree with code C,
|
||||
which is a language-specific tree code in category 'x'. The
|
||||
default expects never to be called. */
|
||||
which is a language-specific tree code in category tcc_constant or
|
||||
tcc_exceptional. The default expects never to be called. */
|
||||
size_t
|
||||
lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED)
|
||||
{
|
||||
|
|
|
@ -205,9 +205,10 @@ struct lang_hooks
|
|||
identifier nodes long enough for the language-specific slots. */
|
||||
size_t identifier_size;
|
||||
|
||||
/* Determines the size of any language-specific 'x' or 'c' nodes.
|
||||
Since it is called from make_node, the only information available
|
||||
is the tree code. Expected to abort on unrecognized codes. */
|
||||
/* Determines the size of any language-specific tcc_constant or
|
||||
tcc_exceptional nodes. Since it is called from make_node, the
|
||||
only information available is the tree code. Expected to abort
|
||||
on unrecognized codes. */
|
||||
size_t (*tree_size) (enum tree_code);
|
||||
|
||||
/* The first callback made to the front end, for simple
|
||||
|
@ -338,12 +339,12 @@ struct lang_hooks
|
|||
this hook. It should output to stderr. */
|
||||
void (*print_statistics) (void);
|
||||
|
||||
/* Called by print_tree when there is a tree of class 'x' that it
|
||||
doesn't know how to display. */
|
||||
/* Called by print_tree when there is a tree of class tcc_exceptional
|
||||
that it doesn't know how to display. */
|
||||
lang_print_tree_hook print_xnode;
|
||||
|
||||
/* Called to print language-dependent parts of a class 'd', class
|
||||
't', and IDENTIFIER_NODE nodes. */
|
||||
/* Called to print language-dependent parts of tcc_decl, tcc_type,
|
||||
and IDENTIFIER_NODE nodes. */
|
||||
lang_print_tree_hook print_decl;
|
||||
lang_print_tree_hook print_type;
|
||||
lang_print_tree_hook print_identifier;
|
||||
|
|
|
@ -54,11 +54,11 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
|
|||
|
||||
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
|
||||
|
||||
const char tree_code_type[] = {
|
||||
const enum tree_code_class tree_code_type[] = {
|
||||
#include "tree.def"
|
||||
'x',
|
||||
tcc_exceptional,
|
||||
#include "c-common.def"
|
||||
'x',
|
||||
tcc_exceptional,
|
||||
#include "objc-tree.def"
|
||||
};
|
||||
#undef DEFTREECODE
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* This file contains the definitions and documentation for the
|
||||
additional tree codes used in the Objective C front end (see tree.def
|
||||
for the standard codes).
|
||||
Copyright (C) 1990, 1997, 1998, 1999, 2000, 2001, 2003
|
||||
Copyright (C) 1990, 1997, 1998, 1999, 2000, 2001, 2003, 2004
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -23,20 +23,22 @@ Boston, MA 02111-1307, USA. */
|
|||
|
||||
|
||||
/* Objective-C types. */
|
||||
DEFTREECODE (CLASS_INTERFACE_TYPE, "class_interface_type", 't', 0)
|
||||
DEFTREECODE (CLASS_IMPLEMENTATION_TYPE, "class_implementation_type", 't', 0)
|
||||
DEFTREECODE (CATEGORY_INTERFACE_TYPE, "category_interface_type", 't', 0)
|
||||
DEFTREECODE (CATEGORY_IMPLEMENTATION_TYPE,"category_implementation_type", 't', 0)
|
||||
DEFTREECODE (PROTOCOL_INTERFACE_TYPE, "protocol_interface_type", 't', 0)
|
||||
DEFTREECODE (CLASS_INTERFACE_TYPE, "class_interface_type", tcc_type, 0)
|
||||
DEFTREECODE (CLASS_IMPLEMENTATION_TYPE, "class_implementation_type",
|
||||
tcc_type, 0)
|
||||
DEFTREECODE (CATEGORY_INTERFACE_TYPE, "category_interface_type", tcc_type, 0)
|
||||
DEFTREECODE (CATEGORY_IMPLEMENTATION_TYPE,"category_implementation_type",
|
||||
tcc_type, 0)
|
||||
DEFTREECODE (PROTOCOL_INTERFACE_TYPE, "protocol_interface_type", tcc_type, 0)
|
||||
|
||||
/* Objective-C decls. */
|
||||
DEFTREECODE (KEYWORD_DECL, "keyword_decl", 'd', 0)
|
||||
DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", 'd', 0)
|
||||
DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0)
|
||||
DEFTREECODE (KEYWORD_DECL, "keyword_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", tcc_declaration, 0)
|
||||
|
||||
/* Objective-C expressions. */
|
||||
DEFTREECODE (MESSAGE_SEND_EXPR, "message_send_expr", 'e', 3)
|
||||
DEFTREECODE (CLASS_REFERENCE_EXPR, "class_reference_expr", 'e', 1)
|
||||
DEFTREECODE (MESSAGE_SEND_EXPR, "message_send_expr", tcc_expression, 3)
|
||||
DEFTREECODE (CLASS_REFERENCE_EXPR, "class_reference_expr", tcc_expression, 1)
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
|
|
|
@ -1048,7 +1048,7 @@ tree_predict_by_opcode (basic_block bb)
|
|||
if (then_edge->flags & EDGE_TRUE_VALUE)
|
||||
break;
|
||||
cond = TREE_OPERAND (stmt, 0);
|
||||
if (TREE_CODE_CLASS (TREE_CODE (cond)) != '<')
|
||||
if (!COMPARISON_CLASS_P (cond))
|
||||
return;
|
||||
op0 = TREE_OPERAND (cond, 0);
|
||||
type = TREE_TYPE (op0);
|
||||
|
|
|
@ -61,7 +61,7 @@ debug_tree (tree node)
|
|||
void
|
||||
print_node_brief (FILE *file, const char *prefix, tree node, int indent)
|
||||
{
|
||||
char class;
|
||||
enum tree_code_class class;
|
||||
|
||||
if (node == 0)
|
||||
return;
|
||||
|
@ -75,12 +75,12 @@ print_node_brief (FILE *file, const char *prefix, tree node, int indent)
|
|||
fprintf (file, "%s <%s " HOST_PTR_PRINTF,
|
||||
prefix, tree_code_name[(int) TREE_CODE (node)], (char *) node);
|
||||
|
||||
if (class == 'd')
|
||||
if (class == tcc_declaration)
|
||||
{
|
||||
if (DECL_NAME (node))
|
||||
fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
|
||||
}
|
||||
else if (class == 't')
|
||||
else if (class == tcc_type)
|
||||
{
|
||||
if (TYPE_NAME (node))
|
||||
{
|
||||
|
@ -156,7 +156,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
|
|||
int hash;
|
||||
struct bucket *b;
|
||||
enum machine_mode mode;
|
||||
char class;
|
||||
enum tree_code_class class;
|
||||
int len;
|
||||
int first_rtl;
|
||||
int i;
|
||||
|
@ -177,7 +177,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
|
|||
return;
|
||||
}
|
||||
|
||||
if (indent > 8 && (class == 't' || class == 'd'))
|
||||
if (indent > 8 && (class == tcc_type || class == tcc_declaration))
|
||||
{
|
||||
print_node_brief (file, prefix, node, indent);
|
||||
return;
|
||||
|
@ -214,12 +214,12 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
|
|||
prefix, tree_code_name[(int) TREE_CODE (node)], (void *) node);
|
||||
|
||||
/* Print the name, if any. */
|
||||
if (class == 'd')
|
||||
if (class == tcc_declaration)
|
||||
{
|
||||
if (DECL_NAME (node))
|
||||
fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
|
||||
}
|
||||
else if (class == 't')
|
||||
else if (class == tcc_type)
|
||||
{
|
||||
if (TYPE_NAME (node))
|
||||
{
|
||||
|
@ -296,7 +296,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
|
|||
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (node)))
|
||||
{
|
||||
case 'd':
|
||||
case tcc_declaration:
|
||||
mode = DECL_MODE (node);
|
||||
|
||||
if (DECL_UNSIGNED (node))
|
||||
|
@ -461,7 +461,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
|
|||
print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
|
||||
break;
|
||||
|
||||
case 't':
|
||||
case tcc_type:
|
||||
if (TYPE_UNSIGNED (node))
|
||||
fputs (" unsigned", file);
|
||||
|
||||
|
@ -573,12 +573,12 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
|
|||
print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
case '<':
|
||||
case '1':
|
||||
case '2':
|
||||
case 'r':
|
||||
case 's':
|
||||
case tcc_expression:
|
||||
case tcc_comparison:
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_reference:
|
||||
case tcc_statement:
|
||||
if (TREE_CODE (node) == BIT_FIELD_REF && BIT_FIELD_REF_UNSIGNED (node))
|
||||
fputs (" unsigned", file);
|
||||
if (TREE_CODE (node) == BIND_EXPR)
|
||||
|
@ -619,8 +619,8 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
|
|||
print_node (file, "chain", TREE_CHAIN (node), indent + 4);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
case 'x':
|
||||
case tcc_constant:
|
||||
case tcc_exceptional:
|
||||
switch (TREE_CODE (node))
|
||||
{
|
||||
case INTEGER_CST:
|
||||
|
@ -765,7 +765,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
|
|||
break;
|
||||
|
||||
default:
|
||||
if (TREE_CODE_CLASS (TREE_CODE (node)) == 'x')
|
||||
if (EXCEPTIONAL_CLASS_P (node))
|
||||
lang_hooks.print_xnode (file, node, indent);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -2032,7 +2032,7 @@ alter_reg (int i, int from_reg)
|
|||
/* If we have a decl for the original register, set it for the
|
||||
memory. If this is a shared MEM, make a copy. */
|
||||
if (REG_EXPR (regno_reg_rtx[i])
|
||||
&& TREE_CODE_CLASS (TREE_CODE (REG_EXPR (regno_reg_rtx[i]))) == 'd')
|
||||
&& DECL_P (REG_EXPR (regno_reg_rtx[i])))
|
||||
{
|
||||
rtx decl = DECL_RTL_IF_SET (REG_EXPR (regno_reg_rtx[i]));
|
||||
|
||||
|
|
|
@ -1471,16 +1471,14 @@ warn_if_unused_value (tree exp, location_t locus)
|
|||
|
||||
default:
|
||||
/* Referencing a volatile value is a side effect, so don't warn. */
|
||||
if ((DECL_P (exp)
|
||||
|| TREE_CODE_CLASS (TREE_CODE (exp)) == 'r')
|
||||
if ((DECL_P (exp) || REFERENCE_CLASS_P (exp))
|
||||
&& TREE_THIS_VOLATILE (exp))
|
||||
return 0;
|
||||
|
||||
/* If this is an expression which has no operands, there is no value
|
||||
to be unused. There are no such language-independent codes,
|
||||
but front ends may define such. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'e'
|
||||
&& TREE_CODE_LENGTH (TREE_CODE (exp)) == 0)
|
||||
if (EXPRESSION_CLASS_P (exp) && TREE_CODE_LENGTH (TREE_CODE (exp)) == 0)
|
||||
return 0;
|
||||
|
||||
maybe_warn:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Tree browser.
|
||||
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
Contributed by Sebastian Pop <s.pop@laposte.net>
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -262,14 +262,14 @@ browse_tree (tree begin)
|
|||
break;
|
||||
|
||||
case TB_REFERENCE_TO_THIS:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
|
||||
if (head && TYPE_P (head))
|
||||
TB_SET_HEAD (TYPE_REFERENCE_TO (head));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_POINTER_TO_THIS:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
|
||||
if (head && TYPE_P (head))
|
||||
TB_SET_HEAD (TYPE_POINTER_TO (head));
|
||||
else
|
||||
TB_WF;
|
||||
|
@ -338,28 +338,28 @@ browse_tree (tree begin)
|
|||
break;
|
||||
|
||||
case TB_INITIAL:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
|
||||
if (head && DECL_P (head))
|
||||
TB_SET_HEAD (DECL_INITIAL (head));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_RESULT:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
|
||||
if (head && DECL_P (head))
|
||||
TB_SET_HEAD (DECL_RESULT_FLD (head));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_ARGUMENTS:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
|
||||
if (head && DECL_P (head))
|
||||
TB_SET_HEAD (DECL_ARGUMENTS (head));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_ABSTRACT_ORIGIN:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
|
||||
if (head && DECL_P (head))
|
||||
TB_SET_HEAD (DECL_ABSTRACT_ORIGIN (head));
|
||||
else if (head && TREE_CODE (head) == BLOCK)
|
||||
TB_SET_HEAD (BLOCK_ABSTRACT_ORIGIN (head));
|
||||
|
@ -368,18 +368,18 @@ browse_tree (tree begin)
|
|||
break;
|
||||
|
||||
case TB_ATTRIBUTES:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
|
||||
if (head && DECL_P (head))
|
||||
TB_SET_HEAD (DECL_ATTRIBUTES (head));
|
||||
else if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
|
||||
else if (head && TYPE_P (head))
|
||||
TB_SET_HEAD (TYPE_ATTRIBUTES (head));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_CONTEXT:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
|
||||
if (head && DECL_P (head))
|
||||
TB_SET_HEAD (DECL_CONTEXT (head));
|
||||
else if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't'
|
||||
else if (head && TYPE_P (head)
|
||||
&& TYPE_CONTEXT (head))
|
||||
TB_SET_HEAD (TYPE_CONTEXT (head));
|
||||
else
|
||||
|
@ -401,18 +401,18 @@ browse_tree (tree begin)
|
|||
break;
|
||||
|
||||
case TB_UNIT_SIZE:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
|
||||
if (head && DECL_P (head))
|
||||
TB_SET_HEAD (DECL_SIZE_UNIT (head));
|
||||
else if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
|
||||
else if (head && TYPE_P (head))
|
||||
TB_SET_HEAD (TYPE_SIZE_UNIT (head));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_SIZE:
|
||||
if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
|
||||
if (head && DECL_P (head))
|
||||
TB_SET_HEAD (DECL_SIZE (head));
|
||||
else if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
|
||||
else if (head && TYPE_P (head))
|
||||
TB_SET_HEAD (TYPE_SIZE (head));
|
||||
else
|
||||
TB_WF;
|
||||
|
@ -441,32 +441,28 @@ browse_tree (tree begin)
|
|||
break;
|
||||
|
||||
case TB_CHILD_0:
|
||||
if (head && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (head)))
|
||||
&& TREE_OPERAND (head, 0))
|
||||
if (head && EXPR_P (head) && TREE_OPERAND (head, 0))
|
||||
TB_SET_HEAD (TREE_OPERAND (head, 0));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_CHILD_1:
|
||||
if (head && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (head)))
|
||||
&& TREE_OPERAND (head, 1))
|
||||
if (head && EXPR_P (head) && TREE_OPERAND (head, 1))
|
||||
TB_SET_HEAD (TREE_OPERAND (head, 1));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_CHILD_2:
|
||||
if (head && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (head)))
|
||||
&& TREE_OPERAND (head, 2))
|
||||
if (head && EXPR_P (head) && TREE_OPERAND (head, 2))
|
||||
TB_SET_HEAD (TREE_OPERAND (head, 2));
|
||||
else
|
||||
TB_WF;
|
||||
break;
|
||||
|
||||
case TB_CHILD_3:
|
||||
if (head && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (head)))
|
||||
&& TREE_OPERAND (head, 3))
|
||||
if (head && EXPR_P (head) && TREE_OPERAND (head, 3))
|
||||
TB_SET_HEAD (TREE_OPERAND (head, 3));
|
||||
else
|
||||
TB_WF;
|
||||
|
@ -751,7 +747,7 @@ store_child_info (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
|
|||
node = *tp;
|
||||
|
||||
/* 'node' is the parent of 'TREE_OPERAND (node, *)'. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (node)) == 'e')
|
||||
if (EXPRESSION_CLASS_P (node))
|
||||
{
|
||||
|
||||
#define STORE_CHILD(N) do { \
|
||||
|
@ -808,7 +804,7 @@ TB_parent_eq (const void *p1, const void *p2)
|
|||
if (p1 == NULL || p2 == NULL)
|
||||
return 0;
|
||||
|
||||
if (TREE_CODE_CLASS(TREE_CODE(parent)) == 'e')
|
||||
if (EXPRESSION_CLASS_P (parent))
|
||||
{
|
||||
|
||||
#define TEST_CHILD(N) do { \
|
||||
|
|
|
@ -2004,7 +2004,7 @@ find_taken_edge (basic_block bb, tree val)
|
|||
SSA_NAME, we can always determine its truth value (except when
|
||||
doing floating point comparisons that may involve NaNs). */
|
||||
if (val
|
||||
&& TREE_CODE_CLASS (TREE_CODE (val)) == '<'
|
||||
&& COMPARISON_CLASS_P (val)
|
||||
&& TREE_OPERAND (val, 0) == TREE_OPERAND (val, 1)
|
||||
&& TREE_CODE (TREE_OPERAND (val, 0)) == SSA_NAME
|
||||
&& (TREE_CODE (TREE_TYPE (TREE_OPERAND (val, 0))) != REAL_TYPE
|
||||
|
@ -3085,8 +3085,8 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
|
|||
We check for constants explicitly since they are not considered
|
||||
gimple invariants if they overflowed. */
|
||||
#define CHECK_OP(N, MSG) \
|
||||
do { if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, N))) != 'c' \
|
||||
&& !is_gimple_val (TREE_OPERAND (t, N))) \
|
||||
do { if (!CONSTANT_CLASS_P (TREE_OPERAND (t, N)) \
|
||||
&& !is_gimple_val (TREE_OPERAND (t, N))) \
|
||||
{ error (MSG); return TREE_OPERAND (t, N); }} while (0)
|
||||
|
||||
switch (TREE_CODE (t))
|
||||
|
@ -3187,8 +3187,7 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
|
|||
t = TREE_OPERAND (t, 0);
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (t)) != 'c'
|
||||
&& !is_gimple_lvalue (t))
|
||||
if (!CONSTANT_CLASS_P (t) && !is_gimple_lvalue (t))
|
||||
{
|
||||
error ("Invalid reference prefix.");
|
||||
return t;
|
||||
|
@ -3298,10 +3297,10 @@ verify_stmt (tree stmt, bool last_in_block)
|
|||
static bool
|
||||
tree_node_can_be_shared (tree t)
|
||||
{
|
||||
if (TYPE_P (t) || DECL_P (t)
|
||||
if (IS_TYPE_OR_DECL_P (t)
|
||||
/* We check for constants explicitly since they are not considered
|
||||
gimple invariants if they overflowed. */
|
||||
|| TREE_CODE_CLASS (TREE_CODE (t)) == 'c'
|
||||
|| CONSTANT_CLASS_P (t)
|
||||
|| is_gimple_min_invariant (t)
|
||||
|| TREE_CODE (t) == SSA_NAME)
|
||||
return true;
|
||||
|
@ -3309,7 +3308,7 @@ tree_node_can_be_shared (tree t)
|
|||
while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
|
||||
/* We check for constants explicitly since they are not considered
|
||||
gimple invariants if they overflowed. */
|
||||
&& (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 1))) == 'c'
|
||||
&& (CONSTANT_CLASS_P (TREE_OPERAND (t, 1))
|
||||
|| is_gimple_min_invariant (TREE_OPERAND (t, 1))))
|
||||
|| (TREE_CODE (t) == COMPONENT_REF
|
||||
|| TREE_CODE (t) == REALPART_EXPR
|
||||
|
|
|
@ -932,7 +932,7 @@ chrec_convert (tree type,
|
|||
|
||||
/* Don't propagate overflows. */
|
||||
TREE_OVERFLOW (res) = 0;
|
||||
if (TREE_CODE_CLASS (TREE_CODE (res)) == 'c')
|
||||
if (CONSTANT_CLASS_P (res))
|
||||
TREE_CONSTANT_OVERFLOW (res) = 0;
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -425,7 +425,7 @@ expand_complex_operations_1 (block_stmt_iterator *bsi)
|
|||
ar = extract_component (bsi, ac, 0);
|
||||
ai = extract_component (bsi, ac, 1);
|
||||
|
||||
if (TREE_CODE_CLASS (code) == '1')
|
||||
if (TREE_CODE_CLASS (code) == tcc_unary)
|
||||
bc = br = bi = NULL;
|
||||
else
|
||||
{
|
||||
|
@ -776,8 +776,8 @@ expand_vector_operations_1 (block_stmt_iterator *bsi)
|
|||
return;
|
||||
|
||||
code = TREE_CODE (rhs);
|
||||
if (TREE_CODE_CLASS (code) != '1'
|
||||
&& TREE_CODE_CLASS (code) != '2')
|
||||
if (TREE_CODE_CLASS (code) != tcc_unary
|
||||
&& TREE_CODE_CLASS (code) != tcc_binary)
|
||||
return;
|
||||
|
||||
if (code == NOP_EXPR || code == VIEW_CONVERT_EXPR)
|
||||
|
@ -872,7 +872,7 @@ expand_vector_operations_1 (block_stmt_iterator *bsi)
|
|||
break;
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (code) == '1')
|
||||
if (TREE_CODE_CLASS (code) == tcc_unary)
|
||||
*p_rhs = expand_vector_piecewise (bsi, do_unop, type, compute_type,
|
||||
TREE_OPERAND (rhs, 0),
|
||||
NULL_TREE, code);
|
||||
|
|
|
@ -847,9 +847,7 @@ find_vars_r (tree *tp, int *walk_subtrees, void *data)
|
|||
|
||||
/* Type, _DECL and constant nodes have no interesting children.
|
||||
Ignore them. */
|
||||
else if (DECL_P (*tp)
|
||||
|| TYPE_P (*tp)
|
||||
|| TREE_CODE_CLASS (TREE_CODE (*tp)) == 'c')
|
||||
else if (IS_TYPE_OR_DECL_P (*tp) || CONSTANT_CLASS_P (*tp))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
return NULL_TREE;
|
||||
|
|
|
@ -216,7 +216,7 @@ dequeue_and_dump (dump_info_p di)
|
|||
tree t;
|
||||
unsigned int index;
|
||||
enum tree_code code;
|
||||
char code_class;
|
||||
enum tree_code_class code_class;
|
||||
const char* code_name;
|
||||
|
||||
/* Get the next node from the queue. */
|
||||
|
@ -292,19 +292,19 @@ dequeue_and_dump (dump_info_p di)
|
|||
|
||||
switch (code_class)
|
||||
{
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
dump_child ("op 0", TREE_OPERAND (t, 0));
|
||||
break;
|
||||
|
||||
case '2':
|
||||
case '<':
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
dump_child ("op 0", TREE_OPERAND (t, 0));
|
||||
dump_child ("op 1", TREE_OPERAND (t, 1));
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
case 'r':
|
||||
case 's':
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
case tcc_statement:
|
||||
/* These nodes are handled explicitly below. */
|
||||
break;
|
||||
|
||||
|
@ -346,7 +346,7 @@ dequeue_and_dump (dump_info_p di)
|
|||
if (TREE_CHAIN (t) && !dump_flag (di, TDF_SLIM, NULL))
|
||||
dump_child ("chan", TREE_CHAIN (t));
|
||||
}
|
||||
else if (code_class == 't')
|
||||
else if (code_class == tcc_type)
|
||||
{
|
||||
/* All types have qualifiers. */
|
||||
int quals = lang_hooks.tree_dump.type_quals (t);
|
||||
|
@ -373,7 +373,7 @@ dequeue_and_dump (dump_info_p di)
|
|||
/* All types have alignments. */
|
||||
dump_int (di, "algn", TYPE_ALIGN (t));
|
||||
}
|
||||
else if (code_class == 'c')
|
||||
else if (code_class == tcc_constant)
|
||||
/* All constants can have types. */
|
||||
queue_and_dump_type (di, t);
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Exception handling semantics and decomposition for trees.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -1719,9 +1719,9 @@ tree_could_trap_p (tree expr)
|
|||
bool honor_trapv = false;
|
||||
tree t, base, idx;
|
||||
|
||||
if (TREE_CODE_CLASS (code) == '<'
|
||||
|| TREE_CODE_CLASS (code) == '1'
|
||||
|| TREE_CODE_CLASS (code) == '2')
|
||||
if (TREE_CODE_CLASS (code) == tcc_comparison
|
||||
|| TREE_CODE_CLASS (code) == tcc_unary
|
||||
|| TREE_CODE_CLASS (code) == tcc_binary)
|
||||
{
|
||||
t = TREE_TYPE (expr);
|
||||
fp_operation = FLOAT_TYPE_P (t);
|
||||
|
|
|
@ -201,9 +201,9 @@ is_gimple_formal_tmp_rhs (tree t)
|
|||
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case '1':
|
||||
case '2':
|
||||
case '<':
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
return true;
|
||||
|
||||
default:
|
||||
|
@ -312,8 +312,7 @@ is_gimple_lvalue (tree t)
|
|||
bool
|
||||
is_gimple_condexpr (tree t)
|
||||
{
|
||||
return (is_gimple_val (t)
|
||||
|| TREE_CODE_CLASS (TREE_CODE (t)) == '<');
|
||||
return (is_gimple_val (t) || COMPARISON_CLASS_P (t));
|
||||
}
|
||||
|
||||
/* Return true if T is something whose address can be taken. */
|
||||
|
@ -579,7 +578,7 @@ recalculate_side_effects (tree t)
|
|||
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
switch (code)
|
||||
{
|
||||
case INIT_EXPR:
|
||||
|
@ -598,10 +597,10 @@ recalculate_side_effects (tree t)
|
|||
}
|
||||
/* Fall through. */
|
||||
|
||||
case '<': /* a comparison expression */
|
||||
case '1': /* a unary arithmetic expression */
|
||||
case '2': /* a binary arithmetic expression */
|
||||
case 'r': /* a reference */
|
||||
case tcc_comparison: /* a comparison expression */
|
||||
case tcc_unary: /* a unary arithmetic expression */
|
||||
case tcc_binary: /* a binary arithmetic expression */
|
||||
case tcc_reference: /* a reference */
|
||||
TREE_SIDE_EFFECTS (t) = TREE_THIS_VOLATILE (t);
|
||||
for (i = 0; i < fro; ++i)
|
||||
{
|
||||
|
@ -610,5 +609,9 @@ recalculate_side_effects (tree t)
|
|||
TREE_SIDE_EFFECTS (t) = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Can never be used with non-expressions. */
|
||||
gcc_unreachable ();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1159,7 +1159,7 @@ estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
|
|||
int *count = data;
|
||||
tree x = *tp;
|
||||
|
||||
if (TYPE_P (x) || DECL_P (x))
|
||||
if (IS_TYPE_OR_DECL_P (x))
|
||||
{
|
||||
*walk_subtrees = 0;
|
||||
return NULL;
|
||||
|
@ -1167,8 +1167,7 @@ estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
|
|||
/* Assume that constants and references counts nothing. These should
|
||||
be majorized by amount of operations among them we count later
|
||||
and are common target of CSE and similar optimizations. */
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (x)) == 'c'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (x)) == 'r')
|
||||
else if (CONSTANT_CLASS_P (x) || REFERENCE_CLASS_P (x))
|
||||
return NULL;
|
||||
|
||||
switch (TREE_CODE (x))
|
||||
|
@ -2258,7 +2257,7 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
|
|||
|
||||
/* We make copies of most nodes. */
|
||||
if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
|
||||
|| TREE_CODE_CLASS (code) == 'c'
|
||||
|| TREE_CODE_CLASS (code) == tcc_constant
|
||||
|| code == TREE_LIST
|
||||
|| code == TREE_VEC
|
||||
|| code == TYPE_DECL)
|
||||
|
@ -2288,9 +2287,9 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
|
|||
BIND_EXPR_BLOCK (*tp) = NULL_TREE;
|
||||
}
|
||||
|
||||
else if (TREE_CODE_CLASS (code) == 't')
|
||||
else if (TREE_CODE_CLASS (code) == tcc_type)
|
||||
*walk_subtrees = 0;
|
||||
else if (TREE_CODE_CLASS (code) == 'd')
|
||||
else if (TREE_CODE_CLASS (code) == tcc_declaration)
|
||||
*walk_subtrees = 0;
|
||||
else
|
||||
gcc_assert (code != STATEMENT_LIST);
|
||||
|
|
|
@ -831,7 +831,7 @@ convert_nonlocal_reference (tree *tp, int *walk_subtrees, void *data)
|
|||
break;
|
||||
|
||||
default:
|
||||
if (!DECL_P (t) && !TYPE_P (t))
|
||||
if (!IS_TYPE_OR_DECL_P (t))
|
||||
{
|
||||
*walk_subtrees = 1;
|
||||
wi->val_only = true;
|
||||
|
@ -945,7 +945,7 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data)
|
|||
break;
|
||||
|
||||
default:
|
||||
if (!DECL_P (t) && !TYPE_P (t))
|
||||
if (!IS_TYPE_OR_DECL_P (t))
|
||||
{
|
||||
*walk_subtrees = 1;
|
||||
wi->val_only = true;
|
||||
|
@ -1124,7 +1124,7 @@ convert_tramp_reference (tree *tp, int *walk_subtrees, void *data)
|
|||
break;
|
||||
|
||||
default:
|
||||
if (!DECL_P (t) && !TYPE_P (t))
|
||||
if (!IS_TYPE_OR_DECL_P (t))
|
||||
*walk_subtrees = 1;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1750,7 +1750,7 @@ discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
|
|||
{
|
||||
tree t = *tp;
|
||||
|
||||
if (TYPE_P (t) || DECL_P (t))
|
||||
if (IS_TYPE_OR_DECL_P (t))
|
||||
*walk_subtrees = 0;
|
||||
else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
|
||||
{
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Pretty formatting of GENERIC trees in C syntax.
|
||||
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -70,7 +70,7 @@ do_niy (pretty_printer *buffer, tree node)
|
|||
pp_string (buffer, "<<< Unknown tree: ");
|
||||
pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
|
||||
|
||||
if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
|
||||
if (EXPR_P (node))
|
||||
{
|
||||
len = first_rtl_op (TREE_CODE (node));
|
||||
for (i = 0; i < len; ++i)
|
||||
|
@ -303,7 +303,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
|
|||
case CHAR_TYPE:
|
||||
{
|
||||
unsigned int quals = TYPE_QUALS (node);
|
||||
char class;
|
||||
enum tree_code_class class;
|
||||
|
||||
if (quals & TYPE_QUAL_CONST)
|
||||
pp_string (buffer, "const ");
|
||||
|
@ -314,14 +314,14 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
|
|||
|
||||
class = TREE_CODE_CLASS (TREE_CODE (node));
|
||||
|
||||
if (class == 'd')
|
||||
if (class == tcc_declaration)
|
||||
{
|
||||
if (DECL_NAME (node))
|
||||
dump_decl_name (buffer, node, flags);
|
||||
else
|
||||
pp_string (buffer, "<unnamed type decl>");
|
||||
}
|
||||
else if (class == 't')
|
||||
else if (class == tcc_type)
|
||||
{
|
||||
if (TYPE_NAME (node))
|
||||
{
|
||||
|
@ -1330,9 +1330,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
|
|||
|
||||
case GOTO_EXPR:
|
||||
op0 = GOTO_DESTINATION (node);
|
||||
if (TREE_CODE (op0) != SSA_NAME
|
||||
&& DECL_P (op0)
|
||||
&& DECL_NAME (op0))
|
||||
if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
|
||||
{
|
||||
const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
|
||||
if (strcmp (name, "break") == 0
|
||||
|
|
|
@ -1553,7 +1553,7 @@ find_new_referenced_vars_1 (tree *tp, int *walk_subtrees,
|
|||
if (TREE_CODE (t) == VAR_DECL && !var_ann (t))
|
||||
add_referenced_tmp_var (t);
|
||||
|
||||
if (DECL_P (t) || TYPE_P (t))
|
||||
if (IS_TYPE_OR_DECL_P (t))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
return NULL;
|
||||
|
@ -1903,7 +1903,7 @@ mark_notrap (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
|
|||
TREE_THIS_NOTRAP (t) = 1;
|
||||
*walk_subtrees = 0;
|
||||
}
|
||||
else if (DECL_P (t) || TYPE_P (t))
|
||||
else if (IS_TYPE_OR_DECL_P (t))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
return NULL;
|
||||
|
|
|
@ -1790,7 +1790,7 @@ add_pointed_to_var (struct alias_info *ai, tree ptr, tree value)
|
|||
gcc_assert (TREE_CODE (value) == ADDR_EXPR);
|
||||
|
||||
pt_var = TREE_OPERAND (value, 0);
|
||||
if (TREE_CODE_CLASS (TREE_CODE (pt_var)) == 'r')
|
||||
if (REFERENCE_CLASS_P (pt_var))
|
||||
pt_var = get_base_address (pt_var);
|
||||
|
||||
if (pt_var && SSA_VAR_P (pt_var))
|
||||
|
|
|
@ -787,7 +787,7 @@ ccp_fold (tree stmt)
|
|||
{
|
||||
tree rhs = get_rhs (stmt);
|
||||
enum tree_code code = TREE_CODE (rhs);
|
||||
int kind = TREE_CODE_CLASS (code);
|
||||
enum tree_code_class kind = TREE_CODE_CLASS (code);
|
||||
tree retval = NULL_TREE;
|
||||
vuse_optype vuses;
|
||||
|
||||
|
@ -805,7 +805,7 @@ ccp_fold (tree stmt)
|
|||
/* Unary operators. Note that we know the single operand must
|
||||
be a constant. So this should almost always return a
|
||||
simplified RHS. */
|
||||
if (kind == '1')
|
||||
if (kind == tcc_unary)
|
||||
{
|
||||
/* Handle unary operators which can appear in GIMPLE form. */
|
||||
tree op0 = TREE_OPERAND (rhs, 0);
|
||||
|
@ -845,8 +845,8 @@ ccp_fold (tree stmt)
|
|||
|
||||
/* Binary and comparison operators. We know one or both of the
|
||||
operands are constants. */
|
||||
else if (kind == '2'
|
||||
|| kind == '<'
|
||||
else if (kind == tcc_binary
|
||||
|| kind == tcc_comparison
|
||||
|| code == TRUTH_AND_EXPR
|
||||
|| code == TRUTH_OR_EXPR
|
||||
|| code == TRUTH_XOR_EXPR)
|
||||
|
@ -2035,7 +2035,8 @@ fold_stmt (tree *stmt_p)
|
|||
if (TREE_CODE (callee) == OBJ_TYPE_REF
|
||||
&& lang_hooks.fold_obj_type_ref
|
||||
&& TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR
|
||||
&& DECL_P (TREE_OPERAND (OBJ_TYPE_REF_OBJECT (callee), 0)))
|
||||
&& DECL_P (TREE_OPERAND
|
||||
(OBJ_TYPE_REF_OBJECT (callee), 0)))
|
||||
{
|
||||
tree t;
|
||||
|
||||
|
|
|
@ -402,7 +402,7 @@ mark_stmt_if_obviously_necessary (tree stmt, bool aggressive)
|
|||
a global variable. Otherwise, we check if the base variable
|
||||
is a global. */
|
||||
lhs = TREE_OPERAND (stmt, 0);
|
||||
if (TREE_CODE_CLASS (TREE_CODE (lhs)) == 'r')
|
||||
if (REFERENCE_CLASS_P (lhs))
|
||||
lhs = get_base_address (lhs);
|
||||
|
||||
if (lhs == NULL_TREE)
|
||||
|
|
|
@ -616,7 +616,7 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
|
|||
else
|
||||
cond = SWITCH_COND (stmt);
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (cond)) == '<')
|
||||
if (COMPARISON_CLASS_P (cond))
|
||||
{
|
||||
tree dummy_cond, op0, op1;
|
||||
enum tree_code cond_code;
|
||||
|
@ -776,8 +776,7 @@ initialize_hash_element (tree expr, tree lhs, struct expr_hash_elt *element)
|
|||
For the former case, we have no annotation and we want to hash the
|
||||
conditional expression. In the latter case we have an annotation and
|
||||
we want to record the expression the statement evaluates. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (expr)) == '<'
|
||||
|| TREE_CODE (expr) == TRUTH_NOT_EXPR)
|
||||
if (COMPARISON_CLASS_P (expr) || TREE_CODE (expr) == TRUTH_NOT_EXPR)
|
||||
{
|
||||
element->ann = NULL;
|
||||
element->rhs = expr;
|
||||
|
@ -932,7 +931,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
|
|||
}
|
||||
else if ((last = last_stmt (bb))
|
||||
&& TREE_CODE (last) == COND_EXPR
|
||||
&& (TREE_CODE_CLASS (TREE_CODE (COND_EXPR_COND (last))) == '<'
|
||||
&& (COMPARISON_CLASS_P (COND_EXPR_COND (last))
|
||||
|| TREE_CODE (COND_EXPR_COND (last)) == SSA_NAME)
|
||||
&& bb->succ
|
||||
&& (bb->succ->flags & EDGE_ABNORMAL) == 0
|
||||
|
@ -949,7 +948,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
|
|||
cond = COND_EXPR_COND (last);
|
||||
cond_code = TREE_CODE (cond);
|
||||
|
||||
if (TREE_CODE_CLASS (cond_code) == '<')
|
||||
if (TREE_CODE_CLASS (cond_code) == tcc_comparison)
|
||||
inverted = invert_truthvalue (cond);
|
||||
|
||||
/* If the THEN arm is the end of a dominator tree or has PHI nodes,
|
||||
|
@ -965,7 +964,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
|
|||
VARRAY_PUSH_TREE (const_and_copies_stack, NULL_TREE);
|
||||
|
||||
/* Record any equivalences created by following this edge. */
|
||||
if (TREE_CODE_CLASS (cond_code) == '<')
|
||||
if (TREE_CODE_CLASS (cond_code) == tcc_comparison)
|
||||
{
|
||||
record_cond (cond, boolean_true_node);
|
||||
record_dominating_conditions (cond);
|
||||
|
@ -989,7 +988,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
|
|||
|| phi_nodes (false_edge->dest))
|
||||
{
|
||||
/* Record any equivalences created by following this edge. */
|
||||
if (TREE_CODE_CLASS (cond_code) == '<')
|
||||
if (TREE_CODE_CLASS (cond_code) == tcc_comparison)
|
||||
{
|
||||
record_cond (cond, boolean_false_node);
|
||||
record_cond (inverted, boolean_true_node);
|
||||
|
@ -1699,10 +1698,9 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
|
|||
/* If the result is a suitable looking gimple expression,
|
||||
then use it instead of the original for STMT. */
|
||||
if (TREE_CODE (t) == SSA_NAME
|
||||
|| (TREE_CODE_CLASS (TREE_CODE (t)) == '1'
|
||||
|| (UNARY_CLASS_P (t)
|
||||
&& TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME)
|
||||
|| ((TREE_CODE_CLASS (TREE_CODE (t)) == '2'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (t)) == '<')
|
||||
|| ((BINARY_CLASS_P (t) || COMPARISON_CLASS_P (t))
|
||||
&& TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
|
||||
&& is_gimple_val (TREE_OPERAND (t, 1))))
|
||||
result = update_rhs_and_lookup_avail_expr (stmt, t, insert);
|
||||
|
@ -1920,7 +1918,7 @@ simplify_cond_and_lookup_avail_expr (tree stmt,
|
|||
{
|
||||
tree cond = COND_EXPR_COND (stmt);
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (cond)) == '<')
|
||||
if (COMPARISON_CLASS_P (cond))
|
||||
{
|
||||
tree op0 = TREE_OPERAND (cond, 0);
|
||||
tree op1 = TREE_OPERAND (cond, 1);
|
||||
|
@ -3023,7 +3021,7 @@ record_range (tree cond, basic_block bb, varray_type *vrp_variables_p)
|
|||
{
|
||||
/* We explicitly ignore NE_EXPRs. They rarely allow for meaningful
|
||||
range optimizations and significantly complicate the implementation. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (cond)) == '<'
|
||||
if (COMPARISON_CLASS_P (cond)
|
||||
&& TREE_CODE (cond) != NE_EXPR
|
||||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (cond, 1))) == INTEGER_TYPE)
|
||||
{
|
||||
|
@ -3091,7 +3089,7 @@ get_eq_expr_value (tree if_stmt,
|
|||
|
||||
/* If we have a comparison expression, then record its result into
|
||||
the available expression table. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (cond)) == '<')
|
||||
if (COMPARISON_CLASS_P (cond))
|
||||
{
|
||||
tree op0 = TREE_OPERAND (cond, 0);
|
||||
tree op1 = TREE_OPERAND (cond, 1);
|
||||
|
|
|
@ -172,7 +172,7 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
|
|||
if (cond_code == SSA_NAME
|
||||
|| ((cond_code == EQ_EXPR || cond_code == NE_EXPR)
|
||||
&& TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
|
||||
&& TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (cond, 1))) == 'c'
|
||||
&& CONSTANT_CLASS_P (TREE_OPERAND (cond, 1))
|
||||
&& INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 1)))))
|
||||
{
|
||||
tree def;
|
||||
|
@ -209,7 +209,7 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
|
|||
/* The first operand must be an SSA_NAME and the second
|
||||
operand must be a constant. */
|
||||
if (TREE_CODE (op0) != SSA_NAME
|
||||
|| TREE_CODE_CLASS (TREE_CODE (op1)) != 'c'
|
||||
|| !CONSTANT_CLASS_P (op1)
|
||||
|| !INTEGRAL_TYPE_P (TREE_TYPE (op1)))
|
||||
continue;
|
||||
}
|
||||
|
@ -223,7 +223,7 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
|
|||
/* If TEST_VAR is set from a relational operation
|
||||
between two SSA_NAMEs or a combination of an SSA_NAME
|
||||
and a constant, then it is interesting. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (def_rhs)) == '<')
|
||||
if (COMPARISON_CLASS_P (def_rhs))
|
||||
{
|
||||
tree op0 = TREE_OPERAND (def_rhs, 0);
|
||||
tree op1 = TREE_OPERAND (def_rhs, 1);
|
||||
|
@ -364,7 +364,7 @@ substitute_single_use_vars (varray_type *cond_worklist,
|
|||
new_cond = build (cond_code, boolean_type_node, op0, t);
|
||||
}
|
||||
/* If the variable is defined by a conditional expression... */
|
||||
else if (TREE_CODE_CLASS (def_rhs_code) == '<')
|
||||
else if (TREE_CODE_CLASS (def_rhs_code) == tcc_comparison)
|
||||
{
|
||||
/* TEST_VAR was set from a relational operator. */
|
||||
tree op0 = TREE_OPERAND (def_rhs, 0);
|
||||
|
@ -382,7 +382,7 @@ substitute_single_use_vars (varray_type *cond_worklist,
|
|||
|
||||
/* If we did not get a simple relational expression or
|
||||
bare SSA_NAME, then we can not optimize this case. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (new_cond)) != '<'
|
||||
if (!COMPARISON_CLASS_P (new_cond)
|
||||
&& TREE_CODE (new_cond) != SSA_NAME)
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Liveness for SSA trees.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
Contributed by Andrew MacLeod <amacleod@redhat.com>
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -297,7 +297,7 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
|
|||
if (TREE_CODE (t) == VAR_DECL)
|
||||
set_is_used (t);
|
||||
|
||||
if (DECL_P (t) || TYPE_P (t))
|
||||
if (IS_TYPE_OR_DECL_P (t))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
return NULL;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Loop invariant motion.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -256,7 +256,7 @@ outermost_invariant_loop (tree def, struct loop *loop)
|
|||
static struct loop *
|
||||
outermost_invariant_loop_expr (tree expr, struct loop *loop)
|
||||
{
|
||||
char class = TREE_CODE_CLASS (TREE_CODE (expr));
|
||||
enum tree_code_class class = TREE_CODE_CLASS (TREE_CODE (expr));
|
||||
unsigned i, nops;
|
||||
struct loop *max_loop = superloop_at_depth (loop, 1), *aloop;
|
||||
|
||||
|
@ -265,10 +265,10 @@ outermost_invariant_loop_expr (tree expr, struct loop *loop)
|
|||
|| is_gimple_min_invariant (expr))
|
||||
return outermost_invariant_loop (expr, loop);
|
||||
|
||||
if (class != '1'
|
||||
&& class != '2'
|
||||
&& class != 'e'
|
||||
&& class != '<')
|
||||
if (class != tcc_unary
|
||||
&& class != tcc_binary
|
||||
&& class != tcc_expression
|
||||
&& class != tcc_comparison)
|
||||
return NULL;
|
||||
|
||||
nops = first_rtl_op (TREE_CODE (expr));
|
||||
|
@ -714,7 +714,7 @@ may_move_till (tree ref, tree *index, void *data)
|
|||
static void
|
||||
force_move_till_expr (tree expr, struct loop *orig_loop, struct loop *loop)
|
||||
{
|
||||
char class = TREE_CODE_CLASS (TREE_CODE (expr));
|
||||
enum tree_code_class class = TREE_CODE_CLASS (TREE_CODE (expr));
|
||||
unsigned i, nops;
|
||||
|
||||
if (TREE_CODE (expr) == SSA_NAME)
|
||||
|
@ -727,10 +727,10 @@ force_move_till_expr (tree expr, struct loop *orig_loop, struct loop *loop)
|
|||
return;
|
||||
}
|
||||
|
||||
if (class != '1'
|
||||
&& class != '2'
|
||||
&& class != 'e'
|
||||
&& class != '<')
|
||||
if (class != tcc_unary
|
||||
&& class != tcc_binary
|
||||
&& class != tcc_expression
|
||||
&& class != tcc_comparison)
|
||||
return;
|
||||
|
||||
nops = first_rtl_op (TREE_CODE (expr));
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Induction variable optimizations.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -721,7 +721,7 @@ static bool
|
|||
contains_abnormal_ssa_name_p (tree expr)
|
||||
{
|
||||
enum tree_code code = TREE_CODE (expr);
|
||||
char class = TREE_CODE_CLASS (code);
|
||||
enum tree_code_class class = TREE_CODE_CLASS (code);
|
||||
|
||||
if (code == SSA_NAME)
|
||||
return SSA_NAME_OCCURS_IN_ABNORMAL_PHI (expr) != 0;
|
||||
|
@ -737,13 +737,13 @@ contains_abnormal_ssa_name_p (tree expr)
|
|||
|
||||
switch (class)
|
||||
{
|
||||
case '2':
|
||||
case '<':
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
if (contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 1)))
|
||||
return true;
|
||||
|
||||
/* Fallthru. */
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
if (contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 0)))
|
||||
return true;
|
||||
|
||||
|
@ -1347,21 +1347,20 @@ find_interesting_uses_stmt (struct ivopts_data *data, tree stmt)
|
|||
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (rhs)))
|
||||
{
|
||||
case '<':
|
||||
case tcc_comparison:
|
||||
find_interesting_uses_cond (data, stmt, &TREE_OPERAND (stmt, 1));
|
||||
return;
|
||||
|
||||
case 'r':
|
||||
case tcc_reference:
|
||||
find_interesting_uses_address (data, stmt, &TREE_OPERAND (stmt, 1));
|
||||
if (TREE_CODE_CLASS (TREE_CODE (lhs)) == 'r')
|
||||
if (REFERENCE_CLASS_P (lhs))
|
||||
find_interesting_uses_address (data, stmt, &TREE_OPERAND (stmt, 0));
|
||||
return;
|
||||
|
||||
default: ;
|
||||
}
|
||||
|
||||
/* Handle memory = gimple_val. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (lhs)) == 'r'
|
||||
if (REFERENCE_CLASS_P (lhs)
|
||||
&& is_gimple_val (rhs))
|
||||
{
|
||||
find_interesting_uses_address (data, stmt, &TREE_OPERAND (stmt, 0));
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* SSA operands management for trees.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -967,7 +967,7 @@ static void
|
|||
get_expr_operands (tree stmt, tree *expr_p, int flags)
|
||||
{
|
||||
enum tree_code code;
|
||||
char class;
|
||||
enum tree_code_class class;
|
||||
tree expr = *expr_p;
|
||||
|
||||
if (expr == NULL || expr == error_mark_node)
|
||||
|
@ -1170,11 +1170,11 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
|
|||
return;
|
||||
|
||||
default:
|
||||
if (class == '1')
|
||||
if (class == tcc_unary)
|
||||
goto do_unary;
|
||||
if (class == '2' || class == '<')
|
||||
if (class == tcc_binary || class == tcc_comparison)
|
||||
goto do_binary;
|
||||
if (class == 'c' || class == 't')
|
||||
if (class == tcc_constant || class == tcc_type)
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -341,7 +341,7 @@ conditional_replacement (basic_block bb, tree phi, tree arg0, tree arg1)
|
|||
if (old_result)
|
||||
{
|
||||
tree new1;
|
||||
if (TREE_CODE_CLASS (TREE_CODE (old_result)) != '<')
|
||||
if (!COMPARISON_CLASS_P (old_result))
|
||||
return false;
|
||||
|
||||
new1 = build (TREE_CODE (old_result), TREE_TYPE (result),
|
||||
|
|
|
@ -848,15 +848,21 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
|
|||
if (expr == NULL)
|
||||
return NULL;
|
||||
|
||||
if (is_gimple_min_invariant (expr))
|
||||
return expr;
|
||||
|
||||
/* Phi translations of a given expression don't change, */
|
||||
phitrans = phi_trans_lookup (expr, pred);
|
||||
if (phitrans)
|
||||
return phitrans;
|
||||
|
||||
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (expr)))
|
||||
{
|
||||
case '2':
|
||||
case tcc_reference:
|
||||
/* XXX: Until we have PRE of loads working, none will be ANTIC. */
|
||||
return NULL;
|
||||
|
||||
case tcc_binary:
|
||||
{
|
||||
tree oldop1 = TREE_OPERAND (expr, 0);
|
||||
tree oldop2 = TREE_OPERAND (expr, 1);
|
||||
|
@ -884,13 +890,9 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
|
|||
phi_trans_add (oldexpr, newexpr, pred);
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* XXX: Until we have PRE of loads working, none will be ANTIC.
|
||||
*/
|
||||
case 'r':
|
||||
return NULL;
|
||||
break;
|
||||
case '1':
|
||||
return expr;
|
||||
|
||||
case tcc_unary:
|
||||
{
|
||||
tree oldop1 = TREE_OPERAND (expr, 0);
|
||||
tree newop1;
|
||||
|
@ -911,10 +913,9 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
|
|||
phi_trans_add (oldexpr, newexpr, pred);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'd':
|
||||
gcc_unreachable ();
|
||||
case 'x':
|
||||
return expr;
|
||||
|
||||
case tcc_exceptional:
|
||||
{
|
||||
tree phi = NULL;
|
||||
int i;
|
||||
|
@ -934,9 +935,11 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
|
|||
return PHI_ARG_DEF (phi, i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
return expr;
|
||||
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
return expr;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1046,34 +1049,31 @@ valid_in_set (value_set_t set, tree expr)
|
|||
{
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (expr)))
|
||||
{
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
{
|
||||
tree op1 = TREE_OPERAND (expr, 0);
|
||||
tree op2 = TREE_OPERAND (expr, 1);
|
||||
return set_contains_value (set, op1) && set_contains_value (set, op2);
|
||||
}
|
||||
break;
|
||||
case '1':
|
||||
|
||||
case tcc_unary:
|
||||
{
|
||||
tree op1 = TREE_OPERAND (expr, 0);
|
||||
return set_contains_value (set, op1);
|
||||
}
|
||||
break;
|
||||
/* XXX: Until PRE of loads works, no reference nodes are ANTIC.
|
||||
*/
|
||||
case 'r':
|
||||
{
|
||||
return false;
|
||||
}
|
||||
case 'x':
|
||||
{
|
||||
gcc_assert (TREE_CODE (expr) == SSA_NAME);
|
||||
return true;
|
||||
}
|
||||
case 'c':
|
||||
gcc_unreachable ();
|
||||
}
|
||||
return false;
|
||||
|
||||
case tcc_reference:
|
||||
/* XXX: Until PRE of loads works, no reference nodes are ANTIC. */
|
||||
return false;
|
||||
|
||||
case tcc_exceptional:
|
||||
gcc_assert (TREE_CODE (expr) == SSA_NAME);
|
||||
return true;
|
||||
|
||||
default:
|
||||
/* No other cases should be encountered. */
|
||||
gcc_unreachable ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean the set of expressions that are no longer valid in SET. This
|
||||
|
@ -1291,9 +1291,9 @@ find_or_generate_expression (basic_block block, tree expr, tree stmts)
|
|||
if (genop == NULL)
|
||||
{
|
||||
genop = VALUE_HANDLE_EXPR_SET (expr)->head->expr;
|
||||
gcc_assert (TREE_CODE_CLASS (TREE_CODE (genop)) == '1'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (genop)) == '2'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (genop)) == 'r');
|
||||
gcc_assert (UNARY_CLASS_P (genop)
|
||||
|| BINARY_CLASS_P (genop)
|
||||
|| REFERENCE_CLASS_P (genop));
|
||||
genop = create_expression_by_pieces (block, genop, stmts);
|
||||
}
|
||||
return genop;
|
||||
|
@ -1323,7 +1323,7 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
|
|||
|
||||
switch (TREE_CODE_CLASS (TREE_CODE (expr)))
|
||||
{
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
{
|
||||
tree_stmt_iterator tsi;
|
||||
tree genop1, genop2;
|
||||
|
@ -1345,7 +1345,7 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
|
|||
pre_stats.insertions++;
|
||||
break;
|
||||
}
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
{
|
||||
tree_stmt_iterator tsi;
|
||||
tree genop1;
|
||||
|
@ -1423,8 +1423,8 @@ insert_aux (basic_block block)
|
|||
node;
|
||||
node = node->next)
|
||||
{
|
||||
if (TREE_CODE_CLASS (TREE_CODE (node->expr)) == '2'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (node->expr)) == '1')
|
||||
if (BINARY_CLASS_P (node->expr)
|
||||
|| UNARY_CLASS_P (node->expr))
|
||||
{
|
||||
tree *avail;
|
||||
tree val;
|
||||
|
@ -1528,8 +1528,8 @@ insert_aux (basic_block block)
|
|||
tree builtexpr;
|
||||
bprime = pred->src;
|
||||
eprime = avail[bprime->index];
|
||||
if (TREE_CODE_CLASS (TREE_CODE (eprime)) == '2'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (eprime)) == '1')
|
||||
if (BINARY_CLASS_P (eprime)
|
||||
|| UNARY_CLASS_P (eprime))
|
||||
{
|
||||
builtexpr = create_expression_by_pieces (bprime,
|
||||
eprime,
|
||||
|
@ -1668,13 +1668,13 @@ create_value_expr_from (tree expr, basic_block block, vuse_optype vuses)
|
|||
enum tree_code code = TREE_CODE (expr);
|
||||
tree vexpr;
|
||||
|
||||
gcc_assert (TREE_CODE_CLASS (code) == '1'
|
||||
|| TREE_CODE_CLASS (code) == '2'
|
||||
|| TREE_CODE_CLASS (code) == 'r');
|
||||
gcc_assert (TREE_CODE_CLASS (code) == tcc_unary
|
||||
|| TREE_CODE_CLASS (code) == tcc_binary
|
||||
|| TREE_CODE_CLASS (code) == tcc_reference);
|
||||
|
||||
if (TREE_CODE_CLASS (code) == '1')
|
||||
if (TREE_CODE_CLASS (code) == tcc_unary)
|
||||
vexpr = pool_alloc (unary_node_pool);
|
||||
else if (TREE_CODE_CLASS (code) == 'r')
|
||||
else if (TREE_CODE_CLASS (code) == tcc_reference)
|
||||
vexpr = pool_alloc (reference_node_pool);
|
||||
else
|
||||
vexpr = pool_alloc (binary_node_pool);
|
||||
|
@ -1791,8 +1791,7 @@ compute_avail (basic_block block)
|
|||
value_insert_into_set (EXP_GEN (block), rhs);
|
||||
continue;
|
||||
}
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (rhs)) == '1'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (rhs)) == '2'
|
||||
else if (UNARY_CLASS_P (rhs) || BINARY_CLASS_P (rhs)
|
||||
|| TREE_CODE (rhs) == INDIRECT_REF)
|
||||
{
|
||||
/* For binary, unary, and reference expressions,
|
||||
|
|
|
@ -564,13 +564,13 @@ set_rhs (tree *stmt_p, tree expr)
|
|||
ssa_op_iter iter;
|
||||
|
||||
/* Verify the constant folded result is valid gimple. */
|
||||
if (TREE_CODE_CLASS (code) == '2')
|
||||
if (TREE_CODE_CLASS (code) == tcc_binary)
|
||||
{
|
||||
if (!is_gimple_val (TREE_OPERAND (expr, 0))
|
||||
|| !is_gimple_val (TREE_OPERAND (expr, 1)))
|
||||
return false;
|
||||
}
|
||||
else if (TREE_CODE_CLASS (code) == '1')
|
||||
else if (TREE_CODE_CLASS (code) == tcc_unary)
|
||||
{
|
||||
if (!is_gimple_val (TREE_OPERAND (expr, 0)))
|
||||
return false;
|
||||
|
|
|
@ -1296,7 +1296,7 @@ warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
|
|||
warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
|
||||
*walk_subtrees = 0;
|
||||
}
|
||||
else if (DECL_P (t) || TYPE_P (t))
|
||||
else if (IS_TYPE_OR_DECL_P (t))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
return NULL_TREE;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Generic routines for manipulating SSA_NAME expressions
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -184,9 +184,7 @@ make_ssa_name (tree var, tree stmt)
|
|||
gcc_assert (DECL_P (var)
|
||||
|| TREE_CODE (var) == INDIRECT_REF);
|
||||
|
||||
gcc_assert (!stmt
|
||||
|| IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (stmt)))
|
||||
|| TREE_CODE (stmt) == PHI_NODE);
|
||||
gcc_assert (!stmt || EXPR_P (stmt) || TREE_CODE (stmt) == PHI_NODE);
|
||||
|
||||
/* If our free list has an element, then use it. Also reuse the
|
||||
SSA version number of the element on the free list which helps
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Tail call optimization on trees.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -279,7 +279,7 @@ process_assignment (tree ass, tree stmt, block_stmt_iterator call, tree *m,
|
|||
return true;
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (code) != '2')
|
||||
if (TREE_CODE_CLASS (code) != tcc_binary)
|
||||
return false;
|
||||
|
||||
/* Accumulator optimizations will reverse the order of operations.
|
||||
|
|
242
gcc/tree.c
242
gcc/tree.c
|
@ -50,6 +50,23 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#include "tree-flow.h"
|
||||
#include "params.h"
|
||||
|
||||
/* Each tree code class has an associated string representation.
|
||||
These must correspond to the tree_code_class entries. */
|
||||
|
||||
const char* tree_code_class_strings[] =
|
||||
{
|
||||
"exceptional",
|
||||
"constant",
|
||||
"type",
|
||||
"declaration",
|
||||
"reference",
|
||||
"comparison",
|
||||
"unary",
|
||||
"binary",
|
||||
"statement",
|
||||
"expression",
|
||||
};
|
||||
|
||||
/* obstack.[ch] explicitly declined to prototype this. */
|
||||
extern int _obstack_allocated_p (struct obstack *h, void *obj);
|
||||
|
||||
|
@ -155,22 +172,22 @@ tree_code_size (enum tree_code code)
|
|||
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'd': /* A decl node */
|
||||
case tcc_declaration: /* A decl node */
|
||||
return sizeof (struct tree_decl);
|
||||
|
||||
case 't': /* a type node */
|
||||
case tcc_type: /* a type node */
|
||||
return sizeof (struct tree_type);
|
||||
|
||||
case 'r': /* a reference */
|
||||
case 'e': /* an expression */
|
||||
case 's': /* an expression with side effects */
|
||||
case '<': /* a comparison expression */
|
||||
case '1': /* a unary arithmetic expression */
|
||||
case '2': /* a binary arithmetic expression */
|
||||
case tcc_reference: /* a reference */
|
||||
case tcc_expression: /* an expression */
|
||||
case tcc_statement: /* an expression with side effects */
|
||||
case tcc_comparison: /* a comparison expression */
|
||||
case tcc_unary: /* a unary arithmetic expression */
|
||||
case tcc_binary: /* a binary arithmetic expression */
|
||||
return (sizeof (struct tree_exp)
|
||||
+ (TREE_CODE_LENGTH (code) - 1) * sizeof (char *));
|
||||
|
||||
case 'c': /* a constant */
|
||||
case tcc_constant: /* a constant */
|
||||
switch (code)
|
||||
{
|
||||
case INTEGER_CST: return sizeof (struct tree_int_cst);
|
||||
|
@ -182,7 +199,7 @@ tree_code_size (enum tree_code code)
|
|||
return lang_hooks.tree_size (code);
|
||||
}
|
||||
|
||||
case 'x': /* something random, like an identifier. */
|
||||
case tcc_exceptional: /* something random, like an identifier. */
|
||||
switch (code)
|
||||
{
|
||||
case IDENTIFIER_NODE: return lang_hooks.identifier_size;
|
||||
|
@ -240,41 +257,41 @@ tree
|
|||
make_node_stat (enum tree_code code MEM_STAT_DECL)
|
||||
{
|
||||
tree t;
|
||||
int type = TREE_CODE_CLASS (code);
|
||||
enum tree_code_class type = TREE_CODE_CLASS (code);
|
||||
size_t length = tree_code_size (code);
|
||||
#ifdef GATHER_STATISTICS
|
||||
tree_node_kind kind;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 'd': /* A decl node */
|
||||
case tcc_declaration: /* A decl node */
|
||||
kind = d_kind;
|
||||
break;
|
||||
|
||||
case 't': /* a type node */
|
||||
case tcc_type: /* a type node */
|
||||
kind = t_kind;
|
||||
break;
|
||||
|
||||
case 's': /* an expression with side effects */
|
||||
case tcc_statement: /* an expression with side effects */
|
||||
kind = s_kind;
|
||||
break;
|
||||
|
||||
case 'r': /* a reference */
|
||||
case tcc_reference: /* a reference */
|
||||
kind = r_kind;
|
||||
break;
|
||||
|
||||
case 'e': /* an expression */
|
||||
case '<': /* a comparison expression */
|
||||
case '1': /* a unary arithmetic expression */
|
||||
case '2': /* a binary arithmetic expression */
|
||||
case tcc_expression: /* an expression */
|
||||
case tcc_comparison: /* a comparison expression */
|
||||
case tcc_unary: /* a unary arithmetic expression */
|
||||
case tcc_binary: /* a binary arithmetic expression */
|
||||
kind = e_kind;
|
||||
break;
|
||||
|
||||
case 'c': /* a constant */
|
||||
case tcc_constant: /* a constant */
|
||||
kind = c_kind;
|
||||
break;
|
||||
|
||||
case 'x': /* something random, like an identifier. */
|
||||
case tcc_exceptional: /* something random, like an identifier. */
|
||||
if (code == IDENTIFIER_NODE)
|
||||
kind = id_kind;
|
||||
else if (code == TREE_VEC)
|
||||
|
@ -290,9 +307,6 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
|
|||
else
|
||||
kind = x_kind;
|
||||
break;
|
||||
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
tree_node_counts[(int) kind]++;
|
||||
|
@ -307,11 +321,11 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
|
|||
|
||||
switch (type)
|
||||
{
|
||||
case 's':
|
||||
case tcc_statement:
|
||||
TREE_SIDE_EFFECTS (t) = 1;
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
case tcc_declaration:
|
||||
if (code != FUNCTION_DECL)
|
||||
DECL_ALIGN (t) = 1;
|
||||
DECL_USER_ALIGN (t) = 0;
|
||||
|
@ -323,7 +337,7 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
|
|||
DECL_POINTER_ALIAS_SET (t) = -1;
|
||||
break;
|
||||
|
||||
case 't':
|
||||
case tcc_type:
|
||||
TYPE_UID (t) = next_type_uid++;
|
||||
TYPE_ALIGN (t) = char_type_node ? TYPE_ALIGN (char_type_node) : 0;
|
||||
TYPE_USER_ALIGN (t) = 0;
|
||||
|
@ -337,12 +351,12 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
|
|||
TYPE_ALIAS_SET (t) = -1;
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
case tcc_constant:
|
||||
TREE_CONSTANT (t) = 1;
|
||||
TREE_INVARIANT (t) = 1;
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
case tcc_expression:
|
||||
switch (code)
|
||||
{
|
||||
case INIT_EXPR:
|
||||
|
@ -361,6 +375,10 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
|
|||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Other classes need no special treatment. */
|
||||
break;
|
||||
}
|
||||
|
||||
return t;
|
||||
|
@ -387,9 +405,9 @@ copy_node_stat (tree node MEM_STAT_DECL)
|
|||
TREE_VISITED (t) = 0;
|
||||
t->common.ann = 0;
|
||||
|
||||
if (TREE_CODE_CLASS (code) == 'd')
|
||||
if (TREE_CODE_CLASS (code) == tcc_declaration)
|
||||
DECL_UID (t) = next_decl_uid++;
|
||||
else if (TREE_CODE_CLASS (code) == 't')
|
||||
else if (TREE_CODE_CLASS (code) == tcc_type)
|
||||
{
|
||||
TYPE_UID (t) = next_type_uid++;
|
||||
/* The following is so that the debug code for
|
||||
|
@ -1566,9 +1584,9 @@ skip_simple_arithmetic (tree expr)
|
|||
inner = expr;
|
||||
while (1)
|
||||
{
|
||||
if (TREE_CODE_CLASS (TREE_CODE (inner)) == '1')
|
||||
if (UNARY_CLASS_P (inner))
|
||||
inner = TREE_OPERAND (inner, 0);
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (inner)) == '2')
|
||||
else if (BINARY_CLASS_P (inner))
|
||||
{
|
||||
if (TREE_INVARIANT (TREE_OPERAND (inner, 1)))
|
||||
inner = TREE_OPERAND (inner, 0);
|
||||
|
@ -1606,22 +1624,29 @@ tree_node_structure (tree t)
|
|||
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'd': return TS_DECL;
|
||||
case 't': return TS_TYPE;
|
||||
case 'r': case '<': case '1': case '2': case 'e': case 's':
|
||||
case tcc_declaration:
|
||||
return TS_DECL;
|
||||
case tcc_type:
|
||||
return TS_TYPE;
|
||||
case tcc_reference:
|
||||
case tcc_comparison:
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_expression:
|
||||
case tcc_statement:
|
||||
return TS_EXP;
|
||||
default: /* 'c' and 'x' */
|
||||
default: /* tcc_constant and tcc_exceptional */
|
||||
break;
|
||||
}
|
||||
switch (code)
|
||||
{
|
||||
/* 'c' cases. */
|
||||
/* tcc_constant cases. */
|
||||
case INTEGER_CST: return TS_INT_CST;
|
||||
case REAL_CST: return TS_REAL_CST;
|
||||
case COMPLEX_CST: return TS_COMPLEX;
|
||||
case VECTOR_CST: return TS_VECTOR;
|
||||
case STRING_CST: return TS_STRING;
|
||||
/* 'x' cases. */
|
||||
/* tcc_exceptional cases. */
|
||||
case ERROR_MARK: return TS_COMMON;
|
||||
case IDENTIFIER_NODE: return TS_IDENTIFIER;
|
||||
case TREE_LIST: return TS_LIST;
|
||||
|
@ -1656,22 +1681,23 @@ contains_placeholder_p (tree exp)
|
|||
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'r':
|
||||
case tcc_reference:
|
||||
/* Don't look at any PLACEHOLDER_EXPRs that might be in index or bit
|
||||
position computations since they will be converted into a
|
||||
WITH_RECORD_EXPR involving the reference, which will assume
|
||||
here will be valid. */
|
||||
return CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0));
|
||||
|
||||
case 'x':
|
||||
case tcc_exceptional:
|
||||
if (code == TREE_LIST)
|
||||
return (CONTAINS_PLACEHOLDER_P (TREE_VALUE (exp))
|
||||
|| CONTAINS_PLACEHOLDER_P (TREE_CHAIN (exp)));
|
||||
break;
|
||||
|
||||
case '1':
|
||||
case '2': case '<':
|
||||
case 'e':
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
case tcc_expression:
|
||||
switch (code)
|
||||
{
|
||||
case COMPOUND_EXPR:
|
||||
|
@ -1823,7 +1849,7 @@ substitute_in_expr (tree exp, tree f, tree r)
|
|||
/* If this expression is getting a value from a PLACEHOLDER_EXPR
|
||||
and it is the right field, replace it with R. */
|
||||
for (inner = TREE_OPERAND (exp, 0);
|
||||
TREE_CODE_CLASS (TREE_CODE (inner)) == 'r';
|
||||
REFERENCE_CLASS_P (inner);
|
||||
inner = TREE_OPERAND (inner, 0))
|
||||
;
|
||||
if (TREE_CODE (inner) == PLACEHOLDER_EXPR
|
||||
|
@ -1844,16 +1870,16 @@ substitute_in_expr (tree exp, tree f, tree r)
|
|||
else
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'c':
|
||||
case 'd':
|
||||
case tcc_constant:
|
||||
case tcc_declaration:
|
||||
return exp;
|
||||
|
||||
case 'x':
|
||||
case '1':
|
||||
case '2':
|
||||
case '<':
|
||||
case 'e':
|
||||
case 'r':
|
||||
case tcc_exceptional:
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
switch (first_rtl_op (code))
|
||||
{
|
||||
case 0:
|
||||
|
@ -1922,10 +1948,10 @@ substitute_placeholder_in_expr (tree exp, tree obj)
|
|||
elt = ((TREE_CODE (elt) == COMPOUND_EXPR
|
||||
|| TREE_CODE (elt) == COND_EXPR)
|
||||
? TREE_OPERAND (elt, 1)
|
||||
: (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (elt)) == 'e')
|
||||
: (REFERENCE_CLASS_P (elt)
|
||||
|| UNARY_CLASS_P (elt)
|
||||
|| BINARY_CLASS_P (elt)
|
||||
|| EXPRESSION_CLASS_P (elt))
|
||||
? TREE_OPERAND (elt, 0) : 0))
|
||||
if (TYPE_MAIN_VARIANT (TREE_TYPE (elt)) == need_type)
|
||||
return elt;
|
||||
|
@ -1934,10 +1960,10 @@ substitute_placeholder_in_expr (tree exp, tree obj)
|
|||
elt = ((TREE_CODE (elt) == COMPOUND_EXPR
|
||||
|| TREE_CODE (elt) == COND_EXPR)
|
||||
? TREE_OPERAND (elt, 1)
|
||||
: (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
|
||||
|| TREE_CODE_CLASS (TREE_CODE (elt)) == 'e')
|
||||
: (REFERENCE_CLASS_P (elt)
|
||||
|| UNARY_CLASS_P (elt)
|
||||
|| BINARY_CLASS_P (elt)
|
||||
|| EXPRESSION_CLASS_P (elt))
|
||||
? TREE_OPERAND (elt, 0) : 0))
|
||||
if (POINTER_TYPE_P (TREE_TYPE (elt))
|
||||
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (elt)))
|
||||
|
@ -1963,17 +1989,17 @@ substitute_placeholder_in_expr (tree exp, tree obj)
|
|||
else
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'c':
|
||||
case 'd':
|
||||
case tcc_constant:
|
||||
case tcc_declaration:
|
||||
return exp;
|
||||
|
||||
case 'x':
|
||||
case '1':
|
||||
case '2':
|
||||
case '<':
|
||||
case 'e':
|
||||
case 'r':
|
||||
case 's':
|
||||
case tcc_exceptional:
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
case tcc_statement:
|
||||
switch (first_rtl_op (code))
|
||||
{
|
||||
case 0:
|
||||
|
@ -2145,13 +2171,13 @@ stabilize_reference_1 (tree e)
|
|||
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 'x':
|
||||
case 't':
|
||||
case 'd':
|
||||
case '<':
|
||||
case 's':
|
||||
case 'e':
|
||||
case 'r':
|
||||
case tcc_exceptional:
|
||||
case tcc_type:
|
||||
case tcc_declaration:
|
||||
case tcc_comparison:
|
||||
case tcc_statement:
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
/* If the expression has side-effects, then encase it in a SAVE_EXPR
|
||||
so that it will only be evaluated once. */
|
||||
/* The reference (r) and comparison (<) classes could be handled as
|
||||
|
@ -2160,12 +2186,12 @@ stabilize_reference_1 (tree e)
|
|||
return save_expr (e);
|
||||
return e;
|
||||
|
||||
case 'c':
|
||||
case tcc_constant:
|
||||
/* Constants need no processing. In fact, we should never reach
|
||||
here. */
|
||||
return e;
|
||||
|
||||
case '2':
|
||||
case tcc_binary:
|
||||
/* Division is slow and tends to be compiled with jumps,
|
||||
especially the division by powers of 2 that is often
|
||||
found inside of an array reference. So do it just once. */
|
||||
|
@ -2179,7 +2205,7 @@ stabilize_reference_1 (tree e)
|
|||
stabilize_reference_1 (TREE_OPERAND (e, 1)));
|
||||
break;
|
||||
|
||||
case '1':
|
||||
case tcc_unary:
|
||||
/* Recursively stabilize each operand. */
|
||||
result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0)));
|
||||
break;
|
||||
|
@ -2271,7 +2297,7 @@ do { tree _node = (NODE); \
|
|||
else
|
||||
ti = tc = false;
|
||||
}
|
||||
else if (TREE_CODE_CLASS (TREE_CODE (node)) == 'c')
|
||||
else if (CONSTANT_CLASS_P (node))
|
||||
;
|
||||
else
|
||||
{
|
||||
|
@ -2319,10 +2345,10 @@ build1_stat (enum tree_code code, tree type, tree node MEM_STAT_DECL)
|
|||
#ifdef GATHER_STATISTICS
|
||||
switch (TREE_CODE_CLASS (code))
|
||||
{
|
||||
case 's': /* an expression with side effects */
|
||||
case tcc_statement: /* an expression with side effects */
|
||||
kind = s_kind;
|
||||
break;
|
||||
case 'r': /* a reference */
|
||||
case tcc_reference: /* a reference */
|
||||
kind = r_kind;
|
||||
break;
|
||||
default:
|
||||
|
@ -2357,7 +2383,7 @@ build1_stat (enum tree_code code, tree type, tree node MEM_STAT_DECL)
|
|||
TREE_READONLY (t) = TREE_READONLY (node);
|
||||
}
|
||||
|
||||
if (TREE_CODE_CLASS (code) == 's')
|
||||
if (TREE_CODE_CLASS (code) == tcc_statement)
|
||||
TREE_SIDE_EFFECTS (t) = 1;
|
||||
else switch (code)
|
||||
{
|
||||
|
@ -2386,12 +2412,15 @@ build1_stat (enum tree_code code, tree type, tree node MEM_STAT_DECL)
|
|||
break;
|
||||
|
||||
default:
|
||||
if (TREE_CODE_CLASS (code) == '1' && node && !TYPE_P (node)
|
||||
if (TREE_CODE_CLASS (code) == tcc_unary
|
||||
&& node && !TYPE_P (node)
|
||||
&& TREE_CONSTANT (node))
|
||||
TREE_CONSTANT (t) = 1;
|
||||
if (TREE_CODE_CLASS (code) == '1' && node && TREE_INVARIANT (node))
|
||||
if (TREE_CODE_CLASS (code) == tcc_unary
|
||||
&& node && TREE_INVARIANT (node))
|
||||
TREE_INVARIANT (t) = 1;
|
||||
if (TREE_CODE_CLASS (code) == 'r' && node && TREE_THIS_VOLATILE (node))
|
||||
if (TREE_CODE_CLASS (code) == tcc_reference
|
||||
&& node && TREE_THIS_VOLATILE (node))
|
||||
TREE_THIS_VOLATILE (t) = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -2435,8 +2464,8 @@ build2_stat (enum tree_code code, tree tt, tree arg0, tree arg1 MEM_STAT_DECL)
|
|||
|
||||
/* Expressions without side effects may be constant if their
|
||||
arguments are as well. */
|
||||
constant = (TREE_CODE_CLASS (code) == '<'
|
||||
|| TREE_CODE_CLASS (code) == '2');
|
||||
constant = (TREE_CODE_CLASS (code) == tcc_comparison
|
||||
|| TREE_CODE_CLASS (code) == tcc_binary);
|
||||
read_only = 1;
|
||||
side_effects = TREE_SIDE_EFFECTS (t);
|
||||
invariant = constant;
|
||||
|
@ -2449,7 +2478,8 @@ build2_stat (enum tree_code code, tree tt, tree arg0, tree arg1 MEM_STAT_DECL)
|
|||
TREE_INVARIANT (t) = invariant;
|
||||
TREE_SIDE_EFFECTS (t) = side_effects;
|
||||
TREE_THIS_VOLATILE (t)
|
||||
= TREE_CODE_CLASS (code) == 'r' && arg0 && TREE_THIS_VOLATILE (arg0);
|
||||
= (TREE_CODE_CLASS (code) == tcc_reference
|
||||
&& arg0 && TREE_THIS_VOLATILE (arg0));
|
||||
|
||||
return t;
|
||||
}
|
||||
|
@ -2497,7 +2527,8 @@ build3_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
|
|||
|
||||
TREE_SIDE_EFFECTS (t) = side_effects;
|
||||
TREE_THIS_VOLATILE (t)
|
||||
= TREE_CODE_CLASS (code) == 'r' && arg0 && TREE_THIS_VOLATILE (arg0);
|
||||
= (TREE_CODE_CLASS (code) == tcc_reference
|
||||
&& arg0 && TREE_THIS_VOLATILE (arg0));
|
||||
|
||||
return t;
|
||||
}
|
||||
|
@ -2526,7 +2557,8 @@ build4_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
|
|||
|
||||
TREE_SIDE_EFFECTS (t) = side_effects;
|
||||
TREE_THIS_VOLATILE (t)
|
||||
= TREE_CODE_CLASS (code) == 'r' && arg0 && TREE_THIS_VOLATILE (arg0);
|
||||
= (TREE_CODE_CLASS (code) == tcc_reference
|
||||
&& arg0 && TREE_THIS_VOLATILE (arg0));
|
||||
|
||||
return t;
|
||||
}
|
||||
|
@ -3829,12 +3861,12 @@ simple_cst_equal (tree t1, tree t2)
|
|||
|
||||
switch (TREE_CODE_CLASS (code1))
|
||||
{
|
||||
case '1':
|
||||
case '2':
|
||||
case '<':
|
||||
case 'e':
|
||||
case 'r':
|
||||
case 's':
|
||||
case tcc_unary:
|
||||
case tcc_binary:
|
||||
case tcc_comparison:
|
||||
case tcc_expression:
|
||||
case tcc_reference:
|
||||
case tcc_statement:
|
||||
cmp = 1;
|
||||
for (i = 0; i < TREE_CODE_LENGTH (code1); i++)
|
||||
{
|
||||
|
@ -3976,7 +4008,7 @@ iterative_hash_expr (tree t, hashval_t val)
|
|||
default:
|
||||
class = TREE_CODE_CLASS (code);
|
||||
|
||||
if (class == 'd')
|
||||
if (class == tcc_declaration)
|
||||
{
|
||||
/* Decls we can just compare by pointer. */
|
||||
val = iterative_hash_pointer (t, val);
|
||||
|
@ -4774,7 +4806,8 @@ find_var_from_fn (tree *tp, int *walk_subtrees, void *data)
|
|||
if (TYPE_P (*tp))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
else if (DECL_P (*tp) && lang_hooks.tree_inlining.auto_var_in_fn_p (*tp, fn))
|
||||
else if (DECL_P (*tp)
|
||||
&& lang_hooks.tree_inlining.auto_var_in_fn_p (*tp, fn))
|
||||
return *tp;
|
||||
|
||||
return NULL_TREE;
|
||||
|
@ -5312,12 +5345,13 @@ tree_not_check_failed (const tree node, const char *file,
|
|||
code, given in CL. */
|
||||
|
||||
void
|
||||
tree_class_check_failed (const tree node, int cl, const char *file,
|
||||
int line, const char *function)
|
||||
tree_class_check_failed (const tree node, const enum tree_code_class cl,
|
||||
const char *file, int line, const char *function)
|
||||
{
|
||||
internal_error
|
||||
("tree check: expected class %qc, have %qc (%s) in %s, at %s:%d",
|
||||
cl, TREE_CODE_CLASS (TREE_CODE (node)),
|
||||
("tree check: expected class %qs, have %qs (%s) in %s, at %s:%d",
|
||||
TREE_CODE_CLASS_STRING (cl),
|
||||
TREE_CODE_CLASS_STRING (TREE_CODE_CLASS (TREE_CODE (node))),
|
||||
tree_code_name[TREE_CODE (node)], function, trim_filename (file), line);
|
||||
}
|
||||
|
||||
|
|
332
gcc/tree.def
332
gcc/tree.def
|
@ -21,49 +21,37 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
02111-1307, USA. */
|
||||
|
||||
|
||||
/* The third argument can be:
|
||||
'x' for an exceptional code (fits no category).
|
||||
't' for a type object code.
|
||||
'c' for codes for constants.
|
||||
'd' for codes for declarations (also serving as variable refs).
|
||||
'r' for codes for references to storage.
|
||||
'<' for codes for comparison expressions.
|
||||
'1' for codes for unary arithmetic expressions.
|
||||
'2' for codes for binary arithmetic expressions.
|
||||
's' for codes for "statement" expressions, which have side-effects,
|
||||
but usually no interesting value.
|
||||
'e' for codes for other kinds of expressions. */
|
||||
|
||||
/* For `r', `e', `<', `1', `2', and `s' nodes, which use struct
|
||||
tree_exp, the 4th element is the number of argument slots to
|
||||
allocate. This determines the size of the tree node object.
|
||||
Other nodes use different structures, and the size is determined
|
||||
by the tree_union member structure; the 4th element should be
|
||||
zero. Languages that define language-specific 'x' or 'c' codes
|
||||
must define the tree_size langhook to say how big they are. */
|
||||
/* For tcc_references, tcc_expression, tcc_comparison, tcc_unary,
|
||||
tcc_binary, and tcc_statement nodes, which use struct tree_exp, the
|
||||
4th element is the number of argument slots to allocate. This
|
||||
determines the size of the tree node object. Other nodes use
|
||||
different structures, and the size is determined by the tree_union
|
||||
member structure; the 4th element should be zero. Languages that
|
||||
define language-specific tcc_exceptional or tcc_constant codes must
|
||||
define the tree_size langhook to say how big they are. */
|
||||
|
||||
/* Any erroneous construct is parsed into a node of this type.
|
||||
This type of node is accepted without complaint in all contexts
|
||||
by later parsing activities, to avoid multiple error messages
|
||||
for one error.
|
||||
No fields in these nodes are used except the TREE_CODE. */
|
||||
DEFTREECODE (ERROR_MARK, "error_mark", 'x', 0)
|
||||
DEFTREECODE (ERROR_MARK, "error_mark", tcc_exceptional, 0)
|
||||
|
||||
/* Used to represent a name (such as, in the DECL_NAME of a decl node).
|
||||
Internally it looks like a STRING_CST node.
|
||||
There is only one IDENTIFIER_NODE ever made for any particular name.
|
||||
Use `get_identifier' to get it (or create it, the first time). */
|
||||
DEFTREECODE (IDENTIFIER_NODE, "identifier_node", 'x', 0)
|
||||
DEFTREECODE (IDENTIFIER_NODE, "identifier_node", tcc_exceptional, 0)
|
||||
|
||||
/* Has the TREE_VALUE and TREE_PURPOSE fields. */
|
||||
/* These nodes are made into lists by chaining through the
|
||||
TREE_CHAIN field. The elements of the list live in the
|
||||
TREE_VALUE fields, while TREE_PURPOSE fields are occasionally
|
||||
used as well to get the effect of Lisp association lists. */
|
||||
DEFTREECODE (TREE_LIST, "tree_list", 'x', 0)
|
||||
DEFTREECODE (TREE_LIST, "tree_list", tcc_exceptional, 0)
|
||||
|
||||
/* These nodes contain an array of tree nodes. */
|
||||
DEFTREECODE (TREE_VEC, "tree_vec", 'x', 0)
|
||||
DEFTREECODE (TREE_VEC, "tree_vec", tcc_exceptional, 0)
|
||||
|
||||
/* A symbol binding block. These are arranged in a tree,
|
||||
where the BLOCK_SUBBLOCKS field contains a chain of subblocks
|
||||
|
@ -85,7 +73,7 @@ DEFTREECODE (TREE_VEC, "tree_vec", 'x', 0)
|
|||
instance of an inline function).
|
||||
TREE_ASM_WRITTEN is nonzero if the block was actually referenced
|
||||
in the generated assembly. */
|
||||
DEFTREECODE (BLOCK, "block", 'x', 0)
|
||||
DEFTREECODE (BLOCK, "block", tcc_exceptional, 0)
|
||||
|
||||
/* Each data type is represented by a tree node whose code is one of
|
||||
the following: */
|
||||
|
@ -130,7 +118,8 @@ DEFTREECODE (BLOCK, "block", 'x', 0)
|
|||
ENUMERAL_TYPE, RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE nodes;
|
||||
see below. */
|
||||
|
||||
DEFTREECODE (VOID_TYPE, "void_type", 't', 0) /* The void type in C */
|
||||
DEFTREECODE (VOID_TYPE, "void_type", tcc_type, 0)
|
||||
/* The void type in C */
|
||||
|
||||
/* Integer types in all languages, including char in C.
|
||||
Also used for sub-ranges of other discrete types.
|
||||
|
@ -140,20 +129,20 @@ DEFTREECODE (VOID_TYPE, "void_type", 't', 0) /* The void type in C */
|
|||
of this will point at the supertype (another INTEGER_TYPE,
|
||||
or an ENUMERAL_TYPE, CHAR_TYPE, or BOOLEAN_TYPE).
|
||||
Otherwise, the TREE_TYPE is zero. */
|
||||
DEFTREECODE (INTEGER_TYPE, "integer_type", 't', 0)
|
||||
DEFTREECODE (INTEGER_TYPE, "integer_type", tcc_type, 0)
|
||||
|
||||
/* C's float and double. Different floating types are distinguished
|
||||
by machine mode and by the TYPE_SIZE and the TYPE_PRECISION. */
|
||||
DEFTREECODE (REAL_TYPE, "real_type", 't', 0)
|
||||
DEFTREECODE (REAL_TYPE, "real_type", tcc_type, 0)
|
||||
|
||||
/* Complex number types. The TREE_TYPE field is the data type
|
||||
of the real and imaginary parts. */
|
||||
DEFTREECODE (COMPLEX_TYPE, "complex_type", 't', 0)
|
||||
DEFTREECODE (COMPLEX_TYPE, "complex_type", tcc_type, 0)
|
||||
|
||||
/* Vector types. The TREE_TYPE field is the data type of the vector
|
||||
elements. The TYPE_PRECISION field is the number of subparts of
|
||||
the vector. */
|
||||
DEFTREECODE (VECTOR_TYPE, "vector_type", 't', 0)
|
||||
DEFTREECODE (VECTOR_TYPE, "vector_type", tcc_type, 0)
|
||||
|
||||
/* C enums. The type node looks just like an INTEGER_TYPE node.
|
||||
The symbols for the values of the enum type are defined by
|
||||
|
@ -166,39 +155,39 @@ DEFTREECODE (VECTOR_TYPE, "vector_type", 't', 0)
|
|||
fields are filled in.
|
||||
RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE forward refs are
|
||||
treated similarly. */
|
||||
DEFTREECODE (ENUMERAL_TYPE, "enumeral_type", 't', 0)
|
||||
DEFTREECODE (ENUMERAL_TYPE, "enumeral_type", tcc_type, 0)
|
||||
|
||||
/* Pascal's boolean type (true or false are the only values);
|
||||
no special fields needed. */
|
||||
DEFTREECODE (BOOLEAN_TYPE, "boolean_type", 't', 0)
|
||||
DEFTREECODE (BOOLEAN_TYPE, "boolean_type", tcc_type, 0)
|
||||
|
||||
/* CHAR in Pascal; not used in C.
|
||||
No special fields needed. */
|
||||
DEFTREECODE (CHAR_TYPE, "char_type", 't', 0)
|
||||
DEFTREECODE (CHAR_TYPE, "char_type", tcc_type, 0)
|
||||
|
||||
/* All pointer-to-x types have code POINTER_TYPE.
|
||||
The TREE_TYPE points to the node for the type pointed to. */
|
||||
DEFTREECODE (POINTER_TYPE, "pointer_type", 't', 0)
|
||||
DEFTREECODE (POINTER_TYPE, "pointer_type", tcc_type, 0)
|
||||
|
||||
/* An offset is a pointer relative to an object.
|
||||
The TREE_TYPE field is the type of the object at the offset.
|
||||
The TYPE_OFFSET_BASETYPE points to the node for the type of object
|
||||
that the offset is relative to. */
|
||||
DEFTREECODE (OFFSET_TYPE, "offset_type", 't', 0)
|
||||
DEFTREECODE (OFFSET_TYPE, "offset_type", tcc_type, 0)
|
||||
|
||||
/* A reference is like a pointer except that it is coerced
|
||||
automatically to the value it points to. Used in C++. */
|
||||
DEFTREECODE (REFERENCE_TYPE, "reference_type", 't', 0)
|
||||
DEFTREECODE (REFERENCE_TYPE, "reference_type", tcc_type, 0)
|
||||
|
||||
/* METHOD_TYPE is the type of a function which takes an extra first
|
||||
argument for "self", which is not present in the declared argument list.
|
||||
The TREE_TYPE is the return type of the method. The TYPE_METHOD_BASETYPE
|
||||
is the type of "self". TYPE_ARG_TYPES is the real argument list, which
|
||||
includes the hidden argument for "self". */
|
||||
DEFTREECODE (METHOD_TYPE, "method_type", 't', 0)
|
||||
DEFTREECODE (METHOD_TYPE, "method_type", tcc_type, 0)
|
||||
|
||||
/* Used for Pascal; details not determined right now. */
|
||||
DEFTREECODE (FILE_TYPE, "file_type", 't', 0)
|
||||
DEFTREECODE (FILE_TYPE, "file_type", tcc_type, 0)
|
||||
|
||||
/* Types of arrays. Special fields:
|
||||
TREE_TYPE Type of an array element.
|
||||
|
@ -209,13 +198,13 @@ DEFTREECODE (FILE_TYPE, "file_type", 't', 0)
|
|||
TYPE_STRING_FLAG indicates a string (in contrast to an array of chars)
|
||||
in languages (such as Chill) that make a distinction. */
|
||||
/* Array types in C or Pascal */
|
||||
DEFTREECODE (ARRAY_TYPE, "array_type", 't', 0)
|
||||
DEFTREECODE (ARRAY_TYPE, "array_type", tcc_type, 0)
|
||||
|
||||
/* Types of sets for Pascal. Special fields are the same as
|
||||
in an array type. The target type is always a boolean type.
|
||||
Used for both bitstrings and powersets in Chill;
|
||||
TYPE_STRING_FLAG indicates a bitstring. */
|
||||
DEFTREECODE (SET_TYPE, "set_type", 't', 0)
|
||||
DEFTREECODE (SET_TYPE, "set_type", tcc_type, 0)
|
||||
|
||||
/* Struct in C, or record in Pascal. */
|
||||
/* Special fields:
|
||||
|
@ -225,19 +214,19 @@ DEFTREECODE (SET_TYPE, "set_type", 't', 0)
|
|||
A few may need to be added for Pascal. */
|
||||
/* See the comment above, before ENUMERAL_TYPE, for how
|
||||
forward references to struct tags are handled in C. */
|
||||
DEFTREECODE (RECORD_TYPE, "record_type", 't', 0)
|
||||
DEFTREECODE (RECORD_TYPE, "record_type", tcc_type, 0)
|
||||
|
||||
/* Union in C. Like a struct, except that the offsets of the fields
|
||||
will all be zero. */
|
||||
/* See the comment above, before ENUMERAL_TYPE, for how
|
||||
forward references to union tags are handled in C. */
|
||||
DEFTREECODE (UNION_TYPE, "union_type", 't', 0) /* C union type */
|
||||
DEFTREECODE (UNION_TYPE, "union_type", tcc_type, 0) /* C union type */
|
||||
|
||||
/* Similar to UNION_TYPE, except that the expressions in DECL_QUALIFIER
|
||||
in each FIELD_DECL determine what the union contains. The first
|
||||
field whose DECL_QUALIFIER expression is true is deemed to occupy
|
||||
the union. */
|
||||
DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", 't', 0)
|
||||
DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", tcc_type, 0)
|
||||
|
||||
/* Type of functions. Special fields:
|
||||
TREE_TYPE type of value returned.
|
||||
|
@ -245,13 +234,13 @@ DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", 't', 0)
|
|||
this list is made of TREE_LIST nodes.
|
||||
Types of "Procedures" in languages where they are different from functions
|
||||
have code FUNCTION_TYPE also, but then TREE_TYPE is zero or void type. */
|
||||
DEFTREECODE (FUNCTION_TYPE, "function_type", 't', 0)
|
||||
DEFTREECODE (FUNCTION_TYPE, "function_type", tcc_type, 0)
|
||||
|
||||
/* This is a language-specific kind of type.
|
||||
Its meaning is defined by the language front end.
|
||||
layout_type does not know how to lay this out,
|
||||
so the front-end must do so manually. */
|
||||
DEFTREECODE (LANG_TYPE, "lang_type", 't', 0)
|
||||
DEFTREECODE (LANG_TYPE, "lang_type", tcc_type, 0)
|
||||
|
||||
/* Expressions */
|
||||
|
||||
|
@ -265,20 +254,20 @@ DEFTREECODE (LANG_TYPE, "lang_type", 't', 0)
|
|||
TREE_CONSTANT_OVERFLOW already set, it is known to be unique.
|
||||
INTEGER_CST nodes are created for the integral types, for pointer
|
||||
types and for vector and float types in some circumstances. */
|
||||
DEFTREECODE (INTEGER_CST, "integer_cst", 'c', 0)
|
||||
DEFTREECODE (INTEGER_CST, "integer_cst", tcc_constant, 0)
|
||||
|
||||
/* Contents are in TREE_REAL_CST field. */
|
||||
DEFTREECODE (REAL_CST, "real_cst", 'c', 0)
|
||||
DEFTREECODE (REAL_CST, "real_cst", tcc_constant, 0)
|
||||
|
||||
/* Contents are in TREE_REALPART and TREE_IMAGPART fields,
|
||||
whose contents are other constant nodes. */
|
||||
DEFTREECODE (COMPLEX_CST, "complex_cst", 'c', 0)
|
||||
DEFTREECODE (COMPLEX_CST, "complex_cst", tcc_constant, 0)
|
||||
|
||||
/* Contents are in TREE_VECTOR_CST_ELTS field. */
|
||||
DEFTREECODE (VECTOR_CST, "vector_cst", 'c', 0)
|
||||
DEFTREECODE (VECTOR_CST, "vector_cst", tcc_constant, 0)
|
||||
|
||||
/* Contents are TREE_STRING_LENGTH and TREE_STRING_POINTER fields. */
|
||||
DEFTREECODE (STRING_CST, "string_cst", 'c', 0)
|
||||
DEFTREECODE (STRING_CST, "string_cst", tcc_constant, 0)
|
||||
|
||||
/* Declarations. All references to names are represented as ..._DECL
|
||||
nodes. The decls in one binding context are chained through the
|
||||
|
@ -338,22 +327,23 @@ DEFTREECODE (STRING_CST, "string_cst", 'c', 0)
|
|||
of a decl (i.e. one which is nested within an abstract instance of a
|
||||
inline function. */
|
||||
|
||||
DEFTREECODE (FUNCTION_DECL, "function_decl", 'd', 0)
|
||||
DEFTREECODE (LABEL_DECL, "label_decl", 'd', 0)
|
||||
DEFTREECODE (CONST_DECL, "const_decl", 'd', 0)
|
||||
DEFTREECODE (TYPE_DECL, "type_decl", 'd', 0)
|
||||
DEFTREECODE (VAR_DECL, "var_decl", 'd', 0)
|
||||
DEFTREECODE (PARM_DECL, "parm_decl", 'd', 0)
|
||||
DEFTREECODE (RESULT_DECL, "result_decl", 'd', 0)
|
||||
DEFTREECODE (FIELD_DECL, "field_decl", 'd', 0)
|
||||
DEFTREECODE (FUNCTION_DECL, "function_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (LABEL_DECL, "label_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (CONST_DECL, "const_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (TYPE_DECL, "type_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (VAR_DECL, "var_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (PARM_DECL, "parm_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (RESULT_DECL, "result_decl", tcc_declaration, 0)
|
||||
DEFTREECODE (FIELD_DECL, "field_decl", tcc_declaration, 0)
|
||||
|
||||
/* A namespace declaration. Namespaces appear in DECL_CONTEXT of other
|
||||
_DECLs, providing a hierarchy of names. */
|
||||
DEFTREECODE (NAMESPACE_DECL, "namespace_decl", 'd', 0)
|
||||
DEFTREECODE (NAMESPACE_DECL, "namespace_decl", tcc_declaration, 0)
|
||||
|
||||
/* A translation unit. This is not technically a declaration, since it
|
||||
can't be looked up, but it's close enough. */
|
||||
DEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl", 'd', 0)
|
||||
DEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl",\
|
||||
tcc_declaration, 0)
|
||||
|
||||
/* References to storage. */
|
||||
|
||||
|
@ -362,7 +352,7 @@ DEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl", 'd', 0)
|
|||
Operand 1 is the field (a node of type FIELD_DECL).
|
||||
Operand 2, if present, is the value of DECL_FIELD_OFFSET, measured
|
||||
in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT. */
|
||||
DEFTREECODE (COMPONENT_REF, "component_ref", 'r', 3)
|
||||
DEFTREECODE (COMPONENT_REF, "component_ref", tcc_reference, 3)
|
||||
|
||||
/* Reference to a group of bits within an object. Similar to COMPONENT_REF
|
||||
except the position is given explicitly rather than via a FIELD_DECL.
|
||||
|
@ -371,22 +361,22 @@ DEFTREECODE (COMPONENT_REF, "component_ref", 'r', 3)
|
|||
operand 2 is a tree giving the position of the first referenced bit.
|
||||
The field can be either a signed or unsigned field;
|
||||
BIT_FIELD_REF_UNSIGNED says which. */
|
||||
DEFTREECODE (BIT_FIELD_REF, "bit_field_ref", 'r', 3)
|
||||
DEFTREECODE (BIT_FIELD_REF, "bit_field_ref", tcc_reference, 3)
|
||||
|
||||
/* C unary `*' or Pascal `^'. One operand, an expression for a pointer. */
|
||||
DEFTREECODE (INDIRECT_REF, "indirect_ref", 'r', 1)
|
||||
DEFTREECODE (INDIRECT_REF, "indirect_ref", tcc_reference, 1)
|
||||
|
||||
/* Array indexing.
|
||||
Operand 0 is the array; operand 1 is a (single) array index.
|
||||
Operand 2, if present, is a copy of TYPE_MIN_VALUE of the index.
|
||||
Operand 3, if present, is the element size, measured in units of
|
||||
the alignment of the element type. */
|
||||
DEFTREECODE (ARRAY_REF, "array_ref", 'r', 4)
|
||||
DEFTREECODE (ARRAY_REF, "array_ref", tcc_reference, 4)
|
||||
|
||||
/* Likewise, except that the result is a range ("slice") of the array. The
|
||||
starting index of the resulting array is taken from operand 1 and the size
|
||||
of the range is taken from the type of the expression. */
|
||||
DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", 'r', 4)
|
||||
DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", tcc_reference, 4)
|
||||
|
||||
/* Used to represent lookup of runtime type dependent data. Often this is
|
||||
a reference to a vtable, but it needn't be. Operands are:
|
||||
|
@ -398,13 +388,13 @@ DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", 'r', 4)
|
|||
reference to something simpler, usually to the address of a DECL.
|
||||
Never touched by the middle-end. Good choices would be either an
|
||||
identifier or a vtable index. */
|
||||
DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", 'e', 3)
|
||||
DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
|
||||
|
||||
/* The exception object from the runtime. */
|
||||
DEFTREECODE (EXC_PTR_EXPR, "exc_ptr_expr", 'e', 0)
|
||||
DEFTREECODE (EXC_PTR_EXPR, "exc_ptr_expr", tcc_expression, 0)
|
||||
|
||||
/* The filter object from the runtime. */
|
||||
DEFTREECODE (FILTER_EXPR, "filter_expr", 'e', 0)
|
||||
DEFTREECODE (FILTER_EXPR, "filter_expr", tcc_expression, 0)
|
||||
|
||||
/* Constructor: return an aggregate value made from specified components.
|
||||
In C, this is used only for structure and array initializers.
|
||||
|
@ -426,7 +416,7 @@ DEFTREECODE (FILTER_EXPR, "filter_expr", 'e', 0)
|
|||
The TREE_VALUE specifies a value (index) in the set that is true.
|
||||
If TREE_PURPOSE is non-NULL, it specifies the lower limit of a
|
||||
range of true values. Elements not listed are false (not in the set). */
|
||||
DEFTREECODE (CONSTRUCTOR, "constructor", 'e', 1)
|
||||
DEFTREECODE (CONSTRUCTOR, "constructor", tcc_expression, 1)
|
||||
|
||||
/* The expression types are mostly straightforward, with the fourth argument
|
||||
of DEFTREECODE saying how many operands there are.
|
||||
|
@ -436,14 +426,14 @@ DEFTREECODE (CONSTRUCTOR, "constructor", 'e', 1)
|
|||
/* Contains two expressions to compute, one followed by the other.
|
||||
the first value is ignored. The second one's value is used. The
|
||||
type of the first expression need not agree with the other types. */
|
||||
DEFTREECODE (COMPOUND_EXPR, "compound_expr", 'e', 2)
|
||||
DEFTREECODE (COMPOUND_EXPR, "compound_expr", tcc_expression, 2)
|
||||
|
||||
/* Assignment expression. Operand 0 is the what to set; 1, the new value. */
|
||||
DEFTREECODE (MODIFY_EXPR, "modify_expr", 'e', 2)
|
||||
DEFTREECODE (MODIFY_EXPR, "modify_expr", tcc_expression, 2)
|
||||
|
||||
/* Initialization expression. Operand 0 is the variable to initialize;
|
||||
Operand 1 is the initializer. */
|
||||
DEFTREECODE (INIT_EXPR, "init_expr", 'e', 2)
|
||||
DEFTREECODE (INIT_EXPR, "init_expr", tcc_expression, 2)
|
||||
|
||||
/* For TARGET_EXPR, operand 0 is the target of an initialization,
|
||||
operand 1 is the initializer for the target, which may be void
|
||||
|
@ -451,7 +441,7 @@ DEFTREECODE (INIT_EXPR, "init_expr", 'e', 2)
|
|||
operand 2 is the cleanup for this node, if any.
|
||||
operand 3 is the saved initializer after this node has been
|
||||
expanded once; this is so we can re-expand the tree later. */
|
||||
DEFTREECODE (TARGET_EXPR, "target_expr", 'e', 4)
|
||||
DEFTREECODE (TARGET_EXPR, "target_expr", tcc_expression, 4)
|
||||
|
||||
/* Conditional expression ( ... ? ... : ... in C).
|
||||
Operand 0 is the condition.
|
||||
|
@ -461,7 +451,7 @@ DEFTREECODE (TARGET_EXPR, "target_expr", 'e', 4)
|
|||
Operand 1 must have the same type as the entire expression, unless
|
||||
it unconditionally throws an exception, in which case it should
|
||||
have VOID_TYPE. The same constraints apply to operand 2. */
|
||||
DEFTREECODE (COND_EXPR, "cond_expr", 'e', 3)
|
||||
DEFTREECODE (COND_EXPR, "cond_expr", tcc_expression, 3)
|
||||
|
||||
/* Declare local variables, including making RTL and allocating space.
|
||||
BIND_EXPR_VARS is a chain of VAR_DECL nodes for the variables.
|
||||
|
@ -484,25 +474,25 @@ DEFTREECODE (COND_EXPR, "cond_expr", 'e', 3)
|
|||
In order for the BIND_EXPR to be known at all, the code that creates it
|
||||
must also install it as a subblock in the tree of BLOCK
|
||||
nodes for the function. */
|
||||
DEFTREECODE (BIND_EXPR, "bind_expr", 'e', 3)
|
||||
DEFTREECODE (BIND_EXPR, "bind_expr", tcc_expression, 3)
|
||||
|
||||
/* A labeled block. Operand 0 is the label that will be generated to
|
||||
mark the end of the block.
|
||||
Operand 1 is the labeled block body. */
|
||||
DEFTREECODE (LABELED_BLOCK_EXPR, "labeled_block_expr", 'e', 2)
|
||||
DEFTREECODE (LABELED_BLOCK_EXPR, "labeled_block_expr", tcc_expression, 2)
|
||||
|
||||
/* Function call. Operand 0 is the function.
|
||||
Operand 1 is the argument list, a list of expressions
|
||||
made out of a chain of TREE_LIST nodes.
|
||||
Operand 2 is the static chain argument, or NULL. */
|
||||
DEFTREECODE (CALL_EXPR, "call_expr", 'e', 3)
|
||||
DEFTREECODE (CALL_EXPR, "call_expr", tcc_expression, 3)
|
||||
|
||||
/* Specify a value to compute along with its corresponding cleanup.
|
||||
Operand 0 is the cleanup expression.
|
||||
The cleanup is executed by the first enclosing CLEANUP_POINT_EXPR,
|
||||
which must exist. This differs from TRY_CATCH_EXPR in that operand 1
|
||||
is always evaluated when cleanups are run. */
|
||||
DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", 'e', 1)
|
||||
DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", tcc_expression, 1)
|
||||
|
||||
/* Specify a cleanup point.
|
||||
Operand 0 is an expression that may have cleanups. If it does, those
|
||||
|
@ -519,7 +509,7 @@ DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", 'e', 1)
|
|||
|
||||
As a consequence, the operand of a CLEANUP_POINT_EXPR must not have
|
||||
BLKmode, because it will not be forced out of memory. */
|
||||
DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", 'e', 1)
|
||||
DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", tcc_expression, 1)
|
||||
|
||||
/* The following two codes are used in languages that have types where
|
||||
some field in an object of the type contains a value that is used in
|
||||
|
@ -571,62 +561,62 @@ DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", 'e', 1)
|
|||
|
||||
/* Denotes a record to later be substituted before evaluating this expression.
|
||||
The type of this expression is used to find the record to replace it. */
|
||||
DEFTREECODE (PLACEHOLDER_EXPR, "placeholder_expr", 'x', 0)
|
||||
DEFTREECODE (PLACEHOLDER_EXPR, "placeholder_expr", tcc_exceptional, 0)
|
||||
|
||||
/* Simple arithmetic. */
|
||||
DEFTREECODE (PLUS_EXPR, "plus_expr", '2', 2)
|
||||
DEFTREECODE (MINUS_EXPR, "minus_expr", '2', 2)
|
||||
DEFTREECODE (MULT_EXPR, "mult_expr", '2', 2)
|
||||
DEFTREECODE (PLUS_EXPR, "plus_expr", tcc_binary, 2)
|
||||
DEFTREECODE (MINUS_EXPR, "minus_expr", tcc_binary, 2)
|
||||
DEFTREECODE (MULT_EXPR, "mult_expr", tcc_binary, 2)
|
||||
|
||||
/* Division for integer result that rounds the quotient toward zero. */
|
||||
DEFTREECODE (TRUNC_DIV_EXPR, "trunc_div_expr", '2', 2)
|
||||
DEFTREECODE (TRUNC_DIV_EXPR, "trunc_div_expr", tcc_binary, 2)
|
||||
|
||||
/* Division for integer result that rounds the quotient toward infinity. */
|
||||
DEFTREECODE (CEIL_DIV_EXPR, "ceil_div_expr", '2', 2)
|
||||
DEFTREECODE (CEIL_DIV_EXPR, "ceil_div_expr", tcc_binary, 2)
|
||||
|
||||
/* Division for integer result that rounds toward minus infinity. */
|
||||
DEFTREECODE (FLOOR_DIV_EXPR, "floor_div_expr", '2', 2)
|
||||
DEFTREECODE (FLOOR_DIV_EXPR, "floor_div_expr", tcc_binary, 2)
|
||||
|
||||
/* Division for integer result that rounds toward nearest integer. */
|
||||
DEFTREECODE (ROUND_DIV_EXPR, "round_div_expr", '2', 2)
|
||||
DEFTREECODE (ROUND_DIV_EXPR, "round_div_expr", tcc_binary, 2)
|
||||
|
||||
/* Four kinds of remainder that go with the four kinds of division. */
|
||||
DEFTREECODE (TRUNC_MOD_EXPR, "trunc_mod_expr", '2', 2)
|
||||
DEFTREECODE (CEIL_MOD_EXPR, "ceil_mod_expr", '2', 2)
|
||||
DEFTREECODE (FLOOR_MOD_EXPR, "floor_mod_expr", '2', 2)
|
||||
DEFTREECODE (ROUND_MOD_EXPR, "round_mod_expr", '2', 2)
|
||||
DEFTREECODE (TRUNC_MOD_EXPR, "trunc_mod_expr", tcc_binary, 2)
|
||||
DEFTREECODE (CEIL_MOD_EXPR, "ceil_mod_expr", tcc_binary, 2)
|
||||
DEFTREECODE (FLOOR_MOD_EXPR, "floor_mod_expr", tcc_binary, 2)
|
||||
DEFTREECODE (ROUND_MOD_EXPR, "round_mod_expr", tcc_binary, 2)
|
||||
|
||||
/* Division for real result. */
|
||||
DEFTREECODE (RDIV_EXPR, "rdiv_expr", '2', 2)
|
||||
DEFTREECODE (RDIV_EXPR, "rdiv_expr", tcc_binary, 2)
|
||||
|
||||
/* Division which is not supposed to need rounding.
|
||||
Used for pointer subtraction in C. */
|
||||
DEFTREECODE (EXACT_DIV_EXPR, "exact_div_expr", '2', 2)
|
||||
DEFTREECODE (EXACT_DIV_EXPR, "exact_div_expr", tcc_binary, 2)
|
||||
|
||||
/* Conversion of real to fixed point: four ways to round,
|
||||
like the four ways to divide.
|
||||
CONVERT_EXPR can also be used to convert a real to an integer,
|
||||
and that is what is used in languages that do not have ways of
|
||||
specifying which of these is wanted. Maybe these are not needed. */
|
||||
DEFTREECODE (FIX_TRUNC_EXPR, "fix_trunc_expr", '1', 1)
|
||||
DEFTREECODE (FIX_CEIL_EXPR, "fix_ceil_expr", '1', 1)
|
||||
DEFTREECODE (FIX_FLOOR_EXPR, "fix_floor_expr", '1', 1)
|
||||
DEFTREECODE (FIX_ROUND_EXPR, "fix_round_expr", '1', 1)
|
||||
DEFTREECODE (FIX_TRUNC_EXPR, "fix_trunc_expr", tcc_unary, 1)
|
||||
DEFTREECODE (FIX_CEIL_EXPR, "fix_ceil_expr", tcc_unary, 1)
|
||||
DEFTREECODE (FIX_FLOOR_EXPR, "fix_floor_expr", tcc_unary, 1)
|
||||
DEFTREECODE (FIX_ROUND_EXPR, "fix_round_expr", tcc_unary, 1)
|
||||
|
||||
/* Conversion of an integer to a real. */
|
||||
DEFTREECODE (FLOAT_EXPR, "float_expr", '1', 1)
|
||||
DEFTREECODE (FLOAT_EXPR, "float_expr", tcc_unary, 1)
|
||||
|
||||
/* Unary negation. */
|
||||
DEFTREECODE (NEGATE_EXPR, "negate_expr", '1', 1)
|
||||
DEFTREECODE (NEGATE_EXPR, "negate_expr", tcc_unary, 1)
|
||||
|
||||
DEFTREECODE (MIN_EXPR, "min_expr", '2', 2)
|
||||
DEFTREECODE (MAX_EXPR, "max_expr", '2', 2)
|
||||
DEFTREECODE (MIN_EXPR, "min_expr", tcc_binary, 2)
|
||||
DEFTREECODE (MAX_EXPR, "max_expr", tcc_binary, 2)
|
||||
|
||||
/* Represents the absolute value of the operand.
|
||||
|
||||
An ABS_EXPR must have either an INTEGER_TYPE or a REAL_TYPE. The
|
||||
operand of the ABS_EXPR must have the same type. */
|
||||
DEFTREECODE (ABS_EXPR, "abs_expr", '1', 1)
|
||||
DEFTREECODE (ABS_EXPR, "abs_expr", tcc_unary, 1)
|
||||
|
||||
/* Shift operations for shift and rotate.
|
||||
Shift means logical shift if done on an
|
||||
|
@ -635,16 +625,16 @@ DEFTREECODE (ABS_EXPR, "abs_expr", '1', 1)
|
|||
shift by; it need not be the same type as the first operand and result.
|
||||
Note that the result is undefined if the second operand is larger
|
||||
than the first operand's type size. */
|
||||
DEFTREECODE (LSHIFT_EXPR, "lshift_expr", '2', 2)
|
||||
DEFTREECODE (RSHIFT_EXPR, "rshift_expr", '2', 2)
|
||||
DEFTREECODE (LROTATE_EXPR, "lrotate_expr", '2', 2)
|
||||
DEFTREECODE (RROTATE_EXPR, "rrotate_expr", '2', 2)
|
||||
DEFTREECODE (LSHIFT_EXPR, "lshift_expr", tcc_binary, 2)
|
||||
DEFTREECODE (RSHIFT_EXPR, "rshift_expr", tcc_binary, 2)
|
||||
DEFTREECODE (LROTATE_EXPR, "lrotate_expr", tcc_binary, 2)
|
||||
DEFTREECODE (RROTATE_EXPR, "rrotate_expr", tcc_binary, 2)
|
||||
|
||||
/* Bitwise operations. Operands have same mode as result. */
|
||||
DEFTREECODE (BIT_IOR_EXPR, "bit_ior_expr", '2', 2)
|
||||
DEFTREECODE (BIT_XOR_EXPR, "bit_xor_expr", '2', 2)
|
||||
DEFTREECODE (BIT_AND_EXPR, "bit_and_expr", '2', 2)
|
||||
DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", '1', 1)
|
||||
DEFTREECODE (BIT_IOR_EXPR, "bit_ior_expr", tcc_binary, 2)
|
||||
DEFTREECODE (BIT_XOR_EXPR, "bit_xor_expr", tcc_binary, 2)
|
||||
DEFTREECODE (BIT_AND_EXPR, "bit_and_expr", tcc_binary, 2)
|
||||
DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", tcc_unary, 1)
|
||||
|
||||
/* ANDIF and ORIF allow the second operand not to be computed if the
|
||||
value of the expression is determined from the first operand. AND,
|
||||
|
@ -655,12 +645,12 @@ DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", '1', 1)
|
|||
an INTEGER_TYPE VAR_DECL as its argument; instead, a NE_EXPR will be
|
||||
used to compare the VAR_DECL to zero, thereby obtaining a node with
|
||||
value zero or one. */
|
||||
DEFTREECODE (TRUTH_ANDIF_EXPR, "truth_andif_expr", 'e', 2)
|
||||
DEFTREECODE (TRUTH_ORIF_EXPR, "truth_orif_expr", 'e', 2)
|
||||
DEFTREECODE (TRUTH_AND_EXPR, "truth_and_expr", 'e', 2)
|
||||
DEFTREECODE (TRUTH_OR_EXPR, "truth_or_expr", 'e', 2)
|
||||
DEFTREECODE (TRUTH_XOR_EXPR, "truth_xor_expr", 'e', 2)
|
||||
DEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", 'e', 1)
|
||||
DEFTREECODE (TRUTH_ANDIF_EXPR, "truth_andif_expr", tcc_expression, 2)
|
||||
DEFTREECODE (TRUTH_ORIF_EXPR, "truth_orif_expr", tcc_expression, 2)
|
||||
DEFTREECODE (TRUTH_AND_EXPR, "truth_and_expr", tcc_expression, 2)
|
||||
DEFTREECODE (TRUTH_OR_EXPR, "truth_or_expr", tcc_expression, 2)
|
||||
DEFTREECODE (TRUTH_XOR_EXPR, "truth_xor_expr", tcc_expression, 2)
|
||||
DEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", tcc_expression, 1)
|
||||
|
||||
/* Relational operators.
|
||||
`EQ_EXPR' and `NE_EXPR' are allowed for any types.
|
||||
|
@ -668,39 +658,39 @@ DEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", 'e', 1)
|
|||
or real types.
|
||||
In all cases the operands will have the same type,
|
||||
and the value is always the type used by the language for booleans. */
|
||||
DEFTREECODE (LT_EXPR, "lt_expr", '<', 2)
|
||||
DEFTREECODE (LE_EXPR, "le_expr", '<', 2)
|
||||
DEFTREECODE (GT_EXPR, "gt_expr", '<', 2)
|
||||
DEFTREECODE (GE_EXPR, "ge_expr", '<', 2)
|
||||
DEFTREECODE (EQ_EXPR, "eq_expr", '<', 2)
|
||||
DEFTREECODE (NE_EXPR, "ne_expr", '<', 2)
|
||||
DEFTREECODE (LT_EXPR, "lt_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (LE_EXPR, "le_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (GT_EXPR, "gt_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (GE_EXPR, "ge_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (EQ_EXPR, "eq_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (NE_EXPR, "ne_expr", tcc_comparison, 2)
|
||||
|
||||
/* Additional relational operators for floating point unordered. */
|
||||
DEFTREECODE (UNORDERED_EXPR, "unordered_expr", '<', 2)
|
||||
DEFTREECODE (ORDERED_EXPR, "ordered_expr", '<', 2)
|
||||
DEFTREECODE (UNORDERED_EXPR, "unordered_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (ORDERED_EXPR, "ordered_expr", tcc_comparison, 2)
|
||||
|
||||
/* These are equivalent to unordered or ... */
|
||||
DEFTREECODE (UNLT_EXPR, "unlt_expr", '<', 2)
|
||||
DEFTREECODE (UNLE_EXPR, "unle_expr", '<', 2)
|
||||
DEFTREECODE (UNGT_EXPR, "ungt_expr", '<', 2)
|
||||
DEFTREECODE (UNGE_EXPR, "unge_expr", '<', 2)
|
||||
DEFTREECODE (UNEQ_EXPR, "uneq_expr", '<', 2)
|
||||
DEFTREECODE (UNLT_EXPR, "unlt_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (UNLE_EXPR, "unle_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (UNGT_EXPR, "ungt_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (UNGE_EXPR, "unge_expr", tcc_comparison, 2)
|
||||
DEFTREECODE (UNEQ_EXPR, "uneq_expr", tcc_comparison, 2)
|
||||
|
||||
/* This is the reverse of uneq_expr. */
|
||||
DEFTREECODE (LTGT_EXPR, "ltgt_expr", '<', 2)
|
||||
DEFTREECODE (LTGT_EXPR, "ltgt_expr", tcc_comparison, 2)
|
||||
|
||||
DEFTREECODE (RANGE_EXPR, "range_expr", '2', 2)
|
||||
DEFTREECODE (RANGE_EXPR, "range_expr", tcc_binary, 2)
|
||||
|
||||
/* Represents a conversion of type of a value.
|
||||
All conversions, including implicit ones, must be
|
||||
represented by CONVERT_EXPR or NOP_EXPR nodes. */
|
||||
DEFTREECODE (CONVERT_EXPR, "convert_expr", '1', 1)
|
||||
DEFTREECODE (CONVERT_EXPR, "convert_expr", tcc_unary, 1)
|
||||
|
||||
/* Represents a conversion expected to require no code to be generated. */
|
||||
DEFTREECODE (NOP_EXPR, "nop_expr", '1', 1)
|
||||
DEFTREECODE (NOP_EXPR, "nop_expr", tcc_unary, 1)
|
||||
|
||||
/* Value is same as argument, but guaranteed not an lvalue. */
|
||||
DEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", '1', 1)
|
||||
DEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", tcc_unary, 1)
|
||||
|
||||
/* Represents viewing something of one type as being of a second type.
|
||||
This corresponds to an "Unchecked Conversion" in Ada and roughly to
|
||||
|
@ -712,91 +702,91 @@ DEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", '1', 1)
|
|||
case no actual data motion may occur. TREE_ADDRESSABLE will be set in
|
||||
this case and GCC must abort if it could not do the operation without
|
||||
generating insns. */
|
||||
DEFTREECODE (VIEW_CONVERT_EXPR, "view_convert_expr", 'r', 1)
|
||||
DEFTREECODE (VIEW_CONVERT_EXPR, "view_convert_expr", tcc_reference, 1)
|
||||
|
||||
/* Represents something we computed once and will use multiple times.
|
||||
First operand is that expression. After it is evaluated once, it
|
||||
will be replaced by the temporary variable that holds the value. */
|
||||
DEFTREECODE (SAVE_EXPR, "save_expr", 'e', 1)
|
||||
DEFTREECODE (SAVE_EXPR, "save_expr", tcc_expression, 1)
|
||||
|
||||
/* & in C. Value is the address at which the operand's value resides.
|
||||
Operand may have any mode. Result mode is Pmode. */
|
||||
DEFTREECODE (ADDR_EXPR, "addr_expr", 'e', 1)
|
||||
DEFTREECODE (ADDR_EXPR, "addr_expr", tcc_expression, 1)
|
||||
|
||||
/* Operand0 is a function constant; result is part N of a function
|
||||
descriptor of type ptr_mode. */
|
||||
DEFTREECODE (FDESC_EXPR, "fdesc_expr", 'e', 2)
|
||||
DEFTREECODE (FDESC_EXPR, "fdesc_expr", tcc_expression, 2)
|
||||
|
||||
/* Given two real or integer operands of the same type,
|
||||
returns a complex value of the corresponding complex type. */
|
||||
DEFTREECODE (COMPLEX_EXPR, "complex_expr", '2', 2)
|
||||
DEFTREECODE (COMPLEX_EXPR, "complex_expr", tcc_binary, 2)
|
||||
|
||||
/* Complex conjugate of operand. Used only on complex types. */
|
||||
DEFTREECODE (CONJ_EXPR, "conj_expr", '1', 1)
|
||||
DEFTREECODE (CONJ_EXPR, "conj_expr", tcc_unary, 1)
|
||||
|
||||
/* Used only on an operand of complex type, these return
|
||||
a value of the corresponding component type. */
|
||||
DEFTREECODE (REALPART_EXPR, "realpart_expr", 'r', 1)
|
||||
DEFTREECODE (IMAGPART_EXPR, "imagpart_expr", 'r', 1)
|
||||
DEFTREECODE (REALPART_EXPR, "realpart_expr", tcc_reference, 1)
|
||||
DEFTREECODE (IMAGPART_EXPR, "imagpart_expr", tcc_reference, 1)
|
||||
|
||||
/* Nodes for ++ and -- in C.
|
||||
The second arg is how much to increment or decrement by.
|
||||
For a pointer, it would be the size of the object pointed to. */
|
||||
DEFTREECODE (PREDECREMENT_EXPR, "predecrement_expr", 'e', 2)
|
||||
DEFTREECODE (PREINCREMENT_EXPR, "preincrement_expr", 'e', 2)
|
||||
DEFTREECODE (POSTDECREMENT_EXPR, "postdecrement_expr", 'e', 2)
|
||||
DEFTREECODE (POSTINCREMENT_EXPR, "postincrement_expr", 'e', 2)
|
||||
DEFTREECODE (PREDECREMENT_EXPR, "predecrement_expr", tcc_expression, 2)
|
||||
DEFTREECODE (PREINCREMENT_EXPR, "preincrement_expr", tcc_expression, 2)
|
||||
DEFTREECODE (POSTDECREMENT_EXPR, "postdecrement_expr", tcc_expression, 2)
|
||||
DEFTREECODE (POSTINCREMENT_EXPR, "postincrement_expr", tcc_expression, 2)
|
||||
|
||||
/* Used to implement `va_arg'. */
|
||||
DEFTREECODE (VA_ARG_EXPR, "va_arg_expr", 'e', 1)
|
||||
DEFTREECODE (VA_ARG_EXPR, "va_arg_expr", tcc_expression, 1)
|
||||
|
||||
/* Evaluate operand 1. If and only if an exception is thrown during
|
||||
the evaluation of operand 1, evaluate operand 2.
|
||||
|
||||
This differs from TRY_FINALLY_EXPR in that operand 2 is not evaluated
|
||||
on a normal or jump exit, only on an exception. */
|
||||
DEFTREECODE (TRY_CATCH_EXPR, "try_catch_expr", 's', 2)
|
||||
DEFTREECODE (TRY_CATCH_EXPR, "try_catch_expr", tcc_statement, 2)
|
||||
|
||||
/* Evaluate the first operand.
|
||||
The second operand is a cleanup expression which is evaluated
|
||||
on any exit (normal, exception, or jump out) from this expression. */
|
||||
DEFTREECODE (TRY_FINALLY_EXPR, "try_finally", 's', 2)
|
||||
DEFTREECODE (TRY_FINALLY_EXPR, "try_finally", tcc_statement, 2)
|
||||
|
||||
/* These types of expressions have no useful value,
|
||||
and always have side effects. */
|
||||
|
||||
/* Used to represent a local declaration. The operand is DECL_EXPR_DECL. */
|
||||
DEFTREECODE (DECL_EXPR, "decl_expr", 's', 1)
|
||||
DEFTREECODE (DECL_EXPR, "decl_expr", tcc_statement, 1)
|
||||
|
||||
/* A label definition, encapsulated as a statement.
|
||||
Operand 0 is the LABEL_DECL node for the label that appears here.
|
||||
The type should be void and the value should be ignored. */
|
||||
DEFTREECODE (LABEL_EXPR, "label_expr", 's', 1)
|
||||
DEFTREECODE (LABEL_EXPR, "label_expr", tcc_statement, 1)
|
||||
|
||||
/* GOTO. Operand 0 is a LABEL_DECL node or an expression.
|
||||
The type should be void and the value should be ignored. */
|
||||
DEFTREECODE (GOTO_EXPR, "goto_expr", 's', 1)
|
||||
DEFTREECODE (GOTO_EXPR, "goto_expr", tcc_statement, 1)
|
||||
|
||||
/* RETURN. Evaluates operand 0, then returns from the current function.
|
||||
Presumably that operand is an assignment that stores into the
|
||||
RESULT_DECL that hold the value to be returned.
|
||||
The operand may be null.
|
||||
The type should be void and the value should be ignored. */
|
||||
DEFTREECODE (RETURN_EXPR, "return_expr", 's', 1)
|
||||
DEFTREECODE (RETURN_EXPR, "return_expr", tcc_statement, 1)
|
||||
|
||||
/* Exit the inner most loop conditionally. Operand 0 is the condition.
|
||||
The type should be void and the value should be ignored. */
|
||||
DEFTREECODE (EXIT_EXPR, "exit_expr", 's', 1)
|
||||
DEFTREECODE (EXIT_EXPR, "exit_expr", tcc_statement, 1)
|
||||
|
||||
/* A loop. Operand 0 is the body of the loop.
|
||||
It must contain an EXIT_EXPR or is an infinite loop.
|
||||
The type should be void and the value should be ignored. */
|
||||
DEFTREECODE (LOOP_EXPR, "loop_expr", 's', 1)
|
||||
DEFTREECODE (LOOP_EXPR, "loop_expr", tcc_statement, 1)
|
||||
|
||||
/* Exit a labeled block, possibly returning a value. Operand 0 is a
|
||||
LABELED_BLOCK_EXPR to exit. Operand 1 is the value to return. It
|
||||
may be left null. */
|
||||
DEFTREECODE (EXIT_BLOCK_EXPR, "exit_block_expr", 's', 2)
|
||||
DEFTREECODE (EXIT_BLOCK_EXPR, "exit_block_expr", tcc_statement, 2)
|
||||
|
||||
/* Switch expression.
|
||||
|
||||
|
@ -810,28 +800,28 @@ DEFTREECODE (EXIT_BLOCK_EXPR, "exit_block_expr", 's', 2)
|
|||
must not be NULL.
|
||||
Operand 2 is either NULL_TREE or a TREE_VEC of the CASE_LABEL_EXPRs
|
||||
of all the cases. */
|
||||
DEFTREECODE (SWITCH_EXPR, "switch_expr", 's', 3)
|
||||
DEFTREECODE (SWITCH_EXPR, "switch_expr", tcc_statement, 3)
|
||||
|
||||
/* Used to represent a case label. The operands are CASE_LOW and
|
||||
CASE_HIGH, respectively. If CASE_LOW is NULL_TREE, the label is a
|
||||
'default' label. If CASE_HIGH is NULL_TREE, the label is a normal case
|
||||
label. CASE_LABEL is the corresponding LABEL_DECL. */
|
||||
DEFTREECODE (CASE_LABEL_EXPR, "case_label_expr", 's', 3)
|
||||
DEFTREECODE (CASE_LABEL_EXPR, "case_label_expr", tcc_statement, 3)
|
||||
|
||||
/* RESX. Resume execution after an exception. Operand 0 is a
|
||||
number indicating the exception region that is being left. */
|
||||
DEFTREECODE (RESX_EXPR, "resx_expr", 's', 1)
|
||||
DEFTREECODE (RESX_EXPR, "resx_expr", tcc_statement, 1)
|
||||
|
||||
/* Used to represent an inline assembly statement. ASM_STRING returns a
|
||||
STRING_CST for the instruction (e.g., "mov x, y"). ASM_OUTPUTS,
|
||||
ASM_INPUTS, and ASM_CLOBBERS represent the outputs, inputs, and clobbers
|
||||
for the statement. */
|
||||
DEFTREECODE (ASM_EXPR, "asm_expr", 's', 4)
|
||||
DEFTREECODE (ASM_EXPR, "asm_expr", tcc_statement, 4)
|
||||
|
||||
/* Variable references for SSA analysis. New SSA names are created every
|
||||
time a variable is assigned a new value. The SSA builder uses SSA_NAME
|
||||
nodes to implement SSA versioning. */
|
||||
DEFTREECODE (SSA_NAME, "ssa_name", 'x', 0)
|
||||
DEFTREECODE (SSA_NAME, "ssa_name", tcc_exceptional, 0)
|
||||
|
||||
/* SSA PHI operator. PHI_RESULT is the new SSA_NAME node created by
|
||||
the PHI node. PHI_ARG_LENGTH is the number of arguments.
|
||||
|
@ -839,50 +829,50 @@ DEFTREECODE (SSA_NAME, "ssa_name", 'x', 0)
|
|||
argument list. Each tuple contains the incoming reaching
|
||||
definition (SSA_NAME node) and the edge via which that definition
|
||||
is coming through. */
|
||||
DEFTREECODE (PHI_NODE, "phi_node", 'x', 0)
|
||||
DEFTREECODE (PHI_NODE, "phi_node", tcc_exceptional, 0)
|
||||
|
||||
/* Used to represent a typed exception handler. CATCH_TYPES is the type (or
|
||||
list of types) handled, and CATCH_BODY is the code for the handler. */
|
||||
DEFTREECODE (CATCH_EXPR, "catch_expr", 's', 2)
|
||||
DEFTREECODE (CATCH_EXPR, "catch_expr", tcc_statement, 2)
|
||||
|
||||
/* Used to represent an exception specification. EH_FILTER_TYPES is a list
|
||||
of allowed types, and EH_FILTER_FAILURE is an expression to evaluate on
|
||||
failure. EH_FILTER_MUST_NOT_THROW controls which range type to use when
|
||||
expanding. */
|
||||
DEFTREECODE (EH_FILTER_EXPR, "eh_filter_expr", 's', 2)
|
||||
DEFTREECODE (EH_FILTER_EXPR, "eh_filter_expr", tcc_statement, 2)
|
||||
|
||||
/* Node used for describing a property that is known at compile
|
||||
time. */
|
||||
DEFTREECODE (SCEV_KNOWN, "scev_known", 'e', 0)
|
||||
DEFTREECODE (SCEV_KNOWN, "scev_known", tcc_expression, 0)
|
||||
|
||||
/* Node used for describing a property that is not known at compile
|
||||
time. */
|
||||
DEFTREECODE (SCEV_NOT_KNOWN, "scev_not_known", 'e', 0)
|
||||
DEFTREECODE (SCEV_NOT_KNOWN, "scev_not_known", tcc_expression, 0)
|
||||
|
||||
/* Polynomial chains of recurrences.
|
||||
Under the form: cr = {CHREC_LEFT (cr), +, CHREC_RIGHT (cr)}. */
|
||||
DEFTREECODE (POLYNOMIAL_CHREC, "polynomial_chrec", 'e', 3)
|
||||
DEFTREECODE (POLYNOMIAL_CHREC, "polynomial_chrec", tcc_expression, 3)
|
||||
|
||||
/* Used to chain children of container statements together.
|
||||
Use the interface in tree-iterator.h to access this node. */
|
||||
DEFTREECODE (STATEMENT_LIST, "statement_list", 'x', 0)
|
||||
DEFTREECODE (STATEMENT_LIST, "statement_list", tcc_exceptional, 0)
|
||||
|
||||
/* Value handles. Artificial nodes to represent expressions in
|
||||
partial redundancy elimination (tree-ssa-pre.c). These nodes are
|
||||
used for expression canonicalization. If two expressions compute
|
||||
the same value, they will be assigned the same value handle. */
|
||||
DEFTREECODE (VALUE_HANDLE, "value_handle", 'x', 0)
|
||||
DEFTREECODE (VALUE_HANDLE, "value_handle", tcc_exceptional, 0)
|
||||
|
||||
/* Base class information. Holds information about a class as a
|
||||
baseclass of itself or another class. */
|
||||
DEFTREECODE (TREE_BINFO, "tree_binfo", 'x', 0)
|
||||
DEFTREECODE (TREE_BINFO, "tree_binfo", tcc_exceptional, 0)
|
||||
|
||||
/* Records the size for an expression of variable size type. This is
|
||||
for use in contexts in which we are accessing the entire object,
|
||||
such as for a function call, or block copy.
|
||||
Operand 0 is the real expression.
|
||||
Operand 1 is the size of the type in the expression. */
|
||||
DEFTREECODE (WITH_SIZE_EXPR, "with_size_expr", 'e', 2)
|
||||
DEFTREECODE (WITH_SIZE_EXPR, "with_size_expr", tcc_expression, 2)
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
|
|
131
gcc/tree.h
131
gcc/tree.h
|
@ -43,25 +43,103 @@ enum tree_code {
|
|||
/* Number of language-independent tree codes. */
|
||||
#define NUM_TREE_CODES ((int) LAST_AND_UNUSED_TREE_CODE)
|
||||
|
||||
/* Indexed by enum tree_code, contains a character which is
|
||||
`<' for a comparison expression, `1', for a unary arithmetic
|
||||
expression, `2' for a binary arithmetic expression, `e' for
|
||||
other types of expressions, `r' for a reference, `c' for a
|
||||
constant, `d' for a decl, `t' for a type, `s' for a statement,
|
||||
and `x' for anything else (TREE_LIST, IDENTIFIER, etc). */
|
||||
/* Tree code classes. */
|
||||
|
||||
/* Each tree_code has an associated code class represented by a
|
||||
TREE_CODE_CLASS. */
|
||||
|
||||
enum tree_code_class {
|
||||
tcc_exceptional, /* An exceptional code (fits no category). */
|
||||
tcc_constant, /* A constant. */
|
||||
tcc_type, /* A type object code. */
|
||||
tcc_declaration, /* A declaration (also serving as variable refs). */
|
||||
tcc_reference, /* A reference to storage. */
|
||||
tcc_comparison, /* A comparison expression. */
|
||||
tcc_unary, /* A unary arithmetic expression. */
|
||||
tcc_binary, /* A binary arithmetic expression. */
|
||||
tcc_statement, /* A statement expression, which have side effects
|
||||
but usually no interesting value. */
|
||||
tcc_expression /* Any other expression. */
|
||||
};
|
||||
|
||||
/* Each tree code class has an associated string representation.
|
||||
These must correspond to the tree_code_class entries. */
|
||||
|
||||
extern const char* tree_code_class_strings[];
|
||||
|
||||
/* Returns the string representing CLASS. */
|
||||
|
||||
#define TREE_CODE_CLASS_STRING(CLASS)\
|
||||
tree_code_class_strings[(int) (CLASS)]
|
||||
|
||||
#define MAX_TREE_CODES 256
|
||||
extern const char tree_code_type[];
|
||||
extern const enum tree_code_class tree_code_type[];
|
||||
#define TREE_CODE_CLASS(CODE) tree_code_type[(int) (CODE)]
|
||||
|
||||
/* Nonzero if CODE represents an exceptional code. */
|
||||
|
||||
#define EXCEPTIONAL_CLASS_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_exceptional)
|
||||
|
||||
/* Nonzero if CODE represents a constant. */
|
||||
|
||||
#define CONSTANT_CLASS_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_constant)
|
||||
|
||||
/* Nonzero if CODE represents a type. */
|
||||
|
||||
#define TYPE_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_type)
|
||||
|
||||
/* Nonzero if CODE represents a declaration. */
|
||||
|
||||
#define DECL_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_declaration)
|
||||
|
||||
/* Nonzero if CODE represents a reference. */
|
||||
|
||||
#define REFERENCE_CLASS_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_reference)
|
||||
|
||||
/* Nonzero if CODE represents a comparison. */
|
||||
|
||||
#define COMPARISON_CLASS_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_comparison)
|
||||
|
||||
/* Nonzero if CODE represents a unary arithmetic expression. */
|
||||
|
||||
#define UNARY_CLASS_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_unary)
|
||||
|
||||
/* Nonzero if CODE represents a binary arithmetic expression. */
|
||||
|
||||
#define BINARY_CLASS_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_binary)
|
||||
|
||||
/* Nonzero if CODE represents a statement expression. */
|
||||
|
||||
#define STATEMENT_CLASS_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_statement)
|
||||
|
||||
/* Nonzero if CODE represents any other expression. */
|
||||
|
||||
#define EXPRESSION_CLASS_P(CODE)\
|
||||
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_expression)
|
||||
|
||||
/* Returns nonzero iff CLASS is not the tree code of a type. */
|
||||
|
||||
#define IS_NON_TYPE_CODE_CLASS(CLASS) ((CLASS) != 't')
|
||||
#define IS_NON_TYPE_CODE_CLASS(CLASS) ((CLASS) != tcc_type)
|
||||
|
||||
/* Returns nonzero iff CODE represents a type or declaration. */
|
||||
|
||||
#define IS_TYPE_OR_DECL_P(CODE)\
|
||||
(TYPE_P (CODE) || DECL_P (CODE))
|
||||
|
||||
/* Returns nonzero iff CLASS is the tree-code class of an
|
||||
expression. */
|
||||
|
||||
#define IS_EXPR_CODE_CLASS(CLASS) (strchr ("<12ers", (CLASS)) != 0)
|
||||
#define IS_EXPR_CODE_CLASS(CLASS)\
|
||||
(((CLASS) >= tcc_reference) && ((CLASS) <= tcc_expression))
|
||||
|
||||
/* Returns nonzero iff NODE is an expression of some kind. */
|
||||
|
||||
|
@ -448,7 +526,7 @@ struct tree_common GTY(())
|
|||
({ const tree __t = (T); \
|
||||
char const __c = TREE_CODE_CLASS (TREE_CODE (__t)); \
|
||||
if (!IS_EXPR_CODE_CLASS (__c)) \
|
||||
tree_class_check_failed (__t, 'E', __FILE__, __LINE__, \
|
||||
tree_class_check_failed (__t, tcc_expression, __FILE__, __LINE__, \
|
||||
__FUNCTION__); \
|
||||
__t; })
|
||||
|
||||
|
@ -457,7 +535,7 @@ struct tree_common GTY(())
|
|||
({ const tree __t = (T); \
|
||||
char const __c = TREE_CODE_CLASS (TREE_CODE (__t)); \
|
||||
if (!IS_NON_TYPE_CODE_CLASS (__c)) \
|
||||
tree_class_check_failed (__t, 'T', __FILE__, __LINE__, \
|
||||
tree_class_check_failed (__t, tcc_type, __FILE__, __LINE__, \
|
||||
__FUNCTION__); \
|
||||
__t; })
|
||||
|
||||
|
@ -517,7 +595,7 @@ extern void tree_check_failed (const tree, const char *, int, const char *,
|
|||
...) ATTRIBUTE_NORETURN;
|
||||
extern void tree_not_check_failed (const tree, const char *, int, const char *,
|
||||
...) ATTRIBUTE_NORETURN;
|
||||
extern void tree_class_check_failed (const tree, int,
|
||||
extern void tree_class_check_failed (const tree, const enum tree_code_class,
|
||||
const char *, int, const char *)
|
||||
ATTRIBUTE_NORETURN;
|
||||
extern void tree_vec_elt_check_failed (int, int, const char *,
|
||||
|
@ -557,10 +635,10 @@ extern void tree_operand_check_failed (int, enum tree_code,
|
|||
|
||||
#include "tree-check.h"
|
||||
|
||||
#define TYPE_CHECK(T) TREE_CLASS_CHECK (T, 't')
|
||||
#define DECL_CHECK(T) TREE_CLASS_CHECK (T, 'd')
|
||||
#define CST_CHECK(T) TREE_CLASS_CHECK (T, 'c')
|
||||
#define STMT_CHECK(T) TREE_CLASS_CHECK (T, 's')
|
||||
#define TYPE_CHECK(T) TREE_CLASS_CHECK (T, tcc_type)
|
||||
#define DECL_CHECK(T) TREE_CLASS_CHECK (T, tcc_declaration)
|
||||
#define CST_CHECK(T) TREE_CLASS_CHECK (T, tcc_constant)
|
||||
#define STMT_CHECK(T) TREE_CLASS_CHECK (T, tcc_statement)
|
||||
#define FUNC_OR_METHOD_CHECK(T) TREE_CHECK2 (T, FUNCTION_TYPE, METHOD_TYPE)
|
||||
#define PTR_OR_REF_CHECK(T) TREE_CHECK2 (T, POINTER_TYPE, REFERENCE_TYPE)
|
||||
|
||||
|
@ -712,9 +790,6 @@ extern void tree_operand_check_failed (int, enum tree_code,
|
|||
#define COMPLETE_OR_UNBOUND_ARRAY_TYPE_P(NODE) \
|
||||
(COMPLETE_TYPE_P (TREE_CODE (NODE) == ARRAY_TYPE ? TREE_TYPE (NODE) : (NODE)))
|
||||
|
||||
/* Nonzero if TYPE represents a type. */
|
||||
|
||||
#define TYPE_P(TYPE) (TREE_CODE_CLASS (TREE_CODE (TYPE)) == 't')
|
||||
|
||||
/* Define many boolean fields that all tree nodes have. */
|
||||
|
||||
|
@ -839,7 +914,8 @@ extern void tree_operand_check_failed (int, enum tree_code,
|
|||
#define TREE_READONLY(NODE) (NON_TYPE_CHECK (NODE)->common.readonly_flag)
|
||||
|
||||
/* Nonzero if NODE is a _DECL with TREE_READONLY set. */
|
||||
#define TREE_READONLY_DECL_P(NODE) (DECL_P (NODE) && TREE_READONLY (NODE))
|
||||
#define TREE_READONLY_DECL_P(NODE)\
|
||||
(DECL_P (NODE) && TREE_READONLY (NODE))
|
||||
|
||||
/* Value of expression is constant. Always on in all ..._CST nodes. May
|
||||
also appear in an expression or decl where the value is constant. */
|
||||
|
@ -1091,17 +1167,13 @@ struct tree_vec GTY(())
|
|||
decls and constants can be shared among multiple locations, so
|
||||
return nothing. */
|
||||
#define EXPR_LOCATION(NODE) \
|
||||
(IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) \
|
||||
? (NODE)->exp.locus \
|
||||
: UNKNOWN_LOCATION)
|
||||
(EXPR_P (NODE) ? (NODE)->exp.locus : UNKNOWN_LOCATION)
|
||||
#define SET_EXPR_LOCATION(NODE, FROM) \
|
||||
(EXPR_CHECK (NODE)->exp.locus = (FROM))
|
||||
#define EXPR_HAS_LOCATION(NODE) (EXPR_LOCATION (NODE) != UNKNOWN_LOCATION)
|
||||
/* EXPR_LOCUS and SET_EXPR_LOCUS are deprecated. */
|
||||
#define EXPR_LOCUS(NODE) \
|
||||
(IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) \
|
||||
? &(NODE)->exp.locus \
|
||||
: (location_t *)NULL)
|
||||
(EXPR_P (NODE) ? &(NODE)->exp.locus : (location_t *)NULL)
|
||||
#define SET_EXPR_LOCUS(NODE, FROM) \
|
||||
do { source_location *loc_tmp = FROM; \
|
||||
EXPR_CHECK (NODE)->exp.locus \
|
||||
|
@ -1115,9 +1187,7 @@ struct tree_vec GTY(())
|
|||
decls and constants can be shared among multiple locations, so
|
||||
return nothing. */
|
||||
#define EXPR_LOCUS(NODE) \
|
||||
(IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) \
|
||||
? (NODE)->exp.locus \
|
||||
: (location_t *)NULL)
|
||||
(EXPR_P (NODE) ? (NODE)->exp.locus : (location_t *)NULL)
|
||||
#define SET_EXPR_LOCUS(NODE, FROM) \
|
||||
(EXPR_CHECK (NODE)->exp.locus = (FROM))
|
||||
#define SET_EXPR_LOCATION(NODE, FROM) annotate_with_locus (NODE, FROM)
|
||||
|
@ -1753,9 +1823,6 @@ struct tree_binfo GTY (())
|
|||
|
||||
/* Define fields and accessors for nodes representing declared names. */
|
||||
|
||||
/* Nonzero if DECL represents a decl. */
|
||||
#define DECL_P(DECL) (TREE_CODE_CLASS (TREE_CODE (DECL)) == 'd')
|
||||
|
||||
/* Nonzero if DECL represents a variable for the SSA passes. */
|
||||
#define SSA_VAR_P(DECL) \
|
||||
(TREE_CODE (DECL) == VAR_DECL \
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com>
|
||||
Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* treetree.c: Update for new tree-class enumeration constants.
|
||||
|
||||
2004-09-15 Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* Make-lang.in (treelang-warn): Set to $(STRICT_WARN).
|
||||
|
|
|
@ -199,9 +199,9 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
|
|||
|
||||
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
|
||||
|
||||
const char tree_code_type[] = {
|
||||
const enum tree_code_class tree_code_type[] = {
|
||||
#include "tree.def"
|
||||
'x'
|
||||
tcc_exceptional
|
||||
};
|
||||
#undef DEFTREECODE
|
||||
|
||||
|
|
|
@ -2466,7 +2466,7 @@ copy_constant (tree exp)
|
|||
case ADDR_EXPR:
|
||||
/* For ADDR_EXPR, we do not want to copy the decl whose address
|
||||
is requested. We do want to copy constants though. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == 'c')
|
||||
if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
|
||||
return build1 (TREE_CODE (exp), TREE_TYPE (exp),
|
||||
copy_constant (TREE_OPERAND (exp, 0)));
|
||||
else
|
||||
|
@ -3378,8 +3378,7 @@ output_addressed_constants (tree exp)
|
|||
tem = TREE_OPERAND (tem, 0))
|
||||
;
|
||||
|
||||
if (TREE_CODE_CLASS (TREE_CODE (tem)) == 'c'
|
||||
|| TREE_CODE (tem) == CONSTRUCTOR)
|
||||
if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
|
||||
output_constant_def (tem, 0);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue