1 | /* Tree-dumping functionality for C-family languages.
|
---|
2 | Copyright (C) 2002 Free Software Foundation, Inc.
|
---|
3 | Written by Mark Mitchell <mark@codesourcery.com>
|
---|
4 |
|
---|
5 | This file is part of GCC.
|
---|
6 |
|
---|
7 | GCC is free software; you can redistribute it and/or modify it under
|
---|
8 | the terms of the GNU General Public License as published by the Free
|
---|
9 | Software Foundation; either version 2, or (at your option) any later
|
---|
10 | version.
|
---|
11 |
|
---|
12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
---|
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
---|
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
---|
15 | for more details.
|
---|
16 |
|
---|
17 | You should have received a copy of the GNU General Public License
|
---|
18 | along with GCC; see the file COPYING. If not, write to the Free
|
---|
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
---|
20 | 02111-1307, USA. */
|
---|
21 |
|
---|
22 | #include "config.h"
|
---|
23 | #include "system.h"
|
---|
24 | #include "tree.h"
|
---|
25 | #include "c-tree.h"
|
---|
26 | #include "tree-dump.h"
|
---|
27 |
|
---|
28 | /* Dump information common to statements from STMT. */
|
---|
29 |
|
---|
30 | void
|
---|
31 | dump_stmt (di, t)
|
---|
32 | dump_info_p di;
|
---|
33 | tree t;
|
---|
34 | {
|
---|
35 | dump_int (di, "line", STMT_LINENO (t));
|
---|
36 | }
|
---|
37 |
|
---|
38 | /* Dump the next statement after STMT. */
|
---|
39 |
|
---|
40 | void
|
---|
41 | dump_next_stmt (di, t)
|
---|
42 | dump_info_p di;
|
---|
43 | tree t;
|
---|
44 | {
|
---|
45 | dump_child ("next", TREE_CHAIN (t));
|
---|
46 | }
|
---|
47 |
|
---|
48 | /* Dump any C-specific tree codes and attributes of common codes. */
|
---|
49 |
|
---|
50 | int
|
---|
51 | c_dump_tree (dump_info, t)
|
---|
52 | void *dump_info;
|
---|
53 | tree t;
|
---|
54 | {
|
---|
55 | enum tree_code code;
|
---|
56 | dump_info_p di = (dump_info_p) dump_info;
|
---|
57 |
|
---|
58 | /* Figure out what kind of node this is. */
|
---|
59 | code = TREE_CODE (t);
|
---|
60 |
|
---|
61 | switch (code)
|
---|
62 | {
|
---|
63 | case FIELD_DECL:
|
---|
64 | if (DECL_C_BIT_FIELD (t))
|
---|
65 | dump_string (di, "bitfield");
|
---|
66 | break;
|
---|
67 |
|
---|
68 | case ASM_STMT:
|
---|
69 | dump_stmt (di, t);
|
---|
70 | if (ASM_VOLATILE_P (t))
|
---|
71 | dump_string (di, "volatile");
|
---|
72 | dump_child ("strg", ASM_STRING (t));
|
---|
73 | dump_child ("outs", ASM_OUTPUTS (t));
|
---|
74 | dump_child ("ins", ASM_INPUTS (t));
|
---|
75 | dump_child ("clbr", ASM_CLOBBERS (t));
|
---|
76 | dump_next_stmt (di, t);
|
---|
77 | break;
|
---|
78 |
|
---|
79 | case BREAK_STMT:
|
---|
80 | case CONTINUE_STMT:
|
---|
81 | dump_stmt (di, t);
|
---|
82 | dump_next_stmt (di, t);
|
---|
83 | break;
|
---|
84 |
|
---|
85 | case CASE_LABEL:
|
---|
86 | /* Note that a case label is not like other statements; there is
|
---|
87 | no way to get the line-number of a case label. */
|
---|
88 | dump_child ("low", CASE_LOW (t));
|
---|
89 | dump_child ("high", CASE_HIGH (t));
|
---|
90 | dump_next_stmt (di, t);
|
---|
91 | break;
|
---|
92 |
|
---|
93 | case CLEANUP_STMT:
|
---|
94 | dump_stmt (di, t);
|
---|
95 | dump_child ("decl", CLEANUP_DECL (t));
|
---|
96 | dump_child ("expr", CLEANUP_EXPR (t));
|
---|
97 | dump_next_stmt (di, t);
|
---|
98 | break;
|
---|
99 |
|
---|
100 | case COMPOUND_STMT:
|
---|
101 | dump_stmt (di, t);
|
---|
102 | dump_child ("body", COMPOUND_BODY (t));
|
---|
103 | dump_next_stmt (di, t);
|
---|
104 | break;
|
---|
105 |
|
---|
106 | case DECL_STMT:
|
---|
107 | dump_stmt (di, t);
|
---|
108 | dump_child ("decl", DECL_STMT_DECL (t));
|
---|
109 | dump_next_stmt (di, t);
|
---|
110 | break;
|
---|
111 |
|
---|
112 | case DO_STMT:
|
---|
113 | dump_stmt (di, t);
|
---|
114 | dump_child ("body", DO_BODY (t));
|
---|
115 | dump_child ("cond", DO_COND (t));
|
---|
116 | dump_next_stmt (di, t);
|
---|
117 | break;
|
---|
118 |
|
---|
119 | case EXPR_STMT:
|
---|
120 | dump_stmt (di, t);
|
---|
121 | dump_child ("expr", EXPR_STMT_EXPR (t));
|
---|
122 | dump_next_stmt (di, t);
|
---|
123 | break;
|
---|
124 |
|
---|
125 | case FOR_STMT:
|
---|
126 | dump_stmt (di, t);
|
---|
127 | dump_child ("init", FOR_INIT_STMT (t));
|
---|
128 | dump_child ("cond", FOR_COND (t));
|
---|
129 | dump_child ("expr", FOR_EXPR (t));
|
---|
130 | dump_child ("body", FOR_BODY (t));
|
---|
131 | dump_next_stmt (di, t);
|
---|
132 | break;
|
---|
133 |
|
---|
134 | case GOTO_STMT:
|
---|
135 | dump_stmt (di, t);
|
---|
136 | dump_child ("dest", GOTO_DESTINATION (t));
|
---|
137 | dump_next_stmt (di, t);
|
---|
138 | break;
|
---|
139 |
|
---|
140 | case IF_STMT:
|
---|
141 | dump_stmt (di, t);
|
---|
142 | dump_child ("cond", IF_COND (t));
|
---|
143 | dump_child ("then", THEN_CLAUSE (t));
|
---|
144 | dump_child ("else", ELSE_CLAUSE (t));
|
---|
145 | dump_next_stmt (di, t);
|
---|
146 | break;
|
---|
147 |
|
---|
148 | case LABEL_STMT:
|
---|
149 | dump_stmt (di, t);
|
---|
150 | dump_child ("labl", LABEL_STMT_LABEL (t));
|
---|
151 | dump_next_stmt (di, t);
|
---|
152 | break;
|
---|
153 |
|
---|
154 | case RETURN_STMT:
|
---|
155 | dump_stmt (di, t);
|
---|
156 | dump_child ("expr", RETURN_STMT_EXPR (t));
|
---|
157 | dump_next_stmt (di, t);
|
---|
158 | break;
|
---|
159 |
|
---|
160 | case SWITCH_STMT:
|
---|
161 | dump_stmt (di, t);
|
---|
162 | dump_child ("cond", SWITCH_COND (t));
|
---|
163 | dump_child ("body", SWITCH_BODY (t));
|
---|
164 | dump_next_stmt (di, t);
|
---|
165 | break;
|
---|
166 |
|
---|
167 | case WHILE_STMT:
|
---|
168 | dump_stmt (di, t);
|
---|
169 | dump_child ("cond", WHILE_COND (t));
|
---|
170 | dump_child ("body", WHILE_BODY (t));
|
---|
171 | dump_next_stmt (di, t);
|
---|
172 | break;
|
---|
173 |
|
---|
174 | case SCOPE_STMT:
|
---|
175 | dump_stmt (di, t);
|
---|
176 | if (SCOPE_BEGIN_P (t))
|
---|
177 | dump_string (di, "begn");
|
---|
178 | else
|
---|
179 | dump_string (di, "end");
|
---|
180 | if (SCOPE_NULLIFIED_P (t))
|
---|
181 | dump_string (di, "null");
|
---|
182 | if (!SCOPE_NO_CLEANUPS_P (t))
|
---|
183 | dump_string (di, "clnp");
|
---|
184 | dump_next_stmt (di, t);
|
---|
185 | break;
|
---|
186 |
|
---|
187 | case STMT_EXPR:
|
---|
188 | dump_child ("stmt", STMT_EXPR_STMT (t));
|
---|
189 | break;
|
---|
190 |
|
---|
191 | default:
|
---|
192 | break;
|
---|
193 | }
|
---|
194 |
|
---|
195 | return 0;
|
---|
196 | }
|
---|