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 #include <sys/types.h>
00037 #include <elf.h>
00038 #include <ctype.h>
00039 #include "wn.h"
00040 #include "wn_map.h"
00041 #include "wn_util.h"
00042 #include <stdio.h>
00043 #include "wb_util.h"
00044 #include "dwarf_DST.h"
00045 #include "ipc_file.h"
00046 #include "ipa_summary.h"
00047 #include "opt_du.h"
00048 #include "opt_alias_mgr.h"
00049 #include "dep_graph.h"
00050 #include "prompf.h"
00051 #include "wb_browser.h"
00052 #include "ipa_section_annot.h"
00053 #include "ipc_symtab_merge.h"
00054 #include "ipl_summary.h"
00055 #include "ipa_section.h"
00056
00057
00058
00059
00060
00061
00062
00063 void WB_BROWSER::Summary_Symbol(FILE* fp,
00064 INT symbol_index,
00065 BOOL is_list)
00066 {
00067 if (Scalar_Summary() == NULL || symbol_index < 0
00068 || symbol_index > Scalar_Summary()->Get_symbol_idx()) {
00069 Error_Cleanup();
00070 return;
00071 }
00072 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00073 char* name = ST_name(ss->St_idx());
00074 ss->WB_Print(fp, symbol_index, is_list, name, "", Fancy_Level());
00075 }
00076
00077
00078
00079
00080
00081
00082
00083 void WB_BROWSER::Summary_Ivar(FILE* fp,
00084 INT ivar_index)
00085 {
00086 if (Array_Summary() == NULL || ivar_index < 0
00087 || ivar_index >= Array_Summary()->Get_ivar_array_count()) {
00088 Error_Cleanup();
00089 return;
00090 }
00091 IVAR* ivar = Array_Summary()->Get_ivar_array(ivar_index);
00092 ivar->WB_Print(fp, ivar_index);
00093 }
00094
00095
00096
00097
00098
00099
00100
00101 void WB_BROWSER::Summary_Formal(FILE* fp,
00102 INT formal_index)
00103 {
00104 if (Scalar_Summary() == NULL || formal_index < 0
00105 || formal_index > Scalar_Summary()->Get_formal_idx()) {
00106 Error_Cleanup();
00107 return;
00108 }
00109 SUMMARY_FORMAL* sf = Scalar_Summary()->Get_formal(formal_index);
00110 INT symbol_index = sf->Get_symbol_index();
00111 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00112 char* name = ST_name(ss->St_idx());
00113 sf->WB_Print(fp, formal_index, name, "");
00114 }
00115
00116
00117
00118
00119
00120
00121
00122 void WB_BROWSER::Summary_Common(FILE* fp,
00123 INT common_index)
00124 {
00125 if (Scalar_Summary() == NULL || common_index < 0
00126 || common_index > Scalar_Summary()->Get_common_idx()) {
00127 Error_Cleanup();
00128 return;
00129 }
00130 SUMMARY_COMMON* sc = Scalar_Summary()->Get_common(common_index);
00131 sc->WB_Print(fp, common_index);
00132 }
00133
00134
00135
00136
00137
00138
00139
00140 void WB_BROWSER::Summary_Common_Shape(FILE* fp,
00141 INT common_shape_index)
00142 {
00143 if (Scalar_Summary() == NULL || common_shape_index < 0
00144 || common_shape_index > Scalar_Summary()->Get_common_shape_idx()) {
00145 Error_Cleanup();
00146 return;
00147 }
00148 SUMMARY_COMMON_SHAPE* sc =
00149 Scalar_Summary()->Get_common_shape(common_shape_index);
00150 sc->WB_Print(fp, common_shape_index);
00151 }
00152
00153
00154
00155
00156
00157
00158
00159 void WB_BROWSER::Summary_Procedure(FILE* fp,
00160 INT procedure_index)
00161 {
00162 if (Scalar_Summary() == NULL || procedure_index < 0
00163 || procedure_index > Scalar_Summary()->Get_procedure_idx()) {
00164 Error_Cleanup();
00165 return;
00166 }
00167 SUMMARY_PROCEDURE* sp = Scalar_Summary()->Get_procedure(procedure_index);
00168 INT symbol_index = sp->Get_symbol_index();
00169 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00170 char* name = ST_name(ss->St_idx());
00171 sp->WB_Print(fp, procedure_index, name, Fancy_Level());
00172 }
00173
00174
00175
00176
00177
00178
00179
00180 void WB_BROWSER::Summary_Global(FILE* fp,
00181 INT global_index)
00182 {
00183 if (Scalar_Summary() == NULL || global_index < 0
00184 || global_index > Scalar_Summary()->Get_procedure_idx()) {
00185 Error_Cleanup();
00186 return;
00187 }
00188 SUMMARY_GLOBAL* sg = Scalar_Summary()->Get_global(global_index);
00189 sg->WB_Print(fp, global_index);
00190 }
00191
00192
00193
00194
00195
00196
00197
00198 void WB_BROWSER::Summary_Callsite(FILE* fp,
00199 INT callsite_index)
00200 {
00201 if (Scalar_Summary() == NULL || callsite_index < 0
00202 || callsite_index > Scalar_Summary()->Get_callsite_idx()) {
00203 Error_Cleanup();
00204 return;
00205 }
00206 SUMMARY_CALLSITE* sc = Scalar_Summary()->Get_callsite(callsite_index);
00207 char* name = NULL;
00208 if (!sc->Is_intrinsic() && !sc->Is_func_ptr()) {
00209 INT symbol_index = sc->Get_symbol_index();
00210 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00211 name = ST_name(ss->St_idx());
00212 }
00213 sc->WB_Print(fp, callsite_index, name, "");
00214 }
00215
00216
00217
00218
00219
00220
00221
00222 void WB_BROWSER::Summary_Control_Dependence(FILE* fp,
00223 INT control_index)
00224 {
00225 if (Scalar_Summary() == NULL || control_index < 0
00226 || control_index > Scalar_Summary()->Get_ctrl_dep_idx()) {
00227 Error_Cleanup();
00228 return;
00229 }
00230 SUMMARY_CONTROL_DEPENDENCE* sd
00231 = Scalar_Summary()->Get_ctrl_dep(control_index);
00232 sd->WB_Print(fp, control_index);
00233 }
00234
00235
00236
00237
00238
00239
00240
00241 void WB_BROWSER::Summary_Actual(FILE* fp,
00242 INT actual_index)
00243 {
00244 if (Scalar_Summary() == NULL || actual_index < 0
00245 || actual_index > Scalar_Summary()->Get_actual_idx()) {
00246 Error_Cleanup();
00247 return;
00248 }
00249 SUMMARY_ACTUAL* sa = Scalar_Summary()->Get_actual(actual_index);
00250 char* name = NULL;
00251 if (sa->Get_symbol_index() != -1) {
00252 INT symbol_index = sa->Get_symbol_index();
00253 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00254 name = ST_name(ss->St_idx());
00255 }
00256 sa->WB_Print(fp, actual_index, name, "");
00257 }
00258
00259
00260
00261
00262
00263
00264
00265 void WB_BROWSER::Summary_Value(FILE* fp,
00266 INT value_index)
00267 {
00268 if (Scalar_Summary() == NULL || value_index < 0
00269 || value_index > Scalar_Summary()->Get_value_idx()) {
00270 Error_Cleanup();
00271 return;
00272 }
00273 SUMMARY_VALUE* sv = Scalar_Summary()->Get_value(value_index);
00274 sv->WB_Print(fp, value_index);
00275 }
00276
00277
00278
00279
00280
00281
00282
00283 void WB_BROWSER::Summary_Cfg_Node(FILE* fp,
00284 INT cfg_index)
00285 {
00286 if (Array_Summary() == NULL || cfg_index < 0
00287 || cfg_index >= Array_Summary()->Get_cfg_node_array_count()) {
00288 Error_Cleanup();
00289 return;
00290 }
00291 CFG_NODE_INFO* cfg = Array_Summary()->Get_cfg_node_array(cfg_index);
00292 cfg->WB_Print(fp, cfg_index);
00293 }
00294
00295
00296
00297
00298
00299
00300
00301 void WB_BROWSER::Summary_Region(FILE* fp,
00302 INT region_index)
00303 {
00304 if (Array_Summary() == NULL || region_index < 0
00305 || region_index >= Array_Summary()->Get_region_array_count()) {
00306 Error_Cleanup();
00307 return;
00308 }
00309 REGION_ARRAYS* ra = Array_Summary()->Get_region_array(region_index);
00310 INT symbol_index = ra->Get_sym_id();
00311 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00312 char* name = ST_name(ss->St_idx());
00313 ra->WB_Print(fp, region_index, name, "");
00314 }
00315
00316
00317
00318
00319
00320
00321
00322 void WB_BROWSER::Summary_Projected_Region(FILE* fp,
00323 INT proj_region_index)
00324 {
00325 if (Array_Summary() == NULL || proj_region_index < 0
00326 || proj_region_index
00327 >= Array_Summary()->Get_projected_region_array_count()) {
00328 Error_Cleanup();
00329 return;
00330 }
00331 PROJECTED_REGION* pr
00332 = Array_Summary()->Get_projected_region_array(proj_region_index);
00333 pr->WB_Print(fp, proj_region_index);
00334 }
00335
00336
00337
00338
00339
00340
00341
00342 void WB_BROWSER::Summary_Projected_Node(FILE* fp,
00343 INT proj_node_index)
00344 {
00345 if (Array_Summary() == NULL || proj_node_index < 0
00346 || proj_node_index >= Array_Summary()->Get_projected_array_count()) {
00347 Error_Cleanup();
00348 return;
00349 }
00350 PROJECTED_NODE* pn
00351 = Array_Summary()->Get_projected_array(proj_node_index);
00352 pn->WB_Print(fp, proj_node_index);
00353 }
00354
00355
00356
00357
00358
00359
00360
00361 void WB_BROWSER::Summary_Term(FILE* fp,
00362 INT term_index)
00363 {
00364 if (Array_Summary() == NULL || term_index < 0
00365 || term_index >= Array_Summary()->Get_term_array_count()) {
00366 Error_Cleanup();
00367 return;
00368 }
00369 TERM* tm = Array_Summary()->Get_term_array(term_index);
00370 tm->WB_Print(fp, term_index);
00371 }
00372
00373
00374
00375
00376
00377
00378
00379 void WB_BROWSER::Summary_Loop_Info(FILE* fp,
00380 INT loop_info_index)
00381 {
00382 if (Array_Summary() == NULL || loop_info_index < 0
00383 || loop_info_index >= Array_Summary()->Get_loopinfo_array_count()) {
00384 Error_Cleanup();
00385 return;
00386 }
00387 LOOPINFO* li = Array_Summary()->Get_loopinfo_array(loop_info_index);
00388 li->WB_Print(fp, loop_info_index);
00389 }
00390
00391
00392
00393
00394
00395
00396
00397 void WB_BROWSER::Summary_Phi(FILE* fp,
00398 INT phi_index)
00399 {
00400 if (Scalar_Summary() == NULL || phi_index < 0
00401 || phi_index > Scalar_Summary()->Get_phi_idx()) {
00402 Error_Cleanup();
00403 return;
00404 }
00405 SUMMARY_PHI* sp = Scalar_Summary()->Get_phi(phi_index);
00406 sp->WB_Print(fp, phi_index);
00407 }
00408
00409
00410
00411
00412
00413
00414
00415 void WB_BROWSER::Summary_Chi(FILE* fp,
00416 INT chi_index)
00417 {
00418 if (Scalar_Summary() == NULL || chi_index < 0
00419 || chi_index > Scalar_Summary()->Get_chi_idx()) {
00420 Error_Cleanup();
00421 return;
00422 }
00423 SUMMARY_CHI* sc = Scalar_Summary()->Get_chi(chi_index);
00424 char* name = NULL;
00425 if (sc->Get_symbol_index() != -1) {
00426 INT symbol_index = sc->Get_symbol_index();
00427 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00428 name = ST_name(ss->St_idx());
00429 }
00430 sc->WB_Print(fp, chi_index, name, "");
00431 }
00432
00433
00434
00435
00436
00437
00438
00439 void WB_BROWSER::Summary_Expr(FILE* fp,
00440 INT expr_index)
00441 {
00442 if (Scalar_Summary() == NULL || expr_index < 0
00443 || expr_index > Scalar_Summary()->Get_expr_idx()) {
00444 Error_Cleanup();
00445 return;
00446 }
00447 SUMMARY_EXPR* se = Scalar_Summary()->Get_expr(expr_index);
00448 se->WB_Print(fp, expr_index);
00449 }
00450
00451
00452
00453
00454
00455
00456
00457 void WB_BROWSER::Summary_Stid(FILE* fp,
00458 INT stid_index)
00459
00460 {
00461 if (Scalar_Summary() == NULL || stid_index < 0
00462 || stid_index > Scalar_Summary()->Get_global_stid_idx()) {
00463 Error_Cleanup();
00464 return;
00465 }
00466 SUMMARY_STID* stid = Scalar_Summary()->Get_global_stid(stid_index);
00467 char* name = NULL;
00468 if (!stid->Is_array_assignment()) {
00469 INT symbol_index = stid->Get_symbol_index();
00470 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00471 name = ST_name(ss->St_idx());
00472 }
00473 stid->WB_Print(fp, stid_index, name, "");
00474 }
00475
00476
00477
00478
00479
00480
00481
00482 void WB_BROWSER::Summary_Stmt(FILE* fp,
00483 INT stmt_index)
00484 {
00485 if (Scalar_Summary() == NULL || stmt_index < 0
00486 || stmt_index > Scalar_Summary()->Get_stmt_idx()) {
00487 Error_Cleanup();
00488 return;
00489 }
00490 SUMMARY_STMT* stmt = Scalar_Summary()->Get_stmt(stmt_index);
00491 char* name = NULL;
00492 if (stmt->Is_var()) {
00493 INT symbol_index = stmt->Get_var_index();
00494 SUMMARY_SYMBOL* ss = Scalar_Summary()->Get_symbol(symbol_index);
00495 name = ST_name(ss->St_idx());
00496 }
00497 stmt->WB_Print(fp, stmt_index, name, "");
00498 }
00499
00500
00501
00502
00503
00504
00505
00506 void WB_BROWSER::Summary_Feedback(FILE* fp,
00507 INT feedback_index)
00508 {
00509 if (Scalar_Summary() == NULL || feedback_index < 0
00510 || feedback_index > Scalar_Summary()->Get_feedback_idx()) {
00511 Error_Cleanup();
00512 return;
00513 }
00514 SUMMARY_FEEDBACK* sf = Scalar_Summary()->Get_feedback(feedback_index);
00515 sf->WB_Print(fp, feedback_index);
00516 }
00517
00518
00519
00520
00521
00522
00523
00524 BOOL WB_BROWSER::Summary_Scalar_Command(char ch)
00525 {
00526 switch (ch) {
00527 case 'S':
00528 case 'F':
00529 case 'G':
00530 case 'A':
00531 case 'V':
00532 case 'C':
00533 case 'K':
00534 case 'D':
00535 case 'L':
00536 case 'p':
00537 case 'x':
00538 case 'E':
00539 case 'X':
00540 case 'Y':
00541 case 'f':
00542 case 'P':
00543 return TRUE;
00544 default:
00545 return FALSE;
00546 }
00547 }
00548
00549
00550
00551
00552
00553
00554
00555 BOOL WB_BROWSER::Summary_Array_Command(char ch)
00556 {
00557 switch (ch) {
00558 case 'I':
00559 case 'J':
00560 case 'a':
00561 case 's':
00562 case 'R':
00563 case 'r':
00564 case 'n':
00565 case 't':
00566 case 'l':
00567 return TRUE;
00568 default:
00569 return FALSE;
00570 }
00571 }
00572
00573
00574
00575
00576
00577
00578
00579 BOOL WB_BROWSER::Summary_Valid_Command(char ch)
00580 {
00581 return (Summary_Scalar_Command(ch) || Summary_Array_Command(ch));
00582 }
00583
00584
00585
00586
00587
00588
00589
00590 INT WB_BROWSER::Summary_Size(char ch)
00591 {
00592 switch (ch) {
00593 case 'S':
00594 return Scalar_Summary()->Get_symbol_idx() + 1;
00595 case 'I':
00596 return Array_Summary()->Get_ivar_array_count();
00597 case 'F':
00598 return Scalar_Summary()->Get_formal_idx() + 1;
00599 case 'G':
00600 return Scalar_Summary()->Get_global_idx() + 1;
00601 case 'A':
00602 return Scalar_Summary()->Get_actual_idx() + 1;
00603 case 'V':
00604 return Scalar_Summary()->Get_value_idx() + 1;
00605 case 'C':
00606 return Scalar_Summary()->Get_common_idx() + 1;
00607 case 'K':
00608 return Scalar_Summary()->Get_common_shape_idx() + 1;
00609 case 'D':
00610 return Scalar_Summary()->Get_ctrl_dep_idx() + 1;
00611 case 'L':
00612 return Scalar_Summary()->Get_callsite_idx() + 1;
00613 case 'a':
00614 return Array_Summary()->Get_cfg_node_array_count();
00615 case 'R':
00616 return Array_Summary()->Get_region_array_count();
00617 case 'r':
00618 return Array_Summary()->Get_projected_region_array_count();
00619 case 'n':
00620 return Array_Summary()->Get_projected_array_count();
00621 case 't':
00622 return Array_Summary()->Get_term_array_count();
00623 case 'l':
00624 return Array_Summary()->Get_loopinfo_array_count();
00625 case 'p':
00626 return Scalar_Summary()->Get_phi_idx() + 1;
00627 case 'x':
00628 return Scalar_Summary()->Get_chi_idx() + 1;
00629 case 'T':
00630 return 0;
00631 case 'E':
00632 return Scalar_Summary()->Get_expr_idx() + 1;
00633 case 'X':
00634 return Scalar_Summary()->Get_global_stid_idx() + 1;
00635 case 'Y':
00636 return Scalar_Summary()->Get_stmt_idx() + 1;
00637 case 'f':
00638 return Scalar_Summary()->Get_feedback_idx() + 1;
00639 case 'P':
00640 return Scalar_Summary()->Get_procedure_idx() + 1;
00641 default:
00642 FmtAssert(FALSE, ("WB_BROWSER::Summary_Size(): Unexpected command"));
00643 return -1;
00644 }
00645 }
00646
00647
00648
00649
00650
00651
00652
00653 void WB_BROWSER::Summary_Single(FILE* fp,
00654 char ch,
00655 INT index,
00656 BOOL is_list)
00657 {
00658 switch (ch) {
00659 case 'S':
00660 Summary_Symbol(fp, index, is_list);
00661 break;
00662 case 'I':
00663 Summary_Ivar(fp, index);
00664 break;
00665 case 'F':
00666 Summary_Formal(fp, index);
00667 break;
00668 case 'G':
00669 Summary_Global(fp, index);
00670 break;
00671 case 'A':
00672 Summary_Actual(fp, index);
00673 break;
00674 case 'V':
00675 Summary_Value(fp, index);
00676 break;
00677 case 'C':
00678 Summary_Common(fp, index);
00679 break;
00680 case 'K':
00681 Summary_Common_Shape(fp, index);
00682 break;
00683 case 'D':
00684 Summary_Control_Dependence(fp, index);
00685 break;
00686 case 'L':
00687 Summary_Callsite(fp, index);
00688 break;
00689 case 'a':
00690 Summary_Cfg_Node(fp, index);
00691 break;
00692 case 'R':
00693 Summary_Region(fp, index);
00694 break;
00695 case 'r':
00696 Summary_Projected_Region(fp, index);
00697 break;
00698 case 'n':
00699 Summary_Projected_Node(fp, index);
00700 break;
00701 case 't':
00702 Summary_Term(fp, index);
00703 break;
00704 case 'l':
00705 Summary_Loop_Info(fp, index);
00706 break;
00707 case 'p':
00708 Summary_Phi(fp, index);
00709 break;
00710 case 'x':
00711 Summary_Chi(fp, index);
00712 break;
00713 case 'T':
00714 break;
00715 case 'X':
00716 Summary_Stid(fp, index);
00717 break;
00718 case 'Y':
00719 Summary_Stmt(fp, index);
00720 break;
00721 case 'E':
00722 Summary_Expr(fp, index);
00723 break;
00724 case 'f':
00725 Summary_Feedback(fp, index);
00726 break;
00727 case 'P':
00728 Summary_Procedure(fp, index);
00729 break;
00730 default:
00731 FmtAssert(FALSE, ("WB_BROWSER::Summary_Single(): Unexpected command"));
00732 break;
00733 }
00734 }
00735
00736
00737
00738
00739
00740
00741
00742 void WB_BROWSER::Summary(FILE* fp)
00743 {
00744 Set_Subcommand('~');
00745 char ch = Buffer().Scan_Character();
00746 if (Summary_Valid_Command(ch)) {
00747 if (Summary_Scalar_Command(ch) && Scalar_Summary() == NULL
00748 || Summary_Array_Command(ch) && Array_Summary() == NULL) {
00749 Error_Cleanup();
00750 return;
00751 }
00752 INT index = -1;
00753 INT count = Summary_Size(ch);
00754 if (Buffer().Is('[')) {
00755 Buffer().Scan_Character();
00756 INT low_index = -1;
00757 Buffer().Scan_Integer(&low_index);
00758 if (low_index < 0 || low_index >= count) {
00759 Error_Cleanup();
00760 return;
00761 }
00762 char separator = Buffer().Scan_Character();
00763 switch (separator) {
00764 case ':': {
00765 INT local_count = -1;
00766 Buffer().Scan_Integer(&local_count);
00767 if (local_count < 0 || local_count > count) {
00768 Error_Cleanup();
00769 return;
00770 }
00771 for (INT i = low_index; i < low_index + local_count; i++)
00772 Summary_Single(fp, ch, i, TRUE);
00773 break;
00774 }
00775 case '-': {
00776 INT high_index = -1;
00777 Buffer().Scan_Integer(&high_index);
00778 if (high_index < low_index || high_index > count) {
00779 Error_Cleanup();
00780 return;
00781 }
00782 for (INT i = low_index; i <= high_index; i++)
00783 Summary_Single(fp, ch, i, TRUE);
00784 break;
00785 }
00786 default:
00787 Error_Cleanup();
00788 return;
00789 }
00790 Buffer().Skip_Chars(1);
00791 } else if (Buffer().Is_Integer()) {
00792 Buffer().Scan_Integer(&index);
00793 if (index < 0 || index >= count) {
00794 Error_Cleanup();
00795 return;
00796 }
00797 Summary_Single(fp, ch, index, FALSE);
00798 } else {
00799 for (INT i = 0; i < count; i++)
00800 Summary_Single(fp, ch, i, TRUE);
00801 }
00802 } else if (ch == '=') {
00803 fprintf(stdout, "Summary Locate Not Implemented\n");
00804 Buffer().Pushback_Character();
00805 } else if (ch == 'H') {
00806 Help();
00807 } else if (ch == '\n') {
00808 fprintf(stdout, "Missing character\n");
00809 Buffer().Pushback_Character();
00810 } else {
00811 fprintf(stdout, "Bad character: %c\n", ch);
00812 }
00813 Reset_Subcommand();
00814 }
00815