dump.c revision 90075
1/* Tree-dumping functionality for intermediate representation. 2 Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. 3 Written by Mark Mitchell <mark@codesourcery.com> 4 5This file is part of GNU CC. 6 7GNU CC is free software; you can redistribute it and/or modify 8it under the terms of the GNU General Public License as published by 9the Free Software Foundation; either version 2, or (at your option) 10any later version. 11 12GNU CC is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17You should have received a copy of the GNU General Public License 18along with GNU CC; see the file COPYING. If not, write to 19the Free Software Foundation, 59 Temple Place - Suite 330, 20Boston, MA 02111-1307, USA. */ 21 22#include "config.h" 23#include "system.h" 24#include "tree.h" 25#include "cp-tree.h" 26#include "tree-dump.h" 27 28static void dump_access 29 PARAMS ((dump_info_p, tree)); 30 31static void dump_op 32 PARAMS ((dump_info_p, tree)); 33 34/* Dump a representation of the accessibility information associated 35 with T. */ 36 37static void 38dump_access (di, t) 39 dump_info_p di; 40 tree t; 41{ 42 if (TREE_PROTECTED(t)) 43 dump_string (di, "protected"); 44 else if (TREE_PRIVATE(t)) 45 dump_string (di, "private"); 46 else 47 dump_string (di, "public"); 48} 49 50/* Dump a representation of the specific operator for an overloaded 51 operator associated with node t. 52*/ 53 54static void 55dump_op (di, t) 56 dump_info_p di; 57 tree t; 58{ 59 switch (DECL_OVERLOADED_OPERATOR_P (t)) { 60 case NEW_EXPR: 61 dump_string (di, "new"); 62 break; 63 case VEC_NEW_EXPR: 64 dump_string (di, "vecnew"); 65 break; 66 case DELETE_EXPR: 67 dump_string (di, "delete"); 68 break; 69 case VEC_DELETE_EXPR: 70 dump_string (di, "vecdelete"); 71 break; 72 case CONVERT_EXPR: 73 dump_string (di, "pos"); 74 break; 75 case NEGATE_EXPR: 76 dump_string (di, "neg"); 77 break; 78 case ADDR_EXPR: 79 dump_string (di, "addr"); 80 break; 81 case INDIRECT_REF: 82 dump_string(di, "deref"); 83 break; 84 case BIT_NOT_EXPR: 85 dump_string(di, "not"); 86 break; 87 case TRUTH_NOT_EXPR: 88 dump_string(di, "lnot"); 89 break; 90 case PREINCREMENT_EXPR: 91 dump_string(di, "preinc"); 92 break; 93 case PREDECREMENT_EXPR: 94 dump_string(di, "predec"); 95 break; 96 case PLUS_EXPR: 97 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 98 dump_string (di, "plusassign"); 99 else 100 dump_string(di, "plus"); 101 break; 102 case MINUS_EXPR: 103 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 104 dump_string (di, "minusassign"); 105 else 106 dump_string(di, "minus"); 107 break; 108 case MULT_EXPR: 109 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 110 dump_string (di, "multassign"); 111 else 112 dump_string (di, "mult"); 113 break; 114 case TRUNC_DIV_EXPR: 115 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 116 dump_string (di, "divassign"); 117 else 118 dump_string (di, "div"); 119 break; 120 case TRUNC_MOD_EXPR: 121 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 122 dump_string (di, "modassign"); 123 else 124 dump_string (di, "mod"); 125 break; 126 case BIT_AND_EXPR: 127 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 128 dump_string (di, "andassign"); 129 else 130 dump_string (di, "and"); 131 break; 132 case BIT_IOR_EXPR: 133 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 134 dump_string (di, "orassign"); 135 else 136 dump_string (di, "or"); 137 break; 138 case BIT_XOR_EXPR: 139 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 140 dump_string (di, "xorassign"); 141 else 142 dump_string (di, "xor"); 143 break; 144 case LSHIFT_EXPR: 145 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 146 dump_string (di, "lshiftassign"); 147 else 148 dump_string (di, "lshift"); 149 break; 150 case RSHIFT_EXPR: 151 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 152 dump_string (di, "rshiftassign"); 153 else 154 dump_string (di, "rshift"); 155 break; 156 case EQ_EXPR: 157 dump_string (di, "eq"); 158 break; 159 case NE_EXPR: 160 dump_string (di, "ne"); 161 break; 162 case LT_EXPR: 163 dump_string (di, "lt"); 164 break; 165 case GT_EXPR: 166 dump_string (di, "gt"); 167 break; 168 case LE_EXPR: 169 dump_string (di, "le"); 170 break; 171 case GE_EXPR: 172 dump_string (di, "ge"); 173 break; 174 case TRUTH_ANDIF_EXPR: 175 dump_string (di, "land"); 176 break; 177 case TRUTH_ORIF_EXPR: 178 dump_string (di, "lor"); 179 break; 180 case COMPOUND_EXPR: 181 dump_string (di, "compound"); 182 break; 183 case MEMBER_REF: 184 dump_string (di, "memref"); 185 break; 186 case COMPONENT_REF: 187 dump_string (di, "ref"); 188 break; 189 case ARRAY_REF: 190 dump_string (di, "subs"); 191 break; 192 case POSTINCREMENT_EXPR: 193 dump_string (di, "postinc"); 194 break; 195 case POSTDECREMENT_EXPR: 196 dump_string (di, "postdec"); 197 break; 198 case CALL_EXPR: 199 dump_string (di, "call"); 200 break; 201 case NOP_EXPR: 202 if (DECL_ASSIGNMENT_OPERATOR_P (t)) 203 dump_string (di, "assign"); 204 break; 205 default: 206 break; 207 } 208} 209 210int 211cp_dump_tree (dump_info, t) 212 void *dump_info; 213 tree t; 214{ 215 enum tree_code code; 216 dump_info_p di = (dump_info_p) dump_info; 217 218 /* Figure out what kind of node this is. */ 219 code = TREE_CODE (t); 220 221 if (DECL_P (t)) 222 { 223 if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus) 224 dump_string (di, language_to_string (DECL_LANGUAGE (t), 0)); 225 } 226 227 switch (code) 228 { 229 case IDENTIFIER_NODE: 230 if (IDENTIFIER_OPNAME_P (t)) 231 { 232 dump_string (di, "operator"); 233 return 1; 234 } 235 else if (IDENTIFIER_TYPENAME_P (t)) 236 { 237 dump_child ("tynm", TREE_TYPE (t)); 238 return 1; 239 } 240 else if (t == anonymous_namespace_name) 241 { 242 dump_string (di, "unnamed"); 243 return 1; 244 } 245 break; 246 247 case POINTER_TYPE: 248 if (TYPE_PTRMEM_P (t)) 249 { 250 dump_string (di, "ptrmem"); 251 dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t)); 252 dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t)); 253 return 1; 254 } 255 break; 256 257 case RECORD_TYPE: 258 case UNION_TYPE: 259 if (TYPE_PTRMEMFUNC_P (t)) 260 { 261 dump_string (di, "ptrmem"); 262 dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t)); 263 dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t)); 264 return 1; 265 } 266 267 dump_child ("vfld", TYPE_VFIELD (t)); 268 if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t)) 269 dump_string(di, "spec"); 270 271 if (!dump_flag (di, TDF_SLIM, t)) 272 { 273 int i; 274 275 for (i = 0; i < CLASSTYPE_N_BASECLASSES (t); ++i) 276 { 277 tree base_binfo = BINFO_BASETYPE (TYPE_BINFO (t), i); 278 dump_child ("base", BINFO_TYPE (base_binfo)); 279 if (TREE_VIA_VIRTUAL (base_binfo)) 280 dump_string (di, "virtual"); 281 dump_access (di, base_binfo); 282 } 283 } 284 break; 285 286 case FIELD_DECL: 287 dump_access (di, t); 288 if (DECL_MUTABLE_P (t)) 289 dump_string(di, "mutable"); 290 break; 291 292 case VAR_DECL: 293 if (TREE_CODE (CP_DECL_CONTEXT (t)) == RECORD_TYPE) 294 dump_access (di, t); 295 if (TREE_STATIC (t) && !TREE_PUBLIC (t)) 296 dump_string (di, "static"); 297 break; 298 299 case FUNCTION_DECL: 300 if (!DECL_THUNK_P (t)) 301 { 302 if (DECL_OVERLOADED_OPERATOR_P (t)) { 303 dump_string (di, "operator"); 304 dump_op (di, t); 305 } 306 if (DECL_FUNCTION_MEMBER_P (t)) 307 { 308 dump_string (di, "member"); 309 dump_access (di, t); 310 } 311 if (DECL_PURE_VIRTUAL_P (t)) 312 dump_string (di, "pure"); 313 if (DECL_VIRTUAL_P (t)) 314 dump_string (di, "virtual"); 315 if (DECL_CONSTRUCTOR_P (t)) 316 dump_string (di, "constructor"); 317 if (DECL_DESTRUCTOR_P (t)) 318 dump_string (di, "destructor"); 319 if (DECL_CONV_FN_P (t)) 320 dump_string (di, "conversion"); 321 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t)) 322 { 323 if (DECL_GLOBAL_CTOR_P (t)) 324 dump_string (di, "global init"); 325 if (DECL_GLOBAL_DTOR_P (t)) 326 dump_string (di, "global fini"); 327 dump_int (di, "prio", GLOBAL_INIT_PRIORITY (t)); 328 } 329 if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)) 330 dump_string (di, "pseudo tmpl"); 331 } 332 else 333 { 334 dump_string (di, "thunk"); 335 dump_int (di, "dlta", THUNK_DELTA (t)); 336 dump_child ("vcll", THUNK_VCALL_OFFSET (t)); 337 dump_child ("fn", DECL_INITIAL (t)); 338 } 339 break; 340 341 case NAMESPACE_DECL: 342 if (DECL_NAMESPACE_ALIAS (t)) 343 dump_child ("alis", DECL_NAMESPACE_ALIAS (t)); 344 else if (!dump_flag (di, TDF_SLIM, t)) 345 dump_child ("dcls", cp_namespace_decls (t)); 346 break; 347 348 case TEMPLATE_DECL: 349 dump_child ("rslt", DECL_TEMPLATE_RESULT (t)); 350 dump_child ("inst", DECL_TEMPLATE_INSTANTIATIONS (t)); 351 dump_child ("spcs", DECL_TEMPLATE_SPECIALIZATIONS (t)); 352 dump_child ("prms", DECL_TEMPLATE_PARMS (t)); 353 break; 354 355 case OVERLOAD: 356 dump_child ("crnt", OVL_CURRENT (t)); 357 dump_child ("chan", OVL_CHAIN (t)); 358 break; 359 360 case TRY_BLOCK: 361 dump_stmt (di, t); 362 if (CLEANUP_P (t)) 363 dump_string (di, "cleanup"); 364 dump_child ("body", TRY_STMTS (t)); 365 dump_child ("hdlr", TRY_HANDLERS (t)); 366 dump_next_stmt (di, t); 367 break; 368 369 case EH_SPEC_BLOCK: 370 dump_stmt (di, t); 371 dump_child ("body", EH_SPEC_STMTS (t)); 372 dump_child ("raises", EH_SPEC_RAISES (t)); 373 dump_next_stmt (di, t); 374 break; 375 376 case PTRMEM_CST: 377 dump_child ("clas", PTRMEM_CST_CLASS (t)); 378 dump_child ("mbr", PTRMEM_CST_MEMBER (t)); 379 break; 380 381 case THROW_EXPR: 382 /* These nodes are unary, but do not have code class `1'. */ 383 dump_child ("op 0", TREE_OPERAND (t, 0)); 384 break; 385 386 case AGGR_INIT_EXPR: 387 dump_int (di, "ctor", AGGR_INIT_VIA_CTOR_P (t)); 388 dump_child ("fn", TREE_OPERAND (t, 0)); 389 dump_child ("args", TREE_OPERAND (t, 1)); 390 dump_child ("decl", TREE_OPERAND (t, 2)); 391 break; 392 393 case CLEANUP_STMT: 394 dump_stmt (di, t); 395 dump_child ("decl", CLEANUP_DECL (t)); 396 dump_child ("expr", CLEANUP_EXPR (t)); 397 dump_next_stmt (di, t); 398 break; 399 400 case CTOR_STMT: 401 dump_stmt (di, t); 402 if (CTOR_BEGIN_P (t)) 403 dump_string (di, "begn"); 404 else 405 dump_string (di, "end"); 406 dump_next_stmt (di, t); 407 break; 408 409 case HANDLER: 410 dump_stmt (di, t); 411 dump_child ("parm", HANDLER_PARMS (t)); 412 dump_child ("body", HANDLER_BODY (t)); 413 dump_next_stmt (di, t); 414 break; 415 416 case MUST_NOT_THROW_EXPR: 417 dump_stmt (di, t); 418 dump_child ("body", TREE_OPERAND (t, 0)); 419 dump_next_stmt (di, t); 420 break; 421 422 case SUBOBJECT: 423 dump_stmt (di, t); 424 dump_child ("clnp", TREE_OPERAND (t, 0)); 425 dump_next_stmt (di, t); 426 break; 427 428 case USING_STMT: 429 dump_stmt (di, t); 430 dump_child ("nmsp", USING_STMT_NAMESPACE (t)); 431 dump_next_stmt (di, t); 432 break; 433 434 default: 435 break; 436 } 437 438 return 0; 439} 440 441