aboutsummaryrefslogtreecommitdiff
path: root/gcc/dmp-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/dmp-tree.c')
-rw-r--r--gcc/dmp-tree.c3695
1 files changed, 3695 insertions, 0 deletions
diff --git a/gcc/dmp-tree.c b/gcc/dmp-tree.c
new file mode 100644
index 00000000000..2d278da9bb7
--- /dev/null
+++ b/gcc/dmp-tree.c
@@ -0,0 +1,3695 @@
+/* APPLE LOCAL new tree dump */
+/* Common condensed tree display routines.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ Contributed by Ira L. Ruben (ira@apple.com)
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* This dumper is intended for used with the debugger. You call
+ dump_tree(x), where x is the node of interest. The tree display
+ produced here is much more condensed than what is produced by,
+ say, debug_tree(). Here each node is displayed as a single
+ (possibly line wrapped) line. The emphasis here is mainly on
+ the parse (front-end) trees as opposed to RTL-related info.
+
+ Here's an example of some of it's output:
+
+ compound_stmt:0xED4D0C line=74 0xED4D20
+ scope_stmt:0xED4D20 line=75 BEGIN block=0xED0300
+ block:0xED0300 vars=0xECD620 abs-orig=0x0 super=0xED0340 sub=0x0
+ var_decl:0xECD620 t=0xEA5310 {int} initial=0xED0260 line=75 comm
+ cntxt=0xECD3F0 sz=32(4) zzz
+ integer_cst:0xED0260 t=0xEA5310 {int} 0xFFFFFF9C = -100
+
+ decl_stmt:0xED4D84 line=75 var_decl=0xECD620 {int} zzz
+
+ expr_stmt:0xED4E24 line=76 0xED02E0
+ modify_expr:0xED02E0 t=0xEA5310 {int} 0xECD540 0xED4DFC
+ var_decl:0xECD540 t=0xEA5310 {int} cntxt=0xECD3F0 i
+ nop_expr:0xED4DFC t=0xEA5310 {int} 0xED02C0
+ plus_expr:0xED02C0 t=0xEA8540 {long unsigned int} 0xED4DE8 0xED02A0
+ nop_expr:0xED4DE8 t=0xEA8540 {long unsigned int} 0xED0280
+ trunc_div_expr:0xED0280 t=0xEA5310 {int} 0xECD540 0xECD620
+ var_decl:0xECD540 t=0xEA5310 {int} cntxt=0xECD3F0 i
+ var_decl:0xECD620 t=0xEA5310 {int} cntxt=0xECD3F0 zzz
+ call_expr:0xED02A0 t=0xEA8540 {long unsigned int} func=0xED4DAC args=0xED4DD4
+ addr_expr:0xED4DAC (func) t=0xECD690 {pointer_type} 0xEB0850
+ function_decl:0xEB0850 t=0xEABD90 {long unsigned int} BUILT_IN_NORMAL strlen
+ tree_list:0xED4DD4 (args) purpose=0x0 value=0xED4DC0 chain=0x0
+ nop_expr:0xED4DC0 (value) t=0xEAB1C0 {pointer_type} 0xECD4D0
+ var_decl:0xECD4D0 t=0xEA8CB0 {pointer_type} cntxt=0xECD3F0 lcl
+ scope_stmt:0xED4E38 line=77 END block=0xED0300
+
+ Each node is limited to a single line (unless it needs to be wrapped).
+ All nodes at the same nesting level are displayed at the same indenting
+ level. Each node is handled individually with code appropriate to what
+ it needs to display.
+
+ Note that unlike debug_tree() the details of the type info are not shown
+ in these trees when (as in this example) the initial node passed to
+ dmp_tree() is not a type. It is assumed that you are mainly interested
+ in the parse trees and their relationship to one another and don't need
+ the display cluttered up with each node's type info (other than it's
+ kind and address).
+
+ On the other hand you could be interested in the details of a particular
+ type. In that case call dmp_tree() specifying that type's address as
+ the initial node. When that is done a similarly formatted tree is
+ output, but now the details of that type and the types it uses are
+ shown. In the above example, 3 lines up from the bottom, there's a
+ pointer (which happens to be for a char*). Here's what
+ dmp_tree(0xEAB1C0) produces:
+
+ pointer_type:0xEAB1C0 t=0xEAB150 align=32 prec=32 sz=32(4)
+ integer_type:0xEAB150 uns const align=8 *this=0xEAB1C0 prec=8 sz=8(1)
+ min/max=0/255 char
+
+ Note, the type is fully followed (except for *this which is overkill).
+ Also illustrated is how lines are wrapped if too long for the display.
+ Here, it's illustrated assuming about a 72-character wrap point to
+ fit in these comments. In reality, the wrap point is normally the
+ terminal width. But the DMP_TREE_WRAP environment variable can be
+ set to the desired width. If neither the terminal width with nor the
+ environment variable can be accessed, or the value is outside the
+ range 72 to 512, the width is set to 130.
+
+ There are five language-specific routines that which MUST be uniquely
+ defined (via the language hooks) for that language to handle language-
+ specific attributes for certain kinds of tree nodes:
+
+ 1. void dump_identifier(FILE *file, tree node, int indent, int before_id);
+
+ Called twice for dmp_tree() for an IDENTIFIER_NODE. The first
+ call is after the common info for the node is generated but before
+ displaying the identifier (before_id==0) which is always assumed to
+ be the last thing on the line.
+
+ The second call is done after the id is displayed (before_id!=0).
+ This is for displaying any language-specific node information that
+ should be preceded by an newline_and_indent() call or a recursive
+ call to dump_tree() for nodes which are language specific operands
+ to a IDENTIFIER_NODE.
+
+ 2. void dump_decl(FILE *file, tree node, int indent, int before_id);
+
+ Called twice for dmp_tree() for a ..._DECL node. The first call
+ after the common info for the node is generated but before
+ displaying the identifier (before_id==0) which is always assumed
+ to be the last thing on the line.
+
+ The second call is done after the id is displayed (before_id!=0).
+ This is for displaying any language-specific node information that
+ should be preceded by an newline_and_indent() call or a recursive
+ call to dump_tree() for nodes which are language specific operands
+ to a ..._DECL node.
+
+ 3. void dump_type(FILE *file, tree node, int indent, int before_id);
+
+ Called twice for dmp_tree() for a ..._TYPE node. The first call
+ after the common info for the node is generated but before
+ displaying the identifier (before_id==0) which is always assumed
+ to be the last thing on the line.
+
+ The second call is done after the id is displayed (before_id!=0).
+ This is for displaying any language-specific node information that
+ should be preceded by an newline_and_indent() call or a recursive
+ call to dump_tree() for nodes which are language specific operands
+ to a ..._TYPE node.
+
+ 4. int dump_blank_line_p(tree previous_node, tree current_node);
+
+ Normally a blank line is inserted before each statement node (a
+ statement node is determined by calling statement_code_p()). This
+ makes the display easier to read by keeping each statement grouped
+ like a paragraph. There may, however, be some kinds of statements
+ where a blank line isn't desired (e.g., a begin SCOPE_STMT in C).
+ Thus dump_blank_line_p() is called to ask if a particular
+ statement should be preceded by a blank line dependent upon the
+ node that preceded it.
+
+ dump_blank_line_p() is called for each statement passing the
+ previous node (not necessarily a statement) and current node (a
+ statement node by definition). It should return 1 if a blank
+ line is to be inserted and 0 otherwise.
+
+ 5. int dump_lineno_p(FILE *file, tree node);
+
+ This is called for each node to display file and/or line number
+ information for those nodes that have such information. If it
+ is displayed the function should return 1. If not, 0.
+
+ The function generally does not have to handle ..._DECL nodes
+ unless there some special handling is reequired. They are
+ handled by print_lineno() (dump_lineno_p()'s caller).
+ It is defined to not repeat the filename if it does not
+ change from what's in dump_tree_state.curr_file and then
+ it only displays the basename (using lbasename()). The
+ format of the display is " line=nbr(basename)" where the
+ leading space is included as usual in these displays and
+ the parenthesized basename omitted if not needed or is
+ the same as before.
+*/
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tree.h"
+#include "real.h"
+#include "c-common.h"
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include "langhooks.h"
+
+/* c-common.h defines a macro called RETURN_EXPR. But we need to use it
+ as the enum defined by tree.def. */
+#undef RETURN_EXPR
+
+#define DMP_TREE
+#include "dmp-tree.h"
+
+#if defined(HAVE_UNISTD_H) && DMP_TREE_WRAPPED_OUTPUT
+#include <sys/ioctl.h>
+#endif
+
+#define MIN_LINE_WRAP 72 /* min wrapping column */
+#define MAX_LINE_WRAP 512 /* max wrapping column */
+#define DEFAULT_LINE_WRAP 130 /* default */
+#define DMP_TREE_LINE_WRAP "DMP_TREE_WRAP" /* environment variable */
+
+/* Notes to myself:
+
+ c-common.c, verify_tree(), c-decl.c, and cp/ptree.c look intersting!
+*/
+
+void dump_tree (FILE *file, const char *annotation, tree node, int indent);
+void dmp_tree (tree node);
+
+#define HASH_SIZE 37
+
+struct bucket
+{
+ tree node;
+ struct bucket *next;
+};
+
+static struct bucket **table;
+
+static tree *type_array = NULL;
+#define TYPE_ARRAY_INITIAL_SIZE 20000
+#define TYPE_ARRAY_INCR 10000
+static int type_array_size = 0;
+static int type_array_next = 0;
+static int type_array_incr = TYPE_ARRAY_INITIAL_SIZE;
+
+#if DMP_TREE_WRAPPED_OUTPUT
+static char curr_line[2 * MAX_LINE_WRAP];
+static int prefix_len;
+static int line_index;
+static int prev_line_was_null;
+static int prev_line_was_wrapped;
+static int wrap_column;
+#ifdef TIOCGWINSZ
+static struct winsize winsize;
+#endif
+#if defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
+static struct ttysize winsize;
+#endif
+#endif /* DMP_TREE_WRAPPED_OUTPUT */
+
+dump_tree_state_t dump_tree_state = {
+ (int)LAST_AND_UNUSED_TREE_CODE, /* c */
+ -1, /* nesting_depth */
+ 0, /* dump_full_type */
+ 0, /* really_follow */
+ 0, /* doing_parm_decl */
+ 0, /* doing_call_expr */
+ NULL, /* curr_file */
+ 0, /* no_new_line */
+ 0, /* line_cnt */
+ 0, /* doing_tree_list */
+ INT_MAX, /* max_depth */
+ DMP_TREE_VISIT_ANY /* visit_only_once */
+};
+
+#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) \
+static void print_ ## SYM (FILE *file, const char *annotation, tree node, int indent);
+#include "tree.def"
+#undef DEFTREECODE
+
+static void init_dump_state PARAMS ((tree node));
+static int no_dump_tree_p PARAMS ((FILE *file, const char *annotation, tree node, int indent));
+static void free_hash_table PARAMS ((void));
+
+static lang_dump_tree_p_t lang_dump_tree_p = no_dump_tree_p;
+
+#define CST_VALUE(node, ok) \
+ ((TREE_INT_CST_HIGH (node) == 0) \
+ ? (ok &= 1, TREE_INT_CST_LOW (node)) \
+ : ((TREE_INT_CST_HIGH (node) == -1 && TREE_INT_CST_LOW (node) != 0) \
+ ? (ok &= 1, -TREE_INT_CST_LOW (node)) \
+ : (ok = 0)))
+
+
+
+/*-------------------------------------------------------------------*/
+
+static void
+init_dump_state (node)
+ tree node;
+{
+ dump_tree_state.dump_full_type = TYPE_P (node);
+ /*dump_tree_state.nesting_depth = 0; */
+ dump_tree_state.really_follow = 1;
+ dump_tree_state.doing_parm_decl = 0;
+ dump_tree_state.doing_call_expr = 0;
+ dump_tree_state.no_new_line = 0;
+ dump_tree_state.line_cnt = 0;
+ dump_tree_state.curr_file = NULL;
+ dump_tree_state.doing_tree_list = 0;
+ /*dump_tree_state.max_depth = INT_MAX;*/
+ /*dump_tree_state.visit_only_once = DMP_TREE_VISIT_ANY;*/
+}
+
+/* Always end the current line by writing a '\n'.
+ If column > 0 then output column blanks to the next line.
+ Increment dump_tree_state.line_cnt to allow callers to
+ determine how many lines are output between any pair of
+ points. */
+
+void
+newline_and_indent (file, column)
+ FILE *file;
+ int column;
+{
+ fputc ('\n', file);
+ ++dump_tree_state.line_cnt;
+
+ if (column > 0)
+ fprintf (file, "%*c", column, ' ');
+}
+
+/* Return 1 if node has been previously seen and 0 otherwise.
+ If record_it is non-zero then record that the node was
+ seen. */
+int
+node_seen (node, record_it)
+ tree node;
+ int record_it;
+{
+ int hash;
+ struct bucket *b;
+
+ hash = ((unsigned long) node) % HASH_SIZE;
+
+ /* If node is in the table, just mention its address. */
+
+ for (b = table[hash]; b; b = b->next)
+ if (b->node == node)
+ return 1;
+
+ if (record_it)
+ {
+ b = (struct bucket *) xmalloc (sizeof (struct bucket));
+ b->node = node;
+ b->next = table[hash];
+ table[hash] = b;
+ }
+
+ return 0;
+}
+
+/* Free the hash table used to record visited nodes. */
+static void
+free_hash_table()
+{
+ int hash;
+ struct bucket *b, *next;
+
+ if (!table)
+ return;
+
+ for (hash = 0; hash < HASH_SIZE; ++hash)
+ {
+ b = table[hash];
+ while (b)
+ {
+ next = b->next;
+ free (b);
+ b = next;
+ }
+ }
+
+ free (table);
+ table = NULL;
+}
+
+
+/*-------------------------------------------------------------------*/
+
+void
+print_type (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ int newline = 0;
+
+# define PRINT_TYPE_NAME(node) \
+ if (!newline && TYPE_NAME (node)) \
+ { \
+ if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) \
+ fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node))); \
+ else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL \
+ && DECL_NAME (TYPE_NAME (node))) \
+ fprintf (file, " %s", \
+ IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)))); \
+ newline = 1; \
+ }
+
+ if (TYPE_CONTEXT (node))
+ {
+ fprintf (file, " cntxt=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_CONTEXT (node)));
+ }
+
+ if (TYPE_NEEDS_CONSTRUCTING (node))
+ fputs (" need-ctor", file);
+ if (TYPE_PACKED (node))
+ fputs (" packed", file);
+ if (TREE_THIS_VOLATILE (node))
+ fputs (" volatile", file);
+ if (TYPE_READONLY (node))
+ fputs (" const", file);
+ if (TYPE_RESTRICT (node))
+ fputs (" restrict", file);
+
+ if (TYPE_LANG_FLAG_0 (node)
+ || TYPE_LANG_FLAG_1 (node)
+ || TYPE_LANG_FLAG_2 (node)
+ || TYPE_LANG_FLAG_3 (node)
+ || TYPE_LANG_FLAG_4 (node)
+ || TYPE_LANG_FLAG_5 (node)
+ || TYPE_LANG_FLAG_6 (node))
+ {
+ fputs (" type-flags=#", file);
+ if (TYPE_LANG_FLAG_0 (node))
+ fputc ('0', file);
+ if (TYPE_LANG_FLAG_1 (node))
+ fputc ('1', file);
+ if (TYPE_LANG_FLAG_2 (node))
+ fputc ('2', file);
+ if (TYPE_LANG_FLAG_3 (node))
+ fputc ('3', file);
+ if (TYPE_LANG_FLAG_4 (node))
+ fputc ('4', file);
+ if (TYPE_LANG_FLAG_5 (node))
+ fputc ('5', file);
+ if (TYPE_LANG_FLAG_6 (node))
+ fputc ('6', file);
+ }
+
+ if (TYPE_USER_ALIGN (node))
+ fprintf (file, " usr-algn");
+
+ fprintf (file, " align=%d", TYPE_ALIGN (node));
+
+ if (TYPE_SYMTAB_ADDRESS (node))
+ fprintf (file, " symtab=%d", TYPE_SYMTAB_ADDRESS (node));
+
+ if (TYPE_ALIAS_SET (node) != -1)
+ {
+ fprintf (file, " alias-set=");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, TYPE_ALIAS_SET (node));
+ }
+
+ if (TYPE_POINTER_TO (node))
+ {
+ fprintf (file, " *this=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_POINTER_TO (node)));
+ }
+
+ if (TYPE_REFERENCE_TO (node))
+ {
+ fprintf (file, " &this=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_REFERENCE_TO (node)));
+ }
+
+ if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE)
+ {
+ if (TYPE_DOMAIN (node))
+ {
+ fprintf (file, " domain=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_DOMAIN (node)));
+ }
+ }
+ else if (TREE_CODE (node) == ENUMERAL_TYPE)
+ {
+ if (TYPE_VALUES (node))
+ {
+ fprintf (file, " values=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_VALUES (node)));
+ }
+ }
+ else if (TREE_CODE (node) == VECTOR_TYPE)
+ {
+ if (TYPE_DEBUG_REPRESENTATION_TYPE (node))
+ {
+ fprintf (file, " values=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_DEBUG_REPRESENTATION_TYPE (node)));
+ }
+ }
+
+ if (TYPE_ATTRIBUTES (node))
+ {
+ fprintf (file, " attr=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_ATTRIBUTES (node)));
+ }
+
+ if (TYPE_PRECISION (node))
+ fprintf (file, " prec=%d", TYPE_PRECISION (node));
+
+ if (TYPE_MAIN_VARIANT (node) != node)
+ {
+ fprintf (file, " main-variant=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_MAIN_VARIANT (node)));
+ }
+ if (TYPE_NEXT_VARIANT (node))
+ {
+ fprintf (file, " next-variant=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_NEXT_VARIANT (node)));
+ }
+
+ if (TYPE_NAME (node) && TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
+ && DECL_ORIGINAL_TYPE (TYPE_NAME (node)))
+ {
+ fprintf (file, " orig-type=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_ORIGINAL_TYPE (TYPE_NAME (node))));
+ }
+
+ (void)node_seen (node, TRUE); /* prevent recursion on this node */
+
+ (*lang_hooks.dump_type) (file, node, indent, 0);
+
+ if (TYPE_SIZE (node)
+ && TREE_CODE (TYPE_SIZE (node)) == INTEGER_CST
+ && TYPE_SIZE_UNIT (node)
+ && TREE_CODE (TYPE_SIZE_UNIT (node)) == INTEGER_CST)
+ {
+ fputs (" sz=", file);
+ print_integer_constant (file, TYPE_SIZE (node), 0);
+ fputs ("(", file);
+ print_integer_constant (file, TYPE_SIZE_UNIT (node), 0);
+ fputs (")", file);
+ }
+ else
+ {
+ PRINT_TYPE_NAME(node);
+ dump_tree (file, "(size)", TYPE_SIZE (node), indent + INDENT);
+ dump_tree (file, "(unit size)", TYPE_SIZE_UNIT (node), indent + INDENT);
+ }
+
+ if (INTEGRAL_TYPE_P (node))
+ {
+ if (!newline &&
+ TREE_CODE (TYPE_MIN_VALUE (node)) == INTEGER_CST
+ && TREE_CODE (TYPE_MAX_VALUE (node)) == INTEGER_CST)
+ {
+ fputs (" min/max=", file);
+ print_integer_constant (file, TYPE_MIN_VALUE (node), 0);
+ fputc ('/', file);
+ print_integer_constant (file, TYPE_MAX_VALUE (node), 0);
+ }
+ else
+ {
+ PRINT_TYPE_NAME(node);
+ dump_tree (file, "(min)", TYPE_MIN_VALUE (node), indent + INDENT);
+ dump_tree (file, "(max)", TYPE_MAX_VALUE (node), indent + INDENT);
+ }
+ }
+
+ PRINT_TYPE_NAME(node);
+
+ if (TYPE_ATTRIBUTES (node))
+ dump_tree (file, NULL, TYPE_ATTRIBUTES (node), indent + INDENT);
+
+ (*lang_hooks.dump_type) (file, node, indent, 1);
+
+ if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE)
+ {
+ if (TYPE_DOMAIN (node))
+ dump_tree (file, "(domain)", TYPE_DOMAIN (node), indent + INDENT);
+ }
+ else if (TREE_CODE (node) == ENUMERAL_TYPE)
+ {
+ if (TYPE_VALUES (node))
+ dump_tree (file, "(values)", TYPE_VALUES (node), indent + INDENT);
+ }
+
+#if 0
+ if (TYPE_MAIN_VARIANT (node) == node)
+ {
+ tree n = TYPE_MAIN_VARIANT (node);
+ dump_tree (file, "(main-variant)", n, indent + INDENT);
+ for (n = TYPE_NEXT_VARIANT (n); n; n = TYPE_NEXT_VARIANT (n))
+ dump_tree (file, "(next-variant)", n, indent + INDENT);
+ }
+#endif
+
+#if 0
+ if (TYPE_POINTER_TO (node))
+ dump_tree (file, "(ptr-to-this)", TYPE_POINTER_TO (node), indent + INDENT);
+
+ if (TYPE_REFERENCE_TO (node))
+ dump_tree (file, "(ref-to-this)", TYPE_REFERENCE_TO (node), indent + INDENT);
+#endif
+
+ if (TREE_TYPE (node))
+ dump_tree (file, NULL, TREE_TYPE (node), indent + INDENT);
+
+ /* I THINK SOME BINFO-RELATED MACROS NEED TO BE INVESTIGATED AND PUT HERE... */
+}
+
+void
+print_decl (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent ATTRIBUTE_UNUSED;
+{
+ int newline = 0;
+
+ if (!node_seen (node, FALSE))
+ {
+ if (TREE_SIDE_EFFECTS (node) || TREE_THIS_VOLATILE (node))
+ fputs (" volatile", file);
+ if (DECL_IGNORED_P (node))
+ fputs (" ignored", file);
+ if (DECL_ABSTRACT (node))
+ fputs (" abst", file);
+ if (DECL_IN_SYSTEM_HEADER (node))
+ fputs (" in-sys-hdr", file);
+ if (DECL_COMMON (node))
+ fputs (" comm", file);
+ if (DECL_NONLOCAL (node))
+ fputs (" nonlcl", file);
+#if 0
+ if (DECL_ARTIFICIAL (node))
+ fputs (" artifical", file);
+#endif
+ if (DECL_WEAK (node))
+ fputs (" weak", file);
+ /* APPLE LOCAL coalescing */
+ if (DECL_COALESCED (node))
+ fputs (" coal", file);
+ /* APPLE LOCAL begin weak_import (Radar 2809704) ilr */
+ if (DECL_WEAK_IMPORT (node))
+ fputs (" weak_import", file);
+ /* APPLE LOCAL end weak_import ilr */
+
+ if (DECL_LANG_FLAG_0 (node)
+ || DECL_LANG_FLAG_1 (node)
+ || DECL_LANG_FLAG_2 (node)
+ || DECL_LANG_FLAG_3 (node)
+ || DECL_LANG_FLAG_4 (node)
+ || DECL_LANG_FLAG_5 (node)
+ || DECL_LANG_FLAG_6 (node)
+ || DECL_LANG_FLAG_7 (node))
+ {
+ fputs (" lang-flags=#", file);
+ if (DECL_LANG_FLAG_0 (node))
+ fputc ('0', file);
+ if (DECL_LANG_FLAG_1 (node))
+ fputc ('1', file);
+ if (DECL_LANG_FLAG_2 (node))
+ fputc ('2', file);
+ if (DECL_LANG_FLAG_3 (node))
+ fputc ('3', file);
+ if (DECL_LANG_FLAG_4 (node))
+ fputc ('4', file);
+ if (DECL_LANG_FLAG_5 (node))
+ fputc ('5', file);
+ if (DECL_LANG_FLAG_6 (node))
+ fputc ('6', file);
+ if (DECL_LANG_FLAG_7 (node))
+ fputc ('7', file);
+ }
+ }
+
+ if (DECL_ATTRIBUTES (node))
+ {
+ fprintf (file, " attr=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_ATTRIBUTES (node)));
+ }
+
+ if (DECL_CONTEXT (node))
+ {
+ fprintf (file, " cntxt=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_CONTEXT (node)));
+ }
+
+ if (DECL_RTL_SET_P (node))
+ {
+ fprintf (file, " rtl=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_RTL (node)));
+ }
+
+ (*lang_hooks.dump_decl) (file, node, indent, 0);
+
+ if (!node_seen (node, TRUE)) /* mark ..._DECL node seen b4 recursing */
+ {
+ if (TREE_CODE (node) == FIELD_DECL)
+ {
+ if (DECL_BIT_FIELD_TYPE (node))
+ {
+ tree bf_type = DECL_BIT_FIELD_TYPE (node);
+ fprintf (file, " bf-type=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (bf_type));
+ if (TYPE_NAME (bf_type))
+ {
+ if (TREE_CODE (TYPE_NAME (bf_type)) == IDENTIFIER_NODE)
+ {
+ if (IDENTIFIER_POINTER (TYPE_NAME (bf_type))
+ && *IDENTIFIER_POINTER (TYPE_NAME (bf_type)))
+ fprintf (file, " {%s}", IDENTIFIER_POINTER (TYPE_NAME (bf_type)));
+ }
+ else if (TREE_CODE (TYPE_NAME (bf_type)) == TYPE_DECL
+ && DECL_NAME (TYPE_NAME (bf_type))
+ && IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (bf_type)))
+ && *IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (bf_type))))
+ fprintf (file, " {%s}",
+ IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (bf_type))));
+ }
+ else
+ fprintf (file, " {%s}", tree_code_name[(int)TREE_CODE (bf_type)]);
+ }
+
+ if (DECL_FIELD_OFFSET (node) && DECL_FIELD_BIT_OFFSET (node))
+ {
+ if (TREE_CODE (DECL_FIELD_OFFSET (node)) == INTEGER_CST
+ && TREE_CODE (DECL_FIELD_BIT_OFFSET (node)) == INTEGER_CST)
+ {
+ fputs (" off=", file);
+ print_integer_constant (file, DECL_FIELD_BIT_OFFSET (node), 0);
+ fputs ("(", file);
+ print_integer_constant (file, DECL_FIELD_OFFSET (node), 0);
+ fputs (")", file);
+ }
+ else
+ {
+ if (DECL_NAME (node))
+ fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
+ dump_tree (file, "(offset)", DECL_FIELD_OFFSET (node),
+ indent + INDENT);
+ dump_tree (file, "(bit offset)", DECL_FIELD_BIT_OFFSET (node),
+ indent + INDENT);
+ newline = 1;
+ }
+ }
+ else
+ {
+ if (DECL_FIELD_OFFSET (node))
+ {
+ if (TREE_CODE (DECL_FIELD_OFFSET (node)) == INTEGER_CST)
+ {
+ fputs (" off=", file);
+ print_integer_constant (file, DECL_FIELD_BIT_OFFSET (node), 0);
+ }
+ else
+ {
+ if (DECL_NAME (node))
+ fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
+ dump_tree (file, "(offset)", DECL_FIELD_OFFSET (node),
+ indent + INDENT);
+ newline = 1;
+ }
+ }
+ if (DECL_FIELD_BIT_OFFSET (node))
+ {
+ if (!newline
+ && TREE_CODE (DECL_FIELD_BIT_OFFSET (node)) == INTEGER_CST)
+ {
+ fputs (" bit-off=", file);
+ print_integer_constant (file, DECL_FIELD_BIT_OFFSET (node), 0);
+ }
+ else
+ {
+ if (!newline && DECL_NAME (node))
+ fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
+ dump_tree (file, "(bit offset)", DECL_FIELD_BIT_OFFSET (node),
+ indent + INDENT);
+ newline = 1;
+ }
+ }
+ }
+ }
+
+ if (!newline && DECL_SIZE (node) && DECL_SIZE_UNIT (node)
+ && TREE_CODE (DECL_SIZE (node)) == INTEGER_CST
+ && TREE_CODE (DECL_SIZE_UNIT (node)) == INTEGER_CST)
+ {
+ fputs (" sz=", file);
+ print_integer_constant (file, DECL_SIZE (node), 0);
+ fputs ("(", file);
+ print_integer_constant (file, DECL_SIZE_UNIT (node), 0);
+ fputs (")", file);
+ }
+ else
+ {
+ if (!newline && DECL_NAME (node))
+ fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
+ newline = 1;
+ dump_tree (file, "(size)", DECL_SIZE (node), indent + INDENT);
+ dump_tree (file, "(unit size)", DECL_SIZE_UNIT (node), indent + INDENT);
+ }
+ }
+
+ if (!newline && DECL_NAME (node))
+ fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
+
+ (*lang_hooks.dump_decl) (file, node, indent, 1);
+}
+
+void
+print_ref (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent ATTRIBUTE_UNUSED;
+{
+ if (TREE_THIS_VOLATILE (node))
+ fputs (" volatile", file);
+ if (TREE_READONLY (node))
+ fputs (" readonly", file);
+}
+
+#define MAX_COMMENT 50
+
+/* The "..." arguments are a list of zero or more strings with a NULL
+ as the last list item. They are used to annotate each respective
+ operand. The annotation convention is that if an string is not
+ enclosed in parentheses it will annotation it's operand display. If
+ it is enclosed in parentheses it will be appended to the kind:address
+ display. Examples:
+
+ annotation kind:address ....
+ or
+ kind:address (annotation) ....
+*/
+
+void
+print_operands VPARAMS ((FILE *file, tree node, int indent, int follow, ...))
+{
+#ifndef ANSI_PROTOTYPES
+ FILE *file;
+ tree node;
+ int indent, follow;
+#endif
+ int i, first_rtl, len, len1, nomore, maxlen;
+ va_list ap;
+ char *s, temp[MAX_COMMENT + 2];
+
+ VA_START (ap, follow);
+#ifndef ANSI_PROTOTYPES
+ file = va_arg (ap, FILE *);
+ node = va_arg (ap, tree);
+ indent = va_arg (ap, int);
+ follow = va_arg (ap, int);
+#endif
+
+ len = TREE_CODE_LENGTH (TREE_CODE (node));
+ first_rtl = first_rtl_op (TREE_CODE (node));
+
+ for (i = nomore = maxlen = 0; i < len && i < first_rtl; ++i)
+ {
+ s = nomore ? NULL : va_arg (ap, char *);
+ if (s == NULL)
+ {
+ nomore = 1;
+ fprintf (file, " ");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_OPERAND (node, i)));
+ }
+ else
+ {
+ if (s[0] != '(')
+ {
+ len1 = strlen (s);
+ if (len1 > maxlen)
+ maxlen = len1;
+ }
+ else
+ {
+ s = strcpy (temp, ++s);
+ temp[strlen (temp) - 1] = '\0';
+ }
+ fprintf (file, " %s=", s);
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_OPERAND (node, i)));
+ }
+ }
+
+ va_end (ap);
+
+ if (first_rtl < len)
+ {
+ for (i = first_rtl; i < len; ++i)
+ if (TREE_OPERAND (node, i))
+ break;
+ if (i < len)
+ {
+ fputs (" [rtl=", file);
+ for (i = first_rtl; i < len; ++i)
+ {
+ if (i > first_rtl)
+ fputc (',', file);
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_OPERAND (node, i)));
+ }
+ fputc (']', file);
+ }
+ }
+
+ if (follow && dump_tree_state.really_follow)
+ {
+ maxlen = MIN (maxlen, MAX_COMMENT);
+ temp[maxlen] = '\0';
+
+ /* Reusing the arg list -- does this work when !ANSI_PROTOTYPES? */
+ VA_START (ap, follow);
+# ifndef ANSI_PROTOTYPES
+ file = va_arg (ap, FILE *);
+ node = va_arg (ap, tree);
+ indent = va_arg (ap, int);
+# endif
+
+ for (i = nomore = 0; i < len && i < first_rtl; ++i)
+ {
+ s = nomore ? NULL : va_arg (ap, char *);
+ if (s == NULL)
+ {
+ nomore = 1;
+ if (maxlen > 0)
+ s = memset(temp, ' ', maxlen);
+ }
+ else if (s[0] != '(')
+ {
+ len = strlen (s);
+ if (maxlen < len)
+ len = maxlen;
+ if (len < maxlen)
+ {
+ memset(temp, ' ', maxlen);
+ s = memcpy(temp + maxlen - len - 1, s, len);
+ }
+ }
+ dump_tree (file, s, TREE_OPERAND (node, i), indent + INDENT);
+ }
+
+ va_end (ap);
+ }
+}
+
+void
+print_lineno (file, node)
+ FILE *file;
+ tree node;
+{
+ if (!(*lang_hooks.dump_lineno_p) (file, node)
+ && TREE_CODE_CLASS (TREE_CODE (node)) == 'd')
+ {
+ if (TREE_CODE (node) != FUNCTION_DECL || !DECL_BUILT_IN (node))
+ {
+ if (dump_tree_state.curr_file
+ && strcmp(dump_tree_state.curr_file, DECL_SOURCE_FILE (node)) == 0)
+ fprintf (file, " line=%d", DECL_SOURCE_LINE (node));
+ else
+ {
+ dump_tree_state.curr_file = (char *)DECL_SOURCE_FILE (node);
+ fprintf (file, " line=%d(%s)", DECL_SOURCE_LINE (node),
+ lbasename(DECL_SOURCE_FILE (node)));
+ }
+ }
+ }
+}
+
+void
+print_integer_constant (file, node, hex)
+ FILE *file;
+ tree node;
+ int hex;
+{
+ int ok = 1;
+ tree type = TREE_TYPE (node);
+ int size;
+
+ size = (TREE_CODE_CLASS (TREE_CODE (type)) == 't') ?
+ CST_VALUE (TYPE_SIZE_UNIT (type), ok)
+ : 4; /*CST_VALUE (type,ok);*/
+ if (!ok)
+ size = 4;
+
+ if (hex)
+ {
+ if (TREE_INT_CST_HIGH (node) == 0
+ || (TREE_INT_CST_HIGH (node) == -1 && TREE_INT_CST_LOW (node) != 0))
+ {
+ if (size == 1)
+ fprintf (file, "0x%.2lX = ", (unsigned long)(TREE_INT_CST_LOW (node) & 0xFF));
+ else if (size == 2)
+ fprintf (file, "0x%.4lX = ", (unsigned long)(TREE_INT_CST_LOW (node) & 0xFFFF));
+ else if (size == 4)
+ fprintf (file, "0x%.8lX = ", (unsigned long)TREE_INT_CST_LOW (node));
+ else
+ fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
+ TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
+ }
+ }
+
+ if (TREE_INT_CST_HIGH (node) == 0)
+ fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node));
+ else if (TREE_INT_CST_HIGH (node) == -1 && TREE_INT_CST_LOW (node) != 0)
+ {
+ fputs ("-", file);
+ fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, -TREE_INT_CST_LOW (node));
+ }
+ else
+ fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
+ TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
+}
+
+void
+print_real_constant (file, node)
+ FILE *file;
+ tree node;
+{
+ char string[100];
+ real_to_decimal (string, &TREE_REAL_CST (node), sizeof (string), 0, 1);
+ fputs (string, file);
+}
+
+void
+print_string_constant (file, str, maxlen)
+ FILE *file;
+ const char *str;
+ int maxlen;
+{
+ char c, buf[1024+12+1], *s;
+ int i = 0, len;
+
+ if (!str)
+ {
+ fputs ("(null)", file);
+ return;
+ }
+
+ /* Buffer string so that we write it with a single fputs(). This is
+ required for our line wrapping code to know when it is "inside"
+ a string. */
+
+ len = strlen (str);
+ if (len > 1021)
+ len = 1021;
+
+ s = buf;
+ *s++ = '"';
+
+ while ((c = *str++) != '\0')
+ {
+ if (c == '\b') {
+ *s++ = '\\'; *s++ = 'b'; i += 2;
+ } else if (c == '\f') {
+ *s++ = '\\'; *s++ = 'f'; i += 2;
+ } else if (c == '\v') {
+ *s++ = '\\'; *s++ = 'v'; i += 2;
+ } else if (c == '\r') {
+ *s++ = '\\'; *s++ = 'r'; i += 2;
+ } else if (c == '\n') {
+ *s++ = '\\'; *s++ = 'n'; i += 2;
+ } else if (c == '\t') {
+ *s++ = '\\'; *s++ = 't'; i += 2;
+ } else if (!isprint (c)) {
+ s += sprintf (s, "\\%03o", c); i += 4;
+ } else {
+ *s++ = c; ++i;
+ }
+ if (i > maxlen && len > maxlen + 12)
+ {
+ strcpy (s, "...(more)...");
+ break;
+ }
+ }
+ *s++ = '"';
+ *s = '\0';
+ fputs (buf, file);
+}
+
+void
+print_tree_flags (file, node)
+ FILE *file;
+ tree node;
+{
+ if (TREE_SIDE_EFFECTS (node))
+ fputs ("side-effects", file);
+ if (TREE_CONSTANT (node))
+ fputs (" const", file);
+ if (TREE_ADDRESSABLE (node))
+ fputs (" addressable", file);
+ if (TREE_THIS_VOLATILE (node))
+ fputs (" volatile", file);
+ if (TREE_READONLY (node))
+ fputs (" readonly", file);
+ if (TREE_UNSIGNED (node))
+ fputs (" uns", file);
+ if (TREE_ASM_WRITTEN (node))
+ fputs (" asm-written", file);
+ if (TREE_USED (node))
+ fputs (" used", file);
+ if (TREE_NOTHROW (node))
+ fputs (" nothrow", file);
+ if (TREE_STATIC (node))
+ fputs (" static", file);
+ if (TREE_PUBLIC (node))
+ fputs (" public", file);
+ if (TREE_PRIVATE (node))
+ fputs (" private", file);
+ if (TREE_PROTECTED (node))
+ fputs (" protected", file);
+ if (TREE_BOUNDED (node))
+ fputs (" bounded", file);
+ if (TREE_DEPRECATED (node))
+ fputs (" deprecated", file);
+ /* APPLE LOCAL begin unavailable (Radar 2809697) ilr */
+ if (TREE_UNAVAILABLE (node))
+ fputs (" unavailable", file);
+ /* APPLE LOCAL end unavailable ilr */
+
+ if (TREE_LANG_FLAG_0 (node)
+ || TREE_LANG_FLAG_1 (node)
+ || TREE_LANG_FLAG_2 (node)
+ || TREE_LANG_FLAG_3 (node)
+ || TREE_LANG_FLAG_4 (node)
+ || TREE_LANG_FLAG_5 (node)
+ || TREE_LANG_FLAG_6 (node))
+ {
+ fputs (" tree-flags=#", file);
+ if (TREE_LANG_FLAG_0 (node))
+ fputc ('0', file);
+ if (TREE_LANG_FLAG_1 (node))
+ fputc ('1', file);
+ if (TREE_LANG_FLAG_2 (node))
+ fputc ('2', file);
+ if (TREE_LANG_FLAG_3 (node))
+ fputc ('3', file);
+ if (TREE_LANG_FLAG_4 (node))
+ fputc ('4', file);
+ if (TREE_LANG_FLAG_5 (node))
+ fputc ('5', file);
+ if (TREE_LANG_FLAG_6 (node))
+ fputc ('6', file);
+ }
+}
+
+/*-------------------------------------------------------------------*/
+
+/* Just in case print anything set in the common part of this node. */
+
+static void
+print_ERROR_MARK (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent ATTRIBUTE_UNUSED;
+{
+ if (TREE_CHAIN (node))
+ {
+ fprintf (file, " chain=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_CHAIN (node)));
+ }
+ if (TREE_TYPE (node))
+ {
+ fprintf (file, " type=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_TYPE (node)));
+ }
+ print_tree_flags (file, node);
+}
+
+static void
+print_IDENTIFIER_NODE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ if (TREE_PUBLIC (node))
+ fputs (" public", file);
+ if (TREE_ADDRESSABLE (node))
+ fputs (" addressable", file);
+
+ (*lang_hooks.dump_identifier) (file, node, indent, 0);
+ fprintf (file, " len=%d %s",
+ IDENTIFIER_LENGTH (node), IDENTIFIER_POINTER (node));
+ (*lang_hooks.dump_identifier) (file, node, indent, 1);
+}
+
+static void
+print_TREE_LIST (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (TREE_VIA_VIRTUAL (node))
+ fputs (" via-virt", file);
+ if (TREE_VIA_PUBLIC (node))
+ fputs (" via-public", file);
+ if (TREE_VIA_PRIVATE (node))
+ fputs (" via-private", file);
+ if (TREE_VIA_PROTECTED (node))
+ fputs (" via-protected", file);
+ fprintf (file, " purpose=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (TREE_PURPOSE (node)));
+ fprintf (file, " value=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (TREE_VALUE (node)));
+ fprintf (file, " chain=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (TREE_CHAIN (node)));
+
+ ++dump_tree_state.doing_tree_list;
+ (void)node_seen (node, TRUE);
+
+ dump_tree (file, "(purpose)", TREE_PURPOSE (node), indent + INDENT);
+ dump_tree (file, "(value)", TREE_VALUE (node), indent + INDENT);
+
+ for (node = TREE_CHAIN (node); node; node = TREE_CHAIN (node))
+ dump_tree (file, annotation, node, indent + 0); /* keep list at same indent */
+
+ --dump_tree_state.doing_tree_list;
+}
+
+static void
+print_TREE_VEC (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ int i, skip_line, len = TREE_VEC_LENGTH (node);
+
+ if (TREE_VIA_VIRTUAL (node))
+ fputs (" via-virt", file);
+ if (TREE_VIA_PUBLIC (node))
+ fputs (" via-public", file);
+ if (TREE_VIA_PRIVATE (node))
+ fputs (" via-private", file);
+ if (TREE_VIA_PROTECTED (node))
+ fputs (" via-protected", file);
+
+ fprintf (file, " len=%d", len);
+
+ for (i = skip_line = 0; i < len; ++i)
+ if (TREE_VEC_ELT (node, i))
+ {
+ char temp[MAX_COMMENT + 20];
+
+ if (skip_line)
+ newline_and_indent (file, 0);
+ skip_line = 1;
+ if (annotation)
+ {
+ temp[0] = '(';
+ if (annotation[0] == '(')
+ {
+ strcpy (temp+1, annotation+1);
+ temp[strlen (temp) - 1] = '\0';
+ }
+ else
+ strcpy (temp+1, annotation);
+ sprintf (temp + strlen (temp), ":%i)", i);
+ }
+ else
+ sprintf (temp, "(%i)", i);
+ dump_tree (file, temp, TREE_VEC_ELT (node, i), indent + INDENT);
+ }
+
+ if (len > 1 && indent > 1)
+ newline_and_indent (file, 0);
+}
+
+static void
+print_BLOCK (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent ATTRIBUTE_UNUSED;
+{
+ tree n;
+
+ fprintf (file, " vars=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (BLOCK_VARS (node)));
+ fprintf (file, " abs-orig=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (BLOCK_ABSTRACT_ORIGIN (node)));
+ fprintf (file, " super=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (BLOCK_SUPERCONTEXT (node)));
+ fprintf (file, " sub=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (BLOCK_SUBBLOCKS (node)));
+ fprintf (file, " frag-origin=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (BLOCK_FRAGMENT_ORIGIN (node)));
+ fprintf (file, " frag-chain=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (BLOCK_FRAGMENT_CHAIN (node)));
+
+ if (BLOCK_HANDLER_BLOCK (node))
+ fputs (" handler_block_flag", file);
+ if (BLOCK_ABSTRACT (node))
+ fputs (" abstract_flag", file);
+
+ for (n = BLOCK_VARS (node); n; n = TREE_CHAIN (n))
+ if (!node_seen (n, FALSE))
+ dump_tree (file, NULL, n, indent + INDENT);
+
+#if 0
+ for (n = BLOCK_SUBBLOCKS (node); n; n = BLOCK_CHAIN (n))
+ if (!node_seen (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+#endif
+
+ /*dump_tree (file, NULL, BLOCK_SUPERCONTEXT (node), indent + INDENT);*/
+
+ if (!node_seen (BLOCK_ABSTRACT_ORIGIN (node), FALSE))
+ dump_tree (file, NULL, BLOCK_ABSTRACT_ORIGIN (node), indent + INDENT);
+}
+
+static void
+print_VOID_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_INTEGER_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (TYPE_IS_SIZETYPE (node))
+ fputs (" sizetype", file);
+ if (TREE_UNSIGNED (node))
+ fputs (" uns", file);
+
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_REAL_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_COMPLEX_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_VECTOR_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_ENUMERAL_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (TREE_UNSIGNED (node))
+ fputs (" uns", file);
+
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_BOOLEAN_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_CHAR_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_POINTER_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_OFFSET_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ fprintf (file, " basetype=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_OFFSET_BASETYPE (node)));
+
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_REFERENCE_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_METHOD_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ tree n;
+
+ if (TYPE_METHOD_BASETYPE (node))
+ {
+ fprintf (file, " basetype=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_METHOD_BASETYPE (node)));
+ }
+ fprintf (file, " args=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_ARG_TYPES (node)));
+
+ print_type (file, annotation, node, indent);
+
+ for (n = TYPE_ARG_TYPES (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, "(args)", n, indent + INDENT);
+}
+
+static void
+print_FILE_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_ARRAY_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (TYPE_STRING_FLAG (node))
+ fputs (" string-flag", file);
+ if (TYPE_NONALIASED_COMPONENT (node))
+ fputs (" nonaliased-component", file);
+
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_SET_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (TYPE_STRING_FLAG (node))
+ fputs (" string-flag", file);
+
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_RECORD_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ tree n;
+
+ if (TYPE_NO_FORCE_BLK (node))
+ fputs (" no-force-blk", file);
+ fprintf (file, " fields=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_FIELDS (node)));
+
+ print_type (file, annotation, node, indent);
+ (void)node_seen (node, TRUE);
+
+ for (n = TYPE_FIELDS (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+}
+
+static void
+print_UNION_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (TYPE_NO_FORCE_BLK (node))
+ fputs (" no-force-blk", file);
+ if (TYPE_TRANSPARENT_UNION (node))
+ fputs (" transparent-union", file);
+ fprintf (file, " fields=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_FIELDS (node)));
+
+ print_type (file, annotation, node, indent);
+ (void)node_seen (node, TRUE);
+
+ for (node = TYPE_FIELDS (node); node; node = TREE_CHAIN (node))
+ dump_tree (file, NULL, node, indent + INDENT);
+}
+
+static void
+print_QUAL_UNION_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (TYPE_NO_FORCE_BLK (node))
+ fputs (" no-force-blk", file);
+ fprintf (file, " fields=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_FIELDS (node)));
+
+ print_type (file, annotation, node, indent);
+ (void)node_seen (node, TRUE);
+
+ for (node = TYPE_FIELDS (node); node; node = TREE_CHAIN (node))
+ dump_tree (file, NULL, node, indent + INDENT);
+}
+
+static void
+print_FUNCTION_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ tree n;
+
+ if (TYPE_METHOD_BASETYPE (node))
+ {
+ fprintf (file, " basetype=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_METHOD_BASETYPE (node)));
+ }
+
+ if (TYPE_RETURNS_STACK_DEPRESSED (node))
+ fputs (" ret-stk-depressed", file);
+ if (TYPE_AMBIENT_BOUNDEDNESS (node))
+ fputs (" ambient-boundedness", file);
+ fprintf (file, " args=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TYPE_ARG_TYPES (node)));
+
+ print_type (file, annotation, node, indent);
+ (void)node_seen (node, TRUE);
+
+ for (n = TYPE_ARG_TYPES (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, "(args)", n, indent + INDENT);
+}
+
+static void
+print_LANG_TYPE (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_type (file, annotation, node, indent);
+}
+
+static void
+print_INTEGER_CST (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent ATTRIBUTE_UNUSED;
+{
+ print_tree_flags (file, node);
+ fputc (' ', file);
+ print_integer_constant (file, node, 1);
+}
+
+static void
+print_REAL_CST (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent ATTRIBUTE_UNUSED;
+{
+ print_tree_flags (file, node);
+ fputc (' ', file);
+ print_real_constant (file, node);
+}
+
+static void
+print_COMPLEX_CST (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_tree_flags (file, node);
+ fprintf (file, " real=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (TREE_REALPART (node)));
+ fprintf (file, " imag=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (TREE_IMAGPART (node)));
+
+ dump_tree (file, "(real)", TREE_REALPART (node), indent + INDENT);
+ dump_tree (file, "(imag)", TREE_IMAGPART (node), indent + INDENT);
+}
+
+static void
+print_VECTOR_CST (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ tree n, type = TREE_TYPE (node);
+ tree t1 = NULL;
+ int i, ok, size = 0;
+ int ok2 = 0;
+ char *fmt = (char *)"this is just to stop compiler warning";
+
+ union {
+ unsigned char uc[16];
+ unsigned short us[8];
+ unsigned long ul[4];
+ } vec_value;
+
+ print_tree_flags (file, node);
+
+ ok = (type && TREE_CODE (type) == VECTOR_TYPE);
+ if (ok)
+ {
+ type = TREE_TYPE (type);
+ n = TYPE_SIZE_UNIT (type);
+ size = CST_VALUE (n, ok);
+ t1 = TREE_VECTOR_CST_ELTS (node);
+
+ if (TREE_CODE (type) == INTEGER_TYPE
+ && (size == 1 || size == 2 || size == 4))
+ {
+ fmt = (char *) (TREE_UNSIGNED (type) ? "%u%s" : "%d%s");
+ if (TREE_CODE (TREE_VALUE (t1)) == INTEGER_CST)
+ {
+ vec_value.ul[0] = CST_VALUE (TREE_VALUE (t1), ok);
+ vec_value.ul[1] = CST_VALUE (TREE_VALUE (TREE_CHAIN (t1)), ok);
+ vec_value.ul[2] = CST_VALUE (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (t1))), ok);
+ vec_value.ul[3] = CST_VALUE (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (t1)))), ok);
+ }
+ ok2 = ok;
+ }
+ else if (TREE_CODE (type) != REAL_TYPE
+ || TREE_CODE (TREE_VALUE (t1)) != REAL_CST
+ || size != 4)
+ ok2 = 0;
+ else
+ ok2 = ok;
+ }
+
+ if (ok2)
+ {
+ fprintf (file, " ");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE(TREE_VALUE (t1)));
+ fprintf (file, " ");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE(TREE_VALUE (TREE_CHAIN (t1))));
+ fprintf (file, " ");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE(TREE_VALUE (TREE_CHAIN (TREE_CHAIN (t1)))));
+ fprintf (file, " ");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE(TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (t1))))));
+ newline_and_indent (file, indent + INDENT);
+ fputc ('(', file);
+
+ switch (size)
+ {
+ case 1:
+ for (i = 0; i < 16; ++i)
+ fprintf (file, fmt, vec_value.uc[i], (i < 15) ? "," : "");
+ break;
+
+ case 2:
+ for (i = 0; i < 8; ++i)
+ fprintf (file, fmt, vec_value.us[i], (i < 7) ? "," : "");
+ break;
+
+ case 4:
+ if (TREE_CODE (type) != REAL_TYPE)
+ for (i = 0; i < 4; ++i)
+ fprintf (file, fmt, vec_value.ul[i], (i < 3) ? "," : "");
+ else
+ {
+ print_real_constant (file, TREE_VALUE (t1));
+ fputc (',', file);
+ print_real_constant (file, TREE_VALUE (TREE_CHAIN (t1)));
+ fputc (',', file);
+ print_real_constant (file, TREE_VALUE (TREE_CHAIN (TREE_CHAIN (t1))));
+ fputc (',', file);
+ print_real_constant (file, TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (t1)))));
+ }
+ break;
+ }
+
+ fputc (')', file);
+ }
+ else
+ {
+ dump_tree (file, NULL, TREE_VALUE (t1), indent + INDENT);
+ dump_tree (file, NULL, TREE_VALUE (TREE_CHAIN (t1)), indent + INDENT);
+ dump_tree (file, NULL, TREE_VALUE (TREE_CHAIN (TREE_CHAIN (t1))), indent + INDENT);
+ dump_tree (file, NULL, TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (t1)))), indent + INDENT);
+ }
+}
+
+static void
+print_STRING_CST (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ print_tree_flags (file, node);
+ fprintf (file, " ptr=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_STRING_POINTER (node)));
+ fprintf (file, " ");
+ print_string_constant (file, (char *)TREE_STRING_POINTER (node), 30);
+
+ if (TREE_CHAIN (node))
+ {
+ fprintf (file, " chain=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_CHAIN (node)));
+
+ for (node = TREE_CHAIN (node); node; node = TREE_CHAIN (node))
+ dump_tree (file, NULL, node, indent + INDENT);
+ }
+}
+
+static void
+print_FUNCTION_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ tree n;
+
+ if (DECL_BUILT_IN (node))
+ {
+ if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
+ fprintf (file, " BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));
+ else
+ fprintf (file, " %s",
+ built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)]);
+ }
+
+ if (DECL_BUILT_IN_NONANSI (node))
+ fputs (" builtin-nonansi", file);
+
+ if (dump_tree_state.doing_call_expr)
+ {
+ print_decl (file, annotation, node, indent);
+ return;
+ }
+
+ if (DECL_EXTERNAL (node))
+ fputs (" ext", file);
+ if (TREE_PUBLIC (node))
+ fputs (" pub", file);
+ if (TREE_PRIVATE (node))
+ fputs (" pvt", file);
+ if (TREE_PROTECTED (node))
+ fputs (" prot", file);
+#if 0
+ if (TREE_STATIC (node))
+ fputs (" def", file);
+ if (TREE_ADDRESSABLE (node))
+ fputs (" addrsable", file);
+#endif
+ if (TREE_ASM_WRITTEN (node))
+ fputs (" asm-wrtn", file);
+ if (TREE_NOTHROW (node))
+ fputs (" nothr", file);
+
+ if (DECL_INLINE (node))
+ fputs (" inline", file);
+ if (DECL_NO_STATIC_CHAIN (node))
+ fputs (" no-static-chain", file);
+ if (DECL_VIRTUAL_P (node))
+ fputs (" virt", file);
+ if (DECL_STATIC_CONSTRUCTOR (node))
+ fputs (" static-ctor", file);
+ if (DECL_STATIC_DESTRUCTOR (node))
+ fputs (" static-dtor", file);
+
+ if (DECL_INITIAL (node))
+ {
+ fprintf (file, " initial=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_INITIAL (node)));
+ }
+
+ if (DECL_SAVED_INSNS (node))
+ {
+ fprintf (file, " saved-insns=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_SAVED_INSNS (node)));
+ }
+
+ if (!DECL_EXTERNAL (node))
+ {
+ fprintf (file, " ");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (DECL_RESULT (node)));
+ fprintf (file, "(");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (DECL_ARGUMENTS (node)));
+ fprintf (file, "){");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_LANG_SPECIFIC(node)
+ ? DECL_SAVED_TREE (node) : 0));
+ fprintf (file, "}");
+ }
+ print_decl (file, annotation, node, indent);
+
+ /*if (DECL_LANG_SPECIFIC(node) && DECL_SAVED_TREE (node)) ?? */
+ if (DECL_RESULT (node))
+ dump_tree (file, NULL, DECL_RESULT (node), indent + INDENT);
+
+ dump_tree_state.doing_parm_decl = 1;
+ for (n = DECL_ARGUMENTS (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+ dump_tree_state.doing_parm_decl = 0;
+
+ if (DECL_LANG_SPECIFIC(node)) /* saftey test, used by DECL_SAVED_TREE */
+ for (n = DECL_SAVED_TREE (node); n; n = TREE_CHAIN (n))
+ {
+ if (n == DECL_SAVED_TREE (node)
+ && TREE_CODE (n) == EXPR_STMT
+ && EXPR_STMT_EXPR (n) == void_zero_node)
+ {
+ dump_tree_state.really_follow = 0;
+ dump_tree (file, "(dummy, to be deleted)", n, indent + INDENT);
+ dump_tree_state.really_follow = 1;
+ }
+ else
+ dump_tree (file, NULL, n, indent + INDENT);
+ }
+
+ /* FIXME: DECL_VINDEX ?? */
+}
+
+static void
+print_LABEL_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (TREE_ADDRESSABLE (node))
+ fputs (" seen", file);
+ if (DECL_TOO_LATE (node))
+ fputs (" too-late", file);
+ if (DECL_ERROR_ISSUED (node))
+ fputs (" error-issued", file);
+ print_decl (file, annotation, node, indent);
+}
+
+static void
+print_CONST_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_decl (file, annotation, node, indent);
+}
+
+static void
+print_TYPE_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (DECL_ORIGINAL_TYPE (node))
+ {
+ fprintf (file, " orig_type=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_ORIGINAL_TYPE (node)));
+ }
+ if (TYPE_DECL_SUPPRESS_DEBUG (node))
+ fputs (" suppress-debug", file);
+ print_decl (file, annotation, node, indent);
+}
+
+static void
+print_VAR_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (node_seen (node, FALSE))
+ {
+ print_decl (file, annotation, node, indent);
+ return;
+ }
+
+ if (TREE_CODE (node) == VAR_DECL && TREE_STATIC (node))
+ fputs (" static", file);
+ if (TREE_PUBLIC (node))
+ fputs (" pub", file);
+ if (DECL_EXTERNAL (node))
+ fputs (" ext", file);
+ if (DECL_REGISTER (node))
+ fputs (" regdcl", file);
+ if (TREE_CODE (node) == VAR_DECL && DECL_IN_TEXT_SECTION (node))
+ fputs (" in-txt-sect", file);
+ if (DECL_VIRTUAL_P (node))
+ fputs (" virt", file);
+ if (DECL_POINTER_ALIAS_SET_KNOWN_P (node))
+ {
+ fputs (" alias-set=", file);
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC,
+ DECL_POINTER_ALIAS_SET (node));
+ }
+
+ if (TREE_CODE (node) == PARM_DECL && DECL_TRANSPARENT_UNION (node))
+ fputs (" transp-union", file);
+
+ if (TREE_CODE (node) != PARM_DECL)
+ {
+ fprintf (file, " initial=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_INITIAL (node)));
+ print_decl (file, annotation, node, indent);
+ dump_tree (file, NULL, DECL_INITIAL (node), indent + INDENT);
+ }
+ else
+ print_decl (file, annotation, node, indent);
+}
+
+static void
+print_PARM_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (dump_tree_state.doing_parm_decl)
+ {
+ if (DECL_ARG_TYPE (node))
+ {
+ fprintf (file, " arg-type=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_ARG_TYPE (node)));
+ }
+ if (DECL_ARG_TYPE_AS_WRITTEN (node))
+ {
+ fprintf (file, " as-written=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_ARG_TYPE_AS_WRITTEN (node)));
+ }
+ if (DECL_INCOMING_RTL (node))
+ {
+ fprintf (file, " incoming-rtl=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (DECL_INCOMING_RTL (node)));
+ }
+ }
+ print_VAR_DECL (file, annotation, node, indent);
+}
+
+static void
+print_RESULT_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_decl (file, annotation, node, indent);
+}
+
+static void
+print_FIELD_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ if (node_seen (node, FALSE))
+ {
+ print_decl (file, annotation, node, indent);
+ return;
+ }
+
+ if (TREE_ADDRESSABLE (node))
+ fputs (" addressable", file);
+ if (TREE_READONLY (node))
+ fputs (" readonly", file);
+
+ if (DECL_VIRTUAL_P (node))
+ fputs (" virt", file);
+ if (DECL_PACKED (node))
+ fputs (" packed", file);
+ if (TREE_UNSIGNED (node))
+ fputs (" uns", file);
+ if (DECL_BIT_FIELD (node))
+ fputs (" bitfield", file);
+ if (DECL_NONADDRESSABLE_P (node))
+ fputs (" nonaddr", file);
+ fprintf (file, " off-align=");
+ fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
+ DECL_OFFSET_ALIGN (node));
+ print_decl (file, annotation, node, indent);
+}
+
+static void
+print_NAMESPACE_DECL (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_decl (file, annotation, node, indent);
+}
+
+static void
+print_COMPONENT_REF (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_ref (file, annotation, node, indent);
+ print_operands (file, node, indent, TRUE, "(struct/union)", "(field)", NULL);
+}
+
+static void
+print_BIT_FIELD_REF (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_ref (file, annotation, node, indent);
+ print_operands (file, node, indent, TRUE, "(struct/union)", "(#bits)", "(pos)", NULL);
+}
+
+static void
+print_INDIRECT_REF (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_ref (file, annotation, node, indent);
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_BUFFER_REF (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_ref (file, annotation, node, indent);
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_ARRAY_REF (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_ref (file, annotation, node, indent);
+ print_operands (file, node, indent, TRUE, "(base)", "(index)", NULL);
+}
+
+static void
+print_ARRAY_RANGE_REF (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_ref (file, annotation, node, indent);
+ print_operands (file, node, indent, TRUE, "(base)", "(index)", NULL);
+}
+
+static void
+print_VTABLE_REF (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ print_ref (file, annotation, node, indent);
+ print_operands (file, node, indent, TRUE, "(base)", "(index)", NULL);
+}
+
+static void
+print_CONSTRUCTOR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ if (TREE_ADDRESSABLE (node))
+ fputs (" must-be-in-mem", file);
+ if (TREE_STATIC (node))
+ fputs (" static", file);
+ if (TREE_CONSTANT (node))
+ fputs (" const", file);
+ if (TREE_BOUNDED (node))
+ fputs (" bounded", file);
+
+ print_operands (file, node, indent, FALSE, NULL);
+
+ for (node = CONSTRUCTOR_ELTS (node); node; node = TREE_CHAIN (node))
+ dump_tree (file, NULL, node, indent + INDENT);
+}
+
+static void
+print_COMPOUND_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ if (TREE_NO_UNUSED_WARNING (node))
+ fputs (" no-unused", file);
+
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_MODIFY_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_INIT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TARGET_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, "(target)", "(init)",
+ "(cleanup)", "(saved-init)", NULL);
+}
+
+static void
+print_COND_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, "(cond)", "(?)", "(:)", NULL);
+}
+
+static void
+print_BIND_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, "(vars)", "(body)", "(block)", NULL);
+}
+
+static void
+print_CALL_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ if (TREE_NOTHROW (node))
+ fputs (" nothrow", file);
+
+ dump_tree_state.doing_call_expr = 1;
+ print_operands (file, node, indent, TRUE, "(func)", "(args)", NULL);
+ dump_tree_state.doing_call_expr = 0;
+}
+
+static void
+print_METHOD_CALL_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, "(self)", "(args)", NULL);
+}
+
+static void
+print_WITH_CLEANUP_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_CLEANUP_POINT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_PLACEHOLDER_EXPR (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ /*print_operands (file, node, indent, FALSE, NULL);*/
+ /* this is an 'x' node, not an expr node */
+}
+
+static void
+print_WITH_RECORD_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_PLUS_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_MINUS_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_MULT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRUNC_DIV_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_CEIL_DIV_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FLOOR_DIV_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_ROUND_DIV_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRUNC_MOD_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_CEIL_MOD_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FLOOR_MOD_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_ROUND_MOD_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_RDIV_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_EXACT_DIV_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FIX_TRUNC_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FIX_CEIL_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FIX_FLOOR_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FIX_ROUND_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FLOAT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_NEGATE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_MIN_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_MAX_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_ABS_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FFS_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_LSHIFT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_RSHIFT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_LROTATE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_RROTATE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_BIT_IOR_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_BIT_XOR_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_BIT_AND_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_BIT_ANDTC_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_BIT_NOT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRUTH_ANDIF_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRUTH_ORIF_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRUTH_AND_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRUTH_OR_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRUTH_XOR_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRUTH_NOT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_LT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_LE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_GT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_GE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_EQ_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_NE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_UNORDERED_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_ORDERED_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_UNLT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_UNLE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_UNGT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_UNGE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_UNEQ_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_IN_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_SET_LE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_CARD_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_RANGE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_CONVERT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_NOP_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_NON_LVALUE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_SAVE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_VIEW_CONVERT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_UNSAVE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_RTL_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_ADDR_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_REFERENCE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_ENTRY_VALUE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_FDESC_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_COMPLEX_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_CONJ_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_REALPART_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_IMAGPART_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_PREDECREMENT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_PREINCREMENT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_POSTDECREMENT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_POSTINCREMENT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_VA_ARG_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_TRY_CATCH_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, "(try)", "(catch)", NULL);
+}
+
+static void
+print_TRY_FINALLY_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_GOTO_SUBROUTINE_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_LABEL_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_GOTO_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_RETURN_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_EXIT_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_LOOP_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_LABELED_BLOCK_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_EXIT_BLOCK_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_EXPR_WITH_FILE_LOCATION (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_SWITCH_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_EXC_PTR_EXPR (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ print_operands (file, node, indent, TRUE, NULL);
+}
+
+static void
+print_CLZ_EXPR (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ /* TO DO */
+}
+static void
+print_CTZ_EXPR (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ /* TO DO */
+}
+static void
+print_PARITY_EXPR (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ /* TO DO */
+}
+static void
+print_POPCOUNT_EXPR (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ /* TO DO */
+}
+
+/*-------------------------------------------------------------------*/
+
+/* Alaways the last lang_dump_tree_p to keep lang_dump_tree_p from being
+ NULL. A return of 0 always forces the tree node switch to go to its
+ default case. */
+
+static int
+no_dump_tree_p (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ return 0;
+}
+
+/* Language-specific initializers call this to add to the chain of language-
+ specific tree node dumpers. It is expected that their default node case
+ will call the function returned from here which was saved during their
+ initialization. */
+
+lang_dump_tree_p_t
+set_dump_tree_p (new_lang_dump_tree_p)
+ lang_dump_tree_p_t new_lang_dump_tree_p;
+{
+ lang_dump_tree_p_t old_lang_dump_tree_p = lang_dump_tree_p;
+ lang_dump_tree_p = new_lang_dump_tree_p;
+ return old_lang_dump_tree_p;
+}
+
+/* Annotations enclosed in parentheses are appended to the initial
+ kind:address display. Otherwise they prefix it. Note that a
+ prefix annotation is expected to have at least a trailing
+ space but a parenthesized annotation should end with it's
+ delimiting right parentheses. */
+
+void
+dump_tree (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation;
+ tree node;
+ int indent;
+{
+ int good_node, no_new_line, plen = 0;
+ static tree previous_node;
+
+ no_new_line = dump_tree_state.no_new_line;
+ dump_tree_state.no_new_line = 0;
+
+ /* prefix_len contains the length of the fixed part of a tree node
+ display line and can be used by tree node dumpers to control
+ line wrapping if the line info for that node gets too long. */
+
+ if (node == NULL)
+ return;
+
+ if (dump_tree_state.nesting_depth < 0)
+ {
+ /* If not called from dmp_tree3() then create hash table to record
+ which nodes we visit. We still also do this for dmp_tree3()
+ but only the first time dmp_tree3() calls this routine. After
+ that it's dmp_tree3() responsibility to free the hash table. */
+ if (dump_tree_state.visit_only_once != DMP_TREE_VISIT_ONCE2)
+ {
+ init_dump_state(node);
+ table = (struct bucket **) xmalloc (HASH_SIZE * sizeof (struct bucket *));
+ memset ((char *) table, 0, HASH_SIZE * sizeof (struct bucket *));
+ if (dump_tree_state.visit_only_once == DMP_TREE_VISIT_ONCE1)
+ dump_tree_state.visit_only_once = DMP_TREE_VISIT_ONCE2;
+ }
+
+ indent = 0;
+ previous_node = NULL_TREE;
+#if DMP_TREE_WRAPPED_OUTPUT
+ {
+ char *wrap_str = getenv(DMP_TREE_LINE_WRAP);
+ line_index = prev_line_was_null = prev_line_was_wrapped = 0;
+ wrap_column = 0;
+ if (wrap_str)
+ wrap_column = strtol (wrap_str, NULL, 10);
+#if defined(TIOCGSIZE) || defined(TIOCGWINSZ)
+ if (wrap_column < MIN_LINE_WRAP || wrap_column > MAX_LINE_WRAP)
+ {
+#ifdef TIOCGWINSZ
+ wrap_column = ioctl (fileno(file), TIOCGWINSZ, &winsize);
+ if (wrap_column >= 0)
+ wrap_column = winsize.ws_col;
+#endif
+#if defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
+ wrap_column = ioctl (fileno(file), TIOCGSIZE, &winsize);
+ if (wrap_column >= 0)
+ wrap_column = winsize.ts_cols;
+#endif
+ }
+ }
+#endif /* TIOCGSIZE || TIOCGWINSZ */
+ if (wrap_column < MIN_LINE_WRAP || wrap_column > MAX_LINE_WRAP)
+ wrap_column = DEFAULT_LINE_WRAP;
+#endif /* DMP_TREE_WRAPPED_OUTPUT */
+ }
+
+ if (dump_tree_state.visit_only_once != DMP_TREE_VISIT_ANY
+ && node_seen (node, TRUE))
+ return;
+
+ if (dump_tree_state.dump_full_type && node_seen (node, FALSE))
+ return;
+
+ if (dump_tree_state.doing_tree_list && node_seen (node, FALSE))
+ return;
+
+ if (dump_tree_state.nesting_depth >= dump_tree_state.max_depth)
+ return;
+
+ if (dump_tree_state.nesting_depth >= 0)
+ {
+ if (!no_new_line)
+ {
+ newline_and_indent (file, 0);
+ if (statement_code_p (TREE_CODE (node))
+ || (TREE_CODE (node) == TREE_VEC && TREE_VEC_LENGTH (node) > 1))
+ {
+ if (previous_node
+ && TREE_CODE (previous_node) != TREE_CODE (node)
+ && (*lang_hooks.dump_blank_line_p) (previous_node, node))
+ newline_and_indent (file, 0);
+ }
+ }
+ previous_node = node;
+ if (indent > 0)
+ fprintf (file, "%*c", indent, ' ');
+ }
+
+ ++dump_tree_state.nesting_depth;
+
+ plen = indent;
+ if (annotation && *annotation && *annotation != '(')
+ plen += fprintf (file, "%s", annotation);
+
+ good_node = ((int) TREE_CODE (node) < dump_tree_state.max_code);
+
+ if (good_node)
+ {
+ plen += fprintf (file, "%s:", tree_code_name[(int) TREE_CODE (node)]);
+ plen += fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (node));
+ }
+ else
+ {
+ plen += fprintf (file, "%d (?):", (int) TREE_CODE (node));
+ plen += fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (node));
+ }
+
+ if (annotation && *annotation == '(')
+ plen += fprintf (file, " %s", annotation);
+
+ if (good_node)
+ {
+ if (TREE_CODE_CLASS (TREE_CODE (node)) != 't'
+ && TREE_TYPE (node)
+ && TREE_CODE_CLASS (TREE_CODE (TREE_TYPE (node))) == 't')
+ {
+ tree type, type0 = TREE_TYPE (node);
+
+ if (dump_tree_state.doing_call_expr
+ && TREE_CODE (node) == FUNCTION_DECL && TREE_TYPE (type0))
+ type = TREE_TYPE (type0);
+ else
+ type = type0;
+
+ fprintf (file, " t=");
+ fprintf (file, HOST_PTR_PRINTF, HOST_PTR_PRINTF_VALUE (type0));
+
+ if (TYPE_NAME (type))
+ {
+ if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
+ {
+ if (IDENTIFIER_POINTER (TYPE_NAME (type))
+ && *IDENTIFIER_POINTER (TYPE_NAME (type)))
+ fprintf (file, " {%s}", IDENTIFIER_POINTER (TYPE_NAME (type)));
+ }
+ else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+ && DECL_NAME (TYPE_NAME (type))
+ && IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))
+ && *IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))))
+ fprintf (file, " {%s}",
+ IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
+ }
+ else
+ fprintf (file, " {%s}", tree_code_name[(int) TREE_CODE (type)]);
+
+ /* If doing a full program dump we also want to dump the types too.
+ So dmp_tree3() will do it after we dump all the decls's. All
+ we do here is record all the decl's types in an array. We won't
+ worry about dups here. That is taken care of when we process
+ this array. */
+
+ if (dump_tree_state.visit_only_once == DMP_TREE_VISIT_ONCE2
+ && !node_seen (type, FALSE))
+ {
+ if (type_array_next >= type_array_size)
+ {
+ type_array_size += type_array_incr;
+ type_array_incr = TYPE_ARRAY_INCR;
+ type_array = (tree *) xrealloc (type_array,
+ sizeof (tree) * type_array_size);
+ }
+
+ type_array[type_array_next++] = type;
+ }
+ }
+ else if (dump_tree_state.dump_full_type && TREE_TYPE (node))
+ {
+ fprintf (file, " t=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_TYPE (node)));
+ }
+ }
+
+#if DMP_TREE_WRAPPED_OUTPUT
+ prefix_len = plen + 1; /* include blank following prefix */
+ prev_line_was_wrapped = 0;
+#endif
+
+ print_lineno (file, node); /* line nbr info where possible */
+
+ if (! (*lang_dump_tree_p) (file, annotation, node, indent))
+ {
+ switch (TREE_CODE (node))
+ {
+# define DEFTREECODE(SYM, NAME, TYPE, LENGTH) \
+ case SYM: print_ ## SYM (file, annotation, node, indent); break;
+# include "tree.def"
+# undef DEFTREECODE
+ default:
+ print_ERROR_MARK (file, annotation, node, indent);
+ break;
+ }
+ }
+
+ --dump_tree_state.nesting_depth;
+
+ if (dump_tree_state.nesting_depth < 0)
+ {
+ newline_and_indent (file, 0);
+ if (dump_tree_state.visit_only_once != DMP_TREE_VISIT_ONCE2)
+ free_hash_table ();
+ }
+ else
+ (void)node_seen (node, TRUE);
+
+}
+
+/* Called from debugger to dump the tree for a specific node. */
+void
+dmp_tree (node)
+ tree node;
+{
+ dump_tree_state.max_depth = INT_MAX;
+ dump_tree_state.visit_only_once = DMP_TREE_VISIT_ANY;
+ dump_tree (stderr, NULL, node, 0);
+}
+
+/* Same as dmp_tree() but limit the nesting to specified depth. */
+void
+dmp_tree1 (node, max_depth)
+ tree node;
+ int max_depth;
+{
+ if (max_depth <= 0)
+ max_depth = 1;
+ dump_tree_state.max_depth = max_depth;
+ dump_tree_state.visit_only_once = DMP_TREE_VISIT_ANY;
+ dump_tree (stderr, NULL, node, 0);
+}
+
+/* Same as dmp_tree() but displays never show a referenced node
+ more than once. */
+void
+dmp_tree2 (node)
+ tree node;
+{
+ dump_tree_state.max_depth = INT_MAX;
+ dump_tree_state.visit_only_once = DMP_TREE_VISIT_ONCE;
+ dump_tree (stderr, NULL, node, 0);
+}
+
+/* Called only from tree-dump.c to handle our dmp_tree() types of
+ displays when dumping an entire program to a file by specifying
+ -fdmp-translation-unit. */
+void
+dmp_tree3 (file, node, flags)
+ FILE *file;
+ tree node;
+ int flags ATTRIBUTE_UNUSED;
+{
+ int i;
+
+ dump_tree_state.max_depth = INT_MAX;
+ dump_tree_state.visit_only_once = DMP_TREE_VISIT_ONCE1;
+
+ while (node)
+ {
+ dump_tree (file, NULL, node, 0);
+ node = TREE_CHAIN (node);
+ }
+
+ newline_and_indent (file, 0);
+
+ if (type_array_next > 0)
+ {
+ for (i = 0; i < type_array_next; ++i)
+ dump_tree (file, NULL, type_array[i], 0);
+
+ free (type_array);
+ }
+
+ free_hash_table ();
+}
+
+/*-------------------------------------------------------------------*/
+
+#if DMP_TREE_WRAPPED_OUTPUT
+
+/* The three routines below here are what's actually called when fprintf,
+ fputc, or fputs are used in the tree dumper. These are used to
+ intercept the output to impose an appropriate line wrapping convention
+ on nodes that get too long for the display (lines > wrap_column). The
+ stdio.h names are redefined by macros to call these routines when
+ DMP_TREE_WRAPPED_OUTPUT is set.
+
+ The line wrap convention is to wrap only on blanks between the node's
+ info. Blanks within bracketed or quoted info does not count. The
+ wrapped portion is indented to start wherever the node's indented
+ kind:address portion of the display ends. */
+
+#undef fprintf
+#undef fputc
+#undef fputs
+
+int
+dmp_tree_fprintf VPARAMS ((FILE *file, const char *fmt, ...))
+{
+ int len;
+ va_list ap;
+
+#ifndef ANSI_PROTOTYPES
+ FILE *file;
+ char *fmt;
+#endif
+
+ VA_START (ap, fmt);
+#ifndef ANSI_PROTOTYPES
+ file = va_arg (ap, FILE *);
+ fmt = va_arg (ap, char *);
+#endif
+
+ len = vsprintf (&curr_line[line_index], fmt, ap);
+ line_index += len;
+
+ va_end (ap);
+
+ if (curr_line[line_index-1] == '\n')
+ {
+ if (line_index != 1 || !(prev_line_was_wrapped || prev_line_was_null))
+ {
+ curr_line[line_index] = '\0';
+ fputs (curr_line, file);
+ fflush (file);
+ }
+ prev_line_was_null = (line_index == 1);
+ line_index = 0;
+ }
+ else if (line_index >= wrap_column)
+ {
+ char c, unwritten_part[MAX_LINE_WRAP+2];
+ int i, end, delimiter, nesting;
+
+ prev_line_was_wrapped = 0;
+
+ /* Limit how far to the left we'll search to about wrap_column/2 */
+ end = wrap_column/2;
+ if (end < prefix_len)
+ end = prefix_len;
+
+ /* Search left the the first blank to the left of the wrap point.
+ We assume that bracketed entities (e.g., quoted strings,
+ parenthetical entities, etc.) are written with a single
+ fprintf() so that we know to ignore blanks embedded within
+ pairs of these things. */
+
+ i = line_index - 1;
+ delimiter = nesting = 0;
+ while (i >= end)
+ {
+ c = curr_line[i];
+ if (curr_line[i-1] == '\\')
+ --i;
+ else if (nesting)
+ {
+ if (c == delimiter && --nesting <= 0)
+ delimiter = 0;
+ }
+ else if (c == '"' || c == '\'') {
+ delimiter = c; ++nesting;
+ } else if (c == ')') {
+ delimiter = '('; ++nesting;
+ } else if (c == ']') {
+ delimiter = '['; ++nesting;
+ } else if (c == '>') {
+ delimiter = '<'; ++nesting;
+ } else if (c == '}') {
+ delimiter = '{'; ++nesting;
+ } else if (c == ' ' && i < wrap_column)
+ break;
+ --i;
+ }
+
+ if (i < end)
+ return len;
+
+ /* The wrapped (unwritten) part is everthing to the right of the
+ blank found above. */
+
+ strcpy (unwritten_part, &curr_line[i+1]);
+
+ /* Delete trailing blanks on the left part we are going to print
+ and print it... */
+
+ while (curr_line[i] == ' ' && i >= end)
+ --i;
+ if (i < end)
+ return len;
+
+ curr_line[i+1] = '\n';
+ curr_line[i+2] = '\0';
+ prev_line_was_wrapped = 1;
+ fputs (curr_line, file);
+ fflush (file);
+
+ /* Write the wrapped portion, indented by the current prefix_len... */
+
+ line_index = prefix_len;
+ memset(curr_line, ' ', line_index);
+ curr_line[line_index] = '\0';
+
+ dmp_tree_fprintf (file, "%s", unwritten_part);
+ }
+
+ return len;
+}
+
+int
+dmp_tree_fputc (c, file)
+ int c;
+ FILE *file;
+{
+ dmp_tree_fprintf (file, "%c", c);
+ return c;
+}
+
+int
+dmp_tree_fputs (s, file)
+ const char *s;
+ FILE *file;
+{
+ return dmp_tree_fprintf (file, "%s", s);
+}
+
+#endif /* DMP_TREE_WRAPPED_OUTPUT */
+
+/*-------------------------------------------------------------------*/
+
+/* Special routine called for debugging chains only. This is NOT a
+ tree node type. */
+
+void print_TREE_CHAIN PARAMS ((tree));
+
+void
+print_TREE_CHAIN (node)
+ tree node;
+{
+ while (node)
+ {
+ dump_tree (stderr, NULL, node, 0); /* keep list at same indent */
+ node = TREE_CHAIN (node);
+ }
+}
+