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