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 #ifndef symtab_utils_INCLUDED
00043 #define symtab_utils_INCLUDED
00044
00045
00046
00047
00048
00049
00050
00051 extern INT64
00052 ST_size (const ST *);
00053
00054 extern ST *
00055 Copy_ST (ST *st);
00056
00057 extern ST *
00058 Copy_ST (ST *st, SYMTAB_IDX scope);
00059
00060 extern ST *
00061 Copy_ST_No_Base (ST *st, SYMTAB_IDX scope);
00062
00063
00064
00065 extern BOOL
00066 ST_is_constant (const ST *);
00067
00068
00069
00070
00071 extern BOOL
00072 ST_is_private_local(const ST *);
00073
00074
00075 #ifdef KEY
00076 extern ST *
00077 Gen_Temp_Named_Symbol(TY_IDX, const char *, ST_CLASS, ST_SCLASS);
00078 #endif // KEY
00079 extern ST *
00080 Gen_Temp_Symbol(TY_IDX ty, const char *rootname);
00081
00082 extern ST *
00083 Gen_Read_Only_Symbol(TY_IDX, const char *rootname);
00084
00085 inline BOOL
00086 ST_visible_outside_dso(const ST &s)
00087 {
00088
00089 return (ST_export(s) != EXPORT_INTERNAL &&
00090 ST_export(s) != EXPORT_LOCAL_INTERNAL);
00091 }
00092 inline BOOL
00093 ST_visible_outside_dso(const ST *s) { return ST_visible_outside_dso(*s); }
00094
00095 ST *
00096 Gen_Intrinsic_Function(TY_IDX, const char *function_name);
00097
00098
00099
00100 TY_IDX
00101 Make_Function_Type(TY_IDX return_ty_idx);
00102
00103
00104 TY_IDX
00105 Make_Array_Type(TYPE_ID element_type, INT32 ndim, INT64 len);
00106
00107 #if 1 // Fix 10-26-2002: Enhancement to reset addr_saved flag before Mainopt
00108 void
00109 Clear_local_symtab_addr_flags (const SCOPE& scope);
00110 #endif
00111
00112
00113
00114
00115 extern TY_IDX MTYPE_TO_TY_array[MTYPE_LAST+1];
00116 #define MTYPE_To_TY(t) MTYPE_TO_TY_array[t]
00117 #define Be_Type_Tbl(t) MTYPE_TO_TY_array[t]
00118
00119
00120 extern TY_IDX Void_Type, FE_int_Type, FE_double_Type;
00121 extern TY_IDX Spill_Int_Type, Spill_Float_Type;
00122 #ifdef TARG_X8664
00123 extern TY_IDX Quad_Type;
00124 #endif
00125
00126 #ifdef KEY
00127 extern TY_IDX Spill_Int32_Type;
00128 extern TY_IDX Spill_Float32_Type;
00129 #endif // KEY
00130
00131 TY_IDX
00132 Copy_TY (TY_IDX ty);
00133
00134
00135
00136 extern UINT
00137 TY_log_base2 (UINT align);
00138
00139
00140 TY_IDX
00141 TY_pointer (TY_IDX ty, BOOL f90_pointer = FALSE);
00142
00143
00144 TY_IDX
00145 Make_Pointer_Type (TY_IDX ty_idx, BOOL f90_pointer = FALSE);
00146
00147 TY_IDX
00148 Make_F90_Pointer_Type (TY_IDX ty_idx);
00149
00150
00151 inline TY_IDX
00152 Make_Align_Type (TY_IDX ty_idx, INT32 align)
00153 {
00154 Set_TY_align (ty_idx, align);
00155 return ty_idx;
00156 }
00157
00158 TY_IDX
00159 Make_Array_Type (TYPE_ID element, INT32 ndim, INT64 len);
00160
00161
00162
00163
00164
00165
00166 TY_IDX
00167 Promoted_Parm_Type(const ST *);
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 #define TY_EQUIV_NO_FLAGS 0x00000000
00178 #define TY_EQUIV_IGNORE_NAMES 0x00000001
00179 #define TY_EQUIV_ALIGN 0x00000002
00180 #define TY_EQUIV_QUALIFIER 0x00000004
00181 BOOL
00182 TY_are_equivalent (TY_IDX ty_id1,
00183 TY_IDX ty_id2,
00184 UINT32 flags = TY_EQUIV_NO_FLAGS);
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198 TY_IDX
00199 TY_is_unique (TY_IDX);
00200
00201
00202 BOOL TY_has_union (TY_IDX ty);
00203
00204 #ifdef TARG_NVISA
00205
00206 inline TY_IDX
00207 TY_vector_elem_ty (TY_IDX ty)
00208 {
00209 return FLD_type(TY_fld(ty));
00210 }
00211
00212 UINT
00213 TY_vector_count (TY_IDX ty);
00214 #endif
00215
00216
00217
00218 TYPE_ID Mtype_For_Type_Offset (TY_IDX ty, INT64 offset);
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 extern ST* MTYPE_TO_PREG_array[MTYPE_LAST+1];
00229 #define MTYPE_To_PREG(t) MTYPE_TO_PREG_array[t]
00230 #define Int32_Preg MTYPE_To_PREG (MTYPE_I4)
00231 #define Int64_Preg MTYPE_To_PREG (MTYPE_I8)
00232 #define Float32_Preg MTYPE_To_PREG (MTYPE_F4)
00233 #define Float64_Preg MTYPE_To_PREG (MTYPE_F8)
00234
00235
00236 extern ST *Int_Preg, *Float_Preg, *Return_Val_Preg;
00237
00238 extern ST *Branch_Preg;
00239 #ifdef TARG_X8664
00240 extern ST* X87_Preg;
00241 #endif
00242
00243 const char *
00244 Preg_Name (PREG_NUM i);
00245
00246
00247 extern PREG_NUM
00248 Create_Preg_explicit (TYPE_ID mtype, const char *name,
00249 SCOPE *scope_tab, SYMTAB_IDX level);
00250
00251 extern PREG_NUM
00252 Create_Preg (TYPE_ID mtype, const char *name);
00253
00254 extern INT32
00255 Preg_Increment (TYPE_ID mtype);
00256
00257
00258
00259
00260 BOOL
00261 ARB_are_equivalent(ARB_HANDLE arb_id1,
00262 ARB_HANDLE arb_id2,
00263 UINT32 flags = TY_EQUIV_NO_FLAGS);
00264
00265
00266 void ARB_swap(ARB_HANDLE arb1, ARB_HANDLE arb2);
00267
00268
00269 inline void ARB_copy(ARB_HANDLE arb1, ARB_HANDLE arb2) {
00270 *(arb1.Entry()) = *(arb2.Entry());
00271 }
00272
00273
00274
00275
00276
00277 BOOL
00278 FLD_are_equivalent(FLD_HANDLE fld_id1,
00279 FLD_HANDLE fld_id2,
00280 UINT32 flags = TY_EQUIV_NO_FLAGS);
00281
00282 extern FLD_HANDLE
00283 FLD_get_to_field (TY_IDX struct_ty_idx, UINT field_id, UINT &cur_field_id);
00284
00285
00286
00287
00288 BOOL
00289 TYLIST_are_equivalent(TYLIST_IDX tylist_id1,
00290 TYLIST_IDX tylist_id2,
00291 UINT32 flags = TY_EQUIV_NO_FLAGS);
00292
00293
00294
00295
00296 BLK_IDX Copy_BLK (BLK_IDX b);
00297
00298
00299 extern void Base_Symbol_And_Offset (
00300 ST *st,
00301 ST **base_symbol,
00302 INT64 *offset_from_base
00303 );
00304
00305
00306
00307
00308
00309 const char *
00310 Class_Name (INT cl);
00311
00312 const char *
00313 Sclass_Name (INT s);
00314
00315 const char *
00316 Export_Name (INT );
00317
00318 const char *
00319 Kind_Name (INT k);
00320
00321 void
00322 Print_local_symtab (FILE *f, const SCOPE& scope);
00323
00324 void
00325 Print_global_symtab (FILE *f);
00326
00327 inline void
00328 Print_symtab (FILE *f, SYMTAB_IDX level)
00329 {
00330 if (level > GLOBAL_SYMTAB)
00331 Print_local_symtab (f, Scope_tab[level]);
00332 else
00333 Print_global_symtab (f);
00334 }
00335
00336
00337
00338
00339
00340 void
00341 New_Scope (SYMTAB_IDX level, MEM_POOL *pool, BOOL reserve_index_zero);
00342
00343 void
00344 Delete_Scope (SYMTAB_IDX level);
00345
00346 void
00347 Initialize_Symbol_Tables (BOOL reserve_index_zero);
00348
00349 void
00350 Initialize_Special_Global_Symbols ();
00351
00352
00353
00354
00355
00356 inline PU_ITER
00357 Make_pu_iter (PU_IDX pu_idx)
00358 {
00359 return PU_ITER (&Pu_Table, pu_idx);
00360 }
00361
00362 inline ST_ITER
00363 Make_st_iter (const ST *st)
00364 {
00365 ST_IDX idx = ST_st_idx (*st);
00366 return ST_ITER (Scope_tab[ST_IDX_level (idx)].st_tab, ST_IDX_index (idx));
00367 }
00368
00369 inline TY_ITER
00370 Make_ty_iter (TY_IDX ty_idx)
00371 {
00372 return TY_ITER (&Ty_Table, TY_IDX_index (ty_idx));
00373 }
00374
00375 inline FLD_ITER
00376 Make_fld_iter (FLD_HANDLE fld)
00377 {
00378 return FLD_ITER (&Fld_Table, fld.Idx());
00379 }
00380
00381 inline TYLIST_ITER
00382 Make_tylist_iter (TYLIST_IDX tylist_idx)
00383 {
00384 return TYLIST_ITER (&Tylist_Table, tylist_idx);
00385 }
00386
00387 inline ARB_ITER
00388 Make_arb_iter (ARB_HANDLE arb)
00389 {
00390 return ARB_ITER (&Arb_Table, arb.Idx());
00391 }
00392
00393 inline LABEL_ITER
00394 Make_label_iter (LABEL_IDX label_idx)
00395 {
00396 return LABEL_ITER (Scope_tab[LABEL_IDX_level (label_idx)].label_tab,
00397 LABEL_IDX_index (label_idx));
00398 }
00399
00400 inline PREG_ITER
00401 Make_preg_iter (PREG_IDX preg_idx)
00402 {
00403 return PREG_ITER (Scope_tab[CURRENT_SYMTAB].preg_tab, preg_idx);
00404 }
00405
00406 inline ST_ATTR_ITER
00407 Make_st_attr_iter (ST_ATTR_IDX st_attr_idx)
00408 {
00409 return ST_ATTR_ITER (Scope_tab[CURRENT_SYMTAB].st_attr_tab, st_attr_idx);
00410 }
00411
00412 inline TCON_ITER
00413 Make_tcon_iter (TCON_IDX tcon_idx)
00414 {
00415 return TCON_ITER (&Tcon_Table, tcon_idx);
00416 }
00417
00418 inline INITO_ITER
00419 Make_inito_iter (INITO_IDX inito_idx)
00420 {
00421 return INITO_ITER (Scope_tab[INITO_IDX_level (inito_idx)].inito_tab,
00422 INITO_IDX_index (inito_idx));
00423 }
00424
00425 inline INITV_ITER
00426 Make_initv_iter (INITV_IDX initv_idx)
00427 {
00428 return INITV_ITER (&Initv_Table, initv_idx);
00429 }
00430
00431
00432
00433
00434 template <class T, UINT block_size, class OP>
00435 inline void
00436 For_all (SEGMENTED_ARRAY<T, block_size>& table, const OP& op)
00437 {
00438 For_all_entries (table, op, 1);
00439 }
00440
00441 template <class T, UINT block_size, class OP>
00442 inline void
00443 For_all (RELATED_SEGMENTED_ARRAY<T, block_size>& table, const OP& op)
00444 {
00445 For_all_entries (table, op, 1);
00446 }
00447
00448 template <class OP>
00449 inline void
00450 For_all (const SYMBOL_TABLE&, SYMTAB_IDX level, const OP& op)
00451 {
00452 For_all_entries (*Scope_tab[level].st_tab, op, 1);
00453 }
00454
00455 template <class OP>
00456 inline void
00457 For_all (const INITO_TABLE&, SYMTAB_IDX level, const OP& op)
00458 {
00459 For_all_entries (*Scope_tab[level].inito_tab, op, 1);
00460 }
00461
00462 template <class OP>
00463 inline void
00464 For_all (const LABEL_TABLE&, const OP& op)
00465 {
00466 For_all_entries (*Scope_tab[CURRENT_SYMTAB].label_tab, op, 1);
00467 }
00468
00469 template <class OP>
00470 inline void
00471 For_all (const PREG_TABLE&, const OP& op)
00472 {
00473 For_all_entries (*Scope_tab[CURRENT_SYMTAB].preg_tab, op, 1);
00474 }
00475
00476 template <class OP>
00477 inline void
00478 For_all (const ST_ATTR_TABLE&, SYMTAB_IDX level, const OP& op)
00479 {
00480 For_all_entries (*Scope_tab[level].st_attr_tab, op, 1);
00481 }
00482
00483 template <class OP>
00484 inline void
00485 For_all (const TYPE_TABLE&, const OP& op)
00486 {
00487 For_all_entries (Ty_tab, op, 1);
00488 }
00489
00490
00491
00492
00493
00494
00495 template <class T, UINT block_size, class PREDICATE>
00496 inline UINT32
00497 For_all_until (const SEGMENTED_ARRAY<T, block_size>& table,
00498 const PREDICATE& pred)
00499 {
00500 UINT32 idx = Find_entry_if (table, pred, 1);
00501 return (idx == NOT_FOUND) ? 0 : idx;
00502 }
00503
00504 template <class T, UINT block_size, class PREDICATE>
00505 inline UINT32
00506 For_all_until (const RELATED_SEGMENTED_ARRAY<T, block_size>& table,
00507 const PREDICATE& pred)
00508 {
00509 UINT32 idx = Find_entry_if (table, pred, 1);
00510 return (idx == NOT_FOUND) ? 0 : idx;
00511 }
00512
00513 template <class PREDICATE>
00514 inline ST_IDX
00515 For_all_until (const SYMBOL_TABLE&, SYMTAB_IDX level, const PREDICATE& pred)
00516 {
00517 UINT32 idx = Find_entry_if (*Scope_tab[level].st_tab, pred, 1);
00518 return (idx == NOT_FOUND) ? 0 : make_ST_IDX (idx, level);
00519 }
00520
00521 template <class PREDICATE>
00522 inline INITO_IDX
00523 For_all_until (const INITO_TABLE&, SYMTAB_IDX level, const PREDICATE& pred)
00524 {
00525 UINT32 idx = Find_entry_if (*Scope_tab[level].inito_tab, pred, 1);
00526 return (idx == NOT_FOUND) ? 0 : make_INITO_IDX (idx, level);
00527 }
00528
00529 template <class PREDICATE>
00530 inline UINT32
00531 For_all_until (const LABEL_TABLE&, const PREDICATE& pred)
00532 {
00533 UINT32 idx = Find_entry_if (*Scope_tab[CURRENT_SYMTAB].label_tab, pred, 1);
00534 return (idx == NOT_FOUND) ? 0 : idx;
00535 }
00536
00537 template <class PREDICATE>
00538 inline UINT32
00539 For_all_until (const PREG_TABLE&, const PREDICATE& pred)
00540 {
00541 UINT32 idx = Find_entry_if (*Scope_tab[CURRENT_SYMTAB].preg_tab, pred, 1);
00542 return (idx == NOT_FOUND) ? 0 : idx;
00543 }
00544
00545 template <class PREDICATE>
00546 inline ST_ATTR_IDX
00547 For_all_until (const ST_ATTR_TABLE&, SYMTAB_IDX level, const PREDICATE& pred)
00548 {
00549 UINT32 idx = Find_entry_if (*Scope_tab[level].st_attr_tab, pred, 1);
00550 return (idx == NOT_FOUND) ? 0 : idx;
00551 }
00552
00553
00554 template <class PREDICATE>
00555 inline TY_IDX
00556 For_all_until (const TYPE_TABLE&, const PREDICATE& pred)
00557 {
00558 UINT32 idx = Find_entry_if (Ty_tab, pred, 1);
00559 return (idx == NOT_FOUND) ? 0 : make_TY_IDX (idx);
00560 }
00561
00562
00563
00564
00565
00566
00567 #define FOREACH_SYMBOL(level,s,i) \
00568 for (i = 1; i < ST_Table_Size(level) && (s = &St_Table(level,i)); ++i)
00569
00570 #define FOREACH_LABEL(level,s,i) \
00571 for (i = 1; i < LABEL_Table_Size(level) && (s = &Label_Table(i)); ++i)
00572
00573
00574 #define FOREACH_INITO(level,o,i) \
00575 for (i = 1; i < INITO_Table_Size(level) && (o = &Inito_Table(level,i)); ++i)
00576
00577 #define FOREACH_INITV(init,v) \
00578 for (v = init; v != 0; v = Initv_Table[v].next)
00579
00580 #endif
00581
00582