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 #define __STDC_LIMIT_MACROS
00046 #include <stdint.h>
00047 #ifdef USE_PCH
00048 #include "be_com_pch.h"
00049 #endif
00050 #pragma hdrstop
00051 #include <sys/types.h>
00052 #if defined(BUILD_OS_DARWIN)
00053 #include "darwin_elf.h"
00054 #else
00055 #include <elf.h>
00056 #endif
00057 #include <ctype.h>
00058 #include "wn.h"
00059 #include "wn_map.h"
00060 #include "wn_util.h"
00061 #include <stdio.h>
00062 #include "opt_du.h"
00063 #include "opt_alias_mgr.h"
00064 #include "dep_graph.h"
00065 #include "prompf.h"
00066 #include "ir_reader.h"
00067 #include "access_vector.h"
00068 #include "if_info.h"
00069 #include "loop_info.h"
00070 #include "wb_util.h"
00071 #include "wb_buffer.h"
00072 #include "wb_carray.h"
00073 #include "wb_browser.h"
00074 #include "whirl2src.h"
00075
00076 #if defined(__linux__) || !defined(SHARED_BUILD)
00077 extern void (*Print_ACCESS_ARRAY_p)(FILE *fp, ACCESS_ARRAY *a);
00078 #define Print_ACCESS_ARRAY (*Print_ACCESS_ARRAY_p)
00079 extern void (*Print_IF_INFO_p)(FILE *fp, IF_INFO *i);
00080 #define Print_IF_INFO (*Print_IF_INFO_p)
00081 extern void (*WB_BROWSER_Summary_p)(FILE *fp, WB_BROWSER *wb);
00082 #define WB_BROWSER_Summary (*WB_BROWSER_Summary_p)
00083 extern void (*Print_DO_LOOP_INFO_BASE_p)(FILE *fp, DO_LOOP_INFO_BASE *b);
00084 #define Print_DO_LOOP_INFO_BASE (*Print_DO_LOOP_INFO_BASE_p)
00085 #else
00086 #pragma weak Print_ACCESS_ARRAY
00087 #pragma weak Print_IF_INFO
00088 #pragma weak Print_DO_LOOP_INFO_BASE
00089 #pragma weak WB_BROWSER_Summary
00090 #pragma weak WB_BROWSER_Summary_p
00091 #endif
00092
00093
00094 static const char *operator_table[OPERATOR_LAST + 1] =
00095 {
00096 "UNKNOWN",
00097 "ABS",
00098 "ADD",
00099 "AGOTO",
00100 "ALTENTRY",
00101 "ARRAY",
00102 "ARRAYEXP",
00103 "ARRSECTION",
00104 "ASHR",
00105 "ASSERT",
00106 "BACKWARD_BARRIER",
00107 "BAND",
00108 "BIOR",
00109 "BLOCK",
00110 "BNOR",
00111 "BNOT",
00112 "BXOR",
00113 "CALL",
00114 "CAND",
00115 "CASEGOTO",
00116 "CEIL",
00117 "CIOR",
00118 "COMMA",
00119 "COMMENT",
00120 "COMPGOTO",
00121 "COMPLEX",
00122 "CONST",
00123 "CSELECT",
00124 "CVT",
00125 "CVTL",
00126 "DIV",
00127 "DIVREM",
00128 "DO_LOOP",
00129 "DO_WHILE",
00130 "EQ",
00131 "EVAL",
00132 "EXC_SCOPE_BEGIN",
00133 "EXC_SCOPE_END",
00134 "FALSEBR",
00135 "FLOOR",
00136 "FORWARD_BARRIER",
00137 "FUNC_ENTRY",
00138 "GE",
00139 "GOTO",
00140 "GT",
00141 "HIGHMPY",
00142 "HIGHPART",
00143 "ICALL",
00144 "IDNAME",
00145 "IF",
00146 "ILDA",
00147 "ILDBITS",
00148 "ILOAD",
00149 "ILOADX",
00150 "IMAGPART",
00151 "INTCONST",
00152 "INTRINSIC_CALL",
00153 "INTRINSIC_OP",
00154 "IO",
00155 "IO_ITEM",
00156 "ISTBITS",
00157 "ISTORE",
00158 "ISTOREX",
00159 "LABEL",
00160 "LAND",
00161 "LDA",
00162 "LDBITS",
00163 "LDID",
00164 "LE",
00165 "LIOR",
00166 "LNOT",
00167 "LOOP_INFO",
00168 "LOWPART",
00169 "LSHR",
00170 "LT",
00171 "MADD",
00172 "MAX",
00173 "MAXPART",
00174 "MIN",
00175 "MINMAX",
00176 "MINPART",
00177 "MLOAD",
00178 "MOD",
00179 "MPY",
00180 "MSTORE",
00181 "MSUB",
00182 "NE",
00183 "NEG",
00184 "NMADD",
00185 "NMSUB",
00186 "OPTPARM",
00187 "OPT_CHI",
00188 "OPT_RESERVE2",
00189 "PAREN",
00190 "PARM",
00191 "PICCALL",
00192 "PRAGMA",
00193 "PREFETCH",
00194 "PREFETCHX",
00195 "RCOMMA",
00196 "REALPART",
00197 "RECIP",
00198 "REGION",
00199 "REGION_EXIT",
00200 "REM",
00201 "RETURN",
00202 "RETURN_VAL",
00203 "RND",
00204 "RSQRT",
00205 "SELECT",
00206 "SHL",
00207 "SQRT",
00208 "STBITS",
00209 "STID",
00210 "SUB",
00211 "SWITCH",
00212 "TAS",
00213 "TRAP",
00214 "TRIPLET",
00215 "TRUEBR",
00216 "TRUNC",
00217 "VFCALL",
00218 "WHERE",
00219 "WHILE_DO",
00220 "XGOTO",
00221 "XMPY",
00222 "XPRAGMA",
00223 "AFFIRM",
00224 "ALLOCA",
00225 "DEALLOCA",
00226 "LDMA"
00227 };
00228
00229
00230
00231
00232
00233
00234 WB_BROWSER::WB_BROWSER()
00235 {
00236 _global_fd = NULL;
00237 _du = NULL;
00238 _alias_mgr = NULL;
00239 _command_list = NULL;
00240 _old_command_list = NULL;
00241 _is_subcommand = FALSE;
00242 _dg = NULL;
00243 _parent_map = WN_MAP_UNDEFINED;
00244 _prompf_id_map = WN_MAP_UNDEFINED;
00245 _access_array_map = WN_MAP_UNDEFINED;
00246 _reduction_map = WN_MAP_UNDEFINED;
00247 _pu = NULL;
00248 _prompf_info = NULL;
00249 _scalar_summary = NULL;
00250 _array_summary = NULL;
00251 _cnode = NULL;
00252 _fancy_level = 2;
00253 _source_language = WB_SRC_NONE;
00254 _sanity_check_level = 0;
00255 for (INT i = 0; i < WB_ASCII_CHAR_COUNT; i++)
00256 _keymap[i] = i;
00257 }
00258
00259
00260
00261
00262
00263
00264
00265 BOOL WB_BROWSER::Unmappable_Character(char ch)
00266 {
00267 switch (ch) {
00268 case ' ':
00269 case '\t':
00270 case '\n':
00271 case 'Q':
00272 case 'q':
00273 case 'H':
00274 case 'h':
00275 return TRUE;
00276 default:
00277 return FALSE;
00278 }
00279 }
00280
00281
00282
00283
00284
00285
00286 WB_BROWSER::WB_BROWSER(WN* global_fd,
00287 DU_MANAGER* du,
00288 ALIAS_MANAGER* alias_mgr,
00289 WN_MAP prompf_id_map,
00290 WN_MAP access_array_map,
00291 WN_MAP reduction_map,
00292 PU* pu,
00293 WB_COMMAND* command_list) :
00294 _global_fd(global_fd), _du(du), _alias_mgr(alias_mgr),
00295 _prompf_id_map(prompf_id_map), _access_array_map(access_array_map),
00296 _reduction_map(reduction_map), _pu(pu), _command_list(command_list)
00297 {
00298 _old_command_list = NULL;
00299 _is_subcommand = FALSE;
00300 _dg = NULL;
00301 _parent_map = WN_MAP_UNDEFINED;
00302 _prompf_info = NULL;
00303 _scalar_summary = NULL;
00304 _array_summary = NULL;
00305 _cnode = global_fd;
00306 _fancy_level = 2;
00307 _source_language = WB_SRC_NONE;
00308 _sanity_check_level = 0;
00309 for (INT i = 0; i < WB_ASCII_CHAR_COUNT; i++)
00310 _keymap[i] = i;
00311 }
00312
00313
00314
00315
00316
00317
00318 void WB_BROWSER::This_Node(WN* wn,
00319 BOOL print_vertex,
00320 BOOL print_brackets)
00321 {
00322 if (wn == NULL) {
00323 fprintf(stdout, "<NULL>");
00324 return;
00325 }
00326 const char* ch = OPCODE_name(WN_opcode(wn));
00327 if (print_brackets)
00328 fprintf(stdout, "[0x%p] ", wn);
00329 else
00330 fprintf(stdout, "0x%p ", wn);
00331 if (print_vertex && Dg() != NULL && Dg()->Get_Vertex(wn) != 0)
00332 fprintf(stdout, "V#%d ", Dg()->Get_Vertex(wn));
00333 fprintf(stdout, "%s ", ch);
00334 if (Fancy_Level() >= 3)
00335 if (OPCODE_has_next_prev(WN_opcode(wn)))
00336 fprintf(stdout, "(%d) ", (INT) WN_linenum(wn));
00337 if (Fancy_Level() >= 3 && Prompf_Id_Map() == -1)
00338 fprintf(stdout, "<%d> ", WN_MAP32_Get(Prompf_Id_Map(), wn));
00339 if (WN_operator(wn) == OPR_INTCONST) {
00340 fprintf(stdout, "%lld ", WN_const_val(wn));
00341 } else {
00342 const char* wn_symbol = WB_Whirl_Symbol(wn);
00343 if (wn_symbol != NULL)
00344 fprintf(stdout, "%s ", wn_symbol);
00345 }
00346 }
00347
00348
00349
00350
00351
00352
00353 void WB_BROWSER::Print_This_Node(WN* wn,
00354 BOOL print_vertex,
00355 BOOL print_brackets)
00356 {
00357 This_Node(wn, print_vertex, print_brackets);
00358 fprintf(stdout, "\n");
00359 }
00360
00361
00362
00363
00364
00365
00366
00367
00368 void WB_BROWSER::Address_Walk(WN* wn_tree,
00369 INT spaces,
00370 INT increment)
00371 {
00372 for (INT i = 0; i < spaces; i++)
00373 fprintf(stdout, " ");
00374 Print_This_Node(wn_tree, FALSE, TRUE);
00375
00376 if (WN_opcode(wn_tree) == OPC_BLOCK) {
00377 for (WN* wn = WN_first(wn_tree); wn != NULL; wn = WN_next(wn))
00378 Address_Walk(wn, spaces + increment, increment);
00379 } else {
00380 for (INT i = 0; i < WN_kid_count(wn_tree); i++)
00381 Address_Walk(WN_kid(wn_tree, i), spaces + increment, increment);
00382 }
00383 }
00384
00385
00386
00387
00388
00389
00390
00391 void WB_BROWSER::Addresses()
00392 {
00393 Address_Walk(Cnode(), 0, 2);
00394 }
00395
00396
00397
00398
00399
00400
00401
00402 void WB_BROWSER::Error_Cleanup()
00403 {
00404 WB_Bell();
00405 WB_Prompt();
00406 Buffer().Load_Buffer();
00407 Buffer().Scan_Blanks_And_Tabs();
00408 }
00409
00410
00411
00412
00413
00414
00415
00416 void WB_BROWSER::Root()
00417 {
00418 Set_Cnode(Global_Fd());
00419 Print_This_Node(Cnode());
00420 }
00421
00422
00423
00424
00425
00426
00427
00428 void WB_BROWSER::Next()
00429 {
00430 WN* pnode = WN_next(Cnode());
00431 if (pnode == NULL) {
00432 Error_Cleanup();
00433 return;
00434 }
00435 Set_Cnode(pnode);
00436 Print_This_Node(Cnode());
00437 }
00438
00439
00440
00441
00442
00443
00444
00445 void WB_BROWSER::Previous()
00446 {
00447 WN* pnode = WN_prev(Cnode());
00448 if (pnode == NULL) {
00449 Error_Cleanup();
00450 return;
00451 }
00452 Set_Cnode(pnode);
00453 Print_This_Node(Cnode());
00454 }
00455
00456
00457
00458
00459
00460
00461
00462 void WB_BROWSER::Set_Node()
00463 {
00464 INT node;
00465 Buffer().Scan_HexInteger(&node);
00466 Set_Cnode((WN*)(INTPTR) node);
00467 Print_This_Node(Cnode());
00468 }
00469
00470
00471
00472
00473
00474
00475
00476 void WB_BROWSER::Address()
00477 {
00478 INT integer;
00479 Buffer().Scan_Integer(&integer);
00480 if (integer < 0 || integer >= Carray().Next_Index()) {
00481 Error_Cleanup();
00482 return;
00483 }
00484 Set_Cnode(Carray().Element(integer));
00485 Print_This_Node(Cnode());
00486 }
00487
00488
00489
00490
00491
00492
00493
00494 void WB_BROWSER::Fancy_Up()
00495 {
00496 const INT fancy_max = 3;
00497 if (Fancy_Level() == fancy_max) {
00498 Error_Cleanup();
00499 return;
00500 }
00501 INT fancy_level = Fancy_Level();
00502 Set_Fancy_Level(++fancy_level);
00503 }
00504
00505
00506
00507
00508
00509
00510
00511 void WB_BROWSER::Fancy_Down()
00512 {
00513 const INT fancy_min = 2;
00514 if (Fancy_Level() == fancy_min) {
00515 Error_Cleanup();
00516 return;
00517 }
00518 INT fancy_level = Fancy_Level();
00519 Set_Fancy_Level(--fancy_level);
00520 }
00521
00522
00523
00524
00525
00526
00527
00528 void WB_BROWSER::Kids()
00529 {
00530 if (WN_kid_count(Cnode()) == 0) {
00531 Error_Cleanup();
00532 return;
00533 }
00534 Carray().Reset_Index();
00535 for (INT i = 0; i < WN_kid_count(Cnode()); i++) {
00536 WN* kid = WN_kid(Cnode(), i);
00537 fprintf(stdout, "[%d] ", i);
00538 This_Node(kid);
00539 Carray().Enter_This_Node(kid);
00540 fprintf(stdout, "\n");
00541 }
00542 }
00543
00544
00545
00546
00547
00548
00549
00550 void WB_BROWSER::Statements()
00551 {
00552 INT i = 0;
00553 if (WN_opcode(Cnode()) != OPC_BLOCK) {
00554 Error_Cleanup();
00555 return;
00556 }
00557 if (WN_first(Cnode()) == NULL) {
00558 Error_Cleanup();
00559 return;
00560 }
00561 Carray().Reset_Index();
00562 for (WN* node = WN_first(Cnode()); node != NULL; i++, node = WN_next(node)) {
00563 fprintf(stdout, "[%d] ", i);
00564 This_Node(node);
00565 Carray().Enter_This_Node(node);
00566 fprintf(stdout, "\n");
00567 }
00568 }
00569
00570
00571
00572
00573
00574
00575
00576 void WB_BROWSER::This_Tree()
00577 {
00578 if (Cnode() == NULL) {
00579 Error_Cleanup();
00580 return;
00581 }
00582 dump_tree(Cnode());
00583 }
00584
00585
00586
00587
00588
00589
00590
00591 extern ST_IDX Compute_ST_IDX(UINT32 st_level,
00592 UINT32 st_index)
00593 {
00594 UINT32 st_idx = st_level + (st_index << 8);
00595 return (ST_IDX) (st_idx);
00596 }
00597
00598
00599
00600
00601
00602
00603
00604 void WB_BROWSER::Symbol()
00605 {
00606 if (Buffer().Is('<')) {
00607 UINT32 st_level;
00608 UINT32 st_index;
00609 Buffer().Scan_Character();
00610 Buffer().Scan_Unsigned(&st_level);
00611 char separator = Buffer().Scan_Character();
00612 if (separator != ',') {
00613 Error_Cleanup();
00614 return;
00615 }
00616 Buffer().Scan_Unsigned(&st_index);
00617 char right_angle_bracket = Buffer().Scan_Character();
00618 if (right_angle_bracket != '>') {
00619 Error_Cleanup();
00620 return;
00621 }
00622 ST_IDX st_idx = Compute_ST_IDX(st_level, st_index);
00623 ST* st = &St_Table[st_idx];
00624 fprintf(stdout, "ST_IDX: %d\n", st_idx);
00625 Print_ST(stdout, st, TRUE);
00626 } else if (Buffer().Is_Integer()) {
00627 ST_IDX st_idx;
00628 Buffer().Scan_Unsigned(&st_idx);
00629 ST* st = &St_Table[st_idx];
00630 fprintf(stdout, "ST_IDX: %d\n", st_idx);
00631 Print_ST(stdout, st, TRUE);
00632 } else {
00633 if (!OPCODE_has_sym(WN_opcode(Cnode()))) {
00634 Error_Cleanup();
00635 return;
00636 }
00637 Print_ST(stdout, WN_st(Cnode()), TRUE);
00638 }
00639 }
00640
00641
00642
00643
00644
00645
00646
00647 void WB_BROWSER::Type()
00648 {
00649 if (Buffer().Is('<')) {
00650 UINT32 ty_index = 0;
00651 Buffer().Scan_Character();
00652 Buffer().Scan_Unsigned(&ty_index);
00653 char right_angle_bracket = Buffer().Scan_Character();
00654 if (right_angle_bracket != '>') {
00655 Error_Cleanup();
00656 return;
00657 }
00658 Ty_tab[ty_index].Print(stdout);
00659 } else if (Buffer().Is_Integer()) {
00660 TY_IDX ty_idx = 0;
00661 Buffer().Scan_Unsigned(&ty_idx);
00662 Print_TY(stdout, ty_idx);
00663 } else {
00664 if (!OPCODE_has_sym(WN_opcode(Cnode()))) {
00665 Error_Cleanup();
00666 return;
00667 }
00668 Ty_Table[ST_type(WN_st(Cnode()))].Print(stdout);
00669 }
00670 }
00671
00672
00673
00674
00675
00676
00677
00678 static BOOL Is_Substring(char s1[],
00679 char s2[])
00680 {
00681 INT substring_length = strlen(s1);
00682 INT string_length = strlen(s2);
00683 INT difference = string_length - substring_length;
00684 if (substring_length > string_length)
00685 return FALSE;
00686 INT i, j;
00687 for (i = 0; i <= difference; i++) {
00688 for (j = 0; j < substring_length; j++)
00689 if (s1[j] != s2[i + j])
00690 break;
00691 if (j == substring_length)
00692 return TRUE;
00693 }
00694 return FALSE;
00695 }
00696
00697
00698
00699
00700
00701
00702
00703 void WB_BROWSER::Find_Walk(char *s, WN* wn)
00704 {
00705 if (wn == NULL)
00706 return;
00707 char* wn_symbol = (char *) WB_Whirl_Symbol(wn);
00708 BOOL test_substring = s[0] == '\'';
00709 if (wn_symbol != NULL && (!test_substring && strcmp(wn_symbol, s) == 0
00710 || test_substring && Is_Substring(&s[1], wn_symbol))) {
00711 fprintf(stdout, "[%d] ", Carray().Next_Index());
00712 This_Node(wn);
00713 Carray().Enter_This_Node(wn);
00714 fprintf(stdout, "\n");
00715 }
00716 for (INT i = 0; i < WN_kid_count(wn); i++)
00717 Find_Walk(s, WN_kid(wn, i));
00718 if (WN_opcode(wn) == OPC_BLOCK)
00719 for (WN* wn_sub = WN_first(wn); wn_sub != NULL; wn_sub = WN_next(wn_sub))
00720 Find_Walk(s, wn_sub);
00721 }
00722
00723 void WB_BROWSER::Find()
00724 {
00725 char s[WB_MAX_STRING_LENGTH];
00726 Buffer().Scan_Alphanumeric(s);
00727 Carray().Reset_Index();
00728 Find_Walk(s, Cnode());
00729 }
00730
00731
00732
00733
00734
00735
00736
00737 void WB_BROWSER::Find_Operator_Walk(OPERATOR opr_test, WN* wn)
00738 {
00739 if (wn == NULL)
00740 return;
00741 if (WN_operator(wn) == opr_test) {
00742 fprintf(stdout, "[%d] ", Carray().Next_Index());
00743 This_Node(wn);
00744 Carray().Enter_This_Node(wn);
00745 fprintf(stdout, "\n");
00746 }
00747 if (WN_opcode(wn) == OPC_BLOCK) {
00748 for (WN* wn_sub = WN_first(wn); wn_sub != NULL; wn_sub = WN_next(wn_sub))
00749 Find_Operator_Walk(opr_test, wn_sub);
00750 } else {
00751 for (INT i = 0; i < WN_kid_count(wn); i++)
00752 Find_Operator_Walk(opr_test, WN_kid(wn, i));
00753 }
00754 }
00755
00756 void WB_BROWSER::Find_Operator()
00757 {
00758 char s[WB_MAX_STRING_LENGTH];
00759 Buffer().Scan_Alphanumeric(s);
00760 INT i;
00761 for (i = 1; i <= OPERATOR_LAST; i++)
00762 if (!strcmp(s, operator_table[i]))
00763 break;
00764 if (i > OPERATOR_LAST) {
00765 Error_Cleanup();
00766 return;
00767 }
00768 Carray().Reset_Index();
00769 Find_Operator_Walk((OPERATOR) i, Cnode());
00770 }
00771
00772
00773
00774
00775
00776
00777
00778 void WB_BROWSER::Uses()
00779 {
00780 if (Du() == NULL) {
00781 Error_Cleanup();
00782 return;
00783 }
00784 USE_LIST *use_list = Du()->Du_Get_Use(Cnode());
00785 if (use_list == NULL) {
00786 Error_Cleanup();
00787 return;
00788 }
00789 Carray().Reset_Index();
00790 if (use_list->Incomplete())
00791 fprintf(stdout, "WARNING: USE LIST INCOMPLETE\n");
00792 USE_LIST_ITER iter(use_list);
00793 const DU_NODE* node = NULL;
00794 INT i = 0;
00795 for (node = iter.First(); !iter.Is_Empty(); node = iter.Next()) {
00796 WN* use = node->Wn();
00797 fprintf(stdout, "[%d] ", i++);
00798 Print_This_Node(use);
00799 Carray().Enter_This_Node(use);
00800 }
00801 }
00802
00803
00804
00805
00806
00807
00808
00809 void WB_BROWSER::Defs()
00810 {
00811 if (Du() == NULL) {
00812 Error_Cleanup();
00813 return;
00814 }
00815 DEF_LIST* def_list = Du()->Ud_Get_Def(Cnode());
00816 if (def_list == NULL) {
00817 Error_Cleanup();
00818 return;
00819 }
00820 if (def_list->Incomplete())
00821 fprintf(stdout, "WARNING: DEF LIST INCOMPLETE\n");
00822 fprintf(stdout, "Loop Statement: 0x%p\n", def_list->Loop_stmt());
00823 DEF_LIST_ITER iter(def_list);
00824 const DU_NODE* node = NULL;
00825 INT i = 0;
00826 for (node = iter.First(); !iter.Is_Empty(); node = iter.Next()) {
00827 WN* def = node->Wn();
00828 fprintf(stdout, "[%d] ", i++);
00829 Print_This_Node(def);
00830 Carray().Enter_This_Node(def);
00831 }
00832 }
00833
00834
00835
00836
00837
00838
00839
00840 void WB_BROWSER::Access_Array()
00841 {
00842 if (Access_Array_Map() == -1) {
00843 Error_Cleanup();
00844 return;
00845 }
00846 if (WN_operator(Cnode()) == OPR_ARRAY) {
00847 ACCESS_ARRAY *array
00848 = (ACCESS_ARRAY *) WN_MAP_Get(Access_Array_Map(), Cnode());
00849 if (array != NULL) {
00850 fprintf(stdout, "The access array is \n");
00851 Print_ACCESS_ARRAY (stdout, array);
00852 } else {
00853 fprintf(stdout, "Null ACCESS_ARRAY\n");
00854 }
00855 } else if (WN_operator(Cnode()) == OPR_IF) {
00856 IF_INFO *info = (IF_INFO *) WN_MAP_Get(Access_Array_Map(), Cnode());
00857 if (info != NULL) {
00858 fprintf(stdout, "The if info is \n");
00859 Print_IF_INFO(stdout, info);
00860 } else {
00861 fprintf(stdout, "Null IF_INFO\n");
00862 }
00863 } else if (WN_operator(Cnode()) == OPR_DO_LOOP) {
00864 DO_LOOP_INFO_BASE* info
00865 = (DO_LOOP_INFO_BASE*) WN_MAP_Get(Access_Array_Map(), Cnode());
00866 if (info != NULL) {
00867 fprintf(stdout, "The loop info is \n");
00868 Print_DO_LOOP_INFO_BASE(stdout, info);
00869 } else {
00870 fprintf(stdout, "NulleDO_LOOP_INFO_BASE\n");
00871 }
00872 } else {
00873 Error_Cleanup();
00874 }
00875 }
00876
00877
00878
00879
00880
00881
00882
00883 void WB_BROWSER::Reduction_Node(WN* wn,
00884 FILE* fp)
00885 {
00886 if (OPCODE_is_load(WN_opcode(wn)) || OPCODE_is_store(WN_opcode(wn))) {
00887 INT32 red_type = WN_MAP32_Get(Reduction_Map(), wn);
00888 switch (red_type) {
00889 case RED_ADD:
00890 fprintf(fp, "[%d] 0x%p RED_ADD ", Carray().Next_Index(), wn);
00891 break;
00892 case RED_MPY:
00893 fprintf(fp, "[%d] 0x%p RED_MPY ", Carray().Next_Index(), wn);
00894 break;
00895 case RED_MIN:
00896 fprintf(fp, "[%d] 0x%p RED_MIN ", Carray().Next_Index(), wn);
00897 break;
00898 case RED_MAX:
00899 fprintf(fp, "[%d] 0x%p RED_MAX ", Carray().Next_Index(), wn);
00900 break;
00901 }
00902 switch (red_type) {
00903 case RED_ADD:
00904 case RED_MPY:
00905 case RED_MIN:
00906 case RED_MAX:
00907 OPERATOR oper = WN_operator(wn);
00908 if (oper == OPR_ILOAD || oper == OPR_ISTORE) {
00909 Dep_Symbol(wn);
00910 fprintf(fp, "\n");
00911 } else {
00912 const char *name = WB_Whirl_Symbol(wn);
00913 fprintf(fp, "%s\n", name);
00914 }
00915 Carray().Enter_This_Node(wn);
00916 break;
00917 }
00918 }
00919 }
00920
00921 void WB_BROWSER::Reduction_Walk(WN* wn_tree,
00922 FILE* fp)
00923 {
00924 if (WN_operator(wn_tree) == OPR_BLOCK) {
00925 for (WN* wn = WN_first(wn_tree); wn != NULL; wn = WN_next(wn))
00926 Reduction_Walk(wn, fp);
00927 } else {
00928 Reduction_Node(wn_tree, fp);
00929 for (INT i = 0; i < WN_kid_count(wn_tree); i++)
00930 Reduction_Walk(WN_kid(wn_tree, i), fp);
00931 }
00932 }
00933
00934 void WB_BROWSER::Reduction()
00935 {
00936 if (Reduction_Map() == WN_MAP_UNDEFINED) {
00937 Error_Cleanup();
00938 return;
00939 }
00940 Carray().Reset_Index();
00941 Reduction_Walk(Cnode(), stdout);
00942 }
00943
00944
00945
00946
00947
00948
00949
00950 BOOL WB_BROWSER::Aliased_Node(WN* wn)
00951 {
00952 OPCODE opc = WN_opcode(wn);
00953 OPERATOR opr = OPCODE_operator(opc);
00954 return (OPCODE_is_load(opc) || OPCODE_is_store(opc) || opr == OPR_PARM)
00955 && Alias_Mgr()->Id(wn) != 0;
00956 }
00957
00958 void WB_BROWSER::Alias_Walk(WN* wn_test,
00959 WN* wn_start,
00960 ALIAS_RESULT ar)
00961 {
00962 if (Aliased_Node(wn_start)) {
00963 ALIAS_RESULT result = Aliased(Alias_Mgr(), wn_test, wn_start);
00964 switch (result) {
00965 case NOT_ALIASED:
00966 break;
00967 case POSSIBLY_ALIASED:
00968 case SAME_LOCATION:
00969 if (ar == result) {
00970 fprintf(stdout, " [%d] ", Carray().Next_Index());
00971 Print_This_Node(wn_start);
00972 Carray().Enter_This_Node(wn_start);
00973 }
00974 break;
00975 }
00976 }
00977
00978 if (WN_opcode(wn_start) == OPC_BLOCK) {
00979 for (WN* wn = WN_first(wn_start); wn != NULL; wn = WN_next(wn))
00980 Alias_Walk(wn_test, wn, ar);
00981 } else {
00982 for (INT i = 0; i < WN_kid_count(wn_start); i++)
00983 Alias_Walk(wn_test, WN_kid(wn_start, i), ar);
00984 }
00985 }
00986
00987 void WB_BROWSER::Alias()
00988 {
00989 if (!Aliased_Node(Cnode())) {
00990 Error_Cleanup();
00991 return;
00992 }
00993 Carray().Reset_Index();
00994 fprintf(stdout, "POSSIBLY ALIASED: \n");
00995 Alias_Walk(Cnode(), Global_Fd(), POSSIBLY_ALIASED);
00996 if (Carray().Next_Index() == 0)
00997 fprintf(stdout, " NO LOCATIONS\n");
00998 INT possible_aliases = Carray().Next_Index();
00999 fprintf(stdout, "SAME LOCATION: \n");
01000 Alias_Walk(Cnode(), Global_Fd(), SAME_LOCATION);
01001 if (Carray().Next_Index() == possible_aliases)
01002 fprintf(stdout, " NO LOCATIONS\n");
01003 }
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013 static BOOL WB_Parent_Search(WN* wn_root,
01014 STACK<WN*>* stk_parent,
01015 WN* wn_node)
01016 {
01017 stk_parent->Push(wn_root);
01018 if (wn_root == wn_node)
01019 return TRUE;
01020 if (WN_opcode(wn_root) == OPC_BLOCK) {
01021 for (WN* wn = WN_first(wn_root); wn != NULL; wn = WN_next(wn)) {
01022 BOOL found_path = WB_Parent_Search(wn, stk_parent, wn_node);
01023 if (found_path)
01024 return TRUE;
01025 }
01026 } else {
01027 for (INT i = 0; i < WN_kid_count(wn_root); i++) {
01028 BOOL found_path = WB_Parent_Search(WN_kid(wn_root, i), stk_parent,
01029 wn_node);
01030 if (found_path)
01031 return TRUE;
01032 }
01033 }
01034 stk_parent->Pop();
01035 return FALSE;
01036 }
01037
01038
01039
01040
01041
01042
01043
01044 void WB_BROWSER::Parent()
01045 {
01046 if (Cnode() == Global_Fd()) {
01047 Error_Cleanup();
01048 return;
01049 }
01050 if (Parent_Map() == -1) {
01051 MEM_POOL_Push(&MEM_local_pool);
01052 STACK<WN*> stk_parent(&MEM_local_pool);
01053 BOOL found_path = WB_Parent_Search(Global_Fd(), &stk_parent, Cnode());
01054 if (!found_path) {
01055 Error_Cleanup();
01056 MEM_POOL_Pop(&MEM_local_pool);
01057 return;
01058 }
01059 Set_Cnode(stk_parent.Bottom_nth(stk_parent.Elements() - 2));
01060 Print_This_Node(Cnode());
01061 MEM_POOL_Pop(&MEM_local_pool);
01062 } else {
01063 WN* pnode = (WN*) WN_MAP_Get(Parent_Map(), Cnode());
01064 if (pnode == NULL) {
01065 Error_Cleanup();
01066 return;
01067 }
01068 Set_Cnode(pnode);
01069 Print_This_Node(Cnode());
01070 }
01071 }
01072
01073
01074
01075
01076
01077
01078
01079 void WB_BROWSER::Ancestors()
01080 {
01081 if (Cnode() == Global_Fd()) {
01082 Error_Cleanup();
01083 return;
01084 }
01085 if (Parent_Map() == -1) {
01086 Carray().Reset_Index();
01087 MEM_POOL_Push(&MEM_local_pool);
01088 STACK<WN*> stk_parent(&MEM_local_pool);
01089 BOOL found_path = WB_Parent_Search(Global_Fd(), &stk_parent, Cnode());
01090 if (!found_path) {
01091 Error_Cleanup();
01092 MEM_POOL_Pop(&MEM_local_pool);
01093 return;
01094 }
01095 INT i = 0;
01096 for (INT j = stk_parent.Elements() - 1; j >= 0; j--) {
01097 Carray().Enter_This_Node(stk_parent.Bottom_nth(j));
01098 fprintf(stdout, "[%d] ", i++);
01099 Print_This_Node(stk_parent.Bottom_nth(j));
01100 }
01101 MEM_POOL_Pop(&MEM_local_pool);
01102 } else {
01103 Carray().Reset_Index();
01104 WN* wnn = NULL;
01105 INT i = 0;
01106 for (WN* wn = Cnode(); wn != NULL; wn = wnn) {
01107 wnn = ((WN*) WN_MAP_Get(Parent_Map(), (WN*) wn));
01108 Carray().Enter_This_Node(wn);
01109 fprintf(stdout, "[%d] ", i++);
01110 Print_This_Node(wn);
01111 }
01112 }
01113 }
01114
01115
01116
01117
01118
01119
01120
01121 void WB_BROWSER::Promp_Map()
01122 {
01123 if (Prompf_Id_Map() == -1) {
01124 Error_Cleanup();
01125 return;
01126 }
01127 Carray().Reset_Index();
01128 WN_ITER* itr = WN_WALK_TreeIter(Cnode());
01129 for (INT i = 0; itr != NULL; itr = WN_WALK_TreeNext(itr)) {
01130 WN* wn = itr->wn;
01131 INT32 map_id = WN_MAP32_Get(Prompf_Id_Map(), wn);
01132 if (map_id != 0) {
01133 fprintf(stdout, "[%d] %3d ", i++, map_id);
01134 Print_This_Node(wn);
01135 Carray().Enter_This_Node(wn);
01136 }
01137 }
01138 }
01139
01140
01141
01142
01143
01144
01145
01146 void WB_BROWSER::Promp_Info()
01147 {
01148 if (!(Prompf_Info() != NULL)) {
01149 Error_Cleanup();
01150 return;
01151 }
01152 Prompf_Info()->Print(stdout);
01153 }
01154
01155
01156
01157
01158
01159
01160
01161 void WB_BROWSER::Whirl2fc()
01162 {
01163 if (Source_Language() == WB_SRC_NONE) {
01164 Whirl2Src_Init(Global_Fd());
01165 Whirl2Src_Emit(stdout, Cnode());
01166 fprintf(stdout, "\n");
01167 } else if (Source_Language() == WB_SRC_FORTRAN) {
01168 Whirl2F_Init(Global_Fd());
01169 Whirl2F_Emit(stdout, Cnode());
01170 fprintf(stdout, "\n");
01171 } else if (Source_Language() == WB_SRC_C) {
01172 Whirl2C_Init(Global_Fd());
01173 Whirl2C_Emit(stdout, Cnode());
01174 fprintf(stdout, "\n");
01175 }
01176 }
01177
01178
01179
01180
01181
01182
01183
01184 void WB_BROWSER::Whirl2fset()
01185 {
01186 if (Source_Language() != WB_SRC_FORTRAN) {
01187 Whirl2F_Init(Global_Fd());
01188 Set_Source_Language(WB_SRC_FORTRAN);
01189 }
01190 fprintf(stdout, "WHIRL-TO-SOURCE language is FORTRAN.\n");
01191 }
01192
01193
01194
01195
01196
01197
01198
01199 void WB_BROWSER::Whirl2cset()
01200 {
01201 if (Source_Language() != WB_SRC_C) {
01202 Whirl2C_Init(Global_Fd());
01203 Set_Source_Language(WB_SRC_C);
01204 }
01205 fprintf(stdout, "WHIRL-TO-SOURCE language is C.\n");
01206 }
01207
01208
01209
01210
01211
01212
01213
01214 static void Compact_Buffer(char buffer[])
01215 {
01216 INT i, j;
01217 for (i = 0, j = 0; buffer[i] != '\0'; i++) {
01218 if (buffer[i] == '+' && buffer[i+1] == '-') {
01219 buffer[j++] = '-';
01220 i++;
01221 } else if (buffer[i] == '-' && buffer[i+1] == '-') {
01222 buffer[j++] = '+';
01223 i++;
01224 } else {
01225 buffer[j++] = buffer[i];
01226 }
01227 }
01228 buffer[j] = '\0';
01229 }
01230
01231
01232
01233
01234
01235
01236 void WB_BROWSER::Dep_Symbol(WN *wn)
01237 {
01238 WN* symbol_node = NULL;
01239 char buffer[WB_MAX_STRING_LENGTH];
01240 switch (WN_operator(wn)) {
01241 case OPR_ISTORE:
01242 symbol_node = WN_kid1(wn);
01243 break;
01244 case OPR_ILOAD:
01245 symbol_node = WN_kid0(wn);
01246 break;
01247 }
01248 if (symbol_node == NULL)
01249 return;
01250 INT cc = WB_Dump_Whirl_Expr(symbol_node, symbol_node, buffer, 0);
01251 Compact_Buffer(buffer);
01252 if (cc > WB_MAX_STRING_LENGTH - 1) {
01253 fprintf(stdout, "Expression too long!\n");
01254 Error_Cleanup();
01255 return;
01256 }
01257 fputs(buffer, stdout);
01258 }
01259
01260
01261
01262
01263
01264
01265
01266 void WB_BROWSER::Deps_Loop()
01267 {
01268 if (Dg() == NULL) {
01269 Error_Cleanup();
01270 return;
01271 }
01272 Carray().Reset_Index();
01273 WN* start_node = NULL;
01274 switch (WN_opcode(Cnode())) {
01275 case OPC_DO_LOOP:
01276 start_node = WN_do_body(Cnode());
01277 break;
01278 case OPC_DO_WHILE:
01279 case OPC_WHILE_DO:
01280 start_node = WN_while_body(Cnode());
01281 break;
01282 }
01283 WN_ITER* itr = WN_WALK_TreeIter(start_node);
01284 for (; itr != NULL; itr = WN_WALK_TreeNext(itr)) {
01285 WN* wn = itr->wn;
01286 VINDEX16 v = Dg()->Get_Vertex(wn);
01287 if (v == 0)
01288 continue;
01289 INT j = Carray().Enter_This_Node_Unique(wn);
01290 fprintf(stdout, "[%d] ", j);
01291 This_Node(wn);
01292 fprintf(stdout, "V#%d ", v);
01293 Dep_Symbol(wn);
01294 fprintf(stdout, "\n");
01295 EINDEX16 e;
01296 if (Dg()->Get_In_Edge(v)) {
01297 fprintf(stdout, " ");
01298 fprintf(stdout, "IN EDGES:\n");
01299 for (e = Dg()->Get_In_Edge(v); e != 0; e = Dg()->Get_Next_In_Edge(e)) {
01300 fprintf(stdout, " ");
01301 INT j = Carray().Enter_This_Node_Unique(
01302 Dg()->Get_Wn(Dg()->Get_Source(e)));
01303 fprintf(stdout, "[%d] ", j);
01304 This_Node(Dg()->Get_Wn(Dg()->Get_Source(e)));
01305 fprintf(stdout, "E#%d ", e);
01306 Dep_Symbol(Dg()->Get_Wn(Dg()->Get_Source(e)));
01307 }
01308 }
01309 if (Dg()->Get_Out_Edge(v)) {
01310 fprintf(stdout, " ");
01311 fprintf(stdout, "OUT EDGES:\n");
01312 for (e = Dg()->Get_Out_Edge(v); e != 0; e = Dg()->Get_Next_Out_Edge(e)) {
01313 fprintf(stdout, " ");
01314 INT j = Carray().Enter_This_Node_Unique(
01315 Dg()->Get_Wn(Dg()->Get_Sink(e)));
01316 fprintf(stdout, "[%d] ", j);
01317 This_Node(Dg()->Get_Wn(Dg()->Get_Sink(e)));
01318 fprintf(stdout, "E#%d ", e);
01319 Dep_Symbol(Dg()->Get_Wn(Dg()->Get_Sink(e)));
01320 }
01321 }
01322 }
01323 }
01324
01325 void WB_BROWSER::Deps_Ref()
01326 {
01327 if (Dg() == NULL) {
01328 Error_Cleanup();
01329 return;
01330 }
01331 VINDEX16 v = Dg()->Get_Vertex(Cnode());
01332 if (v == 0) {
01333 Error_Cleanup();
01334 return;
01335 }
01336 EINDEX16 e;
01337 if (!Dg()->Get_In_Edge(v) && !Dg()->Get_Out_Edge(v))
01338 fprintf(stdout, "V#%d\n", v);
01339 Carray().Reset_Index();
01340 if (Dg()->Get_In_Edge(v)) {
01341 fprintf(stdout, "V#%d ", v);
01342 fprintf(stdout, "IN EDGES:\n");
01343 for (e = Dg()->Get_In_Edge(v); e != 0; e = Dg()->Get_Next_In_Edge(e)) {
01344 INT j = Carray().Enter_This_Node_Unique(
01345 Dg()->Get_Wn(Dg()->Get_Source(e)));
01346 fprintf(stdout, "[%d] ", j);
01347 This_Node(Dg()->Get_Wn(Dg()->Get_Source(e)));
01348 fprintf(stdout, "E#%d ", e);
01349 }
01350 }
01351 if (Dg()->Get_Out_Edge(v)) {
01352 fprintf(stdout, "V#%d ", v);
01353 fprintf(stdout, "OUT EDGES:\n");
01354 for (e = Dg()->Get_Out_Edge(v); e != 0; e = Dg()->Get_Next_Out_Edge(e)) {
01355 INT j = Carray().Enter_This_Node_Unique(
01356 Dg()->Get_Wn(Dg()->Get_Sink(e)));
01357 fprintf(stdout, "[%d] ", j);
01358 This_Node(Dg()->Get_Wn(Dg()->Get_Sink(e)));
01359 fprintf(stdout, "E#%d ", e);
01360 }
01361 }
01362 }
01363
01364 void WB_BROWSER::Deps()
01365 {
01366 switch (WN_opcode(Cnode())) {
01367 case OPC_DO_LOOP:
01368 case OPC_DO_WHILE:
01369 case OPC_WHILE_DO:
01370 Deps_Loop();
01371 break;
01372 default:
01373 Deps_Ref();
01374 break;
01375 }
01376 }
01377
01378
01379
01380
01381
01382
01383
01384 void WB_BROWSER::Vertices()
01385 {
01386 if (Dg() == NULL) {
01387 Error_Cleanup();
01388 return;
01389 }
01390 VINDEX16 v;
01391 for (v = Dg()->Get_Vertex(); v; v = Dg()->Get_Next_Vertex(v)) {
01392 WN* wn = Dg()->Get_Wn(v);
01393 fprintf(stdout, "V#%d ", (INT) v);
01394 This_Node(wn, FALSE);
01395 Dep_Symbol(wn);
01396 fprintf(stdout, "\n");
01397 }
01398
01399 VINDEX16 w;
01400 for (v = Dg()->Get_Vertex(); v; v = Dg()->Get_Next_Vertex(v))
01401 for (w = Dg()->Get_Next_Vertex(v); w; w = Dg()->Get_Next_Vertex(w))
01402 if (Dg()->Get_Wn(v) == Dg()->Get_Wn(w))
01403 fprintf(stdout, "Vertices %d and %d are for the same node!\n", v, w);
01404 }
01405
01406
01407
01408
01409
01410
01411
01412
01413 void WB_BROWSER::Vertex_Set_Node()
01414 {
01415 if (Dg() == NULL) {
01416 Error_Cleanup();
01417 return;
01418 }
01419 INT vertex_number = 0;
01420 Buffer().Scan_Integer(&vertex_number);
01421 VINDEX16 v;
01422 for (v = Dg()->Get_Vertex(); v != 0; v = Dg()->Get_Next_Vertex(v))
01423 if (v == (VINDEX16) vertex_number)
01424 break;
01425 if (v == 0) {
01426 Error_Cleanup();
01427 return;
01428 }
01429 Set_Cnode(Dg()->Get_Wn((VINDEX16) vertex_number));
01430 Print_This_Node(Cnode());
01431 }
01432
01433 INT loop_count = 0;
01434
01435
01436
01437
01438
01439
01440 static void Dump_Spaces(FILE* fp,
01441 INT spaces)
01442 {
01443 for (INT i = 0; i < spaces; i++)
01444 fprintf(fp, " ");
01445 }
01446
01447
01448
01449
01450
01451
01452
01453 void WB_BROWSER::Loops_Walk(WN* wn,
01454 FILE* fp,
01455 INT spaces,
01456 INT increment)
01457 {
01458 WN* w = 0;
01459 const char* name = NULL;
01460 switch (WN_opcode(wn)) {
01461 case OPC_BLOCK:
01462 for (w = WN_first(wn); w; w = WN_next(w))
01463 Loops_Walk(w, fp, spaces, increment);
01464 break;
01465 case OPC_DO_LOOP:
01466 Dump_Spaces(fp, spaces);
01467 name = WB_Whirl_Symbol(wn);
01468 if (Prompf_Id_Map() != -1) {
01469 fprintf(fp, "[%d] 0x%p DOLOOP (%d) <%d> %s\n", Carray().Next_Index(), wn,
01470 (INT) WN_linenum(wn), WN_MAP32_Get(Prompf_Id_Map(), wn), name);
01471 } else {
01472 fprintf(fp, "[%d] 0x%p DOLOOP (%d) %s\n", Carray().Next_Index(), wn,
01473 (INT) WN_linenum(wn), name);
01474 }
01475 Carray().Enter_This_Node(wn);
01476 Loops_Walk(WN_do_body(wn), fp, spaces + increment, increment);
01477 break;
01478 case OPC_FUNC_ENTRY:
01479 Dump_Spaces(fp, spaces);
01480 if (Prompf_Id_Map() != -1) {
01481 fprintf(fp, "[%d] 0x%p FUNC_ENTRY <%d> %s\n", Carray().Next_Index(), wn,
01482 WN_MAP32_Get(Prompf_Id_Map(), wn), WB_Whirl_Symbol(wn));
01483 } else {
01484 fprintf(fp, "[%d] 0x%p FUNC_ENTRY %s\n", Carray().Next_Index(), wn,
01485 WB_Whirl_Symbol(wn));
01486 }
01487 Carray().Enter_This_Node(wn);
01488 Loops_Walk(WN_func_body(wn), fp, spaces + increment, increment);
01489 break;
01490 case OPC_IF:
01491 if (Fancy_Level() < 3) {
01492 Loops_Walk(WN_then(wn), fp, spaces, increment);
01493 Loops_Walk(WN_else(wn), fp, spaces, increment);
01494 } else {
01495 Dump_Spaces(fp, spaces);
01496 fprintf(fp, "[%d] 0x%p IF ([%d] 0x%p) THEN [%d] 0x%p\n",
01497 Carray().Next_Index(), wn, Carray().Next_Index() + 1, WN_if_test(wn),
01498 Carray().Next_Index() + 2, WN_then(wn));
01499 INT if_loop_count = Carray().Next_Index();
01500 Carray().Enter_This_Node(wn);
01501 Carray().Enter_This_Node(WN_if_test(wn));
01502 Carray().Enter_This_Node(WN_then(wn));
01503 Loops_Walk(WN_then(wn), fp, spaces + increment, increment);
01504 if (!WN_else_is_empty(wn)) {
01505 Dump_Spaces(fp, spaces);
01506 fprintf(fp, "[%d] 0x%p ELSE\n", Carray().Next_Index(), WN_else(wn));
01507 Carray().Enter_This_Node(WN_else(wn));
01508 Loops_Walk(WN_else(wn), fp, spaces + increment, increment);
01509 }
01510 Dump_Spaces(fp, spaces);
01511 fprintf(fp, "[%d] 0x%p ENDIF\n", if_loop_count, wn);
01512 }
01513 break;
01514 case OPC_DO_WHILE:
01515 Dump_Spaces(fp, spaces);
01516 fprintf(fp, "[%d] 0x%p DO_WHILE_LOOP \n", Carray().Next_Index(), wn);
01517 Carray().Enter_This_Node(wn);
01518 Loops_Walk(WN_while_body(wn), fp, spaces + increment, increment);
01519 break;
01520 case OPC_WHILE_DO:
01521 Dump_Spaces(fp, spaces);
01522 fprintf(fp, "[%d] 0x%p WHILE_DO_LOOP \n", Carray().Next_Index(), wn);
01523 Carray().Enter_This_Node(wn);
01524 Loops_Walk(WN_while_body(wn), fp, spaces + increment, increment);
01525 break;
01526 case OPC_REGION:
01527 if (Fancy_Level() >= 3) {
01528 Dump_Spaces(fp, spaces);
01529 if (Prompf_Id_Map() != -1) {
01530 fprintf(fp, "[%d] 0x%p REGION <%d>\n", Carray().Next_Index(), wn,
01531 WN_MAP32_Get(Prompf_Id_Map(), wn));
01532 } else {
01533 fprintf(fp, "[%d] 0x%p REGION \n", Carray().Next_Index(), wn);
01534 }
01535 Carray().Enter_This_Node(wn);
01536 for (INT i = 0; i < WN_kid_count(wn); i++)
01537 Loops_Walk(WN_kid(wn, i), fp, spaces + increment, increment);
01538 } else {
01539 for (INT i = 0; i < WN_kid_count(wn); i++)
01540 Loops_Walk(WN_kid(wn, i), fp, spaces, increment);
01541 }
01542 }
01543 }
01544
01545 void WB_BROWSER::Loops()
01546 {
01547 Carray().Reset_Index();
01548 Loops_Walk(Cnode(), stdout, 0, 2);
01549 }
01550
01551
01552
01553
01554
01555
01556
01557 void WB_BROWSER::Set_Map_Id()
01558 {
01559 INT map_id = 0;
01560 Buffer().Scan_Integer(&map_id);
01561 WN_ITER* itr = WN_WALK_TreeIter(Global_Fd());
01562 for (; itr != NULL; itr = WN_WALK_TreeNext(itr))
01563 if (WN_map_id(itr->wn) == map_id)
01564 break;
01565 if (itr == NULL) {
01566 Error_Cleanup();
01567 return;
01568 }
01569 Set_Cnode(itr->wn);
01570 Print_This_Node(Cnode());
01571 }
01572
01573
01574
01575
01576
01577
01578
01579 void WB_BROWSER::Map_Id()
01580 {
01581 fprintf(stdout, "%d\n", WN_map_id(Cnode()));
01582 }
01583
01584
01585
01586
01587
01588
01589
01590 void WB_BROWSER::DaVinci_Toggle()
01591 {
01592 if (DaVinci_Mode()) {
01593 _davinci_mode = FALSE;
01594 fprintf(stdout, "DAVINCI is OFF.\n");
01595 } else {
01596 _davinci_mode = TRUE;
01597 fprintf(stdout, "DAVINCI is ON.\n");
01598 }
01599 }
01600
01601
01602
01603
01604
01605
01606
01607 void WB_BROWSER::Find_Symbols()
01608 {
01609 ST* st = NULL;
01610 char s[WB_MAX_STRING_LENGTH];
01611 Buffer().Scan_Alphanumeric(s);
01612 Carray().Reset_Index();
01613 BOOL test_substring = s[0] == '\'';
01614 INT i;
01615 FOREACH_SYMBOL(CURRENT_SYMTAB, st, i) {
01616 if ((!test_substring && strcmp(ST_name(st), s) == 0
01617 || test_substring && Is_Substring(&s[1], ST_name(st)))) {
01618 Print_ST(stdout, st, TRUE);
01619 }
01620 }
01621 FOREACH_SYMBOL(GLOBAL_SYMTAB, st, i) {
01622 if ((!test_substring && strcmp(ST_name(st), s) == 0
01623 || test_substring && Is_Substring(&s[1], ST_name(st)))) {
01624 Print_ST(stdout, st, TRUE);
01625 }
01626 }
01627 }
01628
01629
01630
01631
01632
01633
01634
01635 BOOL WB_BROWSER::Required_Fields_Present(INT num)
01636 {
01637 if (Required_Fields(num) == WBR_NONE)
01638 return TRUE;
01639 if ((Required_Fields(num) & WBR_DU) && Du() == NULL)
01640 return FALSE;
01641 if ((Required_Fields(num) & WBR_DG) && Dg() == NULL)
01642 return FALSE;
01643 if ((Required_Fields(num) & WBR_ALIAS) && Alias_Mgr() == NULL)
01644 return FALSE;
01645 if ((Required_Fields(num) & WBR_PARENT) && Parent_Map() == WN_MAP_UNDEFINED)
01646 return FALSE;
01647 if ((Required_Fields(num) & WBR_MPFMAP) && Prompf_Id_Map() == WN_MAP_UNDEFINED)
01648 return FALSE;
01649 if ((Required_Fields(num) & WBR_MPFINFO) && Prompf_Info() == NULL)
01650 return FALSE;
01651 if ((Required_Fields(num) & WBR_AAMAP) && Access_Array_Map() == WN_MAP_UNDEFINED)
01652 return FALSE;
01653 if ((Required_Fields(num) & WBR_REDMAP) && Reduction_Map() == WN_MAP_UNDEFINED)
01654 return FALSE;
01655 return TRUE;
01656 }
01657
01658
01659
01660
01661
01662
01663
01664 void WB_BROWSER::Help()
01665 {
01666 for (INT i = 0; Command(i) != '\0'; i++) {
01667 if (Required_Fields_Present(i)) {
01668 for (INT j = 0; j < WB_ASCII_CHAR_COUNT; j++)
01669 if (_keymap[j] == Command(i))
01670 fprintf(stdout, " %c: %s\n", j, Command_Text(i));
01671 }
01672 }
01673 fprintf(stdout, " Q: Exit the debugger\n");
01674 fprintf(stdout, " q: Exit the debugger\n");
01675 }
01676
01677
01678
01679
01680
01681
01682 void WB_BROWSER::Invoke_Command(char ch)
01683 {
01684 switch (_keymap[ch]) {
01685 case 'R':
01686 Root();
01687 break;
01688 case 'N':
01689 Next();
01690 break;
01691 case 'P':
01692 Previous();
01693 break;
01694 case '=':
01695 Set_Node();
01696 break;
01697 case '@':
01698 Address();
01699 break;
01700 case '>':
01701 Fancy_Up();
01702 break;
01703 case '<':
01704 Fancy_Down();
01705 break;
01706 case 'K':
01707 Kids();
01708 break;
01709 case 'S':
01710 Statements();
01711 break;
01712 case 'T':
01713 This_Tree();
01714 break;
01715 case '%':
01716 Addresses();
01717 break;
01718 case 's':
01719 Symbol();
01720 break;
01721 case 't':
01722 Type();
01723 break;
01724 case 'F':
01725 Find();
01726 break;
01727 case '$':
01728 Find_Symbols();
01729 break;
01730 case 'o':
01731 Find_Operator();
01732 break;
01733 case 'H':
01734 case 'h':
01735 Help();
01736 break;
01737 case 'U':
01738 Uses();
01739 break;
01740 case 'D':
01741 Defs();
01742 break;
01743 case 'G':
01744 Deps();
01745 break;
01746 case 'V':
01747 Vertices();
01748 break;
01749 case 'v':
01750 Vertex_Set_Node();
01751 break;
01752 case 'A':
01753 Access_Array();
01754 break;
01755 case 'a':
01756 Alias();
01757 break;
01758 case 'r':
01759 Reduction();
01760 break;
01761 case 'E':
01762 Parent();
01763 break;
01764 case 'e':
01765 Ancestors();
01766 break;
01767 case 'i':
01768 Promp_Map();
01769 break;
01770 case 'I':
01771 Promp_Info();
01772 break;
01773 case 'W':
01774 Whirl2fc();
01775 break;
01776 case 'f':
01777 Whirl2fset();
01778 break;
01779 case 'c':
01780 Whirl2cset();
01781 break;
01782 case 'L':
01783 Loops();
01784 break;
01785 case 'M':
01786 Set_Map_Id();
01787 break;
01788 case 'm':
01789 Map_Id();
01790 break;
01791 case 'd':
01792 DaVinci_Toggle();
01793 break;
01794 case '~':
01795 WB_BROWSER_Summary(stdout, this);
01796 break;
01797 default:
01798 fprintf(stdout, "Bad character: %c\n", ch);
01799 break;
01800 }
01801 }
01802
01803
01804
01805
01806
01807
01808 void WB_BROWSER::Initialize_Language()
01809 {
01810 if (Pu() != NULL) {
01811 switch (PU_src_lang(*Pu())) {
01812 case PU_C_LANG:
01813 case PU_CXX_LANG:
01814 Set_Source_Language(WB_SRC_C);
01815 fprintf(stdout, "WHIRL-TO-SOURCE language is C.\n");
01816 break;
01817 case PU_F90_LANG:
01818 case PU_F77_LANG:
01819 Set_Source_Language(WB_SRC_FORTRAN);
01820 fprintf(stdout, "WHIRL-TO-SOURCE language is FORTRAN.\n");
01821 break;
01822 default:
01823 Set_Source_Language(WB_SRC_NONE);
01824 fprintf(stdout,
01825 "Can't do WHIRL-TO-SOURCE tranformations in this language.\n");
01826 break;
01827 }
01828 } else {
01829 Set_Source_Language(WB_SRC_FORTRAN);
01830 fprintf(stdout, "WHIRL-TO-SOURCE language is FORTRAN.\n");
01831 }
01832 }
01833
01834
01835
01836
01837
01838
01839
01840 static void Scan_Blanks_And_Tabs(char buffer[],
01841 INT* buffer_start)
01842 {
01843 char ch;
01844 do {
01845 ch = buffer[(*buffer_start)++];
01846 } while (ch == ' ' || ch == '\t');
01847 (*buffer_start)--;
01848 }
01849
01850
01851
01852
01853
01854
01855
01856 void WB_BROWSER::Initialize_Keymap(char ch)
01857 {
01858 const INT BUFFER_MAX = 132;
01859 char file_name[BUFFER_MAX];
01860 strcpy(file_name, getenv("HOME"));
01861 strcat(file_name, "/.wb_keymap");
01862 FILE* fp_keymap = fopen(file_name, "r");
01863 if (fp_keymap == NULL)
01864 return;
01865 BOOL print_log = TRUE;
01866 char key_buffer[BUFFER_MAX];
01867 INT line_number = 0;
01868 while (fgets(key_buffer, BUFFER_MAX-1, fp_keymap) != NULL) {
01869 line_number++;
01870 INT key_buffer_start = 0;
01871 Scan_Blanks_And_Tabs(key_buffer, &key_buffer_start);
01872 if (strncasecmp(&key_buffer[key_buffer_start], "SILENT",
01873 strlen("SILENT")) == 0) {
01874 print_log = FALSE;
01875 } else if (strncasecmp(&key_buffer[key_buffer_start], "VERBOSE",
01876 strlen("VERBOSE")) == 0) {
01877 print_log = TRUE;
01878 } else if (strncasecmp(&key_buffer[key_buffer_start], "TRANSLATE",
01879 strlen("TRANSLATE")) == 0) {
01880 key_buffer_start += strlen("TRANSLATE");
01881 Scan_Blanks_And_Tabs(key_buffer, &key_buffer_start);
01882 char old_char = key_buffer[key_buffer_start++];
01883 if (Unmappable_Character(old_char)) {
01884 fprintf(stdout,
01885 ".wb_keymap: Error on line %d: Cannot map %c\n",
01886 line_number, old_char);
01887 continue;
01888 }
01889 if (ch == ' ') {
01890 if (key_buffer[key_buffer_start] != ' '
01891 && key_buffer[key_buffer_start] != '\t')
01892 continue;
01893 Scan_Blanks_And_Tabs(key_buffer, &key_buffer_start);
01894 char new_char = key_buffer[key_buffer_start++];
01895 if (Unmappable_Character(new_char)) {
01896 fprintf(stdout,
01897 ".wb_keymap: Error on line %d: Cannot map %c\n",
01898 line_number, new_char);
01899 continue;
01900 }
01901 if (print_log)
01902 fprintf(stdout, ".wb_keymap: Translating '%c' to '%c'\n",
01903 old_char, new_char);
01904 _keymap[new_char] = old_char;
01905 } else {
01906 if (old_char == ch) {
01907 old_char = key_buffer[key_buffer_start++];
01908 if (Unmappable_Character(old_char)) {
01909 fprintf(stdout,
01910 ".wb_keymap: Error on line %d: Cannot map %c\n",
01911 line_number, old_char);
01912 continue;
01913 }
01914 Scan_Blanks_And_Tabs(key_buffer, &key_buffer_start);
01915 char new_char = key_buffer[key_buffer_start++];
01916 if (Unmappable_Character(new_char)) {
01917 fprintf(stdout,
01918 ".wb_keymap: Error on line %d: Cannot map %c\n",
01919 line_number, new_char);
01920 continue;
01921 }
01922 if (print_log)
01923 fprintf(stdout, ".wb_keymap: Translating '%c' to '%c'\n",
01924 old_char, new_char);
01925 _keymap[new_char] = old_char;
01926 }
01927 }
01928 } else {
01929 fprintf(stdout, ".wb_keymap: Error on line %d: Unrecognized command\n",
01930 line_number);
01931 }
01932 }
01933 fclose(fp_keymap);
01934 }
01935
01936
01937
01938
01939
01940
01941
01942
01943
01944
01945
01946
01947 void WB_BROWSER::Sdebug(const char init_buffer[])
01948 {
01949 char ch;
01950 BOOL reload;
01951
01952 if (Global_Fd() == NULL) {
01953 fprintf(stdout, "Whirl browser not valid in this phase.\n");
01954 Error_Cleanup();
01955 return;
01956 }
01957 Initialize_Keymap(' ');
01958 Initialize_Language();
01959 Root();
01960 fprintf(stdout, "Root node is: ");
01961 Print_This_Node(Cnode());
01962 WB_Prompt();
01963 Buffer().Reset_Buffer();
01964 if (init_buffer[0] == '\0') {
01965 reload = TRUE;
01966 } else {
01967 reload = FALSE;
01968 Buffer().Load_Buffer(init_buffer);
01969 for (INT i = 0; init_buffer[i] != '\0'; i++)
01970 fprintf(stdout, "%c", init_buffer[i]);
01971 fprintf(stdout, "\n");
01972 }
01973 while (TRUE) {
01974 if (reload) {
01975 Buffer().Load_Buffer();
01976 reload = FALSE;
01977 }
01978 ch = Buffer().Get_Command();
01979 if (ch == '\n') {
01980 WB_Prompt();
01981 reload = TRUE;
01982 continue;
01983 }
01984 if (ch == 'Q' || ch == 'q')
01985 return;
01986 Invoke_Command(ch);
01987 }
01988 }
01989
01990
01991
01992
01993
01994
01995
01996 void WB_BROWSER::Set_Subcommand(char ch)
01997 {
01998 INT i;
01999 for (i = 0; Command(i) != '\0'; i++)
02000 if (Command(i) == ch)
02001 break;
02002 if (Command(i) == '\0')
02003 return;
02004 if (Subcommand(i) == NULL)
02005 return;
02006 _is_subcommand = TRUE;
02007 Set_Old_Command_List(Command_List());
02008 Set_Command_List(Subcommand(i));
02009 for (i = 0; i < WB_ASCII_CHAR_COUNT; i++)
02010 _old_keymap[i] = _keymap[i];
02011 for (i = 0; i < WB_ASCII_CHAR_COUNT; i++)
02012 _keymap[i] = i;
02013 Initialize_Keymap(ch);
02014 }
02015
02016
02017
02018
02019
02020
02021 void WB_BROWSER::Reset_Subcommand()
02022 {
02023 _is_subcommand = FALSE;
02024 Set_Command_List(Old_Command_List());
02025 Set_Old_Command_List(NULL);
02026 for (INT i = 0; i < WB_ASCII_CHAR_COUNT; i++)
02027 _keymap[i] = _old_keymap[i];
02028 }
02029
02030
02031
02032
02033
02034
02035
02036 void WB_BROWSER::Debug()
02037 {
02038 Sdebug("");
02039 }
02040