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
00050
00051
00052
00053
00054
00055
00056
00057 #ifdef _KEEP_RCS_ID
00058 static char *rcs_id = "$Source: /scratch/mee/2.4-65/kpro64-pending/be/whirl2c/SCCS/s.stab_attr.cxx $ $Revision: 1.2 $";
00059 #endif
00060
00061
00062 #include "whirl2c_common.h"
00063 #include "const.h"
00064 #include "PUinfo.h"
00065 #include "ty2c.h"
00066 #include "cxx_memory.h"
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 #define NUM_FTN_TY_RNAMES (sizeof(Ftn_Reserved_Ty_Name)/sizeof(char *))
00078 #define NUM_FTN_ST_RNAMES (sizeof(Ftn_Reserved_St_Name)/sizeof(char *))
00079
00080 #ifdef BUILD_WHIRL2C
00081
00082
00083
00084
00085
00086 #define NUM_C_TY_RNAMES (sizeof(C_Reserved_Ty_Name)/sizeof(char *))
00087 #define NUM_C_ST_RNAMES (sizeof(C_Reserved_St_Name)/sizeof(char *))
00088
00089 static const char *const Ftn_Reserved_Ty_Name[] =
00090 {
00091 "_h_val",
00092 "__cabs_s",
00093 "__cabsl_s",
00094 "__fcabs_s",
00095 "__qcabs_s",
00096 "exception",
00097 "_COMPLEX32",
00098 "_COMPLEX64",
00099 "_COMPLEXQD",
00100 "split_st",
00101 "__$w2c_predef_ld_union",
00102 "__$w2c_predef_ldv_union"
00103 };
00104
00105 static const char *const Ftn_Reserved_St_Name[] =
00106 {
00107 "__huge_val",
00108 "_lib_version",
00109 };
00110
00111 static const char *const C_Reserved_Ty_Name[] =
00112 {
00113 "_h_val",
00114 "__cabs_s",
00115 "__cabsl_s",
00116 "__fcabs_s",
00117 "__qcabs_s",
00118 "exception",
00119 "_COMPLEX32",
00120 "_COMPLEX64",
00121 "_COMPLEXQD",
00122 "split_st",
00123 "__$w2c_predef_ld_union",
00124 "__$w2c_predef_ldv_union"
00125 };
00126
00127 static const char *const C_Reserved_St_Name[] =
00128 {
00129 "__huge_val",
00130 "_lib_version",
00131 };
00132
00133 static signed char C_Ty_Rname_Length[NUM_C_TY_RNAMES];
00134 static signed char C_St_Rname_Length[NUM_C_ST_RNAMES];
00135
00136 #else
00137
00138 static const char *const Ftn_Reserved_Ty_Name[] =
00139 {
00140 "split_st",
00141 "__$w2c_predef_ld_union",
00142 "__$w2c_predef_ldv_union"
00143 };
00144
00145 static const char *const Ftn_Reserved_St_Name[] =
00146 {
00147 "TO DO",
00148 "TO DO MORE"
00149 };
00150
00151 #endif
00152
00153
00154 static signed char Ftn_Ty_Rname_Length[NUM_FTN_TY_RNAMES];
00155 static signed char Ftn_St_Rname_Length[NUM_FTN_ST_RNAMES];
00156 static BOOL Rname_Lengths_Initiated = FALSE;
00157
00158 static void
00159 Initiate_Rname_Lengths(void)
00160 {
00161 INT idx;
00162
00163 #ifdef BUILD_WHIRL2C
00164 for (idx = 0; idx < NUM_C_TY_RNAMES; idx++)
00165 C_Ty_Rname_Length[idx] = strlen(C_Reserved_Ty_Name[idx]);
00166 for (idx = 0; idx < NUM_C_ST_RNAMES; idx++)
00167 C_St_Rname_Length[idx] = strlen(C_Reserved_St_Name[idx]);
00168 #endif
00169
00170 for (idx = 0; idx < NUM_FTN_TY_RNAMES; idx++)
00171 Ftn_Ty_Rname_Length[idx] = strlen(Ftn_Reserved_Ty_Name[idx]);
00172 for (idx = 0; idx < NUM_FTN_ST_RNAMES; idx++)
00173 Ftn_St_Rname_Length[idx] = strlen(Ftn_Reserved_St_Name[idx]);
00174
00175 Rname_Lengths_Initiated = TRUE;
00176 }
00177
00178
00179 BOOL
00180 Stab_Reserved_Ty(TY_IDX ty)
00181 {
00182
00183
00184
00185 const INT length = (TY_name(ty) != NULL? strlen(TY_name(ty)) : 0);
00186 BOOL found = FALSE;
00187 UINT idx;
00188
00189 if (!Rname_Lengths_Initiated)
00190 Initiate_Rname_Lengths();
00191
00192 #ifdef BUILD_WHIRL2C
00193
00194 if (TY2C_builtin(ty))
00195 found = TRUE;
00196 else if (W2C_Lower_Fortran)
00197 for (idx = 0; !found && idx < NUM_FTN_TY_RNAMES; idx++)
00198 found =
00199 ((Ftn_Ty_Rname_Length[idx] == length) &&
00200 (strcmp(Ftn_Reserved_Ty_Name[idx], TY_name(ty)) == 0));
00201 else
00202 for (idx = 0; !found && idx < NUM_C_TY_RNAMES; idx++)
00203 found =
00204 ((C_Ty_Rname_Length[idx] == length) &&
00205 (strcmp(C_Reserved_Ty_Name[idx], TY_name(ty)) == 0));
00206
00207 #else
00208
00209 for (idx = 0; !found && idx < NUM_FTN_TY_RNAMES; idx++)
00210 found =
00211 ((Ftn_Ty_Rname_Length[idx] == length) &&
00212 (strcmp(Ftn_Reserved_Ty_Name[idx], TY_name(ty)) == 0));
00213
00214 #endif
00215
00216 return found;
00217 }
00218
00219
00220 BOOL
00221 Stab_Reserved_St(const ST *st)
00222 {
00223
00224
00225
00226 const INT length = (ST_name(st) != NULL? strlen(ST_name(st)) : 0);
00227 BOOL found = FALSE;
00228 UINT idx;
00229
00230 if (!Rname_Lengths_Initiated)
00231 Initiate_Rname_Lengths();
00232
00233 #ifdef BUILD_WHIRL2C
00234
00235 if (W2C_Lower_Fortran)
00236 for (idx = 0; !found && idx < NUM_FTN_ST_RNAMES; idx++)
00237 found =
00238 ((Ftn_St_Rname_Length[idx] == length) &&
00239 (strcmp(Ftn_Reserved_St_Name[idx], ST_name(st)) == 0));
00240 else
00241 for (idx = 0; !found && idx < NUM_C_ST_RNAMES; idx++)
00242 found =
00243 ((C_St_Rname_Length[idx] == length) &&
00244 (strcmp(C_Reserved_St_Name[idx], ST_name(st)) == 0));
00245
00246 #else
00247
00248 for (idx = 0; !found && idx < NUM_FTN_ST_RNAMES; idx++)
00249 found =
00250 ((Ftn_St_Rname_Length[idx] == length) &&
00251 (strcmp(Ftn_Reserved_St_Name[idx], ST_name(st)) == 0));
00252
00253 #endif
00254
00255 return found;
00256 }
00257
00258
00259
00260
00261
00262
00263 void
00264 Stab_Reset_Referenced_Flag(SYMTAB_IDX symtab)
00265 {
00266
00267
00268
00269
00270
00271
00272
00273 ST_IDX st_idx;
00274 const ST *st;
00275
00276 #ifdef BUILD_WHIRL2F
00277
00278
00279
00280
00281
00282
00283 if (symtab == GLOBAL_SYMTAB) {
00284
00285 for (TY_IDX ty = 1; ty < TY_Table_Size(); ty++)
00286 if (TY_Is_Structured(ty))
00287 Reset_TY_is_translated_to_c(ty);
00288 }
00289 #endif
00290
00291 FOREACH_SYMBOL(symtab, st, st_idx)
00292 Clear_BE_ST_w2fc_referenced(st);
00293
00294
00295
00296
00297 if (symtab == GLOBAL_SYMTAB)
00298 Clear_w2fc_flags();
00299
00300 }
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 enum W2FC_FLAGS
00311 {
00312 W2FC_TY_TRANS = 0x02
00313 };
00314
00315 class W2FC_FLAG_ARRAY {
00316 private:
00317 INT32 _size ;
00318 char *_flags;
00319
00320 BOOL check_idx(INT32 index) { return (index < _size) ; }
00321
00322 public:
00323
00324 W2FC_FLAG_ARRAY(int sz)
00325 {
00326 _size = sz ;
00327 _flags = CXX_NEW_ARRAY(char,sz,Malloc_Mem_Pool);
00328 BZERO(_flags, sz);
00329 }
00330
00331 ~W2FC_FLAG_ARRAY()
00332 {
00333 CXX_DELETE_ARRAY(_flags,Malloc_Mem_Pool);
00334 _size = 0 ;
00335 _flags = NULL;
00336 }
00337
00338 void Set_w2fc_flag(INT32 index, enum W2FC_FLAGS flag)
00339 {
00340 if (check_idx(index))
00341 _flags[index] |= flag ;
00342 }
00343
00344 void Reset_w2fc_flag(INT32 index, enum W2FC_FLAGS flag)
00345 {
00346 if (check_idx(index))
00347 _flags[index] &= ~flag;
00348 }
00349
00350 BOOL Check_w2fc_flag(INT32 index,enum W2FC_FLAGS flag)
00351 {
00352 BOOL res = FALSE;
00353
00354 if (check_idx(index))
00355 res = _flags[index] & flag;
00356
00357 return res;
00358 }
00359
00360 void Clear_w2fc_flags(void)
00361 {
00362 if (_flags != NULL) {
00363 BZERO(_flags,_size*sizeof(mUINT8)) ;
00364 }
00365 }
00366 };
00367
00368
00369
00370 static W2FC_FLAG_ARRAY * W2fc_ty_tab;
00371
00372
00373
00374 extern void
00375 Set_TY_is_translated_to_c(const TY_IDX ty)
00376 {
00377 W2fc_ty_tab->Set_w2fc_flag(TY_IDX_index(ty),W2FC_TY_TRANS) ;
00378 }
00379
00380 extern void
00381 Reset_TY_is_translated_to_c(const TY_IDX ty)
00382 {
00383 W2fc_ty_tab->Reset_w2fc_flag(TY_IDX_index(ty),W2FC_TY_TRANS) ;
00384 }
00385
00386 extern BOOL
00387 TY_is_translated_to_c(const TY_IDX ty)
00388 {
00389 return (W2fc_ty_tab->Check_w2fc_flag(TY_IDX_index(ty),W2FC_TY_TRANS)) ;
00390 }
00391
00392
00393
00394 extern void
00395 Clear_w2fc_flags(void)
00396 {
00397
00398 W2fc_ty_tab->Clear_w2fc_flags() ;
00399 }
00400
00401
00402
00403
00404
00405 static BOOL
00406 Stab_Compare_Types(TY_IDX t1,
00407 TY_IDX t2,
00408 BOOL check_quals,
00409 BOOL check_pointed_quals,
00410 BOOL check_scalars,
00411 BOOL ptrs_as_scalars,
00412 BOOL assign_t2_to_t1)
00413 {
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427 INT i;
00428
00429 if (t1 == t2)
00430 return TRUE;
00431 else if (TY_kind(t1) == KIND_INVALID ||
00432 TY_kind(t2) == KIND_INVALID ||
00433 (check_quals && !Stab_Identical_Quals(t1, t2)) ||
00434 (check_pointed_quals &&
00435 !Stab_Assign_Compatible_Pointer_Quals(t1, t2)))
00436 return FALSE;
00437 else
00438 {
00439 switch (TY_kind(t1))
00440 {
00441 case KIND_VOID:
00442 return TY_kind(t2) == KIND_VOID;
00443
00444 case KIND_SCALAR:
00445 if (TY_Is_String(t1) && TY_Is_Array_Of_Chars(t2))
00446 return TRUE;
00447 else if (ptrs_as_scalars)
00448 return (TY_Is_Pointer_Or_Scalar(t2) &&
00449 (!check_scalars || TY_mtype(t1) == TY_mtype(t2)));
00450 else
00451 return (TY_Is_Scalar(t2) &&
00452 (!check_scalars || TY_mtype(t1) == TY_mtype(t2)));
00453
00454 case KIND_POINTER:
00455
00456 if (ptrs_as_scalars)
00457 return (TY_Is_Pointer_Or_Scalar(t2) &&
00458 (!check_scalars || TY_mtype(t1) == TY_mtype(t2)));
00459 else
00460 return
00461 (TY_Is_Pointer(t2) &&
00462 (TY_kind(TY_pointed(t1)) == KIND_VOID ||
00463 TY_kind(TY_pointed(t2)) == KIND_VOID ||
00464 Stab_Compare_Types(
00465 TY_pointed(t1),
00466 TY_pointed(t2),
00467 !assign_t2_to_t1,
00468 assign_t2_to_t1,
00469 TRUE,
00470 FALSE,
00471 FALSE)));
00472
00473 case KIND_FUNCTION:
00474
00475
00476
00477
00478
00479 return (TY_Is_Function(t2) &&
00480 TY_has_prototype(t1) == TY_has_prototype(t2) &&
00481 TY_is_varargs(t1) == TY_is_varargs(t2) &&
00482 TY_parms(t1) == TY_parms(t2) &&
00483 Stab_Compare_Types(Func_Return_Type(t1),
00484 Func_Return_Type(t2),
00485 TRUE,
00486 FALSE,
00487 TRUE,
00488 FALSE,
00489 FALSE)
00490 );
00491
00492 case KIND_ARRAY:
00493 if (TY_Is_String(t2) && TY_Is_Array_Of_Chars(t1))
00494 return TRUE;
00495 else if (!TY_Is_Array(t2) ||
00496 TY_AR_ndims(t1) != TY_AR_ndims(t2))
00497 return FALSE;
00498 else
00499 {
00500 for (i=0; i<TY_AR_ndims(t1); i++)
00501 {
00502
00503
00504
00505
00506
00507 if (TY_AR_const_lbnd(t1,i) != TY_AR_const_lbnd(t2,i) ||
00508 TY_AR_const_ubnd(t1,i) != TY_AR_const_ubnd(t2,i) ||
00509 TY_AR_const_stride(t1,i) != TY_AR_const_stride(t2,i))
00510 return FALSE;
00511 else if (TY_AR_const_lbnd(t1,i) &&
00512 (TY_AR_lbnd_val(t1,i) != TY_AR_lbnd_val(t2,i)))
00513 return FALSE;
00514 else if (TY_AR_const_ubnd(t1,i) &&
00515 (TY_AR_ubnd_val(t1,i) != TY_AR_ubnd_val(t2,i)))
00516 return FALSE;
00517 else if (TY_AR_const_stride(t1,i) &&
00518 (TY_AR_stride_val(t1,i) != TY_AR_stride_val(t2,i)))
00519 return FALSE;
00520 }
00521 return Stab_Compare_Types(TY_AR_etype(t1),
00522 TY_AR_etype(t2),
00523 TRUE,
00524 FALSE,
00525 TRUE,
00526 FALSE,
00527 FALSE);
00528 }
00529
00530 case KIND_STRUCT:
00531 return (TY_Is_Structured(t2) &&
00532 TY_flist(Ty_Table[t1]) == TY_flist(Ty_Table[t2]));
00533
00534 default:
00535 ErrMsg ( EC_Invalid_Case, "Stab_Compare_Types", __LINE__ );
00536 return FALSE;
00537 }
00538 }
00539 }
00540
00541
00542 BOOL
00543 Stab_Identical_Types(TY_IDX t1,
00544 TY_IDX t2,
00545 BOOL check_quals,
00546 BOOL check_scalars,
00547 BOOL ptrs_as_scalars)
00548 {
00549
00550
00551 return
00552 Stab_Compare_Types(
00553 t1, t2, check_quals, FALSE, check_scalars, ptrs_as_scalars, FALSE);
00554 }
00555
00556
00557 BOOL
00558 Stab_Assignment_Compatible_Types(TY_IDX t1,
00559 TY_IDX t2,
00560 BOOL check_quals,
00561 BOOL check_scalars,
00562 BOOL ptrs_as_scalars)
00563 {
00564
00565
00566
00567 return
00568 Stab_Compare_Types(
00569 t1, t2, check_quals, FALSE, check_scalars, ptrs_as_scalars, TRUE);
00570 }
00571
00572
00573 BOOL
00574 Stab_Array_Has_Dynamic_Bounds(TY_IDX ty)
00575 {
00576 INT32 dim;
00577 BOOL is_const = TRUE;
00578
00579 for (dim = 0; dim < TY_AR_ndims(ty); dim++)
00580 {
00581 is_const = (is_const &&
00582 TY_AR_const_lbnd(ty, dim) &&
00583 TY_AR_const_ubnd(ty, dim) &&
00584 TY_AR_const_stride(ty, dim));
00585 }
00586 return !is_const;
00587 }
00588
00589
00590 BOOL
00591 Stab_Is_Assumed_Sized_Array(TY_IDX ty)
00592 {
00593 BOOL assumed_size = FALSE;
00594
00595 if (TY_Is_Array(ty))
00596 {
00597
00598
00599
00600
00601
00602 ARB_HANDLE arb = TY_arb(ty);
00603
00604 if (ARB_const_lbnd(arb) &&
00605 ARB_const_ubnd(arb) &&
00606 (ARB_ubnd_val(arb) - ARB_lbnd_val(arb) <= 0))
00607 {
00608 assumed_size = TRUE;
00609 }
00610 else if ((!ARB_const_lbnd(arb) && ARB_lbnd_var(arb) == (ST_IDX) 0) ||
00611 (!ARB_const_ubnd(arb) && ARB_ubnd_var(arb) == (ST_IDX) 0))
00612 {
00613 assumed_size = TRUE;
00614 }
00615 }
00616 return assumed_size;
00617 }
00618
00619
00620 BOOL
00621 Stab_Is_Element_Type_Of_Array(TY_IDX atype, TY_IDX etype)
00622 {
00623 if (Stab_Assignment_Compatible_Types(etype, TY_AR_etype(atype),
00624 FALSE,
00625 TRUE,
00626 FALSE))
00627 return TRUE;
00628 else if (TY_Is_Array(TY_AR_etype(atype)))
00629 return Stab_Is_Element_Type_Of_Array(TY_AR_etype(atype), etype);
00630 else
00631 return FALSE;
00632 }
00633
00634
00635 BOOL
00636 Stab_Is_Equivalenced_Struct(TY_IDX ty)
00637 {
00638 FLD_ITER fld_iter = Make_fld_iter (TY_flist(Ty_Table[ty]));
00639 BOOL is_equivalent_fld = FALSE;
00640
00641 do {
00642 FLD_HANDLE fld (fld_iter);
00643
00644 if (fld.Is_Null()) {
00645 return FALSE;
00646 }
00647 is_equivalent_fld = FLD_equivalence (fld);
00648 } while (!FLD_last_field (fld_iter++) && !is_equivalent_fld);
00649
00650 return is_equivalent_fld;
00651 }
00652
00653
00654 TY_IDX
00655 Stab_Get_Mload_Ty(TY_IDX base, STAB_OFFSET offset, STAB_OFFSET size)
00656 {
00657
00658
00659
00660
00661 TY_IDX ty;
00662
00663 Is_True(TY_Is_Structured(base),
00664 ("Expected pointer to struct/union type in TY2C_Get_Mload_Ty()"));
00665 Is_True(TY_size(base) <= size,
00666 ("Expected struct/union type >= size in TY2C_Get_Mload_Ty()"));
00667
00668 if (TY_size(base) == size ||
00669 (TY_size(base) == 0 && TY_flist(Ty_Table[base]).Is_Null ()))
00670 {
00671
00672
00673
00674 ty = base;
00675 }
00676 else
00677 {
00678
00679
00680
00681 Is_True(!TY_flist(Ty_Table[base]).Is_Null (),
00682 ("Expected non-empty field list in TY2C_Get_Mload_Ty()"));
00683
00684 FLD_HANDLE this_fld = TY_flist(Ty_Table[base]);
00685 FLD_HANDLE next_fld = FLD_next(this_fld);
00686 if (TY_Is_Union(base))
00687 {
00688
00689 while (! next_fld.Is_Null () &&
00690 (!TY_Is_Structured(FLD_type(this_fld)) ||
00691 TY_size(FLD_type(this_fld)) < size))
00692 {
00693 this_fld = next_fld;
00694 next_fld = FLD_next(next_fld);
00695 }
00696 }
00697 else
00698 {
00699
00700 while (! next_fld.Is_Null () && FLD_ofst(next_fld) <= offset)
00701 {
00702 this_fld = next_fld;
00703 next_fld = FLD_next(next_fld);
00704 }
00705 }
00706
00707 Is_True(! this_fld.Is_Null () &&
00708 FLD_ofst(this_fld) <= offset &&
00709 (next_fld.Is_Null () || FLD_ofst(next_fld) >= offset) &&
00710 (TY_Is_Structured(FLD_type(this_fld))) &&
00711 TY_size(FLD_type(this_fld)) >= size,
00712 ("Could not find a field as expected in TY2C_Get_Mload_Ty()"));
00713
00714 ty = Stab_Get_Mload_Ty(FLD_type(this_fld),
00715 offset-FLD_ofst(this_fld),
00716 size);
00717 }
00718 return ty;
00719 }
00720
00721
00722
00723 extern TY_IDX
00724 Stab_Array_Of(TY_IDX etype, mINT64 num_elts)
00725 {
00726
00727
00728
00729 TY_IDX ty_idx;
00730
00731 ARB_HANDLE arb = New_ARB ();
00732 ARB_Init (arb, 0, num_elts - 1, TY_size(etype));
00733
00734 Set_ARB_dimension (arb,1);
00735 Set_ARB_last_dimen (arb);
00736 Set_ARB_first_dimen (arb);
00737
00738 TY& ty = New_TY (ty_idx);
00739 TY_Init (ty, TY_size(etype) * num_elts,KIND_ARRAY, MTYPE_UNKNOWN,0);
00740
00741 Set_TY_align (ty_idx, TY_size(etype));
00742 Set_TY_etype (ty, etype);
00743 Set_TY_arb (ty, arb);
00744
00745 return ty_idx;
00746
00747 }
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758 #ifdef W2CF_RESET_SYMTABS
00759 static TY_IDX Orig_Sizeof_Ty_Table;
00760 static FLD_IDX Orig_Sizeof_Fld_Table;
00761 static ARB_IDX Orig_Sizeof_Arb_Table;
00762 static TYLIST_IDX Orig_Sizeof_Tylist_Table;
00763 #endif
00764
00765
00766 void
00767 Stab_initialize_flags(void)
00768 {
00769 W2fc_ty_tab = CXX_NEW(W2FC_FLAG_ARRAY(TY_Table_Size()),Malloc_Mem_Pool);
00770 }
00771
00772 void
00773 Stab_finalize_flags(void)
00774 {
00775 CXX_DELETE(W2fc_ty_tab,Malloc_Mem_Pool) ;
00776 }
00777
00778 void
00779 Stab_initialize(void)
00780 {
00781
00782
00783
00784 #ifdef W2CF_RESET_SYMTABS
00785 Orig_Sizeof_Ty_Table = TY_Table_Size();
00786 Orig_Sizeof_Fld_Table = FLD_Table_Size();
00787 Orig_Sizeof_Arb_Table = ARB_Table_Size();
00788 Orig_Sizeof_Tylist_Table = TYLIST_Table_Size();
00789 #endif
00790
00791 }
00792
00793 void
00794 Stab_finalize(void)
00795 {
00796
00797
00798
00799
00800
00801
00802 #ifdef W2CF_RESET_SYMTABS
00803 INT32 diff;
00804 diff = TY_Table_Size() - Orig_Sizeof_Ty_Table;
00805 if (diff > 0)
00806 (&Ty_Table)->Delete_last(diff);
00807
00808 diff = FLD_Table_Size() - Orig_Sizeof_Fld_Table;
00809 if (diff > 0)
00810 Fld_Table.Delete_last(diff);
00811 diff = ARB_Table_Size() - Orig_Sizeof_Arb_Table;
00812 if (diff > 0)
00813 Arb_Table.Delete_last(diff);
00814 diff = TYLIST_Table_Size() - Orig_Sizeof_Tylist_Table;
00815 if (diff > 0)
00816 Tylist_Table.Delete_last(diff);
00817
00818 Verify_SYMTAB (CURRENT_SYMTAB);
00819 Verify_SYMTAB (GLOBAL_SYMTAB);
00820 #endif
00821
00822 }
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842 #define MIN_NAME_SLOTS 8
00843 #define MIN_NAME_BUF_SIZE 1024
00844 #define MAX_NUMSTRING_SIZE 128
00845
00846 static char *Name_Buf;
00847 static UINT Name_Buf_Idx = 0;
00848 static UINT Name_Buf_Size = 0;
00849
00850 static char *buffer_to_be_freed[MIN_NAME_SLOTS];
00851 static UINT next_delay_slot = 0;
00852 static UINT delay_count[MIN_NAME_SLOTS] = {0, 0, 0, 0, 0, 0, 0, 0};
00853 static INT next_to_be_freed = -1;
00854
00855
00856 void
00857 Stab_Free_Namebufs(void)
00858 {
00859
00860
00861 INT i;
00862
00863 if (next_to_be_freed > 0)
00864 {
00865 for (i=0; i < MIN_NAME_SLOTS; i++)
00866 if (delay_count[i] > 0)
00867 {
00868 FREE(buffer_to_be_freed[i]);
00869 delay_count[i] = 0;
00870 }
00871 next_to_be_freed = -1;
00872 next_delay_slot = 0;
00873 }
00874 if (Name_Buf_Size > 0)
00875 {
00876 FREE(Name_Buf);
00877 Name_Buf_Idx = Name_Buf_Size = 0;
00878 }
00879 }
00880
00881
00882 char *
00883 Get_Name_Buf_Slot(UINT size)
00884 {
00885 char *name_slot;
00886
00887
00888 if (next_to_be_freed >= 0 &&
00889 delay_count[next_to_be_freed] > 0)
00890 {
00891 delay_count[next_to_be_freed]--;
00892 if (delay_count[next_to_be_freed] == 0)
00893 {
00894 FREE(buffer_to_be_freed[next_to_be_freed]);
00895 buffer_to_be_freed[next_to_be_freed] = NULL;
00896 next_to_be_freed = (next_to_be_freed + 1) % MIN_NAME_SLOTS;
00897 }
00898 }
00899
00900
00901 if (size*MIN_NAME_SLOTS > Name_Buf_Size)
00902 {
00903
00904 if (Name_Buf_Size > 0)
00905 {
00906
00907
00908
00909 buffer_to_be_freed[next_delay_slot] = Name_Buf;
00910 delay_count[next_delay_slot] = MIN_NAME_SLOTS;
00911 next_delay_slot = (next_delay_slot + 1) % MIN_NAME_SLOTS;
00912
00913
00914 Name_Buf = TYPE_ALLOC_N(char, size*MIN_NAME_SLOTS);
00915 Name_Buf_Size = size*MIN_NAME_SLOTS;
00916 }
00917 else
00918 {
00919 UINT s = MIN_NAME_BUF_SIZE;
00920
00921 if (size*MIN_NAME_SLOTS > s) s = size*MIN_NAME_SLOTS;
00922 Name_Buf = TYPE_ALLOC_N(char, s);
00923 Name_Buf_Size = s;
00924 }
00925 }
00926
00927
00928
00929
00930
00931 if (size + Name_Buf_Idx > Name_Buf_Size)
00932 Name_Buf_Idx = 0;
00933
00934
00935 name_slot = &Name_Buf[Name_Buf_Idx];
00936 Name_Buf_Idx += size;
00937
00938 return name_slot;
00939 }
00940
00941
00942 const char *
00943 Number_as_String(INT64 number, const char *fmt)
00944 {
00945 char *new_name = Get_Name_Buf_Slot(MAX_NUMSTRING_SIZE);
00946
00947 sprintf(new_name, fmt, number);
00948 return new_name;
00949 }
00950
00951
00952 const char *
00953 Ptr_as_String(const void *ptr)
00954 {
00955 char *new_name = Get_Name_Buf_Slot(MAX_NUMSTRING_SIZE);
00956 union
00957 {
00958 const void *ptr;
00959 UINT32 u32;
00960 UINT64 u64;
00961 } ptr_as_number;
00962
00963 ptr_as_number.ptr = ptr;
00964
00965 if (sizeof(void *) == sizeof(UINT32))
00966 sprintf(new_name, "%u", ptr_as_number.u32);
00967 else if (sizeof(void *) == sizeof(UINT64))
00968 sprintf(new_name, "%llu", ptr_as_number.u64);
00969 else
00970 Is_True(FALSE, ("Unknown pointer size in Ptr_as_String()"));
00971
00972 return new_name;
00973 }
00974
00975
00976 const char *
00977 Concat2_Strings(const char *name1, const char *name2)
00978 {
00979
00980
00981
00982 INT name1_length;
00983 INT name2_length;
00984 char *new_name;
00985
00986 if (name1 == NULL)
00987 return name2;
00988 else if (name2 == NULL)
00989 return name1;
00990 else if (*name1 == '\0')
00991 return name2;
00992 else if (*name2 == '\0')
00993 return name1;
00994 else
00995 {
00996 name1_length = strlen(name1);
00997 name2_length = strlen(name2);
00998 new_name = Get_Name_Buf_Slot(name1_length + name2_length + 1);
00999
01000 (void)strcpy(new_name, name1);
01001 (void)strcpy(&new_name[name1_length], name2);
01002
01003 return new_name;
01004 }
01005 }
01006
01007
01008 UINT64
01009 Get_Hash_Value_For_Name(const char *name)
01010 {
01011
01012
01013
01014
01015 INT64 hash_value = 0;
01016 const char *cptr;
01017
01018 if (name != NULL)
01019 {
01020 for (cptr=name; *cptr != '\0'; cptr++)
01021 hash_value = (hash_value << (INT64)6) + (INT64)*cptr;
01022 }
01023 if (hash_value < 0)
01024 hash_value = -hash_value;
01025
01026 return hash_value;
01027 }
01028
01029
01030 STAB_OFFSET
01031 Stab_Full_Split_Offset(const ST *split_out_st)
01032 {
01033 const char *name = ST_name(split_out_st);
01034 INT i;
01035 STAB_OFFSET offset = 0;
01036 UINT64 digit = 1;
01037
01038 for (i = strlen(name) - 1;
01039 i >= 0 && '0' <= name[i] && '9' >= name[i];
01040 i--)
01041 {
01042 offset += (STAB_OFFSET)(name[i] - '0') * digit;
01043 digit *= 10;
01044 }
01045 return offset;
01046 }
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057 typedef struct TmpVarInfo
01058 {
01059 TY_IDX ty;
01060 BOOL locked;
01061 } TMPVARINFO;
01062
01063 #define TMPVAR_ALLOC_INCREMENTS 32
01064 static TMPVARINFO *TmpVar = NULL;
01065 static INT Next_Tmpvar_Idx = 0;
01066 static INT Max_Tmpvar_Idx = -1;
01067
01068
01069 void
01070 Stab_Free_Tmpvars(void)
01071 {
01072
01073
01074 if (TmpVar != NULL)
01075 {
01076 FREE(TmpVar);
01077 TmpVar = NULL;
01078 Next_Tmpvar_Idx = 0;
01079 Max_Tmpvar_Idx = -1;
01080 }
01081 }
01082
01083
01084 UINT
01085 Stab_Lock_Tmpvar(TY_IDX ty,
01086 void (*declare_tmpvar)(TY_IDX, UINT))
01087 {
01088
01089
01090
01091
01092 INT idx;
01093
01094
01095 for (idx = Next_Tmpvar_Idx - 1;
01096 (idx >= 0 &&
01097 (TmpVar[idx].locked ||
01098 !Stab_Identical_Types(TmpVar[idx].ty, ty, FALSE, TRUE, FALSE)));
01099 idx--);
01100
01101 if (idx < 0)
01102 {
01103
01104
01105
01106 if (Max_Tmpvar_Idx <= 0)
01107 {
01108
01109 TmpVar = TYPE_ALLOC_N(TMPVARINFO, TMPVAR_ALLOC_INCREMENTS);
01110 Max_Tmpvar_Idx = TMPVAR_ALLOC_INCREMENTS;
01111 }
01112 if (Next_Tmpvar_Idx >= Max_Tmpvar_Idx)
01113 {
01114
01115 TmpVar = TYPE_REALLOC_N(TMPVARINFO,
01116 TmpVar,
01117 Next_Tmpvar_Idx,
01118 Next_Tmpvar_Idx + TMPVAR_ALLOC_INCREMENTS);
01119 Max_Tmpvar_Idx += TMPVAR_ALLOC_INCREMENTS;
01120 }
01121 idx = Next_Tmpvar_Idx++;
01122 TmpVar[idx].ty = ty;
01123 declare_tmpvar(ty, idx);
01124 }
01125 TmpVar[idx].locked = TRUE;
01126 return idx;
01127 }
01128
01129
01130 void
01131 Stab_Unlock_Tmpvar(UINT idx)
01132 {
01133 Is_True(idx < Next_Tmpvar_Idx,
01134 ("Tmpvar index out of range in Stab_Unlock_Tmpvar()"));
01135
01136 TmpVar[idx].locked = FALSE;
01137 }