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