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 #ifndef instr_reader_INCLUDED
00059 #define instr_reader_INCLUDED
00060
00061 #include <stdio.h>
00062 #include "profile_com.h"
00063 #include "fb_info.h"
00064 #ifndef _BUILD_INSTR
00065 #include "mempool_allocator.h"
00066 #include "cxx_memory.h"
00067 #endif
00068
00069 #ifdef _USE_PROFILE_ERROR_ROUTINES
00070
00071
00072
00073 # include "profile_errors.h"
00074
00075 #else
00076
00077
00078
00079 #include "errors.h"
00080 #define profile_error(arg1, arg2) Fatal_Error(arg1, arg2)
00081
00082 #endif
00083
00084
00085 #define FSEEK(_fd, _position, whence, _error_message, _error_arg) \
00086 if (fseek(_fd, _position, whence) != 0) \
00087 profile_error(_error_message, _error_arg);
00088
00089 #if defined(BUILD_OS_DARWIN)
00090
00091
00092 #undef FREAD
00093 #endif
00094 #define FREAD(_buffer, _size, _nitems, _fp, _error_message, _error_arg) \
00095 if (fread((void *)_buffer, _size, _nitems, _fp) != _nitems) \
00096 profile_error(_error_message, _error_arg);
00097
00098 #if defined(TARG_SL)
00099 #define FWRITE(_buffer, _size, _nitems, _fp, _error_message, _error_arg) \
00100 if (fwrite((void *)_buffer, _size, _nitems, _fp) != _nitems) \
00101 profile_error(_error_message, _error_arg);
00102 #endif
00103
00104 #ifdef _BUILD_INSTR
00105
00106
00107
00108 typedef vector<FB_Info_Invoke> FB_Invoke_Vector;
00109 typedef vector<FB_Info_Branch> FB_Branch_Vector;
00110 typedef vector<FB_Info_Loop> FB_Loop_Vector;
00111 typedef vector<FB_Info_Circuit> FB_Circuit_Vector;
00112 typedef vector<FB_Info_Call> FB_Call_Vector;
00113 typedef vector<FB_Info_Icall> FB_Icall_Vector;
00114 typedef vector<FB_Info_Switch> FB_Switch_Vector;
00115 typedef vector<FB_Info_Edge> FB_Edge_Vector;
00116 typedef vector<FB_Info_Value> FB_Value_Vector;
00117 #ifdef KEY
00118 typedef vector<FB_Info_Value_FP_Bin> FB_Value_FP_Bin_Vector;
00119 #endif
00120 #endif
00121
00122 struct PU_Profile_Handle
00123 {
00124 FB_Invoke_Vector Invoke_Profile_Table;
00125 FB_Branch_Vector Branch_Profile_Table;
00126 FB_Switch_Vector Switch_Profile_Table;
00127 FB_Switch_Vector Compgoto_Profile_Table;
00128 FB_Loop_Vector Loop_Profile_Table;
00129 FB_Circuit_Vector Short_Circuit_Profile_Table;
00130 FB_Call_Vector Call_Profile_Table;
00131 FB_Icall_Vector Icall_Profile_Table;
00132 FB_Edge_Vector Edge_Profile_Table;
00133 FB_Value_Vector Value_Profile_Table;
00134 #ifdef KEY
00135 FB_Value_FP_Bin_Vector Value_FP_Bin_Profile_Table;
00136 #endif
00137 FB_Value_Vector Stride_Profile_Table;
00138
00139 INT32 checksum;
00140
00141 char *pu_name;
00142 #ifdef KEY
00143
00144 char *fb_name;
00145 #endif
00146 INT32 pu_size;
00147 UINT64 runtime_fun_address;
00148
00149 #ifdef _BUILD_INSTR
00150
00151 PU_Profile_Handle (char* pname = NULL, INT32 c_sum = 0) :
00152 pu_name (pname),
00153 checksum (c_sum) {
00154
00155 if (pname) {
00156 pu_name = new char[strlen(pname) + 1];
00157 strcpy (pu_name, pname);
00158 }
00159 }
00160
00161 ~PU_Profile_Handle () { delete [] pu_name; }
00162
00163 #else // _BUILD_INSTR
00164 PU_Profile_Handle (char *pname = NULL, INT32 c_sum = 0,
00165 MEM_POOL* pool = MEM_pu_nz_pool_ptr) :
00166 pu_name (pname),
00167 #ifdef KEY
00168 fb_name (NULL),
00169 #endif
00170 checksum (c_sum),
00171 Invoke_Profile_Table (pool),
00172 Branch_Profile_Table (pool),
00173 Switch_Profile_Table (pool),
00174 Compgoto_Profile_Table (pool),
00175 Loop_Profile_Table (pool),
00176 Short_Circuit_Profile_Table (pool),
00177 Call_Profile_Table (pool) {
00178
00179 if ( pname ) {
00180 pu_name = (char *) MEM_POOL_Alloc (pool, strlen (pname) + 1);
00181 strcpy(pu_name, pname);
00182 }
00183 }
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 ~PU_Profile_Handle()
00198 {
00199 #ifdef KEY
00200 free (fb_name);
00201 #endif
00202 }
00203
00204 #endif // _BUILD_INSTR
00205 FB_Invoke_Vector& Get_Invoke_Table () {
00206 return Invoke_Profile_Table;
00207 }
00208
00209 FB_Branch_Vector& Get_Branch_Table () {
00210 return Branch_Profile_Table;
00211 }
00212
00213 FB_Switch_Vector& Get_Switch_Table () {
00214 return Switch_Profile_Table;
00215 }
00216
00217 FB_Switch_Vector& Get_Compgoto_Table () {
00218 return Compgoto_Profile_Table;
00219 }
00220
00221 FB_Loop_Vector& Get_Loop_Table () {
00222 return Loop_Profile_Table;
00223 }
00224
00225 FB_Circuit_Vector& Get_Short_Circuit_Table () {
00226 return Short_Circuit_Profile_Table;
00227 }
00228
00229 FB_Call_Vector& Get_Call_Table () {
00230 return Call_Profile_Table;
00231 }
00232
00233 FB_Icall_Vector& Get_Icall_Table () {
00234 return Icall_Profile_Table;
00235 }
00236
00237 FB_Edge_Vector& Get_Edge_Table() {
00238 return Edge_Profile_Table;
00239 }
00240
00241 FB_Value_Vector& Get_Value_Table() {
00242 return Value_Profile_Table;
00243 }
00244
00245 #ifdef KEY
00246 FB_Value_FP_Bin_Vector& Get_Value_FP_Bin_Table() {
00247 return Value_FP_Bin_Profile_Table;
00248 }
00249 #endif
00250
00251 FB_Value_Vector& Get_Stride_Table() {
00252 return Stride_Profile_Table;
00253 }
00254
00255 };
00256
00257 typedef PU_Profile_Handle * PU_PROFILE_HANDLE;
00258
00259 extern void Get_File_Header(FILE *fp, char *fname, Fb_Hdr *fb_hdr);
00260
00261 extern void Get_Pu_Hdr_Table(FILE *fp, char *fname, Fb_Hdr& fb_hdr,
00262 Pu_Hdr *pu_hdr_table);
00263
00264 extern void Get_Str_Table(FILE *fp, char *fname, Fb_Hdr& fb_hdr,
00265 char *str_table);
00266
00267 extern void read_invoke_profile( PU_PROFILE_HANDLE pu_handle,
00268 Pu_Hdr& pu_hdr_entry,
00269 long pu_ofst, FILE *fp, char *fname);
00270
00271 extern void read_branch_profile( PU_PROFILE_HANDLE pu_handle,
00272 Pu_Hdr& pu_hdr_entry,
00273 long pu_ofst, FILE *fp, char *fname);
00274
00275 extern void read_switch_profile( PU_PROFILE_HANDLE pu_handle,
00276 Pu_Hdr& pu_hdr_entry,
00277 long pu_ofst, FILE *fp, char *fname);
00278
00279 extern void read_cgoto_profile( PU_PROFILE_HANDLE pu_handle,
00280 Pu_Hdr& pu_hdr_entry,
00281 long pu_ofst, FILE *fp, char *fname);
00282
00283 extern void read_loop_profile( PU_PROFILE_HANDLE pu_handle,
00284 Pu_Hdr& pu_hdr_entry,
00285 long pu_ofst, FILE *fp, char *fname);
00286
00287 extern void read_scircuit_profile(PU_PROFILE_HANDLE pu_handle,
00288 Pu_Hdr& pu_hdr_entry,
00289 long pu_ofst, FILE *fp, char *fname);
00290
00291 extern void read_call_profile( PU_PROFILE_HANDLE pu_handle,
00292 Pu_Hdr& pu_hdr_entry,
00293 long pu_ofst, FILE *fp, char *fname);
00294
00295 extern void read_icall_profile( PU_PROFILE_HANDLE pu_handle,
00296 Pu_Hdr& pu_hdr_entry,
00297 long pu_ofst, FILE *fp, char *fname);
00298
00299 extern void read_edge_profile( PU_PROFILE_HANDLE pu_handle,
00300 Pu_Hdr& pu_hdr_entry,
00301 long pu_ofst, FILE *fp, char *fname);
00302
00303 extern void read_value_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00304 long pu_ofst, FILE *fp, char *fname);
00305
00306 #ifdef KEY
00307 extern void read_value_fp_bin_profile(PU_PROFILE_HANDLE pu_handle,
00308 Pu_Hdr& pu_hdr_entry,
00309 long pu_ofst, FILE *fp, char *fname);
00310 #endif
00311
00312 extern void read_stride_profile(PU_PROFILE_HANDLE pu_handle, Pu_Hdr& pu_hdr_entry,
00313 long pu_ofst, FILE *fp, char *fname);
00314
00315 #ifndef _BUILD_INSTR
00316
00317 struct Fb_File_Info {
00318 char *name;
00319 FILE *fp;
00320 Fb_Hdr fb_hdr;
00321 Pu_Hdr *pu_hdr_table;
00322 char *str_table;
00323
00324 Fb_File_Info() {}
00325 Fb_File_Info(char *nm, FILE *fptr, Fb_Hdr fhdr, Pu_Hdr *ptbl, char *stbl) :
00326 name(nm), fp(fptr), fb_hdr(fhdr), pu_hdr_table(ptbl),
00327 str_table(stbl)
00328 {
00329 #ifdef KEY
00330 if ( nm ) {
00331 name = (char *) malloc (strlen (nm) + 1);
00332 strcpy(name, nm);
00333 }
00334 #endif
00335 }
00336 ~Fb_File_Info()
00337 {
00338 #ifdef KEY
00339 free (name);
00340 #endif
00341 }
00342 };
00343
00344 extern BOOL Feedback_Enabled[PROFILE_PHASE_LAST];
00345 typedef vector<Fb_File_Info*> Fb_File_Info_Vector;
00346 typedef Fb_File_Info_Vector::iterator File_Info_Iterator;
00347 extern Fb_File_Info_Vector Feedback_File_Info[PROFILE_PHASE_LAST];
00348
00349
00350
00351 extern void Process_Feedback_File(char *fb_name);
00352
00353 extern void Close_Feedback_Files();
00354
00355 typedef vector<PU_PROFILE_HANDLE, mempool_allocator<PU_PROFILE_HANDLE> >
00356 PU_PROFILE_HANDLES;
00357 typedef PU_PROFILE_HANDLES::iterator PU_PROFILE_ITERATOR;
00358
00359 extern PU_PROFILE_HANDLES
00360 Get_PU_Profile (char *pu_name, char *src_fname,
00361 Fb_File_Info_Vector& file_info_vector);
00362
00363 extern PU_PROFILE_HANDLE Get_PU_Profile(char *pu_name, char *src_fname,
00364 FILE *fp, char *fb_fname,
00365 Fb_Hdr& fb_hdr, Pu_Hdr *pu_hdr_table,
00366 char *str_table);
00367
00368
00369 extern PU_PROFILE_HANDLES
00370 Get_CG_PU_Profile (char* srcfile_pu_name,Fb_File_Info_Vector& file_info_vector);
00371
00372 extern PU_PROFILE_HANDLE Get_CG_PU_Profile(char* srcfile_pu_name,
00373 FILE *fp, char *fb_fname,
00374 Fb_Hdr& fb_hdr, Pu_Hdr *pu_hdr_table, char* str_table);
00375
00376 extern PU_PROFILE_HANDLES
00377 Get_CG_PU_Value_Profile (char* srcfile_pu_name, Fb_File_Info_Vector& file_info_vector);
00378 extern PU_PROFILE_HANDLE
00379 Get_CG_PU_Value_Profile(char* srcfile_pu_name, FILE* fp, char *fb_fname, Fb_Hdr& fb_hdr, Pu_Hdr *pu_hdr_table, char* str_table);
00380
00381 extern PROFILE_PHASE Get_Phase_Num(Fb_Hdr& fb_hdr);
00382
00383 extern char * Get_PU_Name(PU_PROFILE_HANDLE pu_handle);
00384
00385 extern INT32 Get_PU_Checksum(PU_PROFILE_HANDLE pu_handle);
00386
00387 extern size_t Get_Invoke_Table_Size(PU_PROFILE_HANDLE pu_handle);
00388
00389 extern FB_Info_Invoke& Get_Invoke_Profile(PU_PROFILE_HANDLE pu_handle,
00390 INT32 id);
00391
00392 extern size_t Get_Branch_Table_Size(PU_PROFILE_HANDLE pu_handle);
00393
00394 extern FB_Info_Branch& Get_Branch_Profile(PU_PROFILE_HANDLE pu_handle,
00395 INT32 id);
00396
00397 extern size_t Get_Switch_Table_Size(PU_PROFILE_HANDLE pu_handle);
00398
00399 extern FB_Info_Switch& Get_Switch_Profile(PU_PROFILE_HANDLE pu_handle,
00400 INT32 id);
00401
00402 extern size_t Get_Compgoto_Table_Size(PU_PROFILE_HANDLE pu_handle);
00403
00404 extern FB_Info_Switch& Get_Compgoto_Profile(PU_PROFILE_HANDLE pu_handle,
00405 INT32 id);
00406
00407 #ifdef KEY
00408 extern size_t Get_Value_Table_Size(PU_PROFILE_HANDLE pu_handle);
00409
00410 extern FB_Info_Value& Get_Value_Profile(PU_PROFILE_HANDLE pu_handle,
00411 INT32 id);
00412
00413 extern size_t Get_Value_FP_Bin_Table_Size(PU_PROFILE_HANDLE pu_handle);
00414
00415 extern FB_Info_Value_FP_Bin& Get_Value_FP_Bin_Profile(PU_PROFILE_HANDLE pu_handle,
00416 INT32 id);
00417 #endif
00418
00419 extern size_t Get_Loop_Table_Size(PU_PROFILE_HANDLE pu_handle);
00420
00421 extern FB_Info_Loop& Get_Loop_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id);
00422
00423 extern size_t Get_Short_Circuit_Table_Size(PU_PROFILE_HANDLE pu_handle);
00424
00425 extern FB_Info_Circuit& Get_Short_Circuit_Profile(PU_PROFILE_HANDLE pu_handle,
00426 INT32 id);
00427
00428 extern size_t Get_Call_Table_Size(PU_PROFILE_HANDLE pu_handle);
00429
00430 extern FB_Info_Call& Get_Call_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id);
00431
00432 extern FB_Info_Icall& Get_Icall_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id);
00433
00434 extern size_t Get_Edge_Table_Size(PU_PROFILE_HANDLE pu_handle);
00435
00436 extern FB_Info_Edge& Get_Edge_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id);
00437 extern FB_Info_Value& Get_Value_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id);
00438 #ifdef KEY
00439 extern FB_Info_Value_FP_Bin& Get_Value_FP_Bin_Profile(PU_PROFILE_HANDLE pu_handle,
00440 INT32 id);
00441 #endif
00442 extern FB_Info_Value& Get_Stride_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id);
00443
00444
00445 #endif // _BUILD_INSTR
00446
00447 #endif