Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
irbdata.h
Go to the documentation of this file.
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 */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines