Open64 (mfef90, whirl2f, and IR tools)
TAG: version-openad; SVN changeset: 916
|
00001 /* 00002 00003 Copyright (C) 2000, 2001 Silicon Graphics, Inc. All Rights Reserved. 00004 00005 This program is free software; you can redistribute it and/or modify it 00006 under the terms of version 2 of the GNU General Public License as 00007 published by the Free Software Foundation. 00008 00009 This program is distributed in the hope that it would be useful, but 00010 WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00012 00013 Further, this software is distributed without any warranty that it is 00014 free of the rightful claim of any third person regarding infringement 00015 or the like. Any license provided herein, whether implied or 00016 otherwise, applies only to this software file. Patent licenses, if 00017 any, provided herein do not apply to combinations of this program with 00018 other software, or any other product whatsoever. 00019 00020 You should have received a copy of the GNU General Public License along 00021 with this program; if not, write the Free Software Foundation, Inc., 59 00022 Temple Place - Suite 330, Boston MA 02111-1307, USA. 00023 00024 Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky, 00025 Mountain View, CA 94043, or: 00026 00027 http://www.sgi.com 00028 00029 For further information regarding this notice, see: 00030 00031 http://oss.sgi.com/projects/GenInfo/NoticeExplan 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 // NAME: WB_BROWSER::Summary_Symbol() 00059 // CALL GRAPH BROWSER COMMAND: 'SS' 00060 // FUNCTION: Print info about i-th SUMMARY_SYMBOL. 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 // NAME: WB_BROWSER::Summary_Ivar() 00079 // CALL GRAPH BROWSER COMMAND: 'SI' 00080 // FUNCTION: Print info about IVARs. 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 // NAME: WB_BROWSER::Summary_Formal() 00097 // CALL GRAPH BROWSER COMMAND: 'SF' 00098 // FUNCTION: Print info about i-th SUMMARY_FORMAL. 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 // NAME: WB_BROWSER::Summary_Common() 00118 // CALL GRAPH BROWSER COMMAND: 'SC' 00119 // FUNCTION: Print info about i-th SUMMARY_COMMON. 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 // NAME: WB_BROWSER::Summary_Common_Shape() 00136 // CALL GRAPH BROWSER COMMAND: 'SK' 00137 // FUNCTION: Print info about i-th SUMMARY_COMMON_SHAPE. 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 // NAME: WB_BROWSER::Summary_Procedure() 00155 // CALL GRAPH BROWSER COMMAND: 'SP' 00156 // FUNCTION: Print info about i-th SUMMARY_PROCEDURE. 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 // NAME: WB_BROWSER::Summary_Global() 00176 // CALL GRAPH BROWSER COMMAND: 'SG' 00177 // FUNCTION: Print info about i-th SUMMARY_GLOBAL. 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 // NAME: WB_BROWSER::Summary_Callsite() 00194 // CALL GRAPH BROWSER COMMAND: 'SL' 00195 // FUNCTION: Print info about i-th SUMMARY_CALLSITE. 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 // NAME: WB_BROWSER::Summary_Control_Dependence() 00218 // CALL GRAPH BROWSER COMMAND: 'SD' 00219 // FUNCTION: Print info about i-th SUMMARY_CONTROL_DEPENDENCE. 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 // NAME: WB_BROWSER::Summary_Actual() 00237 // CALL GRAPH BROWSER COMMAND: 'SA' 00238 // FUNCTION: Print info about i-th SUMMARY_ACTUAL. 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 // NAME: WB_BROWSER::Summary_Value() 00261 // CALL GRAPH BROWSER COMMAND: 'SV' 00262 // FUNCTION: Print info about i-th SUMMARY_VALUE. 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 // NAME: WB_BROWSER::Summary_Cfg_Node() 00279 // CALL GRAPH BROWSER COMMAND: 'Sa' 00280 // FUNCTION: Print info about i-th CFG_NODE_INFO. 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 // NAME: WB_BROWSER::Summary_Region() 00297 // CALL GRAPH BROWSER COMMAND: 'SR' 00298 // FUNCTION: Print info about i-th REGION_ARRAYS. 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 // NAME: WB_BROWSER::Summary_Region() 00318 // CALL GRAPH BROWSER COMMAND: 'Sr' 00319 // FUNCTION: Print info about i-th PROJECTED_REGION. 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 // NAME: WB_BROWSER::Summary_Projected_Node() 00338 // CALL GRAPH BROWSER COMMAND: 'Sn' 00339 // FUNCTION: Print info about i-th PROJECTED_NODE. 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 // NAME: WB_BROWSER::Summary_Term() 00357 // CALL GRAPH BROWSER COMMAND: 'St' 00358 // FUNCTION: Print info about i-th TERM. 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 // NAME: WB_BROWSER::Summary_Loop_Info() 00375 // CALL GRAPH BROWSER COMMAND: 'Sl' 00376 // FUNCTION: Print info about i-th LOOPINFO. 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 // NAME: WB_BROWSER::Summary_Phi() 00393 // CALL GRAPH BROWSER COMMAND: 'Sp' 00394 // FUNCTION: Print info about i-th SUMMARY_PHI. 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 // NAME: WB_BROWSER::Summary_Chi() 00411 // CALL GRAPH BROWSER COMMAND: 'Sx' 00412 // FUNCTION: Print info about i-th SUMMARY_CHI. 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 // NAME: WB_BROWSER::Summary_Expr() 00435 // CALL GRAPH BROWSER COMMAND: 'SE' 00436 // FUNCTION: Print info about i-th SUMMARY_EXPR. 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 // NAME: WB_BROWSER::Summary_Stid() 00453 // CALL GRAPH BROWSER COMMAND: 'SX' 00454 // FUNCTION: Print info about i-th SUMMARY_STID. 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 // NAME: WB_BROWSER::Summary_Stmt() 00478 // CALL GRAPH BROWSER COMMAND: 'SY' 00479 // FUNCTION: Print info about i-th SUMMARY_STMT. 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 // NAME: WB_BROWSER::Summary_Feedback() 00502 // CALL GRAPH BROWSER COMMAND: 'Sf' 00503 // FUNCTION: Print info about i-th SUMMARY_FEEDBACK. 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 // NAME: WB_BROWSER::Summary_Scalar_Command() 00520 // FUNCTION: Return TRUE if the character 'ch' represents a valid scalar 00521 // summary command, returns FALSE otherwise. 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 // NAME: WB_BROWSER::Summary_Array_Command() 00551 // FUNCTION: Return TRUE if the character 'ch' represents a valid array 00552 // summary command, returns FALSE otherwise. 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 // NAME: WB_BROWSER::Summary_Valid_Command() 00575 // FUNCTION: Return TRUE if the character 'ch' represents a valid summary 00576 // command, returns FALSE otherwise. 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 // NAME: WB_BROWSER::Summary_Size() 00586 // FUNCTION: Return the size of the summary associated with the character 00587 // 'ch' and current IPA_NODE. 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; // no more tcon in summary info. 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 // NAME: WB_BROWSER::Summary_Single() 00649 // FUNCTION: Print summary info the 'index'-th entry in the summary 00650 // indicated by character 'ch'. 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; // no more tcon in summary info. 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 // NAME: WB_BROWSER::Summary() 00738 // CALL GRAPH BROWSER COMMAND: 'S' 00739 // FUNCTION: Print summary info at this node 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