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
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #include "instr_reader.h"
00062 #include "instr_memory.h"
00063
00064
00065 template <class _Key> struct ihash { };
00066 template <> struct ihash<UINT64> {
00067 size_t operator()(const UINT64 x)const{return (size_t)x;}
00068 };
00069
00070 typedef hash_map<UINT64, char*, ihash<UINT64> > ADDRESS_NAME_MAP;
00071 typedef hash_map<UINT64, INT32, ihash<UINT64> > ADDRESS_PUSIZE_MAP;
00072
00073 extern ADDRESS_NAME_MAP PU_Addr_Name_Map;
00074 extern ADDRESS_PUSIZE_MAP PU_Addr_Pusize_Map;
00075
00076 static char* ERR_POS = "Error in positioning within %s";
00077 static char* ERR_READ = "Error in reading from %s";
00078
00079 static char* ERR_WRITE = "Error in writing to %s";
00080
00081 #ifndef _BUILD_INSTR
00082
00083 BOOL Feedback_Enabled[PROFILE_PHASE_LAST] = {FALSE,FALSE,FALSE,FALSE,FALSE};
00084 Fb_File_Info_Vector Feedback_File_Info[PROFILE_PHASE_LAST];
00085
00086 void
00087 Process_Feedback_File(char *fb_name)
00088 {
00089 FILE *fp;
00090 Fb_Hdr fb_hdr;
00091 Pu_Hdr *pu_hdr_table;
00092 char *str_table;
00093 PROFILE_PHASE phase_num;
00094
00095 if ((fp = fopen(fb_name, "r")) == NULL) {
00096 profile_error("Unable to open file: %s", fb_name);
00097 }
00098
00099
00100 Get_File_Header(fp, fb_name, &fb_hdr);
00101
00102 Is_True(fb_hdr.fb_version == INSTR_CURRENT, ("feedback file not right version") );
00103
00104 pu_hdr_table = CXX_NEW_ARRAY(Pu_Hdr, fb_hdr.fb_pu_hdr_num,
00105 MEM_pu_nz_pool_ptr);
00106
00107 Get_Pu_Hdr_Table(fp,fb_name,fb_hdr,pu_hdr_table);
00108
00109 str_table = CXX_NEW_ARRAY(char, fb_hdr.fb_str_table_size,
00110 MEM_pu_nz_pool_ptr);
00111 Get_Str_Table(fp, fb_name,fb_hdr,str_table);
00112
00113 phase_num = Get_Phase_Num(fb_hdr);
00114
00115 Feedback_Enabled[phase_num] = TRUE;
00116
00117 Fb_File_Info_Vector& fi = Feedback_File_Info[phase_num];
00118
00119 fi.push_back (CXX_NEW(Fb_File_Info(fb_name, fp, fb_hdr, pu_hdr_table,
00120 str_table),
00121 MEM_pu_nz_pool_ptr));
00122 }
00123
00124 void
00125 Close_Feedback_Files()
00126 {
00127
00128 INT32 i;
00129
00130 for (i = (INT32)PROFILE_PHASE_BEFORE_VHO;
00131 i < (INT32) PROFILE_PHASE_LAST;
00132 i++)
00133 {
00134 if (Feedback_Enabled[i]) {
00135 for (File_Info_Iterator iter (Feedback_File_Info[i].begin ());
00136 iter != Feedback_File_Info[i].end (); ++iter)
00137 fclose((*iter)->fp);
00138 }
00139 }
00140 }
00141
00142
00143 PROFILE_PHASE
00144 Get_Phase_Num(Fb_Hdr& fb_hdr)
00145 {
00146 return fb_hdr.phase_num;
00147 }
00148
00149
00150 PU_PROFILE_HANDLES
00151 Get_PU_Profile (char *pu_name, char *src_fname,
00152 Fb_File_Info_Vector& file_info_vector)
00153 {
00154 PU_PROFILE_HANDLES handles (MEM_pu_nz_pool_ptr);
00155
00156 for (File_Info_Iterator i (file_info_vector.begin ());
00157 i != file_info_vector.end (); ++i) {
00158 Fb_File_Info* file_info = *i;
00159 PU_PROFILE_HANDLE handle = Get_PU_Profile (pu_name, src_fname,
00160 file_info->fp,
00161 file_info->name,
00162 file_info->fb_hdr,
00163 file_info->pu_hdr_table,
00164 file_info->str_table);
00165 if (handle)
00166 handles.push_back (handle);
00167 }
00168
00169 return handles;
00170 }
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 PU_PROFILE_HANDLE
00181 Get_PU_Profile(char *pu_name, char *src_fname, FILE *fp, char *fb_fname,
00182 Fb_Hdr& fb_hdr, Pu_Hdr *pu_hdr_table, char *str_table)
00183 {
00184 PU_PROFILE_HANDLE pu_handle;
00185 Pu_Hdr pu_hdr_entry;
00186 long pu_ofst;
00187 char *entry_name;
00188 int pu_size;
00189
00190
00191
00192
00193 char *s;
00194 s = CXX_NEW_ARRAY(char, strlen(src_fname) + strlen("/") + strlen(pu_name)
00195 + 1, MEM_pu_nz_pool_ptr);
00196
00197 strcpy(s,src_fname);
00198 strcat(s,"/");
00199 strcat(s,pu_name);
00200
00201
00202 for (long j = 0; j < fb_hdr.fb_pu_hdr_num; j++) {
00203 pu_hdr_entry = pu_hdr_table[j];
00204 entry_name = str_table + pu_hdr_entry.pu_name_index;
00205 pu_size = pu_hdr_entry.pu_size;
00206 PU_Addr_Name_Map[pu_hdr_entry.runtime_fun_address] = entry_name;
00207 PU_Addr_Pusize_Map[pu_hdr_entry.runtime_fun_address] = pu_size;
00208 }
00209
00210
00211 for (long i = 0; i < fb_hdr.fb_pu_hdr_num; i++) {
00212 pu_hdr_entry = pu_hdr_table[i];
00213 entry_name = str_table + pu_hdr_entry.pu_name_index;
00214 if (strcmp(s, entry_name) == 0) break;
00215 }
00216
00217
00218 if (strcmp(s, entry_name) != 0)
00219 return NULL;
00220
00221 pu_ofst = fb_hdr.fb_profile_offset + pu_hdr_entry.pu_file_offset;
00222
00223 pu_handle = CXX_NEW(PU_Profile_Handle(entry_name, pu_hdr_entry.pu_checksum),
00224 MEM_pu_nz_pool_ptr);
00225 #ifdef KEY
00226 pu_handle->pu_size = pu_hdr_entry.pu_size;
00227 pu_handle->runtime_fun_address = pu_hdr_entry.runtime_fun_address;
00228 if (fb_fname)
00229 {
00230 pu_handle->fb_name = (char *) malloc (strlen (fb_fname) + 1);
00231 strcpy (pu_handle->fb_name, fb_fname);
00232 }
00233 #endif
00234
00235 read_invoke_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00236 read_branch_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00237 read_switch_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00238 read_cgoto_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00239 read_loop_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00240 read_scircuit_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00241 read_call_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00242 #ifdef KEY
00243 read_value_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00244 read_value_fp_bin_profile(pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00245 #endif
00246 read_icall_profile( pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00247
00248 return pu_handle;
00249 }
00250
00251 PU_PROFILE_HANDLES
00252 Get_CG_PU_Profile (char* srcfile_pu_name, Fb_File_Info_Vector& file_info_vector)
00253 {
00254 PU_PROFILE_HANDLES handles (MEM_pu_nz_pool_ptr);
00255
00256 for (File_Info_Iterator i (file_info_vector.begin ());
00257 i != file_info_vector.end (); ++i) {
00258 Fb_File_Info* file_info = *i;
00259 PU_PROFILE_HANDLE handle = Get_CG_PU_Profile (srcfile_pu_name,
00260 file_info->fp,
00261 file_info->name,
00262 file_info->fb_hdr,
00263 file_info->pu_hdr_table,
00264 file_info->str_table);
00265 if (handle)
00266 handles.push_back (handle);
00267 }
00268 return handles;
00269 }
00270
00271 PU_PROFILE_HANDLE
00272 Get_CG_PU_Profile(char* srcfile_pu_name, FILE* fp, char *fb_fname, Fb_Hdr& fb_hdr,Pu_Hdr *pu_hdr_table, char* str_table)
00273 {
00274 PU_PROFILE_HANDLE pu_handle;
00275 Pu_Hdr pu_hdr_entry;
00276 long pu_ofst;
00277 long i;
00278 char* entry_name;
00279
00280 for (long i = 0; i < fb_hdr.fb_pu_hdr_num; i++) {
00281 pu_hdr_entry = pu_hdr_table[i];
00282 entry_name = str_table + pu_hdr_entry.pu_name_index;
00283 if (strcmp(srcfile_pu_name, entry_name) == 0) break;
00284 }
00285
00286
00287 if (strcmp(srcfile_pu_name, entry_name) != 0)
00288 return NULL;
00289
00290
00291 if (pu_hdr_entry.pu_num_edge_entries == 0)
00292 return NULL;
00293
00294 pu_ofst = fb_hdr.fb_profile_offset + pu_hdr_entry.pu_file_offset;
00295
00296 pu_handle = CXX_NEW(PU_Profile_Handle(NULL, pu_hdr_entry.pu_checksum),
00297 MEM_pu_nz_pool_ptr);
00298 read_edge_profile(pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00299 return pu_handle;
00300 }
00301
00302 PU_PROFILE_HANDLE
00303 Get_CG_PU_Value_Profile(char* srcfile_pu_name, FILE* fp, char *fb_fname, Fb_Hdr& fb_hdr,
00304 Pu_Hdr *pu_hdr_table, char* str_table)
00305 {
00306 PU_PROFILE_HANDLE pu_handle;
00307 Pu_Hdr pu_hdr_entry;
00308 long pu_ofst;
00309 long i;
00310 char* entry_name;
00311
00312 for (long i = 0; i < fb_hdr.fb_pu_hdr_num; i++) {
00313 pu_hdr_entry = pu_hdr_table[i];
00314 entry_name = str_table + pu_hdr_entry.pu_name_index;
00315 if (strcmp(srcfile_pu_name, entry_name) == 0) break;
00316 }
00317
00318
00319 if (strcmp(srcfile_pu_name, entry_name) != 0)
00320 return NULL;
00321
00322 pu_ofst = fb_hdr.fb_profile_offset + pu_hdr_entry.pu_file_offset;
00323
00324 pu_handle = CXX_NEW(PU_Profile_Handle(NULL, pu_hdr_entry.pu_checksum),
00325 MEM_pu_nz_pool_ptr);
00326 #ifndef KEY
00327 read_value_profile(pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00328 #endif
00329 read_stride_profile(pu_handle, pu_hdr_entry, pu_ofst, fp, fb_fname );
00330
00331 return pu_handle;
00332 }
00333
00334
00335 PU_PROFILE_HANDLES
00336 Get_CG_PU_Value_Profile (char* srcfile_pu_name, Fb_File_Info_Vector& file_info_vector)
00337 {
00338 PU_PROFILE_HANDLES handles (MEM_pu_nz_pool_ptr);
00339
00340 for (File_Info_Iterator i (file_info_vector.begin ());
00341 i != file_info_vector.end (); ++i) {
00342 Fb_File_Info* file_info = *i;
00343 PU_PROFILE_HANDLE handle = Get_CG_PU_Value_Profile (srcfile_pu_name,
00344 file_info->fp,
00345 file_info->name,
00346 file_info->fb_hdr,
00347 file_info->pu_hdr_table,
00348 file_info->str_table);
00349 if (handle)
00350 handles.push_back (handle);
00351 }
00352 return handles;
00353 }
00354
00355
00356 char *
00357 Get_PU_Name(PU_PROFILE_HANDLE pu_handle)
00358 {
00359 return pu_handle->pu_name;
00360 }
00361
00362
00363 INT32
00364 Get_PU_Checksum(PU_PROFILE_HANDLE pu_handle)
00365 {
00366 return pu_handle->checksum;
00367 }
00368
00369
00370
00371
00372 size_t
00373 Get_Invoke_Table_Size(PU_PROFILE_HANDLE pu_handle)
00374 {
00375 FB_Invoke_Vector& Inv_Table = pu_handle->Get_Invoke_Table();
00376 return Inv_Table.size();
00377 }
00378
00379
00380
00381 FB_Info_Invoke&
00382 Get_Invoke_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00383 {
00384 FB_Invoke_Vector& Inv_Table = pu_handle->Get_Invoke_Table();
00385 return Inv_Table[id];
00386 }
00387
00388
00389
00390 size_t
00391 Get_Branch_Table_Size(PU_PROFILE_HANDLE pu_handle)
00392 {
00393 FB_Branch_Vector& Br_Table = pu_handle->Get_Branch_Table();
00394 return Br_Table.size();
00395 }
00396
00397 #ifdef KEY
00398 FB_Info_Value_FP_Bin& Get_Value_FP_Bin_Profile(PU_PROFILE_HANDLE pu_handle,
00399 INT32 id)
00400 {
00401 FB_Value_FP_Bin_Vector& Value_FP_Bin_Table =
00402 pu_handle->Get_Value_FP_Bin_Table();
00403 return Value_FP_Bin_Table[id];
00404 }
00405
00406
00407
00408 size_t Get_Value_FP_Bin_Table_Size(PU_PROFILE_HANDLE pu_handle)
00409 {
00410 FB_Value_FP_Bin_Vector& Value_FP_Bin_Table =
00411 pu_handle->Get_Value_FP_Bin_Table();
00412 return Value_FP_Bin_Table.size();
00413 }
00414
00415 FB_Info_Value& Get_Value_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00416 {
00417 FB_Value_Vector& Value_Table = pu_handle->Get_Value_Table();
00418 return Value_Table[id];
00419 }
00420
00421
00422
00423 size_t Get_Value_Table_Size(PU_PROFILE_HANDLE pu_handle)
00424 {
00425 FB_Value_Vector& Value_Table = pu_handle->Get_Value_Table();
00426 return Value_Table.size();
00427 }
00428 #endif // KEY
00429
00430
00431
00432 FB_Info_Branch&
00433 Get_Branch_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00434 {
00435 FB_Branch_Vector& Br_Table = pu_handle->Get_Branch_Table();
00436 return Br_Table[id];
00437 }
00438
00439
00440
00441 size_t
00442 Get_Switch_Table_Size(PU_PROFILE_HANDLE pu_handle)
00443 {
00444 FB_Switch_Vector& Switch_Table = pu_handle->Get_Switch_Table();
00445 return Switch_Table.size();
00446
00447 }
00448
00449
00450
00451 FB_Info_Switch&
00452 Get_Switch_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00453 {
00454 FB_Switch_Vector& Switch_Table = pu_handle->Get_Switch_Table();
00455 return Switch_Table[id];
00456 }
00457
00458 size_t
00459 Get_Compgoto_Table_Size(PU_PROFILE_HANDLE pu_handle)
00460 {
00461 FB_Switch_Vector& Cgoto_Table = pu_handle->Get_Compgoto_Table();
00462 return Cgoto_Table.size();
00463
00464 }
00465
00466
00467
00468 FB_Info_Switch&
00469 Get_Compgoto_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00470 {
00471 FB_Switch_Vector& Cgoto_Table = pu_handle->Get_Compgoto_Table();
00472 return Cgoto_Table[id];
00473 }
00474
00475
00476
00477 size_t
00478 Get_Loop_Table_Size(PU_PROFILE_HANDLE pu_handle)
00479 {
00480 FB_Loop_Vector& Loop_Table = pu_handle->Get_Loop_Table();
00481 return Loop_Table.size();
00482 }
00483
00484
00485
00486 FB_Info_Loop&
00487 Get_Loop_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00488 {
00489 FB_Loop_Vector& Loop_Table = pu_handle->Get_Loop_Table();
00490 return Loop_Table[id];
00491 }
00492
00493
00494
00495 size_t
00496 Get_Short_Circuit_Table_Size(PU_PROFILE_HANDLE pu_handle)
00497 {
00498 FB_Circuit_Vector& Short_Circuit_Table
00499 = pu_handle->Get_Short_Circuit_Table();
00500 return Short_Circuit_Table.size();
00501
00502 }
00503
00504
00505
00506 FB_Info_Circuit&
00507 Get_Short_Circuit_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00508 {
00509 FB_Circuit_Vector& Short_Circuit_Table
00510 = pu_handle->Get_Short_Circuit_Table();
00511 return Short_Circuit_Table[id];
00512 }
00513
00514
00515
00516 size_t
00517 Get_Call_Table_Size(PU_PROFILE_HANDLE pu_handle)
00518 {
00519 FB_Call_Vector& Call_Table = pu_handle->Get_Call_Table();
00520 return Call_Table.size();
00521 }
00522
00523
00524
00525 FB_Info_Call&
00526 Get_Call_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00527 {
00528 FB_Call_Vector& Call_Table = pu_handle->Get_Call_Table();
00529 return Call_Table[id];
00530 }
00531
00532
00533
00534 size_t
00535 Get_Icall_Table_Size(PU_PROFILE_HANDLE pu_handle)
00536 {
00537 FB_Icall_Vector& Icall_Table = pu_handle->Get_Icall_Table();
00538 return Icall_Table.size();
00539 }
00540
00541
00542
00543 FB_Info_Icall&
00544 Get_Icall_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00545 {
00546 FB_Icall_Vector& Icall_Table = pu_handle->Get_Icall_Table();
00547 return Icall_Table[id];
00548 }
00549
00550
00551
00552 FB_Info_Edge&
00553 Get_Edge_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00554 {
00555 FB_Edge_Vector& Edge_Table = pu_handle->Get_Edge_Table();
00556 return Edge_Table[id];
00557 }
00558
00559 #ifndef KEY
00560 FB_Info_Value&
00561 Get_Value_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00562 {
00563 FB_Value_Vector& Value_Table = pu_handle->Get_Value_Table();
00564 return Value_Table[id];
00565 }
00566 #endif // !KEY
00567
00568 FB_Info_Value&
00569 Get_Stride_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id)
00570 {
00571 FB_Value_Vector& Stride_Table = pu_handle->Get_Stride_Table();
00572 return Stride_Table[id];
00573 }
00574 #endif // _BUILD_INSTR
00575
00576
00577
00578 void
00579 Get_File_Header(FILE *fp, char *fname, Fb_Hdr *fb_hdr)
00580 {
00581 FSEEK(fp,0,SEEK_SET,ERR_POS,fname);
00582
00583 FREAD(fb_hdr, sizeof(Fb_Hdr), 1, fp,
00584 "Error while writing to: %s", fname);
00585 }
00586
00587
00588
00589
00590 void
00591 Get_Pu_Hdr_Table(FILE *fp, char *fname, Fb_Hdr& fb_hdr,
00592 Pu_Hdr *pu_hdr_table)
00593 {
00594 FSEEK(fp,fb_hdr.fb_pu_hdr_offset,SEEK_SET, ERR_POS, fname);
00595
00596 FREAD(pu_hdr_table, sizeof(Pu_Hdr), fb_hdr.fb_pu_hdr_num, fp, ERR_READ,
00597 fname);
00598 }
00599
00600
00601
00602
00603
00604 void
00605 Get_Str_Table(FILE *fp, char *fname, Fb_Hdr& fb_hdr, char *str_table)
00606 {
00607 FSEEK(fp,fb_hdr.fb_str_table_offset, SEEK_SET, ERR_POS, fname);
00608
00609 FREAD(str_table, sizeof(char), fb_hdr.fb_str_table_size, fp, ERR_READ,
00610 fname);
00611 }
00612
00613
00614
00615
00616 #if defined(TARG_SL)
00617
00618 #define FREQ_FP_OFFSET 3.0
00619 #define RESET_FREQ_FP_OFFSET(x) (x - FREQ_FP_OFFSET)
00620
00621 typedef UINT32 FREQ_INSTR_VALUE_TYPE;
00622 typedef float FREQ_OPT_VALUE_TYPE;
00623
00624 void
00625 cast_invoke_freq(FB_Info_Invoke* fb_ink, ULONG num_inv_items)
00626 {
00627 for(INT i=0;i<num_inv_items;i++) {
00628 FREQ_OPT_VALUE_TYPE value=(FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_ink->Get_Freq_Invoke().Get_Value()))));
00629 fb_ink->Get_Freq_Invoke().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00630 fb_ink++;
00631 }
00632
00633 return;
00634 }
00635
00636 void
00637 cast_branch_freq(FB_Info_Branch* fb_bra, ULONG num_bra_items)
00638 {
00639 for(INT i=0;i<num_bra_items;i++) {
00640 FREQ_OPT_VALUE_TYPE value;
00641 value= (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_bra->Get_Freq_Taken().Get_Value()))));
00642 fb_bra->Get_Freq_Taken().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00643
00644 value = (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_bra->Get_Freq_Not_Taken().Get_Value()))));
00645 fb_bra->Get_Freq_Not_Taken().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00646 fb_bra++;
00647 }
00648
00649 return;
00650 }
00651
00652 void
00653 cast_freq (FB_FREQ* fb, ULONG num_fb_items)
00654 {
00655 for(INT i=0;i<num_fb_items;i++) {
00656 FREQ_OPT_VALUE_TYPE value=(FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb->Get_Value()))));
00657 fb->Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00658 fb++;
00659 }
00660
00661 return;
00662 }
00663
00664 void
00665 cast_loop_freq(FB_Info_Loop* fb_loop, ULONG num_loop_items)
00666 {
00667
00668 for(INT i=0;i<num_loop_items;i++) {
00669 FREQ_OPT_VALUE_TYPE value;
00670 value= (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_loop->Get_Freq_Zero().Get_Value()))));
00671 fb_loop->Get_Freq_Zero().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00672
00673 value = (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_loop->Get_Freq_Positive().Get_Value()))));
00674 fb_loop->Get_Freq_Positive().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00675
00676 value = (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_loop->Get_Freq_Out().Get_Value()))));
00677 fb_loop->Get_Freq_Out().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00678
00679 value = (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_loop->Get_Freq_Back().Get_Value()))));
00680 fb_loop->Get_Freq_Back().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00681
00682 value = (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_loop->Get_Freq_Exit().Get_Value()))));
00683 fb_loop->Get_Freq_Exit().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00684
00685 value = (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_loop->Get_Freq_Iterate().Get_Value()))));
00686 fb_loop->Get_Freq_Iterate().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00687
00688
00689 fb_loop++;
00690 }
00691
00692 return;
00693
00694 }
00695
00696 void
00697 cast_scircuit_freq(FB_Info_Circuit* fb_cir, ULONG num_cir_items)
00698 {
00699
00700 for(INT i=0;i<num_cir_items;i++) {
00701 FREQ_OPT_VALUE_TYPE value;
00702 value= (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&( fb_cir->Get_Freq_Left().Get_Value())))) ;
00703 fb_cir->Get_Freq_Left().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00704
00705 value= (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&( fb_cir->Get_Freq_Right().Get_Value())))) ;
00706 fb_cir->Get_Freq_Right().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00707
00708 value= (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&( fb_cir->Get_Freq_Neither().Get_Value())))) ;
00709 fb_cir->Get_Freq_Neither().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00710
00711 fb_cir++;
00712 }
00713
00714 return;
00715 }
00716
00717 void
00718 cast_call_freq(FB_Info_Call* fb_call, ULONG num_call_items)
00719 {
00720 for(INT i=0;i<num_call_items;i++) {
00721 FREQ_OPT_VALUE_TYPE value;
00722 value= (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&( fb_call->Get_Freq_Entry().Get_Value())))) ;
00723 fb_call->Get_Freq_Entry().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00724
00725 value= (FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&( fb_call->Get_Freq_Exit().Get_Value())))) ;
00726 fb_call->Get_Freq_Exit().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00727
00728 fb_call++;
00729 }
00730
00731 return;
00732
00733 }
00734
00735 #ifdef KEY
00736 void
00737 cast_value_freq(FB_Info_Value* fb_val, ULONG num_val_Items)
00738 {
00739 for(INT i=0;i <num_val_Items;i++) {
00740 FREQ_OPT_VALUE_TYPE value;
00741 value=(FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&(fb_val->Get_Exe_Counter().Get_Value()))));
00742 fb_val->Get_Exe_Counter().Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00743
00744 for(INT j=0;j<TNV;j++) {
00745 value=(FREQ_OPT_VALUE_TYPE)(*((FREQ_INSTR_VALUE_TYPE*)(&((fb_val->Get_Freq())[j].Get_Value()))));
00746 ((fb_val->Get_Freq())[j]).Set_Value(RESET_FREQ_FP_OFFSET( value ) );
00747
00748 }
00749 fb_val++;
00750 }
00751
00752 return;
00753
00754 }
00755
00756 #endif
00757
00758 #endif
00759
00760
00761
00762 void
00763 read_invoke_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00764 long pu_ofst, FILE *fp, char *fname)
00765 {
00766 FB_Invoke_Vector& Inv_Table = pu_handle->Get_Invoke_Table();
00767
00768 Is_True (Inv_Table.empty (), ("pu_handle not empty"));
00769
00770 Inv_Table.resize(pu_hdr_entry.pu_num_inv_entries);
00771
00772 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_inv_offset, SEEK_SET, ERR_POS, fname);
00773
00774 FREAD (&(Inv_Table.front ()), sizeof(FB_Info_Invoke),
00775 pu_hdr_entry.pu_num_inv_entries, fp, ERR_READ, fname);
00776
00777 #if defined(TARG_SL)
00778 cast_invoke_freq(&(Inv_Table.front ()), pu_hdr_entry.pu_num_inv_entries);
00779 #endif
00780
00781 }
00782
00783
00784
00785
00786 void
00787 read_branch_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00788 long pu_ofst, FILE *fp, char *fname)
00789 {
00790 FB_Branch_Vector& Br_Table = pu_handle->Get_Branch_Table();
00791
00792 Is_True (Br_Table.empty (), ("pu_handle not empty"));
00793
00794 Br_Table.resize(pu_hdr_entry.pu_num_br_entries);
00795
00796 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_br_offset, SEEK_SET, ERR_POS, fname);
00797
00798 FREAD (&(Br_Table.front ()), sizeof(FB_Info_Branch),
00799 pu_hdr_entry.pu_num_br_entries, fp, ERR_READ, fname);
00800
00801 #if defined(TARG_SL)
00802 cast_branch_freq(&(Br_Table.front ()), pu_hdr_entry.pu_num_br_entries);
00803 #endif
00804
00805 }
00806
00807
00808
00809
00810 void
00811 read_switch_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00812 long pu_ofst, FILE *fp, char *fname)
00813 {
00814 vector<INT32> targets_vector (pu_hdr_entry.pu_num_switch_entries);
00815
00816 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_switch_target_offset, SEEK_SET,
00817 ERR_POS, fname);
00818
00819 FREAD (&(targets_vector.front ()), sizeof(INT32),
00820 pu_hdr_entry.pu_num_switch_entries, fp, ERR_READ, fname);
00821
00822 FB_Switch_Vector& Switch_Table = pu_handle->Get_Switch_Table();
00823
00824 Is_True (Switch_Table.empty (), ("pu_handle not empty"));
00825
00826 Switch_Table.resize(pu_hdr_entry.pu_num_switch_entries);
00827
00828 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_switch_offset, SEEK_SET, ERR_POS, fname);
00829
00830 vector<INT32>::const_iterator target (targets_vector.begin ());
00831 for (FB_Switch_Vector::iterator first (Switch_Table.begin ());
00832 first != Switch_Table.end (); ++first) {
00833
00834 first->freq_targets.resize (*target);
00835
00836 FREAD (&(first->freq_targets.front ()), sizeof(FB_FREQ), *target, fp,
00837 ERR_READ, fname);
00838
00839 #if defined(TARG_SL)
00840 cast_freq(&(first->freq_targets.front ()), *target);
00841 #endif
00842 ++target;
00843 }
00844 }
00845
00846
00847
00848
00849 void
00850 read_cgoto_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00851 long pu_ofst, FILE *fp, char *fname)
00852 {
00853 vector<INT32> target_vectors (pu_hdr_entry.pu_num_cgoto_entries);
00854
00855 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_cgoto_target_offset, SEEK_SET,
00856 ERR_POS, fname);
00857
00858 FREAD (&(target_vectors.front ()), sizeof(INT32),
00859 pu_hdr_entry.pu_num_cgoto_entries, fp, ERR_READ, fname);
00860
00861 FB_Switch_Vector& Cgoto_Table = pu_handle->Get_Compgoto_Table();
00862
00863 Is_True (Cgoto_Table.empty (), ("pu_handle not empty"));
00864
00865 Cgoto_Table.resize(pu_hdr_entry.pu_num_cgoto_entries);
00866
00867 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_cgoto_offset, SEEK_SET, ERR_POS, fname);
00868
00869 vector<INT32>::const_iterator target (target_vectors.begin ());
00870 for (FB_Switch_Vector::iterator first (Cgoto_Table.begin ());
00871 first != Cgoto_Table.end (); ++first) {
00872
00873 first->freq_targets.resize(*target);
00874
00875 FREAD (&(first->freq_targets.front ()), sizeof(FB_FREQ), *target, fp,
00876 ERR_READ, fname);
00877
00878 #if defined(TARG_SL)
00879 cast_freq(&(first->freq_targets.front ()), *target);
00880 #endif
00881
00882 ++target;
00883 }
00884 }
00885
00886
00887
00888
00889 void
00890 read_loop_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00891 long pu_ofst, FILE *fp, char *fname)
00892 {
00893 FB_Loop_Vector& Loop_Table = pu_handle->Get_Loop_Table();
00894
00895 Is_True (Loop_Table.empty (), ("pu_handle not empty"));
00896
00897 Loop_Table.resize(pu_hdr_entry.pu_num_loop_entries);
00898
00899 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_loop_offset, SEEK_SET, ERR_POS, fname);
00900
00901 FREAD (&(Loop_Table.front ()), sizeof (FB_Info_Loop),
00902 pu_hdr_entry.pu_num_loop_entries, fp, ERR_READ, fname);
00903
00904 #if defined(TARG_SL)
00905 cast_loop_freq(&(Loop_Table.front ()), pu_hdr_entry.pu_num_loop_entries);
00906 #endif
00907
00908 }
00909
00910
00911
00912
00913 void
00914 read_scircuit_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00915 long pu_ofst, FILE *fp, char *fname)
00916 {
00917 FB_Circuit_Vector& Scircuit_Table = pu_handle->Get_Short_Circuit_Table();
00918
00919 Is_True (Scircuit_Table.empty (), ("pu_handle not empty"));
00920
00921 Scircuit_Table.resize(pu_hdr_entry.pu_num_scircuit_entries);
00922
00923 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_scircuit_offset, SEEK_SET, ERR_POS,
00924 fname);
00925
00926 FREAD (&(Scircuit_Table.front ()), sizeof(FB_Info_Circuit),
00927 pu_hdr_entry.pu_num_scircuit_entries, fp, ERR_READ, fname);
00928
00929 #if defined(TARG_SL)
00930 cast_scircuit_freq(&(Scircuit_Table.front ()), pu_hdr_entry.pu_num_scircuit_entries);
00931 #endif
00932
00933 }
00934
00935
00936
00937
00938 void
00939 read_call_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00940 long pu_ofst, FILE *fp, char *fname)
00941 {
00942 FB_Call_Vector& Call_Table = pu_handle->Get_Call_Table();
00943
00944 Is_True (Call_Table.empty (), ("pu_handle not empty"));
00945
00946 Call_Table.resize(pu_hdr_entry.pu_num_call_entries);
00947
00948 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_call_offset, SEEK_SET, ERR_POS, fname);
00949
00950 FREAD (&(Call_Table.front ()), sizeof(FB_Info_Call),
00951 pu_hdr_entry.pu_num_call_entries, fp, ERR_READ, fname);
00952
00953 #if defined(TARG_SL)
00954 cast_call_freq(&(Call_Table.front ()), pu_hdr_entry.pu_num_call_entries);
00955 #endif
00956
00957 }
00958
00959
00960
00961
00962
00963 void
00964 read_icall_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00965 long pu_ofst, FILE *fp, char *fname)
00966 {
00967 FB_Icall_Vector& Icall_Table = pu_handle->Get_Icall_Table();
00968
00969 Is_True (Icall_Table.empty (), ("pu_handle not empty"));
00970
00971 Icall_Table.resize(pu_hdr_entry.pu_num_icall_entries);
00972
00973 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_icall_offset, SEEK_SET, ERR_POS, fname);
00974
00975 FREAD (&(Icall_Table.front ()), sizeof(FB_Info_Icall),
00976 pu_hdr_entry.pu_num_icall_entries, fp, ERR_READ, fname);
00977 }
00978
00979 #ifdef KEY
00980 void read_value_fp_bin_profile( PU_PROFILE_HANDLE pu_handle,
00981 Pu_Hdr& pu_hdr_entry,
00982 long pu_ofst, FILE *fp, char *fname )
00983 {
00984 FB_Value_FP_Bin_Vector& Value_FP_Bin_Table =
00985 pu_handle->Get_Value_FP_Bin_Table();
00986
00987 Is_True (Value_FP_Bin_Table.empty (), ("pu_handle not empty"));
00988
00989 Value_FP_Bin_Table.resize(pu_hdr_entry.pu_num_value_fp_bin_entries);
00990
00991 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_value_fp_bin_offset,
00992 SEEK_SET, ERR_POS, fname);
00993
00994 FREAD (&(Value_FP_Bin_Table.front ()), sizeof(FB_Info_Value_FP_Bin),
00995 pu_hdr_entry.pu_num_value_fp_bin_entries, fp, ERR_READ, fname);
00996 }
00997
00998 void read_value_profile( PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00999 long pu_ofst, FILE *fp, char *fname )
01000 {
01001 FB_Value_Vector& Value_Table = pu_handle->Get_Value_Table();
01002
01003 Is_True (Value_Table.empty (), ("pu_handle not empty"));
01004
01005 Value_Table.resize(pu_hdr_entry.pu_num_value_entries);
01006
01007 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_value_offset, SEEK_SET, ERR_POS, fname);
01008
01009 FREAD (&(Value_Table.front ()), sizeof(FB_Info_Value),
01010 pu_hdr_entry.pu_num_value_entries, fp, ERR_READ, fname);
01011
01012 #if defined(TARG_SL)
01013 cast_value_freq(&(Value_Table.front ()), pu_hdr_entry.pu_num_value_entries);
01014 #endif
01015
01016 }
01017 #endif // KEY
01018
01019
01020
01021 void
01022 read_edge_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
01023 long pu_ofst, FILE *fp, char *fname)
01024 {
01025 FB_Edge_Vector& Edge_Table = pu_handle->Get_Edge_Table();
01026
01027 Is_True (Edge_Table.empty (), ("pu_handle not empty"));
01028
01029 Edge_Table.resize(pu_hdr_entry.pu_num_edge_entries);
01030
01031
01032 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_edge_offset, SEEK_SET, ERR_POS, fname);
01033
01034 FREAD (&(Edge_Table.front ()), sizeof(FB_Info_Edge),
01035 pu_hdr_entry.pu_num_edge_entries, fp, ERR_READ, fname);
01036 }
01037
01038 #ifndef KEY
01039 void
01040 read_value_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
01041 long pu_ofst, FILE *fp, char *fname)
01042 {
01043 FB_Value_Vector& tnv_table = pu_handle->Get_Value_Table();
01044
01045 Is_True (tnv_table.empty (), ("TNV table in pu_handle not empty"));
01046
01047 tnv_table.resize(pu_hdr_entry.pu_instr_count);
01048
01049
01050 FSEEK(fp, pu_ofst + pu_hdr_entry.pu_value_offset, SEEK_SET, ERR_POS, fname);
01051
01052 FREAD (&(tnv_table.front ()), sizeof(FB_Info_Value),
01053 pu_hdr_entry.pu_instr_count, fp, ERR_READ, fname);
01054 }
01055 #endif // !KEY
01056
01057 void
01058 read_stride_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
01059 long pu_ofst, FILE *fp, char *fname)
01060 {
01061 FB_Value_Vector& tnv_table = pu_handle->Get_Stride_Table();
01062
01063 Is_True (tnv_table.empty (), ("TNV table in pu_handle not empty"));
01064
01065 tnv_table.resize(pu_hdr_entry.pu_ld_count);
01066
01067
01068 FSEEK(fp, pu_hdr_entry.pu_stride_offset, SEEK_SET, ERR_POS, fname);
01069
01070 FREAD (&(tnv_table.front ()), sizeof(FB_Info_Stride),
01071 pu_hdr_entry.pu_ld_count, fp, ERR_READ, fname);
01072 }
01073