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 #define __STDC_LIMIT_MACROS
00028 #include <stdint.h>
00029 #include <iostream>
00030 #include <stdio.h>
00031 #include <elf.h>
00032 #include <stdlib.h>
00033 #include "workaround.h"
00034 #include "messg.h"
00035 #include "rta.h"
00036 #include "pu_info.h"
00037 #include "ipl_summary.h"
00038 #include "wn_reader.h"
00039
00040
00041
00042
00043 template <class T>
00044 inline T* ofs2ptr(T* p, char* base) {
00045 return reinterpret_cast<T*>(base + reinterpret_cast<size_t>(p));
00046 }
00047
00048 static inline void print(FILE *fp, INT sz, unsigned char *stream)
00049 {
00050 #if 0
00051 #if defined(DEBUG)
00052 INT j = 0;
00053 while (j < sz) {
00054 if ((j % 8) == 0)
00055 fprintf(fp, "\n");
00056
00057 fprintf(fp, " %2x", *stream);
00058 stream++;
00059 j++;
00060 }
00061 fprintf(fp, "\n");
00062 #endif
00063 #endif
00064 }
00065
00066 void Build_wn_tree_from_bits(WN *node, UINT sz)
00067 {
00068 WN *wn;
00069
00070
00071
00072 #if 0
00073 OPCODE opc = (OPCODE)WN_opcode(node);
00074 if (opc == OPC_BLOCK) {
00075 wn = WN_first(node);
00076 FmtAssert(wn, ("NULL wn"));
00077
00078
00079 #endif
00080 }
00081
00082
00083 const DST_IDX DST_INVALID_IDX = {DST_INVALID_BLOCK_IDX, DST_INVALID_BYTE_IDX};
00084
00085
00086 void Print_Pu_Info_Title(FILE* f, const char *indent)
00087 {
00088 fprintf(f, "%sStid", indent);
00089 fprintf(f, " Flag");
00090 fprintf(f, " DST_IDX");
00091 fprintf(f, " Subs: ");
00092 fprintf(f, " Symtab Size Tree Size\n");
00093 }
00094
00095
00096 static void Print(FILE *f, PU_Info* pu_info, const char *indent)
00097 {
00098 fprintf(f, "%s%04x", indent, PU_Info_proc_id(pu_info));
00099 fprintf(f, " %04x", PU_Info_flags(pu_info));
00100 fprintf(f, " %06x", PU_Info_pu_dst(pu_info));
00101
00102 fprintf(f, " %10llx", PU_Info_subsect_offset(pu_info, WT_SYMTAB));
00103 fprintf(f, " %10llx", PU_Info_subsect_size(pu_info, WT_SYMTAB));
00104 fprintf(f, " %10llx", PU_Info_subsect_offset(pu_info, WT_TREE));
00105 fprintf(f, " %10llx\n", PU_Info_subsect_size(pu_info, WT_TREE));
00106 }
00107
00108
00109 const char* indent = " ";
00110
00111
00112 void Print_whirl_global_from_bits(FILE *f, BITS b, UINT sz)
00113 {
00114 fprintf(f, "Global Table:\n");
00115 print(f, sz, b);
00116
00117 }
00118
00119
00120
00121 void
00122 IPA_Trace_Summary_Section (FILE *f,
00123 const void *sbase)
00124 {
00125 SUMMARY_FILE_HEADER *file_header;
00126 SUMMARY_SYMBOL *sym_array;
00127 SUMMARY_PROCEDURE *proc_array;
00128 SUMMARY_FEEDBACK *feedback_array;
00129 SUMMARY_CALLSITE *callsite_array;
00130 SUMMARY_VALUE *value_array;
00131 SUMMARY_EXPR *expr_array;
00132 SUMMARY_PHI *phi_array;
00133 SUMMARY_CHI *chi_array;
00134 SUMMARY_STMT *stmt_array;
00135 SUMMARY_CONTROL_DEPENDENCE *ctrl_dep_array;
00136 SUMMARY_FORMAL *formal_array;
00137 SUMMARY_ACTUAL *actual_array;
00138 SUMMARY_GLOBAL *global_array;
00139 SUMMARY_STID *global_stid_array;
00140 SUMMARY_COMMON *common_array;
00141 SUMMARY_COMMON_SHAPE *common_shape_array;
00142 SUMMARY_STRUCT_ACCESS * struct_access_array;
00143
00144
00145 const char *section_base = (char *)sbase;
00146
00147 Elf64_Word* offset = (Elf64_Word*)section_base;
00148
00149 file_header = (SUMMARY_FILE_HEADER*)(section_base + *offset);
00150
00151 if (file_header == 0)
00152 return;
00153
00154 fprintf ( (FILE *)f, "IPA Summary Rev -- %d.%d \n\n",
00155 file_header->Get_version_number(), file_header->Get_minor_version_number() );
00156
00157 fprintf ( (FILE*)f, "OLevel-- O%d \n", file_header->Get_opt_level() );
00158
00159 fprintf (f, " Summary type offset size\n");
00160
00161 const char * const format = "%-24s 0x%06x 0x%06x * %-5d\t= 0x%08x\n";
00162
00163 if (file_header->Get_symbol_size () != 0)
00164 fprintf (f, format, "SYMBOL",
00165 file_header->Get_symbol_offset (),
00166 file_header->Get_symbol_entry_size (),
00167 file_header->Get_symbol_size(),
00168 file_header->Get_symbol_entry_size () *
00169 file_header->Get_symbol_size ());
00170
00171 if (file_header->Get_proc_size ())
00172 fprintf (f, format, "PROCEDURE",
00173 file_header->Get_proc_offset (),
00174 file_header->Get_proc_entry_size (),
00175 file_header->Get_proc_size(),
00176 file_header->Get_proc_entry_size () *
00177 file_header->Get_proc_size ());
00178
00179 if (file_header->Get_feedback_size ())
00180 fprintf (f, format, "FEEDBACK",
00181 file_header->Get_feedback_offset (),
00182 file_header->Get_feedback_entry_size (),
00183 file_header->Get_feedback_size(),
00184 file_header->Get_feedback_entry_size () *
00185 file_header->Get_feedback_size ());
00186
00187 if (file_header->Get_callsite_size ())
00188 fprintf (f, format, "CALLSITE",
00189 file_header->Get_callsite_offset (),
00190 file_header->Get_callsite_entry_size (),
00191 file_header->Get_callsite_size(),
00192 file_header->Get_callsite_entry_size () *
00193 file_header->Get_callsite_size ());
00194
00195 if (file_header->Get_stmt_size ())
00196 fprintf (f, format, "STMT",
00197 file_header->Get_stmt_offset (),
00198 file_header->Get_stmt_entry_size (),
00199 file_header->Get_stmt_size(),
00200 file_header->Get_stmt_entry_size () *
00201 file_header->Get_stmt_size ());
00202
00203 if (file_header->Get_ctrl_dep_size ())
00204 fprintf (f, format, "CTRL_DEP",
00205 file_header->Get_ctrl_dep_offset (),
00206 file_header->Get_ctrl_dep_entry_size (),
00207 file_header->Get_ctrl_dep_size(),
00208 file_header->Get_ctrl_dep_entry_size () *
00209 file_header->Get_ctrl_dep_size ());
00210
00211 if (file_header->Get_formal_size ())
00212 fprintf (f, format, "FORMAL",
00213 file_header->Get_formal_offset (),
00214 file_header->Get_formal_entry_size (),
00215 file_header->Get_formal_size(),
00216 file_header->Get_formal_entry_size () *
00217 file_header->Get_formal_size ());
00218
00219 if (file_header->Get_actual_size ())
00220 fprintf (f, format, "ACTUAL",
00221 file_header->Get_actual_offset (),
00222 file_header->Get_actual_entry_size (),
00223 file_header->Get_actual_size(),
00224 file_header->Get_actual_entry_size () *
00225 file_header->Get_actual_size ());
00226
00227 if (file_header->Get_value_size ())
00228 fprintf (f, format, "VALUE",
00229 file_header->Get_value_offset (),
00230 file_header->Get_value_entry_size (),
00231 file_header->Get_value_size(),
00232 file_header->Get_value_entry_size () *
00233 file_header->Get_value_size ());
00234
00235 if (file_header->Get_expr_size ())
00236 fprintf (f, format, "EXPR",
00237 file_header->Get_expr_offset (),
00238 file_header->Get_expr_entry_size (),
00239 file_header->Get_expr_size(),
00240 file_header->Get_expr_entry_size () *
00241 file_header->Get_expr_size ());
00242
00243 if (file_header->Get_phi_size ())
00244 fprintf (f, format, "PHI",
00245 file_header->Get_phi_offset (),
00246 file_header->Get_phi_entry_size (),
00247 file_header->Get_phi_size(),
00248 file_header->Get_phi_entry_size () *
00249 file_header->Get_phi_size ());
00250
00251 if (file_header->Get_chi_size ())
00252 fprintf (f, format, "CHI",
00253 file_header->Get_chi_offset (),
00254 file_header->Get_chi_entry_size (),
00255 file_header->Get_chi_size(),
00256 file_header->Get_chi_entry_size () *
00257 file_header->Get_chi_size ());
00258
00259 if (file_header->Get_global_size ())
00260 fprintf (f, format, "GLOBAL",
00261 file_header->Get_global_offset (),
00262 file_header->Get_global_entry_size (),
00263 file_header->Get_global_size(),
00264 file_header->Get_global_entry_size () *
00265 file_header->Get_global_size ());
00266
00267 if (file_header->Get_common_size ())
00268 fprintf (f, format, "COMMON",
00269 file_header->Get_common_offset (),
00270 file_header->Get_common_entry_size (),
00271 file_header->Get_common_size(),
00272 file_header->Get_common_entry_size () *
00273 file_header->Get_common_size ());
00274
00275 if (file_header->Get_common_shape_size ())
00276 fprintf (f, format, "COMMON_SHAPE",
00277 file_header->Get_common_shape_offset (),
00278 file_header->Get_common_shape_entry_size (),
00279 file_header->Get_common_shape_size(),
00280 file_header->Get_common_shape_entry_size () *
00281 file_header->Get_common_shape_size ());
00282
00283 if (file_header->Get_global_stid_size ())
00284 fprintf (f, format, "GLOBAL_STID",
00285 file_header->Get_global_stid_offset (),
00286 file_header->Get_global_stid_entry_size (),
00287 file_header->Get_global_stid_size(),
00288 file_header->Get_global_stid_entry_size () *
00289 file_header->Get_global_stid_size ());
00290
00291 if (file_header->Get_scalar_node_size ())
00292 fprintf (f, format, "SCALAR_NODE",
00293 file_header->Get_scalar_offset (),
00294 file_header->Get_scalar_node_entry_size (),
00295 file_header->Get_scalar_node_size(),
00296 file_header->Get_scalar_node_entry_size () *
00297 file_header->Get_scalar_node_size ());
00298
00299 if (file_header->Get_cfg_node_size ())
00300 fprintf (f, format, "CFG_NODE",
00301 file_header->Get_cfg_node_offset (),
00302 file_header->Get_cfg_node_entry_size (),
00303 file_header->Get_cfg_node_size(),
00304 file_header->Get_cfg_node_entry_size () *
00305 file_header->Get_cfg_node_size ());
00306
00307 if (file_header->Get_ivar_size ())
00308 fprintf (f, format, "IVAR",
00309 file_header->Get_ivar_offset (),
00310 file_header->Get_ivar_entry_size (),
00311 file_header->Get_ivar_size(),
00312 file_header->Get_ivar_entry_size () *
00313 file_header->Get_ivar_size ());
00314
00315 if (file_header->Get_loopinfo_size ())
00316 fprintf (f, format, "LOOPINFO",
00317 file_header->Get_loopinfo_offset (),
00318 file_header->Get_loopinfo_entry_size (),
00319 file_header->Get_loopinfo_size(),
00320 file_header->Get_loopinfo_entry_size () *
00321 file_header->Get_loopinfo_size ());
00322 if (file_header->Get_struct_access_size () != 0)
00323 fprintf (f, format, "FLD_ACCESS",
00324 file_header->Get_struct_access_offset (),
00325 file_header->Get_struct_access_entry_size (),
00326 file_header->Get_struct_access_size(),
00327 file_header->Get_struct_access_entry_size () *
00328 file_header->Get_struct_access_size ());
00329
00330 if (file_header->Get_symbol_size() != 0) {
00331 sym_array = (SUMMARY_SYMBOL *)
00332 (section_base + file_header->Get_symbol_offset());
00333 Ipl_Summary_Symbol = sym_array;
00334 fprintf(f, "function and symbol name NYI\n");
00335 #if 0
00336 sym_array->Print_array ( f, file_header->Get_symbol_size(),
00337 symbol_names, function_names );
00338 #endif
00339
00340 }
00341
00342 if (file_header->Get_proc_size() != 0) {
00343 proc_array = (SUMMARY_PROCEDURE *)
00344 (section_base + file_header->Get_proc_offset());
00345 proc_array->Print_array ( f, file_header->Get_proc_size() );
00346 }
00347
00348 if (file_header->Get_feedback_size() != 0) {
00349 feedback_array = (SUMMARY_FEEDBACK *)
00350 (section_base + file_header->Get_feedback_offset());
00351 feedback_array->Print_array ( f, file_header->Get_feedback_size() );
00352 }
00353
00354 if (file_header->Get_callsite_size() != 0) {
00355 callsite_array = (SUMMARY_CALLSITE*)
00356 (section_base + file_header->Get_callsite_offset());
00357 callsite_array->Print_array (f, file_header->Get_callsite_size());
00358 }
00359
00360 if (file_header->Get_actual_size() != 0) {
00361 actual_array = (SUMMARY_ACTUAL *)
00362 (section_base + file_header->Get_actual_offset());
00363 actual_array->Print_array ( f, file_header->Get_actual_size() );
00364 }
00365
00366 if (file_header->Get_value_size() != 0) {
00367 value_array = (SUMMARY_VALUE *) (section_base +
00368 file_header->Get_value_offset());
00369 value_array->Print_array ( f, file_header->Get_value_size() );
00370 }
00371
00372 if (file_header->Get_expr_size() != 0) {
00373 expr_array = (SUMMARY_EXPR *) (section_base +
00374 file_header->Get_expr_offset());
00375 expr_array->Print_array ( f, file_header->Get_expr_size() );
00376 }
00377
00378 if (file_header->Get_phi_size() != 0) {
00379 phi_array = (SUMMARY_PHI *) (section_base +
00380 file_header->Get_phi_offset());
00381 phi_array->Print_array ( f, file_header->Get_phi_size() );
00382 }
00383
00384 if (file_header->Get_chi_size() != 0) {
00385 chi_array = (SUMMARY_CHI *) (section_base +
00386 file_header->Get_chi_offset());
00387 chi_array->Print_array ( f, file_header->Get_chi_size() );
00388 }
00389
00390 if (file_header->Get_stmt_size() != 0) {
00391 stmt_array = (SUMMARY_STMT *) (section_base +
00392 file_header->Get_stmt_offset());
00393 stmt_array->Print_array ( f, file_header->Get_stmt_size() );
00394 }
00395
00396 if (file_header->Get_ctrl_dep_size() != 0) {
00397 ctrl_dep_array = (SUMMARY_CONTROL_DEPENDENCE *)
00398 (section_base + file_header->Get_ctrl_dep_offset());
00399 ctrl_dep_array->Print_array ( f, file_header->Get_ctrl_dep_size() );
00400 }
00401
00402 if (file_header->Get_formal_size() != 0) {
00403 formal_array = (SUMMARY_FORMAL *) (section_base +
00404 file_header->Get_formal_offset());
00405 formal_array->Print_array ( f, file_header->Get_formal_size() );
00406 }
00407
00408 if (file_header->Get_global_size() != 0) {
00409 global_array = (SUMMARY_GLOBAL *)
00410 (section_base + file_header->Get_global_offset());
00411 global_array->Print_array ( f, file_header->Get_global_size() );
00412 }
00413
00414 if (file_header->Get_global_stid_size() != 0) {
00415 global_stid_array = (SUMMARY_STID *)
00416 (section_base + file_header->Get_global_stid_offset());
00417 global_stid_array->Print_array ( f, file_header->Get_global_stid_size() );
00418 }
00419
00420 if (file_header->Get_common_size() != 0) {
00421 common_array = (SUMMARY_COMMON *)
00422 (section_base + file_header->Get_common_offset());
00423 common_array->Print_array ( f, file_header->Get_common_size() );
00424 }
00425
00426 if (file_header->Get_common_shape_size() != 0) {
00427 common_shape_array = (SUMMARY_COMMON_SHAPE *)
00428 (section_base + file_header->Get_common_shape_offset());
00429 common_shape_array->Print_array(f,
00430 file_header->Get_common_shape_size() );
00431
00432 }
00433 if (file_header->Get_struct_access_size() != 0) {
00434 struct_access_array = (SUMMARY_STRUCT_ACCESS *)
00435 (section_base + file_header->Get_struct_access_offset());
00436 struct_access_array->Print_array ( f, file_header->Get_struct_access_size() );
00437 }
00438
00439 fprintf(f, "array_summary trace NYI\n");
00440
00441 }
00442
00443 void Print_whirl_summary_from_bits(FILE *f, BITS b, UINT sz)
00444 {
00445 Elf64_Word sum_bgn = readword64(b, b, sz);
00446 SUMMARY_FILE_HEADER *sum_hdr = (SUMMARY_FILE_HEADER* )(b + sum_bgn);
00447 if (sum_hdr == 0) {
00448 fprintf(f, "Empty summary\n");
00449 return;
00450 }
00451
00452 IPA_Trace_Summary_Section(f, b);
00453
00454 }
00455
00456
00457 void Print_whirl_pu_from_bits(FILE *f, BITS b, UINT sz)
00458 {
00459 fprintf(f, "Pu_Info:\n");
00460
00461
00462
00463 Elf64_Word pu_bgn = readword64(b, b, sz);
00464 INT ver_num = readword32(b+pu_bgn, b, sz);
00465 FmtAssert((ver_num == PU_HEADER_VERSION), ("wrong Summary info version"));
00466
00467 BITS pb = b + pu_bgn + sizeof(mINT32);
00468 mINT32 pu_num = readword32(pb, b, sz);
00469 FmtAssert((pu_num >= 0), ("pu number cannot be negative"));
00470
00471 pb += sizeof(mINT32);
00472
00473 INT prev;
00474 PU_Info* pu_hdr = (PU_Info *)(calloc(pu_num, sizeof(PU_Info)));
00475 PU_Info* pu = pu_hdr;
00476 for (INT i = 0; i < pu_num; i++, pu++) {
00477 PU_Info_cu_dst(pu) = DST_INVALID_IDX;
00478 PU_Info_proc_id(pu) = readword32(pb, b, sz);
00479 PU_Info_flags(pu) = readword32(pb+sizeof(mINT32), b, sz);
00480 PU_Info_pu_dst(pu) = *(DST_IDX *)(pb+sizeof(mINT32)+sizeof(mINT32));
00481 pb += sizeof(mINT32) + sizeof(mINT32) + sizeof(DST_IDX);
00482
00483 prev = readword32(pb, b, sz);
00484 pb += sizeof(mINT32);
00485
00486 if (prev == -1) {
00487 if (i != 0)
00488 PU_Info_child(&pu[i-1]) = pu;
00489 }
00490 else {
00491 PU_Info_next(&pu[prev]) = pu;
00492 }
00493 }
00494
00495 INT subsec_num = readword32(pb, b, sz);
00496 pb += sizeof(mINT32);
00497
00498 for (INT i=0; i<subsec_num; i++) {
00499 INT32 id = readword32(pb, b, sz);
00500 pb += sizeof(mINT32);
00501 if (id > WT_LAST) {
00502
00503 pb += pu_num * 2 * sizeof(Elf64_Word);
00504 continue;
00505 }
00506
00507 pu = pu_hdr;
00508 for (INT k=0; k<pu_num; k++, pu++) {
00509 PU_Info_subsect_offset(pu, id) = readword64(pb, b, sz);
00510 PU_Info_subsect_size(pu, id) = readword64(pb+sizeof(Elf64_Word), b, sz);
00511 pb += (sizeof(Elf64_Word) + sizeof(Elf64_Word));
00512 }
00513 }
00514
00515 Print_Pu_Info_Title(f, indent);
00516 for (INT i=0; i<pu_num; i++) {
00517 Print(f, &pu_hdr[i], indent);
00518 }
00519 }
00520
00521
00522 void Print_whirl_flags_from_bits(FILE *f, BITS b, UINT sz)
00523 {
00524 fprintf(f, "%s Compile Flags:\n", SBar);
00525
00526 Elf64_Word arg_num = readword64(b, b, sz);
00527 INT32 argv_sz = arg_num * sizeof(Elf64_Word);
00528 BITS argv_bgn = b + sizeof(Elf64_Word);
00529
00530 fprintf(f, " ");
00531
00532 for (INT i = 0; i < arg_num; i++) {
00533 INT64 bits = readword64((BITS)argv_bgn, b, sz);
00534 argv_bgn += sizeof(Elf64_Word);
00535 char * str_ofs = (char *)(bits + b);
00536 fprintf(f, "%s ", str_ofs, str_ofs);
00537 }
00538 fprintf(f, "\n");
00539 }