00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifdef USE_PCH
00053 #include "opt_pch.h"
00054 #endif // USE_PCH
00055 #pragma hdrstop
00056
00057
00058 #include <stdio.h>
00059 #include <string.h>
00060
00061 #include "defs.h"
00062 #include "errors.h"
00063 #include "srcpos.h"
00064 #include "opcode.h"
00065 #include "wn.h"
00066 #include "wn_simp.h"
00067
00068 #ifdef TODO_IGNORE_SOURCE
00069 #include "dwarf_DST.h"
00070 #include "dwarf_DST_mem.h"
00071 #endif
00072
00073 #include "stab.h"
00074 #include "const.h"
00075 #include "targ_const.h"
00076 #include "strtab.h"
00077 #include "wio.h"
00078 #include "wintrinsic.h"
00079 #include "wutil.h"
00080 #include "intrn_info.h"
00081 #include "wn_pragmas.h"
00082
00083 #include "opt_base.h"
00084 #include "opt_du.h"
00085 #include "targ_sim.h"
00086
00087 extern FILE *Init_daVinci(void);
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 static char ir_obuf[2048];
00107 static char *ir_oidx = ir_obuf;
00108
00109
00110
00111
00112
00113 #define SPRINTF_ADV(buf, args) { \
00114 (void) sprintf args; \
00115 buf += strlen(buf); \
00116 }
00117
00118
00119 static void
00120 sir_put_st (ST *st)
00121 {
00122 char *name;
00123 char *p;
00124
00125 if (st == NULL) {
00126
00127 SPRINTF_ADV(ir_oidx, (ir_oidx, " <null-st>"));
00128 }
00129 else {
00130 name = ST_name(st);
00131 if (ST_class(st) == CLASS_CONST) {
00132 name = Targ_Print(NULL, STC_val(st));
00133
00134
00135
00136 for (p = name; *p != '\0'; p++)
00137 switch (*p) {
00138 case ' ':
00139 case '\t':
00140 case '\n':
00141 *p = '_';
00142 break;
00143 case '"':
00144 *p = '\'';
00145 break;
00146 }
00147 }
00148 SPRINTF_ADV(ir_oidx, (ir_oidx, " <%d,%d,%s>", ST_level(st),
00149 ST_index(st), ST_name(st)));
00150 }
00151 }
00152
00153
00154
00155 static void sir_put_wn(WN *wn)
00156 {
00157 OPCODE opcode = WN_opcode(wn);
00158
00159 if (wn == NULL) {
00160
00161 SPRINTF_ADV(ir_oidx, (ir_oidx, "### error: null WN pointer"));
00162 return;
00163 }
00164
00165 SPRINTF_ADV(ir_oidx,
00166 (ir_oidx, "%s", OPCODE_name(WN_opcode(wn)) + strlen("OPC_")));
00167 if (OPCODE_has_offset(opcode)) {
00168 SPRINTF_ADV(ir_oidx, (ir_oidx, " %d", WN_offset(wn)));
00169 }
00170
00171 if (OPCODE_operator(opcode) == OPR_INTRINSIC_OP
00172 #ifdef KEY
00173 || OPCODE_operator(opcode) == OPR_PURE_CALL_OP
00174 #endif
00175 ) {
00176 SPRINTF_ADV(ir_oidx, (ir_oidx, " %d", WN_kid_count(wn)));
00177 }
00178
00179 if (OPCODE_has_inumber(opcode)) {
00180 switch (opcode) {
00181 case OPC_IO:
00182 SPRINTF_ADV(ir_oidx,
00183 (ir_oidx, " <%d,%s>",
00184 WN_intrinsic(wn),
00185 IOSTATEMENT_name((IOSTATEMENT) WN_intrinsic(wn))));
00186 break;
00187 case OPC_IO_ITEM:
00188 SPRINTF_ADV(ir_oidx,
00189 (ir_oidx, " <%d,%s>",
00190 WN_intrinsic(wn),
00191 IOITEM_name((IOITEM) WN_intrinsic(wn))));
00192 break;
00193 default:
00194
00195 SPRINTF_ADV(ir_oidx,
00196 (ir_oidx, " <%d,%s>",
00197 WN_intrinsic(wn),
00198 INTRINSIC_name((INTRINSIC) WN_intrinsic(wn))));
00199 break;
00200 }
00201 }
00202
00203 if (OPCODE_has_bits(opcode))
00204 SPRINTF_ADV(ir_oidx,
00205 (ir_oidx, " %d", WN_cvtl_bits(wn)));
00206 if (OPCODE_has_label(opcode))
00207 SPRINTF_ADV(ir_oidx,
00208 (ir_oidx, " L%d", WN_label_number(wn)));
00209 if (OPCODE_has_flags(opcode))
00210 SPRINTF_ADV(ir_oidx,
00211 (ir_oidx, " 0x%x", WN_flag(wn)));
00212 if (OPCODE_has_sym(opcode)) {
00213 sir_put_st (WN_st(wn));
00214 }
00215
00216 if (OPCODE_has_1ty(opcode)) {
00217 if (WN_ty(wn) != 0) {
00218 SPRINTF_ADV(ir_oidx,
00219 (ir_oidx, " T<%d,%s>",
00220 TY_id(WN_ty(wn)),
00221 TY_name(WN_ty(wn))));
00222 }
00223 else {
00224 SPRINTF_ADV(ir_oidx,
00225 (ir_oidx, " T<### ERROR: null ptr>"));
00226 }
00227 } else if (OPCODE_has_2ty(opcode)) {
00228 if (WN_ty(wn) != 0) {
00229 SPRINTF_ADV(ir_oidx,
00230 (ir_oidx, " T<%d,%s>",
00231 TY_id(WN_ty(wn)),
00232 TY_name(WN_ty(wn))));
00233 }
00234 else {
00235 SPRINTF_ADV(ir_oidx,
00236 (ir_oidx, " T<### ERROR: null ptr>"));
00237 }
00238 if (WN_load_addr_ty(wn) != 0) {
00239 SPRINTF_ADV(ir_oidx,
00240 (ir_oidx, " T<%d,%s>",
00241 TY_id(WN_load_addr_ty(wn)),
00242 TY_name(WN_load_addr_ty(wn))));
00243 }
00244 else {
00245 SPRINTF_ADV(ir_oidx,
00246 (ir_oidx, " T<### ERROR: null ptr>"));
00247 }
00248 }
00249
00250 if (OPCODE_has_ndim(opcode))
00251 SPRINTF_ADV(ir_oidx,
00252 (ir_oidx, " %d", WN_num_dim(wn)));
00253 if (OPCODE_has_esize(opcode))
00254 SPRINTF_ADV(ir_oidx,
00255 (ir_oidx, " %lld", WN_element_size(wn)));
00256
00257 if (OPCODE_has_num_entries(opcode))
00258 SPRINTF_ADV(ir_oidx,
00259 (ir_oidx, " %d", WN_num_entries(wn)));
00260
00261 if (OPCODE_has_value(opcode))
00262 SPRINTF_ADV(ir_oidx,
00263 (ir_oidx, " %lld", WN_const_val(wn)));
00264
00265 if (opcode == OPC_COMMENT) {
00266 SPRINTF_ADV(ir_oidx,
00267 (ir_oidx, " # %s",
00268 Index_To_Str(WN_offset(wn))));
00269 }
00270
00271 if (OPCODE_has_sym(opcode) && OPCODE_has_offset(opcode)
00272 && WN_st(wn) != NULL && (ST_class(WN_st(wn)) == CLASS_PREG)
00273 && !Preg_Is_Dedicated(WN_offset(wn)) ) {
00274
00275 SPRINTF_ADV(ir_oidx,
00276 (ir_oidx, " # %s", Preg_Name(WN_offset(wn))));
00277 }
00278
00279 if (opcode == OPC_PRAGMA) {
00280 SPRINTF_ADV(ir_oidx,
00281 (ir_oidx, " # %s", WN_pragmas[WN_offset(wn)].name));
00282 }
00283
00284 SPRINTF_ADV(ir_oidx,
00285 (ir_oidx, " # <id %d:%d>",
00286 OPCODE_mapcat(WN_opcode(wn)), WN_map_id(wn)));
00287 }
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322 static FILE *dV_fp;
00323
00324
00325
00326
00327
00328
00329
00330
00331 #define DV_INIT_STK_SZ 2048
00332
00333
00334
00335
00336
00337
00338
00339
00340 typedef enum {
00341 DV_NODE_EXPR,
00342 DV_NODE_STMT,
00343 DV_NODE_NONEXP,
00344 DV_NODE_NULEXP,
00345 DV_NODE_UNKNOWN
00346 } DV_NODE_TYPE;
00347
00348
00349
00350
00351
00352 typedef enum {
00353 DV_ARC_KID,
00354 DV_ARC_DU,
00355 DV_ARC_NEXTPREV,
00356 DV_ARC_UNKNOWN
00357 } DV_ARC_TYPE;
00358
00359 typedef struct wn_stk_ele {
00360 WN *wn;
00361 DV_NODE_TYPE node_type;
00362 } WN_STK_ELE;
00363
00364 static WN_STK_ELE *dV_WN_stack;
00365 static INT dV_WN_sp;
00366 static INT dV_WN_stk_sz;
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378 #define SUP_INIT_SZ 2048
00379
00380 static WN **id_supplement;
00381 static INT id_sup_sz;
00382 static INT next_sup_id;
00383
00384
00385
00386
00387 static void dV_tree_expr(WN *, DU_MANAGER *);
00388 static void dV_tree_stmt(WN *, DU_MANAGER *);
00389
00390
00391
00392
00393
00394
00395 static void
00396 dV_WN_init()
00397
00398 {
00399 dV_WN_stack = (WN_STK_ELE *) malloc(DV_INIT_STK_SZ *
00400 sizeof(WN_STK_ELE));
00401 dV_WN_stk_sz = DV_INIT_STK_SZ;
00402 dV_WN_sp = 0;
00403
00404 id_supplement = (WN **) malloc(SUP_INIT_SZ * sizeof(WN *));
00405 id_sup_sz = SUP_INIT_SZ;
00406 next_sup_id = 0;
00407
00408 FmtAssert((dV_WN_stack != NULL) && (id_supplement != NULL),
00409 ("Unable to allocate memory in dV_WN_init()"));
00410
00411 dV_fp = Init_daVinci();
00412
00413 (void) fprintf(dV_fp, "graph(new([");
00414 }
00415
00416
00417
00418
00419
00420 static void
00421 dV_WN_end()
00422
00423 {
00424 (void) fprintf(dV_fp, "]))\n");
00425 free((void *) id_supplement);
00426 free((void *) dV_WN_stack);
00427
00428 #ifdef TODO_DONT_CLOSE_PIPE
00429 fclose(dV_fp);
00430 #endif
00431 }
00432
00433
00434
00435
00436
00437
00438
00439 static char *
00440 dV_place_stub(char *label)
00441
00442 {
00443 static INT next_id = 1;
00444
00445
00446
00447
00448 ir_oidx = ir_obuf;
00449 (void) sprintf(ir_obuf, "Stub%d", next_id++);
00450
00451 #ifdef VERTICAL_LABELS
00452 char localbuf[4096], *p, *q;
00453
00454 for (p = label, q = localbuf; *p; p++, q++) {
00455 *q++ = *p;
00456 *q++ = '\\';
00457 *q = 'n';
00458 }
00459 if (p != label) {
00460 *(q-2) = '\0';
00461 }
00462 #else
00463 char *localbuf = label;
00464 #endif
00465
00466
00467 (void) fprintf(dV_fp, "l(\"%s\", n(\"\", [a(\"%s\",\"%s\")], [] ) ),",
00468 ir_obuf, "OBJECT", localbuf);
00469 return ir_obuf;
00470 }
00471
00472
00473
00474
00475
00476 INT
00477 id_sup_search(WN *wn)
00478 {
00479 INT i = 0;
00480
00481 while (i < next_sup_id) {
00482 if (wn == id_supplement[i]) {
00483 return i;
00484 }
00485 i++;
00486 }
00487
00488 if (next_sup_id >= id_sup_sz) {
00489 id_sup_sz *= 2;
00490 id_supplement = (WN **) realloc((void *) id_supplement,
00491 id_sup_sz * sizeof(WN *));
00492 }
00493 id_supplement[next_sup_id] = wn;
00494 return next_sup_id++;
00495 }
00496
00497
00498
00499
00500 static const char *
00501 id_str(WN *wn)
00502
00503 {
00504 static char dv_id[64];
00505
00506 if (wn) {
00507 if (WN_map_id(wn) == -1) {
00508
00509
00510
00511 INT sup = id_sup_search(wn);
00512 (void) sprintf(dv_id, "<id %d:%d>-%d",
00513 OPCODE_mapcat(WN_opcode(wn)), WN_map_id(wn),
00514 sup);
00515 }
00516 else {
00517 (void) sprintf(dv_id, "<id %d:%d>",
00518 OPCODE_mapcat(WN_opcode(wn)), WN_map_id(wn));
00519 }
00520 return dv_id;
00521 }
00522 else {
00523 return "!!! NULL WN";
00524 }
00525 }
00526
00527
00528
00529
00530
00531
00532 static void
00533 dV_save_nbor(WN *wn, DV_NODE_TYPE node_type)
00534
00535 {
00536
00537 if (dV_WN_sp == dV_WN_stk_sz) {
00538 dV_WN_stk_sz *= 2;
00539 dV_WN_stack = (WN_STK_ELE *) realloc((void *) dV_WN_stack,
00540 dV_WN_stk_sz *
00541 sizeof(WN_STK_ELE));
00542 }
00543 FmtAssert(dV_WN_sp < dV_WN_stk_sz, ("Stack pointer messed up"));
00544
00545 dV_WN_stack[dV_WN_sp].wn = wn;
00546 dV_WN_stack[dV_WN_sp].node_type = node_type;
00547 dV_WN_sp++;
00548 }
00549
00550
00551
00552
00553 static WN_STK_ELE *
00554 dV_get_nbor(void)
00555
00556 {
00557 FmtAssert(dV_WN_sp > 0, ("Pop when dV_WN_sp == 0"));
00558 dV_WN_sp--;
00559 return dV_WN_stack + dV_WN_sp;
00560 }
00561
00562
00563
00564
00565
00566 static void
00567 dV_open_WN(WN *wn)
00568
00569 {
00570 ir_oidx = ir_obuf;
00571 sir_put_wn(wn);
00572
00573 #ifdef VERTICAL_LABELS
00574 char localbuf[4096], *p, *q;
00575
00576 for (p = ir_obuf, q = localbuf; *p; p++, q++) {
00577 *q++ = *p;
00578 *q++ = '\\';
00579 *q = 'n';
00580 }
00581 if (p != ir_obuf) {
00582 *(q-2) = '\0';
00583 }
00584 #else
00585 char *localbuf = ir_obuf;
00586 #endif
00587
00588 (void) fprintf(dV_fp, "l(\"%s\", n(\"\", [a(\"%s\",\"%s\")], [",
00589 id_str(wn), "OBJECT", localbuf);
00590
00591
00592
00593
00594 dV_save_nbor(NULL, DV_NODE_UNKNOWN);
00595
00596
00597
00598 }
00599
00600
00601
00602
00603
00604
00605
00606
00607 static void
00608 dV_close_WN(WN *wn, DU_MANAGER *du_mgr)
00609
00610 {
00611 WN_STK_ELE *nbor;
00612 char buf[64];
00613
00614
00615
00616 (void) fprintf(dV_fp, "] ) ),");
00617
00618
00619
00620 while ((nbor = dV_get_nbor())->node_type != DV_NODE_UNKNOWN) {
00621 switch (nbor->node_type) {
00622 case DV_NODE_EXPR:
00623 dV_tree_expr(nbor->wn, du_mgr);
00624 break;
00625 case DV_NODE_STMT:
00626 dV_tree_stmt(nbor->wn, du_mgr);
00627 break;
00628 case DV_NODE_NONEXP:
00629 (void) sprintf(buf, "!!! NONEXP(%d)", WN_opcode(nbor->wn));
00630 dV_place_stub(buf);
00631 break;
00632 case DV_NODE_NULEXP:
00633 dV_open_WN(nbor->wn);
00634 dV_close_WN(nbor->wn, du_mgr);
00635 break;
00636 default:
00637 FmtAssert(FALSE, ("Incorrect node type in daVinci WN stack"));
00638 }
00639 }
00640 }
00641
00642
00643
00644
00645
00646 static void
00647 dV_place_arc(const char *node_id, DV_ARC_TYPE arc_type, const char *label)
00648 {
00649 const char *color;
00650
00651 switch (arc_type) {
00652 case DV_ARC_KID:
00653 color = "red";
00654 break;
00655 case DV_ARC_NEXTPREV:
00656 color = "green";
00657 break;
00658 case DV_ARC_DU:
00659 color = "blue";
00660 break;
00661 default:
00662 color = "black";
00663 }
00664
00665 (void) fprintf(dV_fp, "e(\"\", [a(\"%s\", \"%s\")], r(\"%s\")),",
00666 "EDGECOLOR", color, node_id);
00667 }
00668
00669
00670
00671 static void
00672 dV_tree_expr(WN *wn, DU_MANAGER *du_mgr)
00673
00674 {
00675 INT i;
00676 WN *wn2;
00677 char buf[64];
00678
00679 dV_open_WN(wn);
00680
00681 for (i = 0; i < WN_kid_count(wn); i++) {
00682 wn2 = WN_kid(wn,i);
00683 if (wn2) {
00684 OPCODE op = WN_opcode(wn2);
00685 if ((OPCODE_FIRST <= op && op <= OPCODE_LAST) &&
00686 (OPCODE_is_expression(op) || OPCODE_is_call(op))) {
00687 dV_save_nbor(WN_kid(wn,i), DV_NODE_EXPR);
00688 (void) sprintf(buf, "kid%d", i);
00689 dV_place_arc(id_str(WN_kid(wn,i)), DV_ARC_KID, buf);
00690 }
00691 else {
00692 dV_save_nbor(wn2, DV_NODE_NONEXP);
00693 dV_place_arc(id_str(wn2), DV_ARC_KID, "NONEXP");
00694 }
00695 }
00696 else {
00697 dV_save_nbor(wn2, DV_NODE_NULEXP);
00698 dV_place_arc(id_str(wn2), DV_ARC_KID, "NULEXP");
00699 }
00700 }
00701
00702
00703
00704
00705
00706 if (du_mgr) {
00707 USE_LIST *use_list = du_mgr->Du_Get_Use(wn);
00708 USE_LIST_CONST_ITER use_lst_iter;
00709 const DU_NODE *tmp;
00710
00711 FOR_ALL_NODE(tmp, use_lst_iter, Init(use_list))
00712 dV_place_arc(id_str(tmp->Wn()), DV_ARC_DU, "USES");
00713 }
00714
00715 dV_close_WN(wn, du_mgr);
00716 }
00717
00718
00719
00720 static void
00721 dV_tree_stmt(WN *wn, DU_MANAGER *du_mgr)
00722 {
00723 INT i;
00724 WN *wn2;
00725 char buf[64];
00726
00727 #ifdef TODO_IGNORE_SOURCE
00728 USRCPOS srcpos;
00729 OPCODE opc = WN_opcode(wn);
00730
00731 USRCPOS_srcpos(srcpos) = WN_Get_Linenum(wn);
00732 if (USRCPOS_srcpos(srcpos) != 0 &&
00733 USRCPOS_srcpos(srcpos) != USRCPOS_srcpos(last_srcpos)) {
00734 last_srcpos = srcpos;
00735 #ifdef FRONT_END
00736 fprintf(ir_ofile, "%*sLOC %d %d\n", indent, "",
00737 USRCPOS_filenum(srcpos), USRCPOS_linenum(srcpos));
00738 #else
00739 print_source(USRCPOS_srcpos(srcpos));
00740 #endif
00741 }
00742 #endif
00743
00744 dV_open_WN(wn);
00745
00746 switch (WN_opcode(wn)) {
00747 case OPC_BLOCK: {
00748 INT kid_num = 1;
00749
00750 wn2 = WN_first(wn);
00751 while (wn2) {
00752 dV_save_nbor(wn2, DV_NODE_STMT);
00753 (void) sprintf(buf, "blkkid%d", kid_num);
00754 kid_num++;
00755 dV_place_arc(id_str(wn2), DV_ARC_KID, buf);
00756
00757 #ifdef TODO_DV_SYNTAX_SNAG
00758 wn3 = WN_next(wn2);
00759 if (wn3) {
00760 **--> dV_place_arc(wn2, wn3, DV_ARC_NEXTPREV, "<-- PV/NX -->");
00761 }
00762 wn2 = wn3;
00763 #else
00764 wn2 = WN_next(wn2);
00765 #endif
00766 }
00767 break;
00768 }
00769 case OPC_IF:
00770 dV_save_nbor(WN_if_test(wn), DV_NODE_EXPR);
00771 dV_place_arc(id_str(WN_if_test(wn)), DV_ARC_KID, "COND");
00772 if (WN_then(wn)) {
00773 dV_save_nbor(WN_then(wn), DV_NODE_STMT);
00774 dV_place_arc(id_str(WN_then(wn)), DV_ARC_KID, "THEN");
00775 }
00776 if (WN_else(wn)) {
00777 dV_save_nbor(WN_else(wn), DV_NODE_STMT);
00778 dV_place_arc(id_str(WN_else(wn)), DV_ARC_KID, "ELSE");
00779 }
00780 break;
00781
00782 case OPC_DO_LOOP:
00783 dV_save_nbor(WN_index(wn), DV_NODE_EXPR);
00784 dV_place_arc(id_str(WN_index(wn)), DV_ARC_KID, "INDX");
00785 dV_save_nbor(WN_start(wn), DV_NODE_STMT);
00786 dV_place_arc(id_str(WN_start(wn)), DV_ARC_KID, "INIT");
00787 dV_save_nbor(WN_end(wn), DV_NODE_EXPR);
00788 dV_place_arc(id_str(WN_end(wn)), DV_ARC_KID, "COMP");
00789 dV_save_nbor(WN_step(wn), DV_NODE_STMT);
00790 dV_place_arc(id_str(WN_step(wn)), DV_ARC_KID, "INCR");
00791 dV_save_nbor(WN_do_body(wn), DV_NODE_STMT);
00792 dV_place_arc(id_str(WN_do_body(wn)), DV_ARC_KID, "BODY");
00793 break;
00794
00795 case OPC_COMPGOTO:
00796 dV_save_nbor(WN_kid(wn,0), DV_NODE_EXPR);
00797 dV_place_arc(id_str(WN_kid(wn,0)), DV_ARC_KID, "SWCH");
00798 dV_save_nbor(WN_kid(wn,1), DV_NODE_STMT);
00799 dV_place_arc(id_str(WN_kid(wn,1)), DV_ARC_KID, "JMPS");
00800 if (WN_kid_count(wn) > 2) {
00801 dV_save_nbor(WN_kid(wn,2), DV_NODE_STMT);
00802 dV_place_arc(id_str(WN_kid(wn,2)), DV_ARC_KID, "DFLT");
00803 }
00804 break;
00805
00806 case OPC_XGOTO:
00807 dV_save_nbor(WN_kid(wn,0), DV_NODE_EXPR);
00808 dV_place_arc(id_str(WN_kid(wn,0)), DV_ARC_KID, "SWCH");
00809 dV_save_nbor(WN_kid(wn,1), DV_NODE_STMT);
00810 dV_place_arc(id_str(WN_kid(wn,1)), DV_ARC_KID, "JMPS");
00811 break;
00812
00813 default:
00814 {
00815 OPCODE opc2;
00816 for (i = 0; i < WN_kid_count(wn); i++) {
00817 wn2 = WN_kid(wn,i);
00818 FmtAssert(wn2, ("Null kid in dV_tree_stmt"));
00819 opc2 = WN_opcode(wn2);
00820 if (OPCODE_is_expression(opc2)) {
00821 dV_save_nbor(wn2, DV_NODE_EXPR);
00822 (void) sprintf(buf, "kid%d", i);
00823 dV_place_arc(id_str(wn2), DV_ARC_KID, buf);
00824 }
00825 else if (OPCODE_is_stmt(opc2) || OPCODE_is_scf(opc2)) {
00826 dV_save_nbor(wn2, DV_NODE_STMT);
00827 (void) sprintf(buf, "kid%d", i);
00828 dV_place_arc(id_str(wn2), DV_ARC_KID, buf);
00829 }
00830 else {
00831 FmtAssert(FALSE, ("operator of unknown type"));
00832 }
00833 }
00834 }
00835 }
00836
00837
00838
00839
00840
00841 if (du_mgr) {
00842 USE_LIST *use_list = du_mgr->Du_Get_Use(wn);
00843 USE_LIST_CONST_ITER use_lst_iter;
00844 const DU_NODE *tmp;
00845
00846 FOR_ALL_NODE(tmp, use_lst_iter, Init(use_list))
00847 dV_place_arc(id_str(tmp->Wn()), DV_ARC_DU, "USES");
00848 }
00849
00850 dV_close_WN(wn, du_mgr);
00851 }
00852
00853
00854
00855
00856
00857 extern "C" void
00858 dV_show_whirl(WN *wn, DU_MANAGER *du_mgr)
00859
00860 {
00861 dV_WN_init();
00862
00863 if (OPCODE_is_expression(WN_opcode(wn))) {
00864 dV_tree_expr(wn, du_mgr);
00865 }
00866 else if (OPCODE_is_stmt(WN_opcode(wn)) ||
00867 OPCODE_is_scf(WN_opcode(wn))) {
00868 dV_tree_stmt(wn, du_mgr);
00869 }
00870 else {
00871 FmtAssert(FALSE, ("opcode of unknown type"));
00872 }
00873
00874 dV_WN_end();
00875 }