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 #ifndef instr_reader_INCLUDED
00050 #define instr_reader_INCLUDED
00051
00052 #include <stdio.h>
00053 #include "profile_com.h"
00054 #include "fb_info.h"
00055 #ifndef _BUILD_INSTR
00056 #include "mempool_allocator.h"
00057 #include "cxx_memory.h"
00058 #endif
00059
00060 #ifdef _USE_PROFILE_ERROR_ROUTINES
00061
00062
00063
00064 # include "profile_errors.h"
00065
00066 #else
00067
00068
00069
00070 #include "errors.h"
00071 #define profile_error(arg1, arg2) Fatal_Error(arg1, arg2)
00072
00073 #endif
00074
00075
00076 #ifdef FSEEK
00077 # undef FSEEK
00078 #endif
00079 #define FSEEK(_fd, _position, whence, _error_message, _error_arg) \
00080 if (fseek(_fd, _position, whence) != 0) \
00081 profile_error(_error_message, _error_arg);
00082
00083 #ifdef FREAD
00084 # undef FREAD
00085 #endif
00086 #define FREAD(_buffer, _size, _nitems, _fp, _error_message, _error_arg) \
00087 if (fread((void *)_buffer, _size, _nitems, _fp) != _nitems) \
00088 profile_error(_error_message, _error_arg);
00089
00090 #ifdef _BUILD_INSTR
00091
00092
00093
00094 typedef vector<FB_Info_Invoke> FB_Invoke_Vector;
00095 typedef vector<FB_Info_Branch> FB_Branch_Vector;
00096 typedef vector<FB_Info_Loop> FB_Loop_Vector;
00097 typedef vector<FB_Info_Circuit> FB_Circuit_Vector;
00098 typedef vector<FB_Info_Call> FB_Call_Vector;
00099 typedef vector<FB_Info_Switch> FB_Switch_Vector;
00100 #endif
00101
00102 struct PU_Profile_Handle
00103 {
00104 FB_Invoke_Vector Invoke_Profile_Table;
00105 FB_Branch_Vector Branch_Profile_Table;
00106 FB_Switch_Vector Switch_Profile_Table;
00107 FB_Switch_Vector Compgoto_Profile_Table;
00108 FB_Loop_Vector Loop_Profile_Table;
00109 FB_Circuit_Vector Short_Circuit_Profile_Table;
00110 FB_Call_Vector Call_Profile_Table;
00111
00112 INT32 checksum;
00113
00114 char *pu_name;
00115
00116 #ifdef _BUILD_INSTR
00117
00118 PU_Profile_Handle (char* pname = NULL, INT32 c_sum = 0) :
00119 pu_name (pname),
00120 checksum (c_sum) {
00121
00122 if (pname) {
00123 pu_name = new char[strlen(pname) + 1];
00124 strcpy (pu_name, pname);
00125 }
00126 }
00127
00128 ~PU_Profile_Handle () { delete [] pu_name; }
00129
00130 #else // _BUILD_INSTR
00131
00132 PU_Profile_Handle (char *pname = NULL, INT32 c_sum = 0,
00133 MEM_POOL* pool = MEM_pu_nz_pool_ptr) :
00134 pu_name (pname),
00135 checksum (c_sum),
00136 Invoke_Profile_Table (pool),
00137 Branch_Profile_Table (pool),
00138 Switch_Profile_Table (pool),
00139 Compgoto_Profile_Table (pool),
00140 Loop_Profile_Table (pool),
00141 Short_Circuit_Profile_Table (pool),
00142 Call_Profile_Table (pool) {
00143
00144 if ( pname ) {
00145 pu_name = (char *) MEM_POOL_Alloc (pool, strlen (pname) + 1);
00146 strcpy(pu_name, pname);
00147 }
00148 }
00149
00150 ~PU_Profile_Handle() {}
00151
00152 #endif // _BUILD_INSTR
00153
00154 FB_Invoke_Vector& Get_Invoke_Table () {
00155 return Invoke_Profile_Table;
00156 }
00157
00158 FB_Branch_Vector& Get_Branch_Table () {
00159 return Branch_Profile_Table;
00160 }
00161
00162 FB_Switch_Vector& Get_Switch_Table () {
00163 return Switch_Profile_Table;
00164 }
00165
00166 FB_Switch_Vector& Get_Compgoto_Table () {
00167 return Compgoto_Profile_Table;
00168 }
00169
00170 FB_Loop_Vector& Get_Loop_Table () {
00171 return Loop_Profile_Table;
00172 }
00173
00174 FB_Circuit_Vector& Get_Short_Circuit_Table () {
00175 return Short_Circuit_Profile_Table;
00176 }
00177
00178 FB_Call_Vector& Get_Call_Table () {
00179 return Call_Profile_Table;
00180 }
00181
00182 };
00183
00184 typedef PU_Profile_Handle * PU_PROFILE_HANDLE;
00185
00186 extern void Get_File_Header(FILE *fp, char *fname, Fb_Hdr *fb_hdr);
00187
00188 extern void Get_Pu_Hdr_Table(FILE *fp, char *fname, Fb_Hdr& fb_hdr,
00189 Pu_Hdr *pu_hdr_table);
00190
00191 extern void Get_Str_Table(FILE *fp, char *fname, Fb_Hdr& fb_hdr,
00192 char *str_table);
00193
00194 extern void read_invoke_profile( PU_PROFILE_HANDLE pu_handle,
00195 Pu_Hdr& pu_hdr_entry,
00196 long pu_ofst, FILE *fp, char *fname);
00197
00198 extern void read_branch_profile( PU_PROFILE_HANDLE pu_handle,
00199 Pu_Hdr& pu_hdr_entry,
00200 long pu_ofst, FILE *fp, char *fname);
00201
00202 extern void read_switch_profile( PU_PROFILE_HANDLE pu_handle,
00203 Pu_Hdr& pu_hdr_entry,
00204 long pu_ofst, FILE *fp, char *fname);
00205
00206 extern void read_cgoto_profile( PU_PROFILE_HANDLE pu_handle,
00207 Pu_Hdr& pu_hdr_entry,
00208 long pu_ofst, FILE *fp, char *fname);
00209
00210 extern void read_loop_profile( PU_PROFILE_HANDLE pu_handle,
00211 Pu_Hdr& pu_hdr_entry,
00212 long pu_ofst, FILE *fp, char *fname);
00213
00214 extern void read_scircuit_profile(PU_PROFILE_HANDLE pu_handle,
00215 Pu_Hdr& pu_hdr_entry,
00216 long pu_ofst, FILE *fp, char *fname);
00217
00218 extern void read_call_profile( PU_PROFILE_HANDLE pu_handle,
00219 Pu_Hdr& pu_hdr_entry,
00220 long pu_ofst, FILE *fp, char *fname);
00221
00222
00223 #ifndef _BUILD_INSTR
00224
00225 struct Fb_File_Info {
00226 char *name;
00227 FILE *fp;
00228 Fb_Hdr fb_hdr;
00229 Pu_Hdr *pu_hdr_table;
00230 char *str_table;
00231
00232 Fb_File_Info() {}
00233 Fb_File_Info(char *nm, FILE *fptr, Fb_Hdr fhdr, Pu_Hdr *ptbl, char *stbl) :
00234 name(nm), fp(fptr), fb_hdr(fhdr), pu_hdr_table(ptbl),
00235 str_table(stbl) {}
00236 ~Fb_File_Info() {}
00237 };
00238
00239 extern BOOL Feedback_Enabled[PROFILE_PHASE_LAST];
00240 typedef vector<Fb_File_Info*> Fb_File_Info_Vector;
00241 typedef Fb_File_Info_Vector::iterator File_Info_Iterator;
00242 extern Fb_File_Info_Vector Feedback_File_Info[PROFILE_PHASE_LAST];
00243
00244
00245
00246 extern void Process_Feedback_File(char *fb_name);
00247
00248 extern void Close_Feedback_Files();
00249
00250 typedef vector<PU_PROFILE_HANDLE, mempool_allocator<PU_PROFILE_HANDLE> >
00251 PU_PROFILE_HANDLES;
00252 typedef PU_PROFILE_HANDLES::iterator PU_PROFILE_ITERATOR;
00253
00254 extern PU_PROFILE_HANDLES
00255 Get_PU_Profile (char *pu_name, char *src_fname,
00256 Fb_File_Info_Vector& file_info_vector);
00257
00258 extern PU_PROFILE_HANDLE Get_PU_Profile(char *pu_name, char *src_fname,
00259 FILE *fp, char *fb_fname,
00260 Fb_Hdr& fb_hdr, Pu_Hdr *pu_hdr_table,
00261 char *str_table);
00262
00263 extern PROFILE_PHASE Get_Phase_Num(Fb_Hdr& fb_hdr);
00264
00265 extern char * Get_PU_Name(PU_PROFILE_HANDLE pu_handle);
00266
00267 extern INT32 Get_PU_Checksum(PU_PROFILE_HANDLE pu_handle);
00268
00269 extern size_t Get_Invoke_Table_Size(PU_PROFILE_HANDLE pu_handle);
00270
00271 extern FB_Info_Invoke& Get_Invoke_Profile(PU_PROFILE_HANDLE pu_handle,
00272 INT32 id);
00273
00274 extern size_t Get_Branch_Table_Size(PU_PROFILE_HANDLE pu_handle);
00275
00276 extern FB_Info_Branch& Get_Branch_Profile(PU_PROFILE_HANDLE pu_handle,
00277 INT32 id);
00278
00279 extern size_t Get_Switch_Table_Size(PU_PROFILE_HANDLE pu_handle);
00280
00281 extern FB_Info_Switch& Get_Switch_Profile(PU_PROFILE_HANDLE pu_handle,
00282 INT32 id);
00283
00284 extern size_t Get_Compgoto_Table_Size(PU_PROFILE_HANDLE pu_handle);
00285
00286 extern FB_Info_Switch& Get_Compgoto_Profile(PU_PROFILE_HANDLE pu_handle,
00287 INT32 id);
00288
00289 extern size_t Get_Loop_Table_Size(PU_PROFILE_HANDLE pu_handle);
00290
00291 extern FB_Info_Loop& Get_Loop_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id);
00292
00293 extern size_t Get_Short_Circuit_Table_Size(PU_PROFILE_HANDLE pu_handle);
00294
00295 extern FB_Info_Circuit& Get_Short_Circuit_Profile(PU_PROFILE_HANDLE pu_handle,
00296 INT32 id);
00297
00298 extern size_t Get_Call_Table_Size(PU_PROFILE_HANDLE pu_handle);
00299
00300 extern FB_Info_Call& Get_Call_Profile(PU_PROFILE_HANDLE pu_handle, INT32 id);
00301
00302 #endif // _BUILD_INSTR
00303
00304 #endif