|
|
1.1 root 1: /* -*- Mode:C++ -*- */
2: /* dump_tree.C -- utilities for displaying the cfront tree. */
3: /* BIM 890530 */
4: /* rewritten 890712 to use the tree-walking facilities */
5:
6: /*
7: $Source: /usr3/lang/benson/work/stripped_cfront/RCS/dump_tree.c,v $ $RCSfile: dump_tree.c,v $
8: $Revision: 1.1 $ $Date: 89/11/20 08:50:22 $
9: $Author: benson $ $Locker: $
10: $State: Exp $
11:
12:
13: */
14:
15:
16: #include "dump_tree.H"
17: #include <stdio.h> /* turds and whey */
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.n_key || 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_oper:\t\t%s", n.n_oper ?
587: token_name(n.n_oper) : 0);
588: nz_printf( "n_sto:\t\t%s", n.n_sto ?
589: token_name(n.n_sto) : 0);
590: nz_printf( "n_stclass:\t%s", n.n_stclass ?
591: token_name(n.n_stclass) : 0);
592: nz_printf( "n_scope:\t%s", n.n_scope ?
593: token_name(n.n_scope) : 0);
594: nz_printf( "n_union:\t%d", n.n_union);
595: nz_printf( "n_evaluated:\t%d", n.n_evaluated);
596: nz_printf( "n_xref:\t\t%d", n.n_xref);
597: nz_printf( "lex_level:\t%d", n.lex_level);
598: nz_printf( "n_protect:\t%s", n.n_protect ?
599: token_name(n.n_protect) : 0);
600: if (n.n_dcl_printed || print_null_values) {
601: ind();
602: catprintf("n_dcl_printed:\t%d", n.n_dcl_printed);
603:
604: switch(n.n_dcl_printed)
605: {
606: case 0:
607: catprintf("(not)\n");
608: break;
609: case 1:
610: printf("(declaration)\n");
611: break;
612: case 2:
613: printf("(definition)\n");
614: break;
615: }
616:
617: }
618: if(n.n_template_arg) {
619: ind();
620: catprintf( "n_template_arg:\t");
621: switch(n.n_template_arg)
622: {
623: case name::template_type_formal:
624: catprintf("template_type_formal\n");
625: break;
626: case name::template_expr_formal:
627: catprintf("template_expr_formal\n");
628: break;
629: case name::template_stmt_tree_formal:
630: catprintf("template_stmt_formal\n");
631: break;
632: case name::template_expr_tree_formal:
633: catprintf("template_expr_tree_formal\n");
634: break;
635: case name::template_actual_arg_dummy:
636: catprintf("template_actual_arg_dummy\n");
637: break;
638: } ;
639: }
640: nz_printf( "n_addr_taken:\t%d", n.n_addr_taken);
641: nz_printf( "n_used:\t\t%d", n.n_used);
642: nz_printf( "n_assigned_to:\t%d", n.n_assigned_to);
643: ind();
644: catprintf("loc:\t\t");
645: print_loc(n.where);
646: catprintf("\n");
647: nz_printf( "n_offset:\t%d", n.n_offset);
648: if(n.output_string) {
649: print_string("output_string", (void *)n.output_string);
650: }
651: nz_printf( "n_val:\t\t%ld", n.n_val);
652:
653: print_ptr("n_list", n.n_list);
654: print_ptr("n_tbl_list", n.n_tbl_list);
655: if(n.n_gen_fct_name)
656: print_string("n_gen_fct_name", n.n_gen_fct_name);
657: if(n.n_template_arg_string) {
658: print_string("n_template_arg_string",
659: n.n_template_arg_string);
660: }
661: switch(n.discriminator(0)) {
662: case 2: print_ptr("n_realscope", n.n_realscope); break;
663: case 1: print_ptr("n_qualifier", n.n_qualifier); break;
664: }
665: nz_printf("n_val:\t%ld", n.n_val);
666:
667: indent += Indent_Increment;
668: a_expr(1); /* do the supertype. */
669: indent -= Indent_Increment;
670: }
671:
672: void
673: displayer::a_fct()
674: {
675: struct fct& f = *Pfct(node);
676:
677: printf("$fct %s |0x%p",
678: token_name(node->base),
679: node_address);
680:
681:
682: printf("nargs:\t\t%d", f.nargs);
683: printf("nargs_known:\t%d%s", f.nargs_known,
684: f.nargs_known == 0 ? " UNKNOWN" :
685: (f.nargs_known == 1 ? " KNOWN" :
686: (f.nargs_known == ELLIPSIS ? "ELLIPSIS" : "" )));
687: nz_printf( "f_vdef:\t\t%d", f.f_vdef);
688: printf("f_inline:\t%d%s", f.f_inline,
689: f.f_inline == 0 ? "" :
690: f.f_inline == 1 ? " inline" :
691: f.f_inline == 2 ? " inline in expansion" : "");
692: nz_printf( "f_const:\t\t%d", f.f_const);
693: nz_printf( "f_static:\t\t%d", f.f_static);
694: nz_printf( "f_virtual:\t%d", f.f_virtual);
695: nz_printf( "f_imeasure:\t%d", f.f_imeasure);
696: print_string("f_signature", (void *)f.f_signature);
697:
698: print_ptr("returns", f.returns);
699: print_ptr("argtype", f.argtype);
700: print_ptr("s_returns", f.s_returns);
701: print_ptr("f_this", f.f_this);
702: print_ptr("memof", f.memof);
703: print_ptr("body", f.body);
704: print_ptr("f_init", f.f_init);
705: print_ptr("f_expr", f.f_expr);
706: print_ptr("last_expanded", f.last_expanded);
707: print_ptr("f_result", f.f_result);
708: print_ptr("f_args", f.f_args);
709: print_ptr("local_classes", f.local_class);
710:
711: indent += Indent_Increment;
712: a_type(); /* do the supertype. */
713: indent -= Indent_Increment;
714: }
715:
716: void
717: displayer::a_stmt ()
718: {
719: struct stmt& s = *Pstmt(node);
720:
721: ind();
722: catprintf("$stmt %s |0x%p ",
723: token_name(node->base),
724: node_address);
725: print_loc(s.where);
726: *arg->output_stream << "\n";
727:
728: ind();
729: *arg->output_stream << "where:\t";
730: print_loc(s.where);
731: *arg->output_stream << "\n";
732:
733: print_ptr("s", s.s);
734: print_ptr("s_list", s.s_list);
735: print_ptr("memtbl", s.memtbl);
736: switch(s.discriminator(0)) {
737: case 1: print_ptr("d", s.d); break;
738: case 2: print_ptr("e2", s.e2); break;
739: case 3: print_ptr("has_default", s.has_default); break;
740: case 4: nz_printf("case_value:\t0x%x", s.case_value);
741: case 5: print_ptr("ret_tp", s.ret_tp); break;
742: }
743: switch(s.discriminator(1)) {
744: case 1: print_ptr("e", s.e); break;
745: case 2: nz_printf("own_tbl:\t%d", s.own_tbl); break;
746: case 3: print_ptr("s2", s.s2); break;
747: }
748:
749: switch(s.discriminator(2)) {
750: case 1: print_ptr("for_init", s.for_init); break;
751: case 2: print_ptr("else_stmt",s.for_init); break;
752: case 3: print_ptr("case_list", s.case_list); break;
753: }
754: }
755:
756: void
757: displayer::a_enumdef ()
758: {
759: struct enumdef& e = *Penum(node);
760:
761: printf("$enumdef %s |0x%p",
762: token_name(node->base),
763: node_address);
764:
765: nz_printf( "e_body:\t\t%d", e.e_body);
766: nz_printf( "no_of_enumerators: %d",
767: e.no_of_enumerators);
768: nz_printf( "strlen:\t%d", e.strlen);
769: print_string ("string", (void *)e.string);
770:
771: print_ptr("mem", e.mem);
772: print_ptr("e_type", e.e_type);
773: indent += Indent_Increment;
774: a_type(); /* do the supertype. */
775: indent -= Indent_Increment;
776: }
777:
778: void
779: displayer::a_classdef ()
780: {
781: struct classdef& c = *Pclass(node);
782:
783: ind();
784: catprintf("$classdef %s |0x%p ",
785: token_name(node->base),
786: node_address);
787: print_string_brief(c.string);
788: *arg->output_stream << "\n";
789: ind();
790: catprintf("class_base:\t");
791: switch(c.class_base)
792: {
793: case vanilla_class:
794: *arg->output_stream << "vanilla_class\n";
795: break;
796: case template_class:
797: *arg->output_stream << "template_class\n";
798: Template_Class:
799: nz_printf("inst:\t\t%p", (int)Ptclass(&c)->inst);
800: break;
801: case instantiated_template_class:
802: *arg->output_stream << "instantiated_template_class\n";
803: goto Template_Class;
804: case uninstantiated_template_class:
805: *arg->output_stream << "uninstantiated_template_class\n";
806: goto Template_Class;
807: case relationship_class:
808: *arg->output_stream << "relationship_class\n";
809: break;
810: case defining_class:
811: *arg->output_stream << "defining_class\n";
812: break;
813: }
814:
815: nz_printf( "c_body:\t\t%d", c.c_body);
816: printf("csu:\t\t%s",
817: token_name(c.csu));
818: nz_printf( "obj_align:\t%d", c.obj_align);
819: if(c.c_xref) {
820: ind();
821: catprintf( "c_xref:\t%x", c.c_xref);
822: flag(c.c_xref & 1, "has-vptr ");
823: flag(c.c_xref & 2, "X(X&)-defined ");
824: flag(c.c_xref & 4, "operator=(X&)-defined ");
825: flag(c.c_xref & 8, "has-vbaseptr(s) ");
826: *arg->output_stream << "\n";
827: }
828: nz_printf( "virt_count:\t%d", c.virt_count);
829: nz_printf( "virt_merge:\t%d", c.virt_merge);
830: nz_printf( "c_abstract:\t%d", c.c_abstract);
831: nz_printf( "has_vvtab:\t%d", c.has_vvtab);
832: nz_printf( "strlen:\t%d", c.strlen);
833: print_string ("string", (void *)c.string);
834: nz_printf( "obj_size:\t%d", c.obj_size);
835: nz_printf( "real_size:\t%d", c.real_size);
836: nz_printf("lex_level:\t%d", c.lex_level);
837: if(c.lcl)print_string("lcl", c.lcl);
838:
839: print_ptr("baselist", c.baselist);
840: print_ptr("mem_list", c.mem_list);
841: print_ptr("memtbl", c.memtbl);
842: print_ptr("friend_list", c.friend_list);
843: print_ptr("pubdef", c.pubdef);
844: print_ptr("tn_list", c.tn_list); /* not brief */
845: print_ptr("in_class", c.in_class);
846: print_ptr("in_fct", c.in_fct);
847: print_ptr("this_type", c.this_type);
848: print_ptr("virt_list", c.virt_list);
849: print_ptr("c_ctor", c.c_ctor);
850: print_ptr("c_dtor", c.c_dtor);
851: print_ptr("c_itor", c.c_itor);
852: print_ptr("conv", c.conv);
853: indent += Indent_Increment;
854: a_type(); /* do the supertype. */
855: indent -= Indent_Increment;
856: }
857:
858:
859: void
860: displayer::a_virt()
861: {
862: virt& v = *Pvirt(node);
863: void * vna;
864: void * vna_e;
865: int vx;
866:
867: printf("$virt %s |0x%p ",
868: token_name(node->base),
869: node_address);
870:
871: print_ptr("next", v.next);
872: if(v.n_init) {
873: printf("n_init:\t%d", v.n_init);
874: printf("virt_init:");
875: for (vna = v.virt_init, vx = 0; vx < (v.n_init - 1);
876: vna = (char *)vna + sizeof (velem), vx++)
877: {
878: fetch(vna, sizeof (velem), vna_e);
879: struct velem * ve = (struct velem *) vna_e;
880: ind();
881: catprintf("%d offset %d\t", vx, ve->offset);
882: print_ptr(ve->n);
883: free_fetched(vna_e);
884: }
885: }
886: print_ptr("vclass", v.vclass);
887: nz_printf( "\nis_vbase:\t %d", v.is_vbase);
888: nz_printf( "\nprinted:\t %d", v.printed);
889: }
890:
891: void
892: displayer::a_table ()
893: {
894: struct table& t = *Ptable(node);
895: int x;
896: int y;
897: void * nlist;
898: void * slist;
899:
900: printf("$table %s |0x%p",
901: token_name(node->base),
902: node_address);
903:
904: printf("init_stat:\t%d%s", t.init_stat,
905: t.init_stat == 0 ? " not simplified" :
906: t.init_stat == 1 ? " simplified, no inits" :
907: t.init_stat == 2 ? " simplified, inits" :
908: "");
909: printf("size:\t%d", t.size);
910: printf("hashsize:\t%d", t.hashsize);
911: printf("free_slot:\t%d", t.free_slot);
912:
913: /* it looks like there is an array of Pnames here ... */
914: *arg->output_stream << "\n";
915: ind();
916: *arg->output_stream << "entries:\n";
917: fetch((void *)t.entries, t.size * sizeof(Pname), nlist);
918: Pname * tmp_nlist = (Pname *)nlist;
919: for(x = 0; x < t.size; x ++) {
920: if(tmp_nlist[x]) {
921: ind();
922: *arg->output_stream << x;
923: *arg->output_stream << "\t";
924: print_ptr(tmp_nlist[x]);
925: unsigned char tmp_name_s[sizeof(name)];
926: void * tmp_name;
927: tmp_name = (void *)&tmp_name_s[0];
928: fetch(tmp_nlist[x], sizeof(name), tmp_name);
929: catprintf(" key %d\n", Pname(tmp_name)->n_key);
930: }
931: }
932: free_fetched(nlist);
933: /* and then an array of shorts for the hash table. */
934: /* we really need a tabular format here, alright. */
935: ind();
936: *arg->output_stream << "hashtbl:\n";
937: fetch(t.hashtbl, t.hashsize * sizeof(short), slist);
938: short * tmp_slist = (short *)slist;
939: for(x = 0;; x++ ) {
940: for (y = 0; y < 11; y ++) {
941: if(((x * 12) + y) > t.hashsize) break;
942: catprintf("%6d ", tmp_slist[(x*12)+y]);
943: }
944: *arg->output_stream << "\n";
945: if(((x * 12) + y) > t.hashsize) break;
946: }
947:
948: free_fetched (slist);
949:
950: print_ptr("t_name", t.t_name);
951: print_ptr("real_block", t.real_block);
952: print_ptr("name", t.t_name);
953: print_ptr("next", t.next);
954: }
955:
956: void
957: displayer::a_gen ()
958: {
959: struct gen& g = *Pgen(node);
960:
961: printf("$gen %s |0x%p",
962: token_name(node->base),
963: node_address);
964:
965: print_ptr ("fct_list", g.fct_list);
966: indent += Indent_Increment;
967: a_type(); /* do the supertype. */
968: indent -= Indent_Increment;
969: }
970:
971: void
972: displayer::a_vec ()
973: {
974: struct vec& v = *Pvec(node);
975:
976: printf("$vec %s |0x%p",
977: token_name(node->base),
978: node_address);
979: printf("size:\t\t%d", v.size);
980: print_ptr ("typ", v.typ);
981: print_ptr ("dim", v.dim);
982: }
983:
984: void
985: displayer::a_ptr ()
986: {
987: struct ptr& p = *Pptr(node);
988:
989: printf("$ptr %s |0x%p",
990: token_name(node->base),
991: node_address);
992: ind();
993: printf("rdo:\t\t%d", p.rdo);
994: ind();
995:
996: print_ptr ("typ", p.typ);
997: print_ptr ("memof", p.memof);
998: }
999:
1000:
1001: void
1002: displayer::a_nlist()
1003: {
1004: name_list& n = *Plist(node);
1005:
1006: printf("$name_list %s |0x%p ",
1007: token_name(node->base),
1008: node_address);
1009:
1010: print_ptr("f", n.f);
1011: print_ptr("l", n.l);
1012: }
1013:
1014: void
1015: displayer::a_iline()
1016: {
1017: struct iline& i = *(struct iline *)node;
1018:
1019: printf("$iline %s |0x%p ",
1020: token_name(node->base),
1021: node_address);
1022:
1023: print_ptr("fct_name", i.fct_name);
1024: print_ptr("i_next", i.i_next);
1025: print_ptr("i_table", i.i_table);
1026: nz_printf("i_slots:\t%d", i.i_slots);
1027: print_ptr("i_args", i.i_args);
1028: }
1029:
1030: void
1031: displayer::a_ia()
1032: {
1033: struct ia& i = *(struct ia *)node;
1034:
1035: printf("$ia %s |0x%p ",
1036: token_name(node->base),
1037: node_address);
1038:
1039: print_ptr("local", i.local);
1040: print_ptr("arg", i.arg);
1041: print_ptr("tp", i.tp);
1042: }
1043:
1044: static int fetcher (void * info,
1045: void * pointer,
1046: unsigned long length,
1047: int zero_stop, /* for character strings.*/
1048: void * target)
1049: {
1050: displayer * d = (displayer *)info;
1051: if(d->arg->fetcher)
1052: return d->arg->fetcher(d->arg->fetcher_info, pointer, length,
1053: zero_stop, target);
1054: }
1055:
1056: static void
1057: do_node (Pnode& node, node_class cl, void * info, tree_node_action& action,
1058: int depth, Pnode na, tree_walk_tree&, int&)
1059: {
1060: displayer * d = (displayer *)info;
1061: d->do_node(node, cl, action, depth, na);
1062: d->arg->output_stream->write("\n", 1);
1063: }
1064:
1065:
1066: /* Note -- declared extern "C" in dump_tree.H. */
1067:
1068: void
1069: display_cfront_node (dcn_arg& arg, Pnode n)
1070: {
1071: tree_walk_control twc;
1072: displayer d (arg);
1073:
1074: if(arg.verbose == dt_normal)arg.max_depth = 0;
1075: twc.callback_info = (void *)&d;
1076: if(arg.fetcher) twc.fetcher = fetcher;
1077: twc.action_proc = do_node;
1078: twc.error_stream = arg.error_stream;
1079: twc.nodes_seen_hash = arg.nodes_seen_hash;
1080: twc.resolve_by_name = 0; /* we want to display the by_name nodes */
1081: twc.dont_chase_lists_top = 1; /* don't display n_list or s_list peers
1082: at the top level. */
1083:
1084: walk_tree(twc, n);
1085:
1086: arg.error_stream->flush();
1087: arg.output_stream->flush();
1088: }
1089:
1090:
1091: extern "C" void _fcout();
1092:
1093: void _fcout () { cout.flush(); }
1094:
1095: static char rcsinfo[] = "$Header: /usr3/lang/benson/work/stripped_cfront/RCS/dump_tree.c,v 1.1 89/11/20 08:50:22 benson Exp $";
1096:
1097:
1098: /* $Log: dump_tree.c,v $
1099: * Revision 1.1 89/11/20 08:50:22 benson
1100: * Initial revision
1101: *
1102: Revision 1.32 89/11/03 16:18:32 benson
1103: mind rot.
1104:
1105: Revision 1.31 89/11/03 16:10:04 benson
1106: Oh, don't try to use the name constructor inside dgb.
1107:
1108: Revision 1.30 89/11/03 15:28:39 benson
1109: fix cn for tables.
1110:
1111: Revision 1.29 89/10/31 14:47:24 benson
1112: new function flags. Bug in vector printing.
1113:
1114: Revision 1.28 89/10/20 14:33:06 benson
1115: print abnormal function flag, don't print n_list and s_list peers
1116: of top item dumped.
1117:
1118: Revision 1.27 89/10/06 14:44:28 benson
1119: use new token name array courtesy of byacc.
1120:
1121: Revision 1.26 89/10/04 18:54:21 dysak
1122: Add code to dump the let_address_of_deref_be_address_of and
1123: nonempty_converted_collection flags in an expression node.
1124: Add code to dump the n_persistent_db field of a name node.
1125: Fix failure to discriminate properly between the n_realscope
1126: and n_qualifier nodes properly when dumping.
1127:
1128: Revision 1.25 89/09/22 14:03:32 benson
1129: fixes for locs.
1130:
1131: Revision 1.24 89/09/14 15:25:47 benson
1132: display a table as the top level item, but not deeper in.
1133:
1134: Revision 1.23 89/09/13 09:17:10 benson
1135: rename aggregate to collection.
1136:
1137: Revision 1.22 89/09/08 13:49:52 benson
1138: fix handling for dt_normal to print something,
1139: and also stop printing a spurious >.
1140:
1141: Revision 1.21 89/09/02 22:08:10 benson
1142: deal with changes to tree copies.
1143:
1144: Revision 1.20 89/08/29 13:39:57 benson
1145: disentangle the character string name of a generic function
1146: from n_table_list.
1147:
1148: Revision 1.19 89/08/24 08:45:11 benson
1149: some support for queries and templates.
1150:
1151: Revision 1.17 89/07/27 13:30:33 benson
1152: agg changes.
1153:
1154: Revision 1.16 89/07/21 16:49:44 benson
1155: checked in with -k by benson at 89.07.24.15.48.50.
1156:
1157: Revision 1.16 89/07/21 16:49:44 benson
1158: support for by_name nodes.
1159:
1160: Revision 1.15 89/07/18 15:17:39 benson
1161: print local classes, not args, under label local_classes.
1162: other bugfixes.
1163:
1164: Revision 1.14 89/07/14 10:58:30 benson
1165: rewrite as a user of the new tree_walk facilities. Brief mode
1166: is most likely busted.
1167:
1168: Revision 1.13 89/07/10 10:51:32 benson
1169: add fields added in 2.0 or just plain missed before.
1170:
1171: Revision 1.13 89/07/09 14:37:21 benson
1172: print aggregate facts. Treat QUERIES as exprs.
1173:
1174: Revision 1.12 89/06/30 15:28:26 benson
1175: checked in with -k by benson at 89.07.07.08.32.34.
1176:
1177: Revision 1.12 89/06/30 15:28:26 benson
1178: add ZTYPE to the list of type nodes, whatever it is.
1179:
1180: Revision 1.11 89/06/30 14:34:07 benson
1181: run script to make token name list automatically from tokens
1182: in gram.y
1183:
1184: Revision 1.9 89/06/29 08:44:47 benson
1185: checked in with -k by benson at 89.06.29.20.54.47.
1186:
1187: Revision 1.9 89/06/29 08:44:47 benson
1188: token_name function useful in parse tracing.
1189:
1190: Revision 1.8 89/06/28 12:57:53 benson
1191: Port of changes from 2.0beta6 odi bugfixes
1192:
1193: end_log
1194:
1195: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.