c-dump.c revision 117395
1117395Skan/* Tree-dumping functionality for C-family languages. 2117395Skan Copyright (C) 2002 Free Software Foundation, Inc. 3117395Skan Written by Mark Mitchell <mark@codesourcery.com> 4117395Skan 5117395SkanThis file is part of GCC. 6117395Skan 7117395SkanGCC is free software; you can redistribute it and/or modify it under 8117395Skanthe terms of the GNU General Public License as published by the Free 9117395SkanSoftware Foundation; either version 2, or (at your option) any later 10117395Skanversion. 11117395Skan 12117395SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY 13117395SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or 14117395SkanFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15117395Skanfor more details. 16117395Skan 17117395SkanYou should have received a copy of the GNU General Public License 18117395Skanalong with GCC; see the file COPYING. If not, write to the Free 19117395SkanSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA 20117395Skan02111-1307, USA. */ 21117395Skan 22117395Skan#include "config.h" 23117395Skan#include "system.h" 24117395Skan#include "tree.h" 25117395Skan#include "c-tree.h" 26117395Skan#include "tree-dump.h" 27117395Skan 28117395Skan/* Dump information common to statements from STMT. */ 29117395Skan 30117395Skanvoid 31117395Skandump_stmt (di, t) 32117395Skan dump_info_p di; 33117395Skan tree t; 34117395Skan{ 35117395Skan dump_int (di, "line", STMT_LINENO (t)); 36117395Skan} 37117395Skan 38117395Skan/* Dump the next statement after STMT. */ 39117395Skan 40117395Skanvoid 41117395Skandump_next_stmt (di, t) 42117395Skan dump_info_p di; 43117395Skan tree t; 44117395Skan{ 45117395Skan dump_child ("next", TREE_CHAIN (t)); 46117395Skan} 47117395Skan 48117395Skan/* Dump any C-specific tree codes and attributes of common codes. */ 49117395Skan 50117395Skanint 51117395Skanc_dump_tree (dump_info, t) 52117395Skan void *dump_info; 53117395Skan tree t; 54117395Skan{ 55117395Skan enum tree_code code; 56117395Skan dump_info_p di = (dump_info_p) dump_info; 57117395Skan 58117395Skan /* Figure out what kind of node this is. */ 59117395Skan code = TREE_CODE (t); 60117395Skan 61117395Skan switch (code) 62117395Skan { 63117395Skan case FIELD_DECL: 64117395Skan if (DECL_C_BIT_FIELD (t)) 65117395Skan dump_string (di, "bitfield"); 66117395Skan break; 67117395Skan 68117395Skan case ASM_STMT: 69117395Skan dump_stmt (di, t); 70117395Skan if (ASM_VOLATILE_P (t)) 71117395Skan dump_string (di, "volatile"); 72117395Skan dump_child ("strg", ASM_STRING (t)); 73117395Skan dump_child ("outs", ASM_OUTPUTS (t)); 74117395Skan dump_child ("ins", ASM_INPUTS (t)); 75117395Skan dump_child ("clbr", ASM_CLOBBERS (t)); 76117395Skan dump_next_stmt (di, t); 77117395Skan break; 78117395Skan 79117395Skan case BREAK_STMT: 80117395Skan case CONTINUE_STMT: 81117395Skan dump_stmt (di, t); 82117395Skan dump_next_stmt (di, t); 83117395Skan break; 84117395Skan 85117395Skan case CASE_LABEL: 86117395Skan /* Note that a case label is not like other statements; there is 87117395Skan no way to get the line-number of a case label. */ 88117395Skan dump_child ("low", CASE_LOW (t)); 89117395Skan dump_child ("high", CASE_HIGH (t)); 90117395Skan dump_next_stmt (di, t); 91117395Skan break; 92117395Skan 93117395Skan case CLEANUP_STMT: 94117395Skan dump_stmt (di, t); 95117395Skan dump_child ("decl", CLEANUP_DECL (t)); 96117395Skan dump_child ("expr", CLEANUP_EXPR (t)); 97117395Skan dump_next_stmt (di, t); 98117395Skan break; 99117395Skan 100117395Skan case COMPOUND_STMT: 101117395Skan dump_stmt (di, t); 102117395Skan dump_child ("body", COMPOUND_BODY (t)); 103117395Skan dump_next_stmt (di, t); 104117395Skan break; 105117395Skan 106117395Skan case DECL_STMT: 107117395Skan dump_stmt (di, t); 108117395Skan dump_child ("decl", DECL_STMT_DECL (t)); 109117395Skan dump_next_stmt (di, t); 110117395Skan break; 111117395Skan 112117395Skan case DO_STMT: 113117395Skan dump_stmt (di, t); 114117395Skan dump_child ("body", DO_BODY (t)); 115117395Skan dump_child ("cond", DO_COND (t)); 116117395Skan dump_next_stmt (di, t); 117117395Skan break; 118117395Skan 119117395Skan case EXPR_STMT: 120117395Skan dump_stmt (di, t); 121117395Skan dump_child ("expr", EXPR_STMT_EXPR (t)); 122117395Skan dump_next_stmt (di, t); 123117395Skan break; 124117395Skan 125117395Skan case FOR_STMT: 126117395Skan dump_stmt (di, t); 127117395Skan dump_child ("init", FOR_INIT_STMT (t)); 128117395Skan dump_child ("cond", FOR_COND (t)); 129117395Skan dump_child ("expr", FOR_EXPR (t)); 130117395Skan dump_child ("body", FOR_BODY (t)); 131117395Skan dump_next_stmt (di, t); 132117395Skan break; 133117395Skan 134117395Skan case GOTO_STMT: 135117395Skan dump_stmt (di, t); 136117395Skan dump_child ("dest", GOTO_DESTINATION (t)); 137117395Skan dump_next_stmt (di, t); 138117395Skan break; 139117395Skan 140117395Skan case IF_STMT: 141117395Skan dump_stmt (di, t); 142117395Skan dump_child ("cond", IF_COND (t)); 143117395Skan dump_child ("then", THEN_CLAUSE (t)); 144117395Skan dump_child ("else", ELSE_CLAUSE (t)); 145117395Skan dump_next_stmt (di, t); 146117395Skan break; 147117395Skan 148117395Skan case LABEL_STMT: 149117395Skan dump_stmt (di, t); 150117395Skan dump_child ("labl", LABEL_STMT_LABEL (t)); 151117395Skan dump_next_stmt (di, t); 152117395Skan break; 153117395Skan 154117395Skan case RETURN_STMT: 155117395Skan dump_stmt (di, t); 156117395Skan dump_child ("expr", RETURN_STMT_EXPR (t)); 157117395Skan dump_next_stmt (di, t); 158117395Skan break; 159117395Skan 160117395Skan case SWITCH_STMT: 161117395Skan dump_stmt (di, t); 162117395Skan dump_child ("cond", SWITCH_COND (t)); 163117395Skan dump_child ("body", SWITCH_BODY (t)); 164117395Skan dump_next_stmt (di, t); 165117395Skan break; 166117395Skan 167117395Skan case WHILE_STMT: 168117395Skan dump_stmt (di, t); 169117395Skan dump_child ("cond", WHILE_COND (t)); 170117395Skan dump_child ("body", WHILE_BODY (t)); 171117395Skan dump_next_stmt (di, t); 172117395Skan break; 173117395Skan 174117395Skan case SCOPE_STMT: 175117395Skan dump_stmt (di, t); 176117395Skan if (SCOPE_BEGIN_P (t)) 177117395Skan dump_string (di, "begn"); 178117395Skan else 179117395Skan dump_string (di, "end"); 180117395Skan if (SCOPE_NULLIFIED_P (t)) 181117395Skan dump_string (di, "null"); 182117395Skan if (!SCOPE_NO_CLEANUPS_P (t)) 183117395Skan dump_string (di, "clnp"); 184117395Skan dump_next_stmt (di, t); 185117395Skan break; 186117395Skan 187117395Skan case STMT_EXPR: 188117395Skan dump_child ("stmt", STMT_EXPR_STMT (t)); 189117395Skan break; 190117395Skan 191117395Skan default: 192117395Skan break; 193117395Skan } 194117395Skan 195117395Skan return 0; 196117395Skan} 197