c-dump.c revision 117395
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 "tree.h" 25#include "c-tree.h" 26#include "tree-dump.h" 27 28/* Dump information common to statements from STMT. */ 29 30void 31dump_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 40void 41dump_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 50int 51c_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} 197