|
|
1.1 ! root 1: /* ident "@(#)ctrans:src/tree_dump.c 1.2" */ ! 2: /* -*- Mode:C++ -*- */ ! 3: /* tree_dump.C -- utilities for displaying the cfront tree. */ ! 4: /* BIM 890530 */ ! 5: /* rewritten 890712 to use the tree-walking facilities */ ! 6: ! 7: /* ! 8: $Source: /usr3/lang/benson/work/stripped_cfront/RCS/tree_dump.c,v $ $RCSfile: tree_dump.c,v $ ! 9: $Revision: 1.1 $ $Date: 89/11/20 08:50:22 $ ! 10: $Author: benson $ $Locker: $ ! 11: $State: Exp $ ! 12: ! 13: ! 14: */ ! 15: ! 16: #include "tree_dump.h" ! 17: #include <stdio.h> ! 18: #include <malloc.h> ! 19: #include "template.h" ! 20: #include "token_names.h" ! 21: ! 22: const int Indent_Increment = 4; ! 23: static char badnamebuf[100]; ! 24: ! 25: char * ! 26: token_name(TOK t) ! 27: { ! 28: char * bnb = badnamebuf; ! 29: ! 30: if((int) t == -1) return "-1"; ! 31: if(t > DUMMY_LAST_NODE) { ! 32: bad: ! 33: printf_to_string(bnb, sizeof(badnamebuf), ! 34: "<unknown token %d>", (int) t); ! 35: return bnb; ! 36: } ! 37: int x; ! 38: for (x = 0; x < DUMMY_LAST_NODE; x++) { ! 39: if(token_names[x].val == t) return token_names[x].string; ! 40: } ! 41: goto bad; ! 42: } ! 43: ! 44: class displayer{ ! 45: public: ! 46: dcn_arg * arg; ! 47: Pnode node; ! 48: Pnode node_address; ! 49: displayer (dcn_arg& d) { arg = &d; indent = 0; print_null_values = 0; }; ! 50: void do_node (Pnode& node, node_class cl, tree_node_action& action, int depth, Pnode); ! 51: private: ! 52: enum ppc {print_ptr_copy = 0, print_ptr_copied = 1}; ! 53: int indent; ! 54: int err; ! 55: int print_null_values; ! 56: void printf (const char *, ...); ! 57: void catprintf (const char *, ...); ! 58: void print_ptr (const char *, Pnode); ! 59: void print_ptr (Pnode, ppc = print_ptr_copy); ! 60: void minimal (); ! 61: void a_basetype (); ! 62: void a_basecl() ; ! 63: void a_type() ; ! 64: void a_node() ; ! 65: void a_name (); ! 66: void a_expr (int from_name = 0); ! 67: void a_fct (); ! 68: void a_stmt (); ! 69: void a_enumdef (); ! 70: void a_table(); ! 71: void a_classdef (); ! 72: void a_gen (); ! 73: void a_vec (); ! 74: void a_ptr (); ! 75: void a_virt (); ! 76: void a_nlist (); ! 77: void a_iline (); ! 78: void a_elist (); ! 79: void a_ia (); ! 80: void a_by_name (); ! 81: void print_loc(loc&); ! 82: void * display_address () { return node_address; } ! 83: void fetch (void * addr, unsigned long length, void *& taddr); ! 84: void fetch_string (void * addr, unsigned long length, void *& taddr); ! 85: void free_fetched(void *); ! 86: void flag (int, const char *); ! 87: void print_string (const char *, void *); ! 88: void print_string_brief (void *); ! 89: void null_field (const char *); ! 90: void nz_printf(const char *format, const int i) ; ! 91: void nz_printf(const char *format, const char *p) ; ! 92: void nz_printf(const char *format, const long l) ; ! 93: void ind(); ! 94: }; ! 95: ! 96: const char many_spaces[] = " "; ! 97: ! 98: inline void ! 99: displayer::ind() ! 100: { ! 101: arg->output_stream->write(many_spaces, indent); ! 102: } ! 103: ! 104: /* call me for full lines */ ! 105: ! 106: void ! 107: displayer::printf (const char * format, ...) ! 108: { ! 109: va_list args; ! 110: va_start(args, format); ! 111: ! 112: ind(); ! 113: vostream_printf (format, args, *arg->output_stream); ! 114: arg->output_stream->write("\n", 1); ! 115: va_end (args); ! 116: } ! 117: ! 118: void ! 119: displayer::catprintf (const char * format, ...) ! 120: { ! 121: va_list args; ! 122: va_start(args, format); ! 123: ! 124: vostream_printf (format, args, *arg->output_stream); ! 125: va_end (args); ! 126: } ! 127: ! 128: void ! 129: displayer::minimal () ! 130: { ! 131: print_ptr(node, print_ptr_copied); ! 132: } ! 133: ! 134: void ! 135: displayer::print_ptr(const char * label, Pnode node) ! 136: { ! 137: if(node || print_null_values) { ! 138: ind(); ! 139: catprintf("%s:\t", label); ! 140: print_ptr(node); ! 141: catprintf("\n"); ! 142: } ! 143: } ! 144: ! 145: ! 146: void ! 147: displayer::print_ptr(Pnode node, ppc copy_ptr) ! 148: { ! 149: void * string = 0; ! 150: void * ncopy; ! 151: void * na = (void *)node; ! 152: ! 153: if(node) { ! 154: ! 155: if(copy_ptr == print_ptr_copy) { ! 156: fetch(na, sizeof(node), ncopy); ! 157: node = Pnode(ncopy); ! 158: } else ncopy = node; ! 159: ! 160: switch(node->base) { ! 161: case CLASS: ! 162: free_fetched(ncopy); ! 163: fetch(na, sizeof(classdef),ncopy); ! 164: node = Pnode(ncopy); ! 165: string = Pclass(node)->string; ! 166: break; ! 167: case ENUM: ! 168: free_fetched(ncopy); ! 169: fetch(na, sizeof(enumdef),ncopy); ! 170: node = Pnode(ncopy); ! 171: string = Penum(node)->string; ! 172: break; ! 173: case NAME: ! 174: case TNAME: ! 175: case PUBLIC: ! 176: case PROTECTED: ! 177: if(!node->baseclass) { ! 178: free_fetched(ncopy); ! 179: fetch(na, sizeof(name),ncopy); ! 180: node = Pnode(ncopy); ! 181: string = Pname(node)->string; ! 182: } ! 183: break; ! 184: } ! 185: if(string) { ! 186: catprintf("<%s |0x%p ", token_name(node->base), na); ! 187: print_string_brief(string); ! 188: catprintf(">"); ! 189: } ! 190: else catprintf("<%s |0x%p>", token_name(node->base), na); ! 191: free_fetched (ncopy); ! 192: } ! 193: else catprintf("Null"); ! 194: } ! 195: ! 196: void ! 197: displayer::do_node (Pnode& n, node_class cl, tree_node_action& action, ! 198: int depth, Pnode na) ! 199: { ! 200: int forced_min = 0; ! 201: int printed_min = 0; ! 202: int prune = 0; ! 203: ! 204: switch(cl) { ! 205: case nc_table: ! 206: if(depth > 0 && !arg->walk_tables)prune = 1; ! 207: case nc_fct: ! 208: case nc_classdef: ! 209: case nc_enumdef: ! 210: if(arg->stop_at_top && depth > 1) prune = 1; ! 211: break; ! 212: } ! 213: ! 214: if((arg->max_depth > 0) && (depth >= arg->max_depth)) ! 215: prune = 1; ! 216: ! 217: if(prune || arg->max_depth == 0) ! 218: action = tna_stop; ! 219: else action = tna_continue; ! 220: ! 221: node = n; ! 222: node_address = na; ! 223: ! 224: if(arg->verbose == dt_brief || prune) { ! 225: printed_min = 1; ! 226: minimal(); ! 227: } ! 228: else { ! 229: switch(cl) ! 230: { ! 231: default: ! 232: case nc_unused: ! 233: ostream_printf(*arg->error_stream, "Unknown node %d\n", node->base); ! 234: forced_min = 1; ! 235: ! 236: case nc_eof: ! 237: minimal(); ! 238: printed_min = 1; ! 239: break; ! 240: ! 241: case nc_virt: ! 242: a_virt (); ! 243: break; ! 244: ! 245: case nc_nlist: ! 246: a_nlist(); ! 247: break; ! 248: ! 249: case nc_gen: ! 250: a_gen(); ! 251: break; ! 252: ! 253: case nc_vec: ! 254: a_vec(); ! 255: break; ! 256: ! 257: case nc_ptr: ! 258: a_ptr(); ! 259: break; ! 260: ! 261: case nc_fct: ! 262: a_fct(); ! 263: break; ! 264: ! 265: case nc_table: ! 266: a_table(); ! 267: break; ! 268: ! 269: case nc_basetype: ! 270: a_basetype(); ! 271: break; ! 272: ! 273: case nc_name: ! 274: a_name(); ! 275: break; ! 276: ! 277: case nc_expr: ! 278: a_expr(); ! 279: break; ! 280: ! 281: case nc_stmt: ! 282: a_stmt(); ! 283: break; ! 284: ! 285: case nc_enumdef: ! 286: a_enumdef(); ! 287: break; ! 288: ! 289: case nc_classdef: ! 290: a_classdef(); ! 291: break; ! 292: ! 293: case nc_baseclass: ! 294: a_basecl (); ! 295: break; ! 296: ! 297: case nc_iline: ! 298: a_iline(); ! 299: break; ! 300: ! 301: case nc_ia: ! 302: a_ia(); ! 303: break; ! 304: ! 305: } ! 306: if(printed_min) catprintf(">"); ! 307: } ! 308: } ! 309: ! 310: ! 311: void ! 312: displayer::flag(int f, const char * n) ! 313: { ! 314: if(f)catprintf("%s", n); ! 315: } ! 316: ! 317: void ! 318: displayer::free_fetched (void * addr) ! 319: { ! 320: if (arg->fetcher != null_tfp) /* not in the same address space. */ ! 321: free ((char *)addr); ! 322: } ! 323: ! 324: ! 325: void ! 326: displayer::fetch (void * addr, unsigned long length, void *& taddr) ! 327: { ! 328: if (arg->fetcher == null_tfp) { /* in the same address space. */ ! 329: taddr = addr; ! 330: err = 0; ! 331: } else { ! 332: taddr = (void *)malloc ((unsigned int)length); ! 333: err = arg->fetcher (arg->fetcher_info, ! 334: addr, ! 335: length, ! 336: 0, ! 337: taddr); ! 338: } ! 339: } ! 340: ! 341: void ! 342: displayer::fetch_string (void * addr, unsigned long length, void *& taddr) ! 343: { ! 344: if (arg->fetcher == null_tfp) { /* in the same address space. */ ! 345: taddr = addr; ! 346: err = 0; ! 347: } else { ! 348: taddr = (void *)malloc ((unsigned int)length); ! 349: err = arg->fetcher (arg->fetcher_info, ! 350: addr, ! 351: length, ! 352: 1, ! 353: taddr); ! 354: } ! 355: } ! 356: ! 357: /* Print the field, only if it has a non_zero value, or requested to print */ ! 358: /* always */ ! 359: void ! 360: displayer::nz_printf(const char *format, const int i) ! 361: { ! 362: if (i || print_null_values) { ! 363: printf(format, i) ; ! 364: } ! 365: } ! 366: ! 367: void ! 368: displayer::nz_printf(const char *format, const char *p) ! 369: { ! 370: if (p || print_null_values) { ! 371: printf(format, (p ? p : "0")) ; ! 372: } ! 373: } ! 374: ! 375: ! 376: void ! 377: displayer::nz_printf(const char *format, const long i) ! 378: { ! 379: if (i || print_null_values) { ! 380: printf(format, i) ; ! 381: } ! 382: } ! 383: ! 384: void ! 385: displayer::a_node() ! 386: { ! 387: struct node &n = *node ; ! 388: ! 389: nz_printf("$node", n.permanent); ! 390: // nz_printf("n_key:\t%d", (int)n.n_key) ; ! 391: nz_printf("permanent:\t%d", n.permanent) ; ! 392: nz_printf("baseclass:\t%d", n.baseclass) ; ! 393: } ! 394: ! 395: ! 396: ! 397: void ! 398: displayer::a_type() ! 399: { ! 400: struct type& t = *Ptype(node); ! 401: int show_up = t.defined /* || t.inline_temp_index != 0 */; ! 402: ! 403: if(show_up) { ! 404: printf("$type") ; ! 405: nz_printf("defined:\t%d", t.defined) ; ! 406: // nz_printf("inline_temp_index:\t%d", t.inline_temp_index); ! 407: indent += Indent_Increment; ! 408: } ! 409: a_node(); ! 410: if(show_up) indent -= Indent_Increment; ! 411: } ! 412: ! 413: ! 414: ! 415: ! 416: ! 417: void ! 418: displayer::null_field(const char * name) ! 419: { ! 420: nz_printf( "%s:\t0", name); ! 421: } ! 422: ! 423: ! 424: void ! 425: displayer::a_basecl() ! 426: { ! 427: struct basecl& bc = *Pbcl(node); ! 428: ! 429: printf("$basecl %s |0x%p", ! 430: token_name(node->base), ! 431: node_address); ! 432: ! 433: nz_printf ("ppp:\t%s", token_name(bc.ppp)) ; ! 434: nz_printf ("allocated:\t%d", bc.allocated) ; ! 435: nz_printf ("promoted:\t%d", bc.promoted) ; ! 436: print_ptr("bclass", bc.bclass); ! 437: nz_printf ("ptr_offset:\t%d", bc.ptr_offset) ; ! 438: nz_printf ("obj_offset:\t%d", bc.obj_offset) ; ! 439: indent += Indent_Increment; ! 440: a_node(); /* do the supertype. */ ! 441: indent -= Indent_Increment; ! 442: } ! 443: ! 444: ! 445: ! 446: ! 447: void ! 448: displayer::a_basetype () ! 449: { ! 450: struct basetype& bt = *Pbase(node); ! 451: ! 452: printf("$basetype %s |0x%p", ! 453: token_name(node->base), ! 454: node_address); ! 455: ! 456: ind(); ! 457: catprintf("Flags:\t"); ! 458: flag(bt.b_unsigned, "unsigned "); ! 459: flag(bt.b_signed, "signed "); ! 460: flag(bt.b_volatile, "volatile "); ! 461: flag(bt.b_const, "const "); ! 462: flag(bt.b_typedef, "typedef "); ! 463: flag(bt.b_virtual, "virtual "); ! 464: flag(bt.b_short, "short "); ! 465: flag(bt.b_long, "long "); ! 466: catprintf("\n"); ! 467: nz_printf( "b_bits:\t%d", bt.b_bits); ! 468: nz_printf( "b_offset:\t%d", bt.b_offset); ! 469: nz_printf( "b_sto:\t%s", bt.b_sto ? token_name(bt.b_sto) : 0); ! 470: switch(bt.discriminator(0)) { ! 471: case 1: ! 472: print_ptr("b_fieldtype", bt.b_fieldtype); ! 473: break; ! 474: case 2: ! 475: nz_printf( "b_linkage:\t%s", bt.b_linkage ? "C" : "0(C++)"); ! 476: } ! 477: ! 478: print_ptr("b_name", bt.b_name); ! 479: print_ptr("b_table", bt.b_table); ! 480: // print_ptr("b_field", bt.b_field); ! 481: print_ptr("b_xname", bt.b_xname); ! 482: ! 483: indent += Indent_Increment; ! 484: a_type(); /* do the supertype. */ ! 485: indent -= Indent_Increment; ! 486: ! 487: } ! 488: ! 489: void ! 490: displayer::print_loc(loc& loc) ! 491: { ! 492: catprintf("file %d line %d", (int)loc.file, (int)loc.line); ! 493: } ! 494: ! 495: ! 496: void ! 497: displayer::print_string_brief(void * addr) ! 498: { ! 499: void * tmp; ! 500: ! 501: fetch_string (addr, 1000, tmp); ! 502: *arg->output_stream << (char *)tmp; ! 503: free_fetched (tmp); ! 504: } ! 505: ! 506: void ! 507: displayer::print_string(const char * label, void * addr) ! 508: { ! 509: ind(); ! 510: catprintf("%s:\t", label); ! 511: print_string_brief(addr); ! 512: *arg->output_stream << "\n"; ! 513: } ! 514: ! 515: void ! 516: displayer::a_expr(int from_name) ! 517: { ! 518: struct expr& e = *Pexpr(node); ! 519: ! 520: if(from_name) printf("$expr"); ! 521: else printf("$expr %s |0x%p", ! 522: token_name(node->base), ! 523: node_address); ! 524: ! 525: print_ptr("tp", e.tp); ! 526: ! 527: switch(e.discriminator(1)) { ! 528: case 0: break; ! 529: case 1: ! 530: print_ptr("e1", e.e1); ! 531: break; ! 532: case 2: ! 533: printf("i1:\t%ld", e.i1); ! 534: break; ! 535: case 3: ! 536: print_string("string", (void *)e.string); ! 537: } ! 538: ! 539: switch(e.discriminator(2)) { ! 540: case 0: break; ! 541: case 1: ! 542: print_ptr("e2", e.e2); ! 543: break; ! 544: case 2: ! 545: printf("i2:\t%ld", e.i2); ! 546: break; ! 547: case 3: ! 548: print_string("string2", (void *)e.string2); ! 549: break; ! 550: case 4: ! 551: print_ptr("n_initializer", e.n_initializer); ! 552: } ! 553: ! 554: switch(e.discriminator(3)) { ! 555: case 0: ! 556: break; ! 557: case 1: print_ptr ("tp2", e.tp2); break; ! 558: case 2: print_ptr ("fct_name", e.fct_name); break; ! 559: case 3: print_ptr ("cond", e.cond); break; ! 560: case 4: print_ptr ("mem", e.mem); break; ! 561: case 5: print_ptr ("as_type", e.as_type); break; ! 562: case 6: print_ptr ("n_table", e.n_table); break; ! 563: case 7: print_ptr ("il", e.il); break; ! 564: case 8: print_ptr ("query_this", e.query_this); break; ! 565: } ! 566: ! 567: indent += Indent_Increment; ! 568: a_node(); ! 569: indent -= Indent_Increment; ! 570: ! 571: } ! 572: ! 573: void ! 574: displayer::a_name() ! 575: { ! 576: struct name& n = *Pname(node); ! 577: ! 578: ! 579: ind(); ! 580: catprintf("$name %s |0x%p ", ! 581: token_name(node->base), ! 582: node_address); ! 583: print_string_brief((void *)n.string); ! 584: *arg->output_stream << "\n"; ! 585: ! 586: nz_printf("n_key:\t%d", (int)n.n_key) ; ! 587: nz_printf( "n_oper:\t\t%s", n.n_oper ? ! 588: token_name(n.n_oper) : 0); ! 589: nz_printf( "n_sto:\t\t%s", n.n_sto ? ! 590: token_name(n.n_sto) : 0); ! 591: nz_printf( "n_stclass:\t%s", n.n_stclass ? ! 592: token_name(n.n_stclass) : 0); ! 593: nz_printf( "n_scope:\t%s", n.n_scope ? ! 594: token_name(n.n_scope) : 0); ! 595: nz_printf( "n_union:\t%d", n.n_union); ! 596: nz_printf( "n_evaluated:\t%d", n.n_evaluated); ! 597: nz_printf( "n_xref:\t\t%d", n.n_xref); ! 598: nz_printf( "lex_level:\t%d", n.lex_level); ! 599: nz_printf( "n_protect:\t%s", n.n_protect ? ! 600: token_name(n.n_protect) : 0); ! 601: if (n.n_dcl_printed || print_null_values) { ! 602: ind(); ! 603: catprintf("n_dcl_printed:\t%d", n.n_dcl_printed); ! 604: ! 605: switch(n.n_dcl_printed) ! 606: { ! 607: case 0: ! 608: catprintf("(not)\n"); ! 609: break; ! 610: case 1: ! 611: printf("(declaration)\n"); ! 612: break; ! 613: case 2: ! 614: printf("(definition)\n"); ! 615: break; ! 616: } ! 617: ! 618: } ! 619: if(n.n_template_arg) { ! 620: ind(); ! 621: catprintf( "n_template_arg:\t"); ! 622: switch(n.n_template_arg) ! 623: { ! 624: case template_type_formal: ! 625: catprintf("template_type_formal\n"); ! 626: break; ! 627: case template_expr_formal: ! 628: catprintf("template_expr_formal\n"); ! 629: break; ! 630: case template_stmt_tree_formal: ! 631: catprintf("template_stmt_formal\n"); ! 632: break; ! 633: case template_expr_tree_formal: ! 634: catprintf("template_expr_tree_formal\n"); ! 635: break; ! 636: case template_actual_arg_dummy: ! 637: catprintf("template_actual_arg_dummy\n"); ! 638: break; ! 639: } ; ! 640: } ! 641: nz_printf( "n_addr_taken:\t%d", n.n_addr_taken); ! 642: nz_printf( "n_used:\t\t%d", n.n_used); ! 643: nz_printf( "n_assigned_to:\t%d", n.n_assigned_to); ! 644: ind(); ! 645: catprintf("loc:\t\t"); ! 646: print_loc(n.where); ! 647: catprintf("\n"); ! 648: nz_printf( "n_offset:\t%d", n.n_offset); ! 649: // if(n.output_string) { print_string("output_string", (void *)n.output_string); } ! 650: nz_printf( "n_val:\t\t%ld", n.n_val); ! 651: ! 652: print_ptr("n_list", n.n_list); ! 653: print_ptr("n_tbl_list", n.n_tbl_list); ! 654: if(n.n_gen_fct_name) ! 655: print_string("n_gen_fct_name", n.n_gen_fct_name); ! 656: if(n.n_template_arg_string) { ! 657: print_string("n_template_arg_string", ! 658: n.n_template_arg_string); ! 659: } ! 660: switch(n.discriminator(0)) { ! 661: case 2: print_ptr("n_realscope", n.n_realscope); break; ! 662: case 1: print_ptr("n_qualifier", n.n_qualifier); break; ! 663: } ! 664: nz_printf("n_val:\t%ld", n.n_val); ! 665: ! 666: indent += Indent_Increment; ! 667: a_expr(1); /* do the supertype. */ ! 668: indent -= Indent_Increment; ! 669: } ! 670: ! 671: void ! 672: displayer::a_fct() ! 673: { ! 674: struct fct& f = *Pfct(node); ! 675: ! 676: printf("$fct %s |0x%p", ! 677: token_name(node->base), ! 678: node_address); ! 679: ! 680: ! 681: printf("nargs:\t\t%d", f.nargs); ! 682: printf("nargs_known:\t%d%s", f.nargs_known, ! 683: f.nargs_known == 0 ? " UNKNOWN" : ! 684: (f.nargs_known == 1 ? " KNOWN" : ! 685: (f.nargs_known == ELLIPSIS ? "ELLIPSIS" : "" ))); ! 686: nz_printf( "f_vdef:\t\t%d", f.f_vdef); ! 687: printf("f_inline:\t%d%s", f.f_inline, ! 688: f.f_inline == 0 ? "" : ! 689: f.f_inline == 1 ? " inline" : ! 690: f.f_inline == 2 ? " inline in expansion" : ""); ! 691: nz_printf( "f_const:\t\t%d", f.f_const); ! 692: nz_printf( "f_static:\t\t%d", f.f_static); ! 693: nz_printf( "f_virtual:\t%d", f.f_virtual); ! 694: nz_printf( "f_imeasure:\t%d", f.f_imeasure); ! 695: print_string("f_signature", (void *)f.f_signature); ! 696: ! 697: print_ptr("returns", f.returns); ! 698: print_ptr("argtype", f.argtype); ! 699: print_ptr("s_returns", f.s_returns); ! 700: print_ptr("f_this", f.f_this); ! 701: print_ptr("memof", f.memof); ! 702: print_ptr("body", f.body); ! 703: print_ptr("f_init", f.f_init); ! 704: print_ptr("f_expr", f.f_expr); ! 705: print_ptr("last_expanded", f.last_expanded); ! 706: print_ptr("f_result", f.f_result); ! 707: print_ptr("f_args", f.f_args); ! 708: print_ptr("local_classes", f.local_class); ! 709: ! 710: indent += Indent_Increment; ! 711: a_type(); /* do the supertype. */ ! 712: indent -= Indent_Increment; ! 713: } ! 714: ! 715: void ! 716: displayer::a_stmt () ! 717: { ! 718: struct stmt& s = *Pstmt(node); ! 719: ! 720: ind(); ! 721: catprintf("$stmt %s |0x%p ", ! 722: token_name(node->base), ! 723: node_address); ! 724: print_loc(s.where); ! 725: *arg->output_stream << "\n"; ! 726: ! 727: ind(); ! 728: *arg->output_stream << "where:\t"; ! 729: print_loc(s.where); ! 730: *arg->output_stream << "\n"; ! 731: ! 732: print_ptr("s", s.s); ! 733: print_ptr("s_list", s.s_list); ! 734: print_ptr("memtbl", s.memtbl); ! 735: switch(s.discriminator(0)) { ! 736: case 1: print_ptr("d", s.d); break; ! 737: case 2: print_ptr("e2", s.e2); break; ! 738: case 3: print_ptr("has_default", s.has_default); break; ! 739: case 4: nz_printf("case_value:\t0x%x", s.case_value); ! 740: case 5: print_ptr("ret_tp", s.ret_tp); break; ! 741: } ! 742: switch(s.discriminator(1)) { ! 743: case 1: print_ptr("e", s.e); break; ! 744: case 2: nz_printf("own_tbl:\t%d", s.own_tbl); break; ! 745: case 3: print_ptr("s2", s.s2); break; ! 746: } ! 747: ! 748: switch(s.discriminator(2)) { ! 749: case 1: print_ptr("for_init", s.for_init); break; ! 750: case 2: print_ptr("else_stmt",s.for_init); break; ! 751: case 3: print_ptr("case_list", s.case_list); break; ! 752: } ! 753: } ! 754: ! 755: void ! 756: displayer::a_enumdef () ! 757: { ! 758: struct enumdef& e = *Penum(node); ! 759: ! 760: printf("$enumdef %s |0x%p", ! 761: token_name(node->base), ! 762: node_address); ! 763: ! 764: nz_printf( "e_body:\t\t%d", e.e_body); ! 765: nz_printf( "no_of_enumerators: %d", ! 766: e.no_of_enumerators); ! 767: nz_printf( "strlen:\t%d", e.strlen); ! 768: print_string ("string", (void *)e.string); ! 769: ! 770: print_ptr("mem", e.mem); ! 771: print_ptr("e_type", e.e_type); ! 772: indent += Indent_Increment; ! 773: a_type(); /* do the supertype. */ ! 774: indent -= Indent_Increment; ! 775: } ! 776: ! 777: void ! 778: displayer::a_classdef () ! 779: { ! 780: struct classdef& c = *Pclass(node); ! 781: ! 782: ind(); ! 783: catprintf("$classdef %s |0x%p ", ! 784: token_name(node->base), ! 785: node_address); ! 786: print_string_brief(c.string); ! 787: *arg->output_stream << "\n"; ! 788: ind(); ! 789: catprintf("class_base:\t"); ! 790: switch(c.class_base) ! 791: { ! 792: case vanilla_class: ! 793: *arg->output_stream << "vanilla_class\n"; ! 794: break; ! 795: case template_class: ! 796: *arg->output_stream << "template_class\n"; ! 797: Template_Class: ! 798: nz_printf("inst:\t\t%p", (int)Ptclass(&c)->inst); ! 799: break; ! 800: case instantiated_template_class: ! 801: *arg->output_stream << "instantiated_template_class\n"; ! 802: goto Template_Class; ! 803: case uninstantiated_template_class: ! 804: *arg->output_stream << "uninstantiated_template_class\n"; ! 805: goto Template_Class; ! 806: case relationship_class: ! 807: *arg->output_stream << "relationship_class\n"; ! 808: break; ! 809: case defining_class: ! 810: *arg->output_stream << "defining_class\n"; ! 811: break; ! 812: } ! 813: ! 814: nz_printf( "c_body:\t\t%d", c.c_body); ! 815: printf("csu:\t\t%s", ! 816: token_name(c.csu)); ! 817: nz_printf( "obj_align:\t%d", c.obj_align); ! 818: if(c.c_xref) { ! 819: ind(); ! 820: catprintf( "c_xref:\t%x", c.c_xref); ! 821: flag(c.c_xref & 1, "has-vptr "); ! 822: flag(c.c_xref & 2, "X(X&)-defined "); ! 823: flag(c.c_xref & 4, "operator=(X&)-defined "); ! 824: flag(c.c_xref & 8, "has-vbaseptr(s) "); ! 825: *arg->output_stream << "\n"; ! 826: } ! 827: nz_printf( "virt_count:\t%d", c.virt_count); ! 828: nz_printf( "virt_merge:\t%d", c.virt_merge); ! 829: nz_printf( "c_abstract:\t%d", c.c_abstract); ! 830: nz_printf( "has_vvtab:\t%d", c.has_vvtab); ! 831: nz_printf( "strlen:\t%d", c.strlen); ! 832: print_string ("string", (void *)c.string); ! 833: nz_printf( "obj_size:\t%d", c.obj_size); ! 834: nz_printf( "real_size:\t%d", c.real_size); ! 835: nz_printf("lex_level:\t%d", c.lex_level); ! 836: if(c.lcl)print_string("lcl", c.lcl); ! 837: ! 838: print_ptr("baselist", c.baselist); ! 839: print_ptr("mem_list", c.mem_list); ! 840: print_ptr("memtbl", c.memtbl); ! 841: print_ptr("friend_list", c.friend_list); ! 842: print_ptr("pubdef", c.pubdef); ! 843: print_ptr("tn_list", c.tn_list); /* not brief */ ! 844: print_ptr("in_class", c.in_class); ! 845: print_ptr("in_fct", c.in_fct); ! 846: print_ptr("this_type", c.this_type); ! 847: print_ptr("virt_list", c.virt_list); ! 848: print_ptr("c_ctor", c.c_ctor); ! 849: print_ptr("c_dtor", c.c_dtor); ! 850: print_ptr("c_itor", c.c_itor); ! 851: print_ptr("conv", c.conv); ! 852: indent += Indent_Increment; ! 853: a_type(); /* do the supertype. */ ! 854: indent -= Indent_Increment; ! 855: } ! 856: ! 857: ! 858: void ! 859: displayer::a_virt() ! 860: { ! 861: virt& v = *Pvirt(node); ! 862: void * vna; ! 863: void * vna_e; ! 864: int vx; ! 865: ! 866: printf("$virt %s |0x%p ", ! 867: token_name(node->base), ! 868: node_address); ! 869: ! 870: print_ptr("next", v.next); ! 871: if(v.n_init) { ! 872: printf("n_init:\t%d", v.n_init); ! 873: printf("virt_init:"); ! 874: for (vna = v.virt_init, vx = 0; vx < (v.n_init - 1); ! 875: vna = (char *)vna + sizeof (velem), vx++) ! 876: { ! 877: fetch(vna, sizeof (velem), vna_e); ! 878: struct velem * ve = (struct velem *) vna_e; ! 879: ind(); ! 880: catprintf("%d offset %d\t", vx, ve->offset); ! 881: print_ptr(ve->n); ! 882: free_fetched(vna_e); ! 883: } ! 884: } ! 885: print_ptr("vclass", v.vclass); ! 886: nz_printf( "\nis_vbase:\t %d", v.is_vbase); ! 887: nz_printf( "\nprinted:\t %d", v.printed); ! 888: } ! 889: ! 890: void ! 891: displayer::a_table () ! 892: { ! 893: struct table& t = *Ptable(node); ! 894: int x; ! 895: int y; ! 896: void * nlist; ! 897: void * slist; ! 898: ! 899: printf("$table %s |0x%p", ! 900: token_name(node->base), ! 901: node_address); ! 902: ! 903: printf("init_stat:\t%d%s", t.init_stat, ! 904: t.init_stat == 0 ? " not simplified" : ! 905: t.init_stat == 1 ? " simplified, no inits" : ! 906: t.init_stat == 2 ? " simplified, inits" : ! 907: ""); ! 908: printf("size:\t%d", t.size); ! 909: printf("hashsize:\t%d", t.hashsize); ! 910: printf("free_slot:\t%d", t.free_slot); ! 911: ! 912: /* it looks like there is an array of Pnames here ... */ ! 913: *arg->output_stream << "\n"; ! 914: ind(); ! 915: *arg->output_stream << "entries:\n"; ! 916: fetch((void *)t.entries, t.size * sizeof(Pname), nlist); ! 917: Pname * tmp_nlist = (Pname *)nlist; ! 918: for(x = 0; x < t.size; x ++) { ! 919: if(tmp_nlist[x]) { ! 920: ind(); ! 921: *arg->output_stream << x; ! 922: *arg->output_stream << "\t"; ! 923: print_ptr(tmp_nlist[x]); ! 924: unsigned char tmp_name_s[sizeof(name)]; ! 925: void * tmp_name; ! 926: tmp_name = (void *)&tmp_name_s[0]; ! 927: fetch(tmp_nlist[x], sizeof(name), tmp_name); ! 928: catprintf(" key %d\n", Pname(tmp_name)->n_key); ! 929: } ! 930: } ! 931: free_fetched(nlist); ! 932: /* and then an array of shorts for the hash table. */ ! 933: /* we really need a tabular format here, alright. */ ! 934: ind(); ! 935: *arg->output_stream << "hashtbl:\n"; ! 936: fetch(t.hashtbl, t.hashsize * sizeof(short), slist); ! 937: short * tmp_slist = (short *)slist; ! 938: for(x = 0;; x++ ) { ! 939: for (y = 0; y < 11; y ++) { ! 940: if(((x * 12) + y) > t.hashsize) break; ! 941: catprintf("%6d ", tmp_slist[(x*12)+y]); ! 942: } ! 943: *arg->output_stream << "\n"; ! 944: if(((x * 12) + y) > t.hashsize) break; ! 945: } ! 946: ! 947: free_fetched (slist); ! 948: ! 949: print_ptr("t_name", t.t_name); ! 950: print_ptr("real_block", t.real_block); ! 951: print_ptr("name", t.t_name); ! 952: print_ptr("next", t.next); ! 953: } ! 954: ! 955: void ! 956: displayer::a_gen () ! 957: { ! 958: struct gen& g = *Pgen(node); ! 959: ! 960: printf("$gen %s |0x%p", ! 961: token_name(node->base), ! 962: node_address); ! 963: ! 964: print_ptr ("fct_list", g.fct_list); ! 965: indent += Indent_Increment; ! 966: a_type(); /* do the supertype. */ ! 967: indent -= Indent_Increment; ! 968: } ! 969: ! 970: void ! 971: displayer::a_vec () ! 972: { ! 973: struct vec& v = *Pvec(node); ! 974: ! 975: printf("$vec %s |0x%p", ! 976: token_name(node->base), ! 977: node_address); ! 978: printf("size:\t\t%d", v.size); ! 979: print_ptr ("typ", v.typ); ! 980: print_ptr ("dim", v.dim); ! 981: } ! 982: ! 983: void ! 984: displayer::a_ptr () ! 985: { ! 986: struct ptr& p = *Pptr(node); ! 987: ! 988: printf("$ptr %s |0x%p", ! 989: token_name(node->base), ! 990: node_address); ! 991: ind(); ! 992: printf("rdo:\t\t%d", p.rdo); ! 993: ind(); ! 994: ! 995: print_ptr ("typ", p.typ); ! 996: print_ptr ("memof", p.memof); ! 997: } ! 998: ! 999: ! 1000: void ! 1001: displayer::a_nlist() ! 1002: { ! 1003: name_list& n = *Plist(node); ! 1004: ! 1005: printf("$name_list %s |0x%p ", ! 1006: token_name(node->base), ! 1007: node_address); ! 1008: ! 1009: print_ptr("f", n.f); ! 1010: print_ptr("l", n.l); ! 1011: } ! 1012: ! 1013: void ! 1014: displayer::a_iline() ! 1015: { ! 1016: struct iline& i = *(struct iline *)node; ! 1017: ! 1018: printf("$iline %s |0x%p ", ! 1019: token_name(node->base), ! 1020: node_address); ! 1021: ! 1022: print_ptr("fct_name", i.fct_name); ! 1023: print_ptr("i_next", i.i_next); ! 1024: print_ptr("i_table", i.i_table); ! 1025: nz_printf("i_slots:\t%d", i.i_slots); ! 1026: print_ptr("i_args", i.i_args); ! 1027: } ! 1028: ! 1029: void ! 1030: displayer::a_ia() ! 1031: { ! 1032: struct ia& i = *(struct ia *)node; ! 1033: ! 1034: printf("$ia %s |0x%p ", ! 1035: token_name(node->base), ! 1036: node_address); ! 1037: ! 1038: print_ptr("local", i.local); ! 1039: print_ptr("arg", i.arg); ! 1040: print_ptr("tp", i.tp); ! 1041: } ! 1042: ! 1043: static int fetcher (void * info, ! 1044: void * pointer, ! 1045: unsigned long length, ! 1046: int zero_stop, /* for character strings.*/ ! 1047: void * target) ! 1048: { ! 1049: displayer * d = (displayer *)info; ! 1050: if(d->arg->fetcher) ! 1051: return d->arg->fetcher(d->arg->fetcher_info, pointer, length, ! 1052: zero_stop, target); ! 1053: } ! 1054: ! 1055: static void ! 1056: do_node (Pnode& node, node_class cl, void * info, tree_node_action& action, ! 1057: int depth, Pnode na, tree_walk_tree&, int&) ! 1058: { ! 1059: displayer * d = (displayer *)info; ! 1060: d->do_node(node, cl, action, depth, na); ! 1061: d->arg->output_stream->write("\n", 1); ! 1062: } ! 1063: ! 1064: ! 1065: /* Note -- declared extern "C" in tree_dump.h. */ ! 1066: ! 1067: void ! 1068: display_cfront_node (dcn_arg& arg, Pnode n) ! 1069: { ! 1070: tree_walk_control twc; ! 1071: displayer d (arg); ! 1072: ! 1073: if(arg.verbose == dt_normal)arg.max_depth = 0; ! 1074: twc.callback_info = (void *)&d; ! 1075: if(arg.fetcher) twc.fetcher = fetcher; ! 1076: twc.action_proc = do_node; ! 1077: twc.error_stream = arg.error_stream; ! 1078: twc.nodes_seen_hash = arg.nodes_seen_hash; ! 1079: twc.resolve_by_name = 0; /* we want to display the by_name nodes */ ! 1080: twc.dont_chase_lists_top = 1; /* don't display n_list or s_list peers ! 1081: at the top level. */ ! 1082: ! 1083: walk_tree(twc, n); ! 1084: ! 1085: arg.error_stream->flush(); ! 1086: arg.output_stream->flush(); ! 1087: } ! 1088: ! 1089: ! 1090: extern "C" void _fcout(); ! 1091: void _fcout () { cout.flush(); }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.