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 /* -*-Mode: c++;-*- (Tell emacs to use c++ mode) */ 00037 00038 #ifndef irbdata_INCLUDED 00039 #define irbdata_INCLUDED 00040 00041 /* ==================================================================== 00042 * 00043 * Revision history: 00044 * 21-Mar-93 - Original Version 00045 * 00046 * Description: 00047 * declaration of the initialized data structures 00048 * ==================================================================== */ 00049 00050 00051 #ifndef symtab_INCLUDED 00052 #include "symtab.h" // for Scope_tab 00053 #endif 00054 00055 #ifndef irbdata_defs_INCLUDED 00056 #include "irbdata_defs.h" 00057 #endif 00058 00059 // access functions for INITO 00060 00061 inline ST_IDX 00062 INITO_st_idx (const INITO& inito) { return inito.st_idx; } 00063 inline void 00064 Set_INITO_st_idx (INITO& inito, ST_IDX st) { inito.st_idx = st; } 00065 inline void 00066 Set_INITO_st_idx (INITO_IDX idx, ST_IDX st) 00067 { Set_INITO_st_idx(Inito_Table[idx], st); } 00068 inline ST* 00069 INITO_st (const INITO& ino) { return &St_Table[ino.st_idx]; } 00070 inline ST* 00071 INITO_st (const INITO* ino) { return &St_Table[ino->st_idx]; } 00072 inline ST* 00073 INITO_st (const INITO_IDX idx) { return &St_Table[Inito_Table[idx].st_idx]; } 00074 00075 inline INITV_IDX 00076 INITO_val (const INITO& inito) { return inito.val; } 00077 inline INITV_IDX 00078 INITO_val (INITO_IDX idx) { return INITO_val (Inito_Table[idx]);} 00079 inline void 00080 Set_INITO_val (INITO& ino, INITV_IDX inv) { ino.val = inv; } 00081 inline void 00082 Set_INITO_val (INITO_IDX idx, INITV_IDX inv) 00083 { Set_INITO_val(Inito_Table[idx], inv); } 00084 00085 00086 // access functions for INITV 00087 00088 // read access for INITV 00089 00090 inline INITV_IDX 00091 INITV_next (const INITV& initv) { return initv.next; } 00092 inline INITV_IDX 00093 INITV_next (const INITV_IDX idx) { return Initv_Table[idx].next; } 00094 00095 inline void 00096 Set_INITV_next(const INITV_IDX idx, const INITV_IDX nidx) 00097 { 00098 Initv_Table[idx].next = nidx; 00099 } 00100 00101 /*ARGSUSED*/ 00102 inline void 00103 INITV_read_check (BOOL condition) 00104 { 00105 Is_True (condition, ("INITV read access error")); 00106 } 00107 00108 inline INITVKIND 00109 INITV_kind (const INITV& initv) { return initv.kind; } 00110 inline INITVKIND 00111 INITV_kind (const INITV_IDX idx) { return Initv_Table[idx].kind; } 00112 00113 inline UINT16 00114 INITV_repeat1 (const INITV& initv) { 00115 #ifdef Is_True_On 00116 switch (initv.kind) { 00117 case INITVKIND_ZERO: 00118 case INITVKIND_ONE: 00119 case INITVKIND_VAL: 00120 INITV_read_check (FALSE); 00121 break; 00122 default: 00123 break; 00124 } 00125 #endif /* Is_True_On */ 00126 00127 return initv.repeat1; 00128 } 00129 00130 inline UINT32 00131 INITV_repeat2 (const INITV& initv) { 00132 #ifdef Is_True_On 00133 switch (initv.kind) { 00134 case INITVKIND_ZERO: 00135 case INITVKIND_ONE: 00136 case INITVKIND_VAL: 00137 break; 00138 default: 00139 INITV_read_check (FALSE); 00140 break; 00141 } 00142 #endif 00143 00144 return initv.Repeat2 (); 00145 } 00146 00147 inline UINT32 00148 INITV_repeat (const INITV_IDX inv) 00149 { 00150 switch (Initv_Table[inv].kind) { 00151 case INITVKIND_VAL: 00152 case INITVKIND_ZERO: 00153 case INITVKIND_ONE: 00154 return Initv_Table[inv].u.tcval.repeat2; 00155 default: 00156 return Initv_Table[inv].repeat1; 00157 } 00158 } 00159 00160 inline ST_IDX 00161 INITV_st (const INITV& initv) { 00162 INITV_read_check (initv.kind == INITVKIND_SYMOFF); 00163 return initv.St (); 00164 } 00165 inline ST_IDX 00166 INITV_st (const INITV_IDX initv) { 00167 INITV_read_check (Initv_Table[initv].kind == INITVKIND_SYMOFF); 00168 return Initv_Table[initv].St (); 00169 } 00170 inline void 00171 Set_INITV_st (INITV_IDX inv, ST_IDX st) 00172 { 00173 INITV_read_check (Initv_Table[inv].kind == INITVKIND_SYMOFF); 00174 Initv_Table[inv].u.sto.st = st; 00175 } 00176 00177 inline INT32 00178 INITV_ofst (const INITV& initv) { 00179 INITV_read_check (initv.kind == INITVKIND_SYMOFF); 00180 return initv.Ofst (); 00181 } 00182 inline INT32 00183 INITV_ofst (const INITV_IDX initv) { 00184 INITV_read_check (Initv_Table[initv].kind == INITVKIND_SYMOFF); 00185 return Initv_Table[initv].Ofst (); 00186 } 00187 inline void 00188 Set_INITV_ofst (INITV_IDX inv, INT32 ofst) 00189 { 00190 INITV_read_check (Initv_Table[inv].kind == INITVKIND_SYMOFF); 00191 Initv_Table[inv].u.sto.ofst = ofst; 00192 } 00193 00194 inline LABEL_IDX 00195 INITV_lab (const INITV& initv) { 00196 INITV_read_check (initv.kind == INITVKIND_LABEL); 00197 return initv.Lab (); 00198 } 00199 inline LABEL_IDX 00200 INITV_lab (const INITV_IDX initv) { 00201 return INITV_lab (Initv_Table[initv]); 00202 } 00203 inline void 00204 Set_INITV_lab (INITV& inv, LABEL_IDX lab) { 00205 inv.u.lab.lab = lab; 00206 inv.u.lab.unused = 0; 00207 } 00208 inline void 00209 Set_INITV_lab (INITV_IDX inv, LABEL_IDX lab) { 00210 INITV_read_check (Initv_Table[inv].kind == INITVKIND_LABEL); 00211 Set_INITV_lab(Initv_Table[inv], lab); 00212 } 00213 00214 inline LABEL_IDX 00215 INITV_lab1 (const INITV& initv) { 00216 INITV_read_check (initv.kind == INITVKIND_SYMDIFF || 00217 initv.kind == INITVKIND_SYMDIFF16); 00218 return initv.Lab1 (); 00219 } 00220 inline LABEL_IDX 00221 INITV_lab1 (const INITV_IDX initv) { 00222 return INITV_lab1 (Initv_Table[initv]); 00223 } 00224 inline void 00225 Set_INITV_lab1 (INITV& inv, LABEL_IDX lab1) { 00226 inv.u.stdiff.lab1 = lab1; 00227 } 00228 inline void 00229 Set_INITV_lab1 (INITV_IDX inv, LABEL_IDX lab1) { 00230 INITV_read_check (Initv_Table[inv].kind == INITVKIND_SYMDIFF || 00231 Initv_Table[inv].kind == INITVKIND_SYMDIFF16); 00232 Set_INITV_lab1(Initv_Table[inv], lab1); 00233 } 00234 00235 inline ST_IDX 00236 INITV_st2 (const INITV& initv) { 00237 INITV_read_check (initv.kind == INITVKIND_SYMDIFF || 00238 initv.kind == INITVKIND_SYMDIFF16); 00239 return initv.St2 (); 00240 } 00241 inline ST_IDX 00242 INITV_st2 (const INITV_IDX initv) { 00243 return INITV_st2 (Initv_Table[initv]); 00244 } 00245 inline void 00246 Set_INITV_st2 (INITV_IDX inv, ST_IDX st2) { 00247 INITV_read_check (Initv_Table[inv].kind == INITVKIND_SYMDIFF || 00248 Initv_Table[inv].kind == INITVKIND_SYMDIFF16); 00249 Initv_Table[inv].u.stdiff.st2 = st2; 00250 } 00251 00252 inline TCON_IDX 00253 INITV_tc (const INITV& initv) { 00254 INITV_read_check (initv.kind == INITVKIND_VAL); 00255 return initv.Tc (); 00256 } 00257 inline TCON& 00258 INITV_tc_val (const INITV& initv) { 00259 INITV_read_check (initv.kind == INITVKIND_VAL); 00260 return Tcon_Table[initv.Tc ()]; 00261 } 00262 inline TCON& 00263 INITV_tc_val (const INITV_IDX initv) { 00264 INITV_read_check (Initv_Table[initv].kind == INITVKIND_VAL); 00265 return Tcon_Table[Initv_Table[initv].Tc ()]; 00266 } 00267 00268 inline TYPE_ID 00269 INITV_mtype (const INITV& initv) { 00270 INITV_read_check (initv.kind == INITVKIND_ZERO || 00271 initv.kind == INITVKIND_ONE); 00272 return initv.Mtype (); 00273 } 00274 inline TYPE_ID 00275 INITV_mtype (const INITV_IDX initv) { 00276 INITV_read_check (Initv_Table[initv].kind == INITVKIND_ZERO || 00277 Initv_Table[initv].kind == INITVKIND_ONE); 00278 return Initv_Table[initv].Mtype (); 00279 } 00280 00281 inline INITV_IDX 00282 INITV_blk (const INITV& initv) { 00283 INITV_read_check (initv.kind == INITVKIND_BLOCK); 00284 return initv.Blk (); 00285 } 00286 inline INITV_IDX 00287 INITV_blk (const INITV_IDX initv) { 00288 return INITV_blk(Initv_Table[initv]); 00289 } 00290 inline void 00291 Set_INITV_blk (INITV& inv, INITV_IDX blk) { 00292 inv.u.blk.blk = blk; 00293 inv.u.blk.unused = 0; 00294 } 00295 inline void 00296 Set_INITV_blk (INITV_IDX inv, INITV_IDX blk) { 00297 Set_INITV_blk(Initv_Table[inv], blk); 00298 } 00299 00300 inline INT32 00301 INITV_pad (const INITV& initv) { 00302 INITV_read_check (initv.kind == INITVKIND_PAD); 00303 return initv.Pad (); 00304 } 00305 inline INT32 00306 INITV_pad (const INITV_IDX initv) { 00307 INITV_read_check (Initv_Table[initv].kind == INITVKIND_PAD); 00308 return Initv_Table[initv].Pad (); 00309 } 00310 inline void 00311 Set_INITV_pad (INITV& initv, UINT32 pad_bytes) { 00312 initv.u.pad.pad = pad_bytes; 00313 } 00314 00315 00316 // utility functions 00317 00318 extern INITO_IDX 00319 New_INITO (ST_IDX st, INITV_IDX val = 0); 00320 inline INITO_IDX 00321 New_INITO (const ST *st, INITV_IDX val = 0) { 00322 return New_INITO (ST_st_idx (st), val); 00323 } 00324 00325 extern INITV_IDX New_INITV (void); 00326 00327 extern INITV_IDX 00328 Copy_INITV (INITV_IDX parent_inv, INITO_IDX ino, INITV_IDX inv); 00329 00330 extern void 00331 INITV_Init_Integer (INITV_IDX inv, 00332 TYPE_ID mtype, INT64 val, UINT16 repeat = 1); 00333 00334 extern void 00335 INITV_Init_Float (INITV_IDX inv, TYPE_ID mtype, double val, UINT16 repeat = 1); 00336 00337 extern void 00338 INITV_Init_String (INITV_IDX inv, char *str, INT size, UINT16 repeat = 1); 00339 00340 extern void 00341 INITV_Init_Symoff (INITV_IDX inv, ST *st, INT64 ofst, UINT16 repeat = 1); 00342 00343 extern void 00344 INITV_Init_Label (INITV_IDX inv, LABEL_IDX lab, UINT16 repeat = 1); 00345 00346 extern void 00347 INITV_Init_Symdiff (INITV_IDX inv, 00348 LABEL_IDX lab1, ST *st2, BOOL halfword, UINT16 repeat = 1); 00349 00350 extern void 00351 INITV_Init_Block (INITV_IDX inv, INITV_IDX bval, UINT16 repeat = 1); 00352 00353 extern void 00354 INITV_Init_Pad (INITV_IDX inv, UINT32 pad_bytes); 00355 00356 // append inv either as child of ino or as next sibling of prev_inv 00357 inline INITV_IDX 00358 Append_INITV (INITV_IDX inv, INITO_IDX ino, INITV_IDX prev_inv) 00359 { 00360 if (prev_inv == INITV_IDX_ZERO) 00361 Set_INITO_val (ino, inv); 00362 else 00363 Set_INITV_next (prev_inv, inv); 00364 return inv; 00365 } 00366 00367 // return the next to-be-allocated INITV_IDX 00368 inline INITV_IDX 00369 INITV_Next_Idx(void) { return Initv_Table.Size(); } 00370 00371 // return total size of initvs under inito 00372 extern UINT 00373 Get_INITO_Size (INITO_IDX ino); 00374 00375 extern INITO_IDX 00376 Find_INITO_For_Symbol (const ST *st); 00377 00378 const char * 00379 InitvKind_Name (INITVKIND knd); 00380 00381 INITVKIND 00382 Name_To_InitvKind (const char* nm); 00383 00384 00385 extern void 00386 Print_INITV (const INITV& initv); 00387 00388 extern void 00389 Print_INITVs (INITV_IDX initv); 00390 00391 extern void 00392 Print_INITO (const INITO& ino); 00393 inline void 00394 Print_INITO (INITO_IDX idx) { Print_INITO(Inito_Table[idx]); } 00395 00396 extern void 00397 Print_Inits (UINT level); 00398 00399 00400 // internal inline routines for writing INITV 00401 00402 inline void 00403 INITV_Set_SYMOFF (INITV& initv, mUINT16 rp1, ST_IDX st, INT32 ofst) { 00404 initv.next = 0; 00405 initv.kind = INITVKIND_SYMOFF; 00406 initv.repeat1 = rp1; 00407 initv.u.sto.st = st; 00408 initv.u.sto.ofst = ofst; 00409 } 00410 00411 inline void 00412 INITV_Set_LABEL (INITV& initv, mUINT16 rp1, LABEL_IDX lab) { 00413 initv.next = 0; 00414 initv.kind = INITVKIND_LABEL; 00415 initv.repeat1 = rp1; 00416 initv.u.lab.lab = lab; 00417 initv.u.lab.unused = 0; 00418 } 00419 00420 inline void 00421 INITV_Set_int (INITV& initv, INITVKIND kind, TYPE_ID m, UINT32 rp2) { 00422 initv.next = 0; 00423 initv.kind = kind; 00424 initv.repeat1 = 0; 00425 initv.u.tcval.u.mtype = m; 00426 initv.u.tcval.repeat2 = rp2; 00427 } 00428 inline void 00429 INITV_Set_ZERO (INITV& initv, TYPE_ID m, UINT32 rp2) { 00430 INITV_Set_int (initv, INITVKIND_ZERO, m, rp2); 00431 } 00432 inline void 00433 INITV_Set_ONE (INITV& initv, TYPE_ID m, UINT32 rp2) { 00434 INITV_Set_int (initv, INITVKIND_ONE, m, rp2); 00435 } 00436 00437 inline void 00438 INITV_Set_VAL (INITV& initv, TCON_IDX t, mUINT32 rp2) { 00439 initv.next = 0; 00440 initv.kind = INITVKIND_VAL; 00441 initv.repeat1 = 0; 00442 initv.u.tcval.u.tc = t; 00443 initv.u.tcval.repeat2 = rp2; 00444 } 00445 00446 inline void 00447 INITV_Set_BLOCK (INITV& initv, mUINT16 rp1, INITV_IDX b) { 00448 initv.next = 0; 00449 initv.kind = INITVKIND_BLOCK; 00450 initv.repeat1 = rp1; 00451 initv.u.blk.blk = b; 00452 initv.u.blk.unused = 0; 00453 } 00454 00455 inline void 00456 INITV_Set_PAD (INITV& initv, UINT32 pad_bytes) { 00457 initv.next = 0; 00458 initv.kind = INITVKIND_PAD; 00459 initv.repeat1 = 1; 00460 initv.u.pad.pad = pad_bytes; 00461 initv.u.pad.unused = 0; 00462 } 00463 00464 inline void 00465 INITV_Set_SYMDIFF (INITV& initv, mUINT16 rp1, LABEL_IDX s1, ST_IDX s2, 00466 BOOL halfword) 00467 { 00468 initv.next = 0; 00469 initv.kind = halfword ? INITVKIND_SYMDIFF16 : INITVKIND_SYMDIFF; 00470 initv.repeat1 = rp1; 00471 initv.u.stdiff.lab1 = s1; 00472 initv.u.stdiff.st2 = s2; 00473 } 00474 00475 00476 00477 // old routines here for compatibility; should eventually remove 00478 00479 extern INITV_IDX 00480 Irb_Init_Symoff (INITO_IDX ino, INITV_IDX inv, mUINT16 repeat, ST *st, 00481 INT64 ofst); 00482 00483 extern INITV_IDX 00484 Irb_Init_Label (INITO_IDX ino, INITV_IDX inv, mUINT16 repeat, LABEL_IDX lab); 00485 00486 extern INITV_IDX 00487 Irb_Init_Symdiff (INITO_IDX ino, INITV_IDX inv, mUINT16 repeat, LABEL_IDX lab1, 00488 ST *st2, BOOL halfword); 00489 00490 extern INITV_IDX 00491 Irb_Init_Val (INITO_IDX ino, INITV_IDX inv, UINT32 repeat, TCON_IDX tc); 00492 00493 extern INITV_IDX 00494 Irb_Init_Pad (INITO_IDX ino, INITV_IDX inv, UINT32 pad_bytes); 00495 00496 extern INITV_IDX 00497 Irb_Init_Block (INITO_IDX ino, INITV_IDX inv, mUINT16 repeat); 00498 00499 extern INITV_IDX 00500 Irb_Init_Integer (INT size, INT64 value, INT32 repeat, INITO_IDX ino, 00501 INITV_IDX inv); 00502 00503 extern INITV_IDX 00504 Irb_Init_Integer_Of_Type (TYPE_ID mtype, INT64 value, INT32 repeat, 00505 INITO_IDX ino, INITV_IDX inv); 00506 00507 extern INITV_IDX 00508 Irb_Init_String (INT size, char *str, INT32 repeat, INITO_IDX ino, 00509 INITV_IDX inv); 00510 00511 #ifndef MONGOOSE_BE 00512 00513 extern INITV_IDX 00514 Irb_Init_Float (INT size, double value, INT32 repeat, INITO_IDX ino, 00515 INITV_IDX inv); 00516 00517 extern INITV_IDX 00518 Irb_Init_Float_4 (INT size, float value, INT32 repeat, INITO_IDX ino, 00519 INITV_IDX inv); 00520 00521 extern INITV_IDX 00522 Irb_Init_Quad (INT size, QUAD_TYPE value, INT32 repeat, INITO_IDX ino, 00523 INITV_IDX inv); 00524 00525 extern INITV_IDX 00526 Irb_Init_Complex (INT size, double real, double imag, INT32 repeat, 00527 INITO_IDX ino, INITV_IDX inv); 00528 00529 extern INITV_IDX 00530 Irb_Init_Complex_4 (INT size, float real, float imag, INT32 repeat, 00531 INITO_IDX ino, INITV_IDX inv); 00532 00533 extern INITV_IDX 00534 Irb_Init_Complex_Quad (INT size, QUAD_TYPE real, QUAD_TYPE imag, 00535 INT32 repeat, INITO_IDX ino, INITV_IDX inv); 00536 00537 #endif /* MONGOOSE_BE */ 00538 00539 #endif /* irbdata_INCLUDED */