c-dump.c revision 132718
1139825Simp/* Tree-dumping functionality for C-family languages.
286227Stmm   Copyright (C) 2002 Free Software Foundation, Inc.
3128776Stmm   Written by Mark Mitchell <mark@codesourcery.com>
4167308Smarius
5128776StmmThis file is part of GCC.
686227Stmm
786227StmmGCC is free software; you can redistribute it and/or modify it under
886227Stmmthe terms of the GNU General Public License as published by the Free
986227StmmSoftware Foundation; either version 2, or (at your option) any later
1086227Stmmversion.
1186227Stmm
1286227StmmGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1386227StmmWARRANTY; without even the implied warranty of MERCHANTABILITY or
1486227StmmFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1586227Stmmfor more details.
1686227Stmm
1786227StmmYou should have received a copy of the GNU General Public License
18128776Stmmalong with GCC; see the file COPYING.  If not, write to the Free
1986227StmmSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA
2086227Stmm02111-1307, USA.  */
2186227Stmm
2286227Stmm#include "config.h"
2386227Stmm#include "system.h"
2486227Stmm#include "coretypes.h"
2586227Stmm#include "tm.h"
2686227Stmm#include "tree.h"
2786227Stmm#include "c-tree.h"
2886227Stmm#include "tree-dump.h"
2986227Stmm
3086227Stmm/* Dump information common to statements from STMT.  */
3186227Stmm
3286227Stmmvoid
3386227Stmmdump_stmt (dump_info_p di, tree t)
3486227Stmm{
35146474Smarius  dump_int (di, "line", STMT_LINENO (t));
36146474Smarius}
37146474Smarius
3886227Stmm/* Dump the next statement after STMT.  */
3986227Stmm
4086227Stmmvoid
4186227Stmmdump_next_stmt (dump_info_p di, tree t)
4286227Stmm{
43130068Sphk  dump_child ("next", TREE_CHAIN (t));
4486227Stmm}
45167308Smarius
46167308Smarius/* Dump any C-specific tree codes and attributes of common codes.  */
4786227Stmm
4886227Stmmbool
4986227Stmmc_dump_tree (void *dump_info, tree t)
50167308Smarius{
5186227Stmm  enum tree_code code;
52167308Smarius  dump_info_p di = (dump_info_p) dump_info;
5386227Stmm
54167308Smarius  /* Figure out what kind of node this is.  */
5586227Stmm  code = TREE_CODE (t);
5686227Stmm
5786227Stmm  switch (code)
5886227Stmm    {
5986227Stmm    case FIELD_DECL:
60133862Smarius      if (DECL_C_BIT_FIELD (t))
6186227Stmm	dump_string (di, "bitfield");
62128776Stmm      break;
6386227Stmm
6486227Stmm    case ASM_STMT:
6586227Stmm      dump_stmt (di, t);
6686227Stmm      if (ASM_VOLATILE_P (t))
6786227Stmm	dump_string (di, "volatile");
68133862Smarius      dump_child ("strg", ASM_STRING (t));
6986227Stmm      dump_child ("outs", ASM_OUTPUTS (t));
7086227Stmm      dump_child ("ins", ASM_INPUTS (t));
7186227Stmm      dump_child ("clbr", ASM_CLOBBERS (t));
72167308Smarius      dump_next_stmt (di, t);
73167308Smarius      break;
7486227Stmm
7586227Stmm    case BREAK_STMT:
7688823Stmm    case CONTINUE_STMT:
7788823Stmm      dump_stmt (di, t);
7888823Stmm      dump_next_stmt (di, t);
7988823Stmm      break;
8088823Stmm
81128776Stmm    case CASE_LABEL:
82128776Stmm      /* Note that a case label is not like other statements; there is
83167308Smarius	 no way to get the line-number of a case label.  */
84146474Smarius      dump_child ("low", CASE_LOW (t));
85128776Stmm      dump_child ("high", CASE_HIGH (t));
86128776Stmm      dump_next_stmt (di, t);
87128776Stmm      break;
88128776Stmm
89128776Stmm    case CLEANUP_STMT:
90128776Stmm      dump_stmt (di, t);
91128776Stmm      dump_child ("decl", CLEANUP_DECL (t));
92167308Smarius      dump_child ("expr", CLEANUP_EXPR (t));
93167308Smarius      dump_next_stmt (di, t);
94167308Smarius      break;
9586227Stmm
96178443Smarius    case COMPOUND_STMT:
97178443Smarius      dump_stmt (di, t);
98178443Smarius      dump_child ("body", COMPOUND_BODY (t));
99185133Smarius      dump_next_stmt (di, t);
100167308Smarius      break;
101167308Smarius
102167308Smarius    case DECL_STMT:
103167308Smarius      dump_stmt (di, t);
10486227Stmm      dump_child ("decl", DECL_STMT_DECL (t));
10586227Stmm      dump_next_stmt (di, t);
10686227Stmm      break;
107128776Stmm
10886227Stmm    case DO_STMT:
10986227Stmm      dump_stmt (di, t);
11086227Stmm      dump_child ("body", DO_BODY (t));
11186227Stmm      dump_child ("cond", DO_COND (t));
11286227Stmm      dump_next_stmt (di, t);
113167308Smarius      break;
114167308Smarius
115167308Smarius    case EXPR_STMT:
116167308Smarius      dump_stmt (di, t);
117167308Smarius      dump_child ("expr", EXPR_STMT_EXPR (t));
118146474Smarius      dump_next_stmt (di, t);
11986227Stmm      break;
12086227Stmm
12186227Stmm    case FOR_STMT:
12286227Stmm      dump_stmt (di, t);
123167308Smarius      dump_child ("init", FOR_INIT_STMT (t));
124167308Smarius      dump_child ("cond", FOR_COND (t));
125178443Smarius      dump_child ("expr", FOR_EXPR (t));
126178443Smarius      dump_child ("body", FOR_BODY (t));
127178443Smarius      dump_next_stmt (di, t);
128185133Smarius      break;
129167308Smarius
130167308Smarius    case GOTO_STMT:
131167308Smarius      dump_stmt (di, t);
13286227Stmm      dump_child ("dest", GOTO_DESTINATION (t));
133167308Smarius      dump_next_stmt (di, t);
134167308Smarius      break;
135167308Smarius
136167308Smarius    case IF_STMT:
137167308Smarius      dump_stmt (di, t);
138167308Smarius      dump_child ("cond", IF_COND (t));
139167308Smarius      dump_child ("then", THEN_CLAUSE (t));
140167308Smarius      dump_child ("else", ELSE_CLAUSE (t));
14186227Stmm      dump_next_stmt (di, t);
14286227Stmm      break;
14386227Stmm
14486227Stmm    case LABEL_STMT:
14586227Stmm      dump_stmt (di, t);
146167308Smarius      dump_child ("labl", LABEL_STMT_LABEL (t));
14786227Stmm      dump_next_stmt (di, t);
14886227Stmm      break;
149185133Smarius
15090622Stmm    case RETURN_STMT:
151167308Smarius      dump_stmt (di, t);
15290622Stmm      dump_child ("expr", RETURN_STMT_EXPR (t));
15390622Stmm      dump_next_stmt (di, t);
15486227Stmm      break;
15590622Stmm
15686227Stmm    case SWITCH_STMT:
15786227Stmm      dump_stmt (di, t);
158167308Smarius      dump_child ("cond", SWITCH_COND (t));
15990622Stmm      dump_child ("body", SWITCH_BODY (t));
16086227Stmm      dump_next_stmt (di, t);
16186227Stmm      break;
16286227Stmm
163185133Smarius    case WHILE_STMT:
16486227Stmm      dump_stmt (di, t);
16586227Stmm      dump_child ("cond", WHILE_COND (t));
16686227Stmm      dump_child ("body", WHILE_BODY (t));
16786227Stmm      dump_next_stmt (di, t);
16886227Stmm      break;
16986227Stmm
17086227Stmm    case SCOPE_STMT:
17186227Stmm      dump_stmt (di, t);
172185133Smarius      if (SCOPE_BEGIN_P (t))
17386227Stmm	dump_string (di, "begn");
17486227Stmm      else
17586227Stmm	dump_string (di, "end");
176167308Smarius      if (SCOPE_NULLIFIED_P (t))
177167308Smarius	dump_string (di, "null");
17886227Stmm      if (!SCOPE_NO_CLEANUPS_P (t))
17986227Stmm	dump_string (di, "clnp");
18086227Stmm      dump_next_stmt (di, t);
18186227Stmm      break;
18286227Stmm
18386227Stmm    case STMT_EXPR:
18486227Stmm      dump_child ("stmt", STMT_EXPR_STMT (t));
18586227Stmm      break;
18686227Stmm
18786227Stmm    default:
18886227Stmm      break;
18986227Stmm    }
19086227Stmm
191128776Stmm  return false;
192128776Stmm}
193133862Smarius