c-dump.c revision 132718
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" 24132718Skan#include "coretypes.h" 25132718Skan#include "tm.h" 26117395Skan#include "tree.h" 27117395Skan#include "c-tree.h" 28117395Skan#include "tree-dump.h" 29117395Skan 30117395Skan/* Dump information common to statements from STMT. */ 31117395Skan 32117395Skanvoid 33132718Skandump_stmt (dump_info_p di, tree t) 34117395Skan{ 35117395Skan dump_int (di, "line", STMT_LINENO (t)); 36117395Skan} 37117395Skan 38117395Skan/* Dump the next statement after STMT. */ 39117395Skan 40117395Skanvoid 41132718Skandump_next_stmt (dump_info_p di, tree t) 42117395Skan{ 43117395Skan dump_child ("next", TREE_CHAIN (t)); 44117395Skan} 45117395Skan 46117395Skan/* Dump any C-specific tree codes and attributes of common codes. */ 47117395Skan 48132718Skanbool 49132718Skanc_dump_tree (void *dump_info, tree t) 50117395Skan{ 51117395Skan enum tree_code code; 52117395Skan dump_info_p di = (dump_info_p) dump_info; 53117395Skan 54117395Skan /* Figure out what kind of node this is. */ 55117395Skan code = TREE_CODE (t); 56117395Skan 57117395Skan switch (code) 58117395Skan { 59117395Skan case FIELD_DECL: 60117395Skan if (DECL_C_BIT_FIELD (t)) 61117395Skan dump_string (di, "bitfield"); 62117395Skan break; 63117395Skan 64117395Skan case ASM_STMT: 65117395Skan dump_stmt (di, t); 66117395Skan if (ASM_VOLATILE_P (t)) 67117395Skan dump_string (di, "volatile"); 68117395Skan dump_child ("strg", ASM_STRING (t)); 69117395Skan dump_child ("outs", ASM_OUTPUTS (t)); 70117395Skan dump_child ("ins", ASM_INPUTS (t)); 71117395Skan dump_child ("clbr", ASM_CLOBBERS (t)); 72117395Skan dump_next_stmt (di, t); 73117395Skan break; 74117395Skan 75117395Skan case BREAK_STMT: 76117395Skan case CONTINUE_STMT: 77117395Skan dump_stmt (di, t); 78117395Skan dump_next_stmt (di, t); 79117395Skan break; 80117395Skan 81117395Skan case CASE_LABEL: 82117395Skan /* Note that a case label is not like other statements; there is 83117395Skan no way to get the line-number of a case label. */ 84117395Skan dump_child ("low", CASE_LOW (t)); 85117395Skan dump_child ("high", CASE_HIGH (t)); 86117395Skan dump_next_stmt (di, t); 87117395Skan break; 88117395Skan 89117395Skan case CLEANUP_STMT: 90117395Skan dump_stmt (di, t); 91117395Skan dump_child ("decl", CLEANUP_DECL (t)); 92117395Skan dump_child ("expr", CLEANUP_EXPR (t)); 93117395Skan dump_next_stmt (di, t); 94117395Skan break; 95117395Skan 96117395Skan case COMPOUND_STMT: 97117395Skan dump_stmt (di, t); 98117395Skan dump_child ("body", COMPOUND_BODY (t)); 99117395Skan dump_next_stmt (di, t); 100117395Skan break; 101117395Skan 102117395Skan case DECL_STMT: 103117395Skan dump_stmt (di, t); 104117395Skan dump_child ("decl", DECL_STMT_DECL (t)); 105117395Skan dump_next_stmt (di, t); 106117395Skan break; 107117395Skan 108117395Skan case DO_STMT: 109117395Skan dump_stmt (di, t); 110117395Skan dump_child ("body", DO_BODY (t)); 111117395Skan dump_child ("cond", DO_COND (t)); 112117395Skan dump_next_stmt (di, t); 113117395Skan break; 114117395Skan 115117395Skan case EXPR_STMT: 116117395Skan dump_stmt (di, t); 117117395Skan dump_child ("expr", EXPR_STMT_EXPR (t)); 118117395Skan dump_next_stmt (di, t); 119117395Skan break; 120117395Skan 121117395Skan case FOR_STMT: 122117395Skan dump_stmt (di, t); 123117395Skan dump_child ("init", FOR_INIT_STMT (t)); 124117395Skan dump_child ("cond", FOR_COND (t)); 125117395Skan dump_child ("expr", FOR_EXPR (t)); 126117395Skan dump_child ("body", FOR_BODY (t)); 127117395Skan dump_next_stmt (di, t); 128117395Skan break; 129117395Skan 130117395Skan case GOTO_STMT: 131117395Skan dump_stmt (di, t); 132117395Skan dump_child ("dest", GOTO_DESTINATION (t)); 133117395Skan dump_next_stmt (di, t); 134117395Skan break; 135117395Skan 136117395Skan case IF_STMT: 137117395Skan dump_stmt (di, t); 138117395Skan dump_child ("cond", IF_COND (t)); 139117395Skan dump_child ("then", THEN_CLAUSE (t)); 140117395Skan dump_child ("else", ELSE_CLAUSE (t)); 141117395Skan dump_next_stmt (di, t); 142117395Skan break; 143117395Skan 144117395Skan case LABEL_STMT: 145117395Skan dump_stmt (di, t); 146117395Skan dump_child ("labl", LABEL_STMT_LABEL (t)); 147117395Skan dump_next_stmt (di, t); 148117395Skan break; 149117395Skan 150117395Skan case RETURN_STMT: 151117395Skan dump_stmt (di, t); 152117395Skan dump_child ("expr", RETURN_STMT_EXPR (t)); 153117395Skan dump_next_stmt (di, t); 154117395Skan break; 155117395Skan 156117395Skan case SWITCH_STMT: 157117395Skan dump_stmt (di, t); 158117395Skan dump_child ("cond", SWITCH_COND (t)); 159117395Skan dump_child ("body", SWITCH_BODY (t)); 160117395Skan dump_next_stmt (di, t); 161117395Skan break; 162117395Skan 163117395Skan case WHILE_STMT: 164117395Skan dump_stmt (di, t); 165117395Skan dump_child ("cond", WHILE_COND (t)); 166117395Skan dump_child ("body", WHILE_BODY (t)); 167117395Skan dump_next_stmt (di, t); 168117395Skan break; 169117395Skan 170117395Skan case SCOPE_STMT: 171117395Skan dump_stmt (di, t); 172117395Skan if (SCOPE_BEGIN_P (t)) 173117395Skan dump_string (di, "begn"); 174117395Skan else 175117395Skan dump_string (di, "end"); 176117395Skan if (SCOPE_NULLIFIED_P (t)) 177117395Skan dump_string (di, "null"); 178117395Skan if (!SCOPE_NO_CLEANUPS_P (t)) 179117395Skan dump_string (di, "clnp"); 180117395Skan dump_next_stmt (di, t); 181117395Skan break; 182117395Skan 183117395Skan case STMT_EXPR: 184117395Skan dump_child ("stmt", STMT_EXPR_STMT (t)); 185117395Skan break; 186117395Skan 187117395Skan default: 188117395Skan break; 189117395Skan } 190117395Skan 191132718Skan return false; 192117395Skan} 193