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 //-*-c++-*- 00037 // ==================================================================== 00038 // ==================================================================== 00039 // 00040 // 00041 // Revision history: 00042 // 10-Aug-98 - Original Version 00043 // 00044 // Description: 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 // For standalone instr_reader and libinstr use the error 00063 // reporting mechanism of libinstr. 00064 # include "profile_errors.h" 00065 00066 #else 00067 00068 // When the backend uses instr_reader, it needs to use its own 00069 // error reporting routines. 00070 #include "errors.h" 00071 #define profile_error(arg1, arg2) Fatal_Error(arg1, arg2) 00072 00073 #endif /* _USE_PROFILE_ERROR_ROUTINES */ 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 // we can't use the definitions in fb_info.h because we don't have mempool 00093 // in the standalone version 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 // Prototypes for routines in instr_reader.cxx 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 /* instr_reader_INCLUDED */