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 #ifdef USE_PCH
00042 #include "common_com_pch.h"
00043 #endif
00044 #pragma hdrstop
00045
00046
00047
00048
00049
00050
00051
00052
00053 #ifndef symtab_INCLUDED
00054 #include "symtab.h"
00055 #endif
00056
00057
00058
00059
00060
00061
00062
00063
00064 static void
00065 TCON_Verify (TCON tc) {
00066 #ifdef Is_True_On
00067 switch ( TCON_ty (tc)) {
00068 case MTYPE_STRING:
00069 Is_True( Targ_String_Address (tc) != NULL,
00070 ("Invalid TCON string pointer"));
00071 break;
00072 default:
00073 break;
00074 }
00075 #endif // Is_True_On
00076 }
00077
00078
00079
00080
00081
00082
00083 void
00084 ST_Verify_Class_Sclass(ST_CLASS sym_class, ST_SCLASS storage_class) {
00085 static char msg[] = "Invalid storage class (%s) for %s";
00086 switch (sym_class) {
00087 case CLASS_UNK:
00088 Is_True (storage_class == SCLASS_UNKNOWN,
00089 (msg, Sclass_Name (storage_class), Class_Name (sym_class)));
00090 break;
00091 case CLASS_VAR:
00092 switch (storage_class) {
00093 case SCLASS_AUTO:
00094 case SCLASS_FORMAL:
00095 case SCLASS_FORMAL_REF:
00096 case SCLASS_PSTATIC:
00097 case SCLASS_FSTATIC:
00098 case SCLASS_COMMON:
00099 case SCLASS_EXTERN:
00100 case SCLASS_UGLOBAL:
00101 case SCLASS_DGLOBAL:
00102 case SCLASS_CPLINIT:
00103 case SCLASS_EH_REGION:
00104 case SCLASS_EH_REGION_SUPP:
00105 case SCLASS_DISTR_ARRAY:
00106 case SCLASS_THREAD_PRIVATE_FUNCS:
00107 break;
00108 default:
00109 Fail_FmtAssertion (msg, Sclass_Name (storage_class),
00110 Class_Name (sym_class));
00111 break;
00112 }
00113 break;
00114 case CLASS_FUNC:
00115 Is_True (storage_class == SCLASS_EXTERN ||
00116 storage_class == SCLASS_TEXT,
00117 (msg, Sclass_Name (storage_class), Class_Name (sym_class)));
00118 break;
00119 case CLASS_CONST:
00120 Is_True (storage_class == SCLASS_FSTATIC ||
00121 storage_class == SCLASS_EXTERN,
00122 (msg, Sclass_Name(storage_class), Class_Name(sym_class)));
00123 break;
00124 case CLASS_PREG:
00125 Is_True (storage_class == SCLASS_REG,
00126 (msg, Sclass_Name(storage_class), Class_Name(sym_class)));
00127 break;
00128 case CLASS_BLOCK:
00129 Is_True (storage_class != SCLASS_REG,
00130 (msg, Sclass_Name(storage_class), Class_Name(sym_class)));
00131 break;
00132 case CLASS_NAME:
00133 Is_True (storage_class == SCLASS_UNKNOWN ||
00134 storage_class == SCLASS_COMMENT,
00135 (msg, Sclass_Name(storage_class), Class_Name(sym_class)));
00136 break;
00137 default:
00138 Fail_FmtAssertion (msg, Sclass_Name (storage_class),
00139 Class_Name (sym_class));
00140 break;
00141 }
00142 }
00143
00144
00145
00146
00147
00148
00149
00150 void
00151 ST_Verify_Sclass_Export (ST_SCLASS storage_class, ST_EXPORT export_class,
00152 const ST* st)
00153 {
00154 static char msg[] = "Invalid export scope (%s) for storage class (%s)";
00155 switch (storage_class) {
00156 case SCLASS_UNKNOWN:
00157 case SCLASS_AUTO:
00158 case SCLASS_FORMAL:
00159 case SCLASS_FORMAL_REF:
00160 case SCLASS_PSTATIC:
00161 case SCLASS_FSTATIC:
00162 case SCLASS_CPLINIT:
00163 case SCLASS_EH_REGION:
00164 case SCLASS_EH_REGION_SUPP:
00165 case SCLASS_DISTR_ARRAY:
00166 case SCLASS_THREAD_PRIVATE_FUNCS:
00167 case SCLASS_COMMENT:
00168
00169 if ( export_class == EXPORT_PREEMPTIBLE ) {
00170
00171 ST_IDX base_idx = ST_base_idx (st);
00172 Is_True ( base_idx != ST_st_idx (st),
00173 (msg, Export_Name(export_class), Sclass_Name (storage_class)));
00174 Is_True ( storage_class == ST_sclass(St_Table[base_idx]),
00175 (msg, Export_Name(export_class), Sclass_Name (storage_class)));
00176 }
00177 else {
00178 Is_True (export_class == EXPORT_LOCAL ||
00179 export_class == EXPORT_LOCAL_INTERNAL,
00180 (msg, Export_Name(export_class), Sclass_Name (storage_class)));
00181 }
00182 break;
00183 case SCLASS_COMMON:
00184 case SCLASS_DGLOBAL:
00185 if (export_class == EXPORT_LOCAL ||
00186 export_class == EXPORT_LOCAL_INTERNAL) {
00187 Is_True (st != NULL && ST_base_idx (st) != ST_st_idx (st) &&
00188 ST_sclass (St_Table[ST_st_idx (st)]) == storage_class,
00189 (msg, Export_Name(export_class),
00190 Sclass_Name (storage_class)));
00191 break;
00192 }
00193
00194
00195
00196 case SCLASS_EXTERN:
00197 case SCLASS_UGLOBAL:
00198 case SCLASS_TEXT:
00199 break;
00200
00201 case SCLASS_REG:
00202 Is_True (export_class == EXPORT_LOCAL ||
00203 export_class == EXPORT_LOCAL_INTERNAL,
00204 (msg, Export_Name(export_class), Sclass_Name (storage_class)));
00205 break;
00206 default:
00207 Fail_FmtAssertion (msg, Export_Name (export_class),
00208 Sclass_Name (storage_class));
00209 break;
00210 }
00211 }
00212
00213
00214
00215
00216
00217 static void
00218 ST_Verify_Flags (const ST &s)
00219 {
00220 static char msg[] = "Invalid %s (%s) for ST Flag: (%s)";
00221
00222 if (ST_is_weak_symbol (s)) {
00223 Is_True(ST_export(s) != EXPORT_LOCAL &&
00224 ST_export(s) != EXPORT_LOCAL_INTERNAL,
00225 (msg, "Export scope", Export_Name(ST_export(s)), "ST_WEAK_SYMBOL"));
00226
00227 if (ST_base_idx (s) != ST_st_idx (s))
00228 Is_True (ST_sclass (s) == SCLASS_EXTERN ||
00229 ST_sclass (s) == SCLASS_TEXT ||
00230 ST_sclass (s) == SCLASS_DGLOBAL ||
00231 ST_sclass (s) == SCLASS_UGLOBAL,
00232 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00233 "ST_WEAK_SYMBOL"));
00234 }
00235
00236
00237 if (ST_is_initialized (s)) {
00238 Is_True(ST_sym_class(s) == CLASS_VAR || ST_sym_class(s) == CLASS_CONST ||
00239 ST_sym_class(s) == CLASS_BLOCK,
00240 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_INITIALIZED"));
00241
00242 Is_True(ST_sclass(s) == SCLASS_PSTATIC ||
00243 ST_sclass(s) == SCLASS_FSTATIC ||
00244 ST_sclass(s) == SCLASS_EXTERN ||
00245 ST_sclass(s) == SCLASS_DGLOBAL ||
00246 ST_sclass(s) == SCLASS_UGLOBAL ||
00247 ST_sclass(s) == SCLASS_CPLINIT ||
00248 ST_sclass(s) == SCLASS_EH_REGION ||
00249 ST_sclass(s) == SCLASS_EH_REGION_SUPP ||
00250 ST_sclass(s) == SCLASS_DISTR_ARRAY ||
00251 ST_sclass(s) == SCLASS_THREAD_PRIVATE_FUNCS ||
00252 (ST_sclass(s) == SCLASS_UNKNOWN && ST_sym_class(s) == CLASS_BLOCK),
00253 (msg, "Storage class", Sclass_Name(ST_sclass(s)), "ST_INITIALIZED"));
00254 if (ST_sclass(s) == SCLASS_UGLOBAL)
00255 Is_True (ST_init_value_zero (s),
00256 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00257 "ST_INIT_VALUE_ZERO (must be set)"));
00258 }
00259
00260
00261 if (ST_sclass(s) == SCLASS_DGLOBAL)
00262 Is_True(ST_is_initialized (s),
00263 (msg,"Storage class", Sclass_Name(SCLASS_DGLOBAL),
00264 "ST_INITIALIZED (musr be set)"));
00265
00266
00267 if (ST_is_return_var (s))
00268 Is_True(ST_sclass(s) == SCLASS_AUTO ||
00269 ST_sclass(s) == SCLASS_PSTATIC ||
00270 ST_sclass(s) == SCLASS_FORMAL,
00271 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00272 "ST_IS_RETURN_VAR"));
00273
00274 if (ST_is_value_parm (s))
00275 Is_True (ST_sclass (s) == SCLASS_FORMAL ||
00276 ST_sclass (s) == SCLASS_FORMAL_REF,
00277 (msg, "Storage class", Sclass_Name (ST_sclass (s)),
00278 "ST_IS_VALUE_PARM"));
00279
00280 if (ST_is_reshaped (s))
00281 Is_True(ST_sym_class(s) == CLASS_VAR,
00282 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_IS_RESHAPED"));
00283
00284 if (ST_emit_symbol (s))
00285 Is_True(ST_sym_class(s) == CLASS_NAME ||
00286 ST_sym_class(s) == CLASS_FUNC ||
00287 ST_sym_class(s) == CLASS_VAR,
00288 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_EMIT_SYMBOL"));
00289
00290 if (ST_has_nested_ref (s))
00291 Is_True(ST_sclass(s) == SCLASS_AUTO ||
00292 ST_sclass(s) == SCLASS_FORMAL ||
00293 ST_sclass(s) == SCLASS_FORMAL_REF ||
00294 ST_sclass(s) == SCLASS_PSTATIC,
00295 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00296 "ST_HAS_NESTED_REF"));
00297
00298 if (ST_init_value_zero (s)) {
00299 Is_True(ST_sym_class(s) == CLASS_VAR,
00300 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_INIT_VALUE_ZERO"));
00301
00302 Is_True(ST_sclass(s) == SCLASS_EXTERN ||
00303 ST_sclass(s) == SCLASS_UGLOBAL ||
00304 ST_sclass(s) == SCLASS_FSTATIC ||
00305 ST_sclass(s) == SCLASS_PSTATIC,
00306 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00307 "ST_INIT_VALUE_ZERO"));
00308
00309 Is_True(ST_is_initialized (s),
00310 (msg, "ST_IS_INITIALIZED", Class_Name(ST_sym_class(s)),
00311 "ST_INIT_VALUE_ZERO"));
00312
00313 }
00314
00315 if (ST_gprel (s) || ST_not_gprel (s)) {
00316 Is_True(ST_sym_class(s) == CLASS_VAR ||
00317 ST_sym_class(s) == CLASS_CONST ||
00318 ST_sym_class(s) == CLASS_BLOCK,
00319 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_GPREL"));
00320
00321 Is_True(ST_sclass(s) != SCLASS_AUTO &&
00322 ST_sclass(s) != SCLASS_FORMAL &&
00323 ST_sclass(s) != SCLASS_FORMAL_REF,
00324 (msg, "Storage class", Sclass_Name(ST_sclass(s)), "ST_GPREL"));
00325 }
00326
00327 if (ST_is_namelist (s))
00328 Is_True(ST_sym_class(s) == CLASS_VAR,
00329 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_IS_NAMELIST"));
00330
00331
00332 if (ST_is_f90_target (s))
00333 Is_True(ST_sym_class(s) == CLASS_VAR,
00334 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_IS_F90_TARGET"));
00335
00336
00337 if (ST_declared_static (s))
00338 Is_True(ST_sym_class(s) == CLASS_VAR,
00339 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_DECLARED_STATIC"));
00340
00341 if (ST_is_equivalenced (s))
00342 Is_True(ST_sym_class(s) == CLASS_VAR,
00343 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_IS_EQUIVALENCED"));
00344
00345 if (ST_is_fill_align (s))
00346 Is_True(ST_sym_class(s) == CLASS_VAR,
00347 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_IS_FILL_ALIGN"));
00348
00349 if (ST_is_optional_argument (s))
00350 Is_True(ST_sclass(s) == SCLASS_FORMAL_REF ||
00351 ST_sclass(s) == SCLASS_FORMAL,
00352 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00353 "ST_IS_OPTIONAL_ARGUMENT"));
00354
00355 if (ST_is_temp_var (s))
00356 Is_True(ST_sclass(s) == SCLASS_AUTO ||
00357 #if defined(TARG_NVISA)
00358
00359 ST_sclass(s) == SCLASS_PSTATIC ||
00360 #endif
00361 ST_sclass(s) == SCLASS_FORMAL ||
00362 ST_sclass(s) == SCLASS_FORMAL_REF,
00363 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00364 "ST_IS_TEMP_VAR"));
00365
00366 if (ST_is_const_var (s)) {
00367 Is_True(ST_sym_class(s) == CLASS_VAR,
00368 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_IS_CONST_VAR"));
00369
00370 Is_True(ST_sclass(s) != SCLASS_AUTO &&
00371 #if !defined(TARG_NVISA)
00372
00373 ST_sclass(s) != SCLASS_FORMAL &&
00374 #endif
00375 ST_sclass(s) != SCLASS_FORMAL_REF,
00376 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00377 "ST_IS_CONST_VAR"));
00378 }
00379
00380 if (ST_pt_to_unique_mem (s)) {
00381 Is_True (ST_sym_class (s) == CLASS_VAR,
00382 (msg, "Class", Class_Name(ST_sym_class(s)),
00383 "ST_PT_TO_UNIQUE_MEM"));
00384 }
00385
00386 if (ST_addr_saved (s))
00387 Is_True(ST_sym_class(s) != CLASS_PREG,
00388 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_ADDR_SAVED"));
00389
00390 if (ST_addr_passed (s))
00391 Is_True(ST_sym_class(s) != CLASS_PREG,
00392 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_ADDR_PASSED"));
00393
00394 if (ST_is_shared_auto (s)) {
00395 Is_True(ST_sym_class(s) == CLASS_VAR,
00396 (msg, "Class", Class_Name(ST_sym_class(s)), "ST_IS_SHARED_AUTO"));
00397
00398 Is_True(ST_sclass(s) == SCLASS_AUTO,
00399 (msg, "Storage class", Sclass_Name(ST_sclass(s)),
00400 "ST_IS_SHARED_AUTO"));
00401 }
00402
00403 Is_True (! (ST_is_weak_symbol (s) &&
00404 ST_is_split_common (s)),
00405 (msg, "Flags", " ", "ST_is_split_common & ST_is_weak_symbol"));
00406
00407 }
00408
00409
00410
00411
00412 static void
00413 ST_Verify_Fields(const ST &s)
00414 {
00415 static char msg[] = "Invalid entry for ST Field: (%s)";
00416 if ( ST_sym_class(s) == CLASS_CONST) {
00417 Is_True( 0 < ST_tcon(s) && ST_tcon(s) < TCON_Table_Size (),
00418 (msg, "tcon"));
00419
00420
00421 TCON_Verify(Tcon_Table[ST_tcon (s)]);
00422 }
00423 else {
00424 switch (ST_export (s)) {
00425
00426 default:
00427 Is_True (0 < ST_name_idx (s), (msg, "name_idx"));
00428
00429
00430 case EXPORT_LOCAL:
00431 case EXPORT_LOCAL_INTERNAL:
00432 Is_True(ST_name_idx(s) < STR_Table_Size (), (msg, "name_idx"));
00433 break;
00434 }
00435 }
00436
00437 if (ST_level (&s) > GLOBAL_SYMTAB)
00438 Is_True (ST_export (s) == EXPORT_LOCAL ||
00439 ST_export (s) == EXPORT_LOCAL_INTERNAL,
00440 (msg, "export"));
00441
00442 switch (ST_sym_class (s)) {
00443 case CLASS_FUNC:
00444 #ifndef KEY
00445 Is_True (ST_level (&s) == GLOBAL_SYMTAB, (msg, "sym_class"));
00446 #endif
00447 Is_True( 0 < ST_pu(s) && ST_pu(s) < PU_Table_Size (), (msg, "pu"));
00448
00449
00450 Pu_Table[ST_pu (s)].Verify (ST_level(&s));
00451 break;
00452 case CLASS_BLOCK:
00453 if (ST_blk(s) == 0)
00454 DevWarn ("ST_blk == 0?");
00455 else
00456 Is_True (ST_blk (s) > 0 && ST_blk (s) < Blk_Table.Size (),
00457 (msg, "name"));
00458 break;
00459 default:
00460 case CLASS_UNK:
00461 Fail_FmtAssertion (msg, Class_Name (ST_sym_class(s)));
00462 break;
00463 case CLASS_PREG:
00464 Is_True( ((&s == Return_Val_Preg) || (0 < TY_IDX_index (ST_type(s)) &&
00465 TY_IDX_index (ST_type(s)) < TY_Table_Size ())),
00466 (msg, "type"));
00467 break;
00468 case CLASS_VAR:
00469 case CLASS_CONST:
00470 Is_True( 0 < TY_IDX_index (ST_type(s)) &&
00471 TY_IDX_index (ST_type(s)) < TY_Table_Size (),
00472 (msg, "type"));
00473 break;
00474 case CLASS_NAME:
00475
00476 Is_True((ST_sclass(s) == SCLASS_UNKNOWN ||
00477 ST_sclass(s) == SCLASS_COMMENT) &&
00478 ST_export(s) == EXPORT_LOCAL,
00479 (msg,"sclass, export, base_idx"));
00480
00481 Is_True( 0 < ST_name_idx(s) && ST_name_idx(s) < STR_Table_Size (),
00482 (msg, "name"));
00483 break;
00484 }
00485
00486
00487
00488 Is_True (ST_base_idx(s) != 0, (msg, "base_idx"));
00489
00490 if ( ST_base_idx(s) != ST_st_idx(s)) {
00491
00492
00493
00494
00495
00496
00497 INT64 ofst;
00498 ST *sb;
00499 ST *snon_const = (ST *) &s;
00500
00501
00502 Base_Symbol_And_Offset ( snon_const, &sb, &ofst );
00503
00504
00505 if ( ST_storage_class (*sb) != SCLASS_UNKNOWN) {
00506
00507 if ( !ST_is_weak_symbol (s) )
00508 Is_True( ST_storage_class(s) == ST_storage_class(*sb),
00509 (msg,"storage class, should be identical as based blocks"));
00510
00511 }
00512 else {
00513
00514 Is_True( ST_export(sb) == EXPORT_LOCAL && ST_class(sb) ==CLASS_BLOCK,
00515 (msg,"export scope, for based st with SCLASS_UNKNOWN should be EXPORT_LOCAL and class should be CLASS_BLOCK"));
00516 }
00517
00518
00519 if ( ST_sym_class (s) == CLASS_BLOCK) {
00520 Is_True( ST_sym_class (s) == ST_sym_class (sb),
00521 (msg, "storage_class"));
00522 }
00523
00524
00525 #ifdef TARG_MIPS
00526
00527
00528
00529
00530
00531 if (ST_storage_class(s) != SCLASS_FORMAL)
00532 #endif
00533 if (!(ofst + ST_size (&s) <= ST_size (sb)) && (ST_class(sb) != CLASS_BLOCK || !STB_is_basereg(sb)))
00534 DevWarn("ofst + size of a ST (%s) should be less than size of its base (%s)", ST_name(s), ST_name(sb));
00535
00536 }
00537 else {
00538
00539 Is_True(ST_ofst(s) == 0,
00540 ("offset: should be zero for st (%s) that is not based", ST_name(s)));
00541 }
00542 }
00543
00544
00545
00546
00547
00548 void
00549 ST::Verify (UINT) const
00550 {
00551 #ifdef Is_True_On
00552 ST_Verify_Class_Sclass (sym_class, storage_class);
00553 ST_Verify_Sclass_Export (storage_class, export_class, this);
00554 ST_Verify_Flags(*this);
00555 ST_Verify_Fields(*this);
00556 #endif // Is_True_On
00557 }
00558
00559
00560
00561
00562
00563
00564 void INITO::Verify(UINT level) const
00565 {
00566 #ifdef Is_True_On
00567 Is_True(ST_IDX_index (st_idx) > 0 &&
00568 ST_IDX_index (st_idx) < ST_Table_Size (ST_IDX_level (st_idx)),
00569 ("Invalid st_idx for INITO"));
00570 #ifndef KEY // no longer true because INITO is used to link up nested functions
00571 Is_True(ST_is_initialized (St_Table[st_idx]),
00572 ("ST_IS_INITIALIZED not set"));
00573 #endif
00574 Is_True(0 < val && val < INITV_Table_Size(),
00575 ("Invalid field for INITO: val"));
00576 Is_True(level == ST_IDX_level(st_idx),
00577 ("INITO/st_idx level mismatch"));
00578 #endif
00579 }
00580
00581
00582
00583
00584
00585
00586 void INITV::Verify(UINT) const
00587 {
00588 #ifdef Is_True_On
00589 static char msg[] = "Invalid entry for INITV Field: (%s)";
00590
00591 switch (kind) {
00592 case INITVKIND_SYMOFF:
00593 Is_True ( repeat1 != 0,
00594 (msg, "repeat1: should not be 0"));
00595 break;
00596 #ifdef TARG_IA64
00597 case INITVKIND_SYMIPLT:
00598 Is_True ( repeat1 != 0,
00599 (msg, "repeat1: should not be 0"));
00600 break;
00601 #endif
00602 case INITVKIND_ZERO:
00603 Is_True ( repeat1 == 0,
00604 (msg, "repeat1: should be 0"));
00605 Is_True ( Repeat2 () != 0,
00606 (msg, "repeat2: should be 0"));
00607 break;
00608 case INITVKIND_ONE:
00609 Is_True ( repeat1 == 0,
00610 (msg, "repeat1: should be 0"));
00611 Is_True ( Repeat2 () != 0,
00612 (msg, "repeat2: should be 1"));
00613 break;
00614 case INITVKIND_VAL:
00615 Is_True ( repeat1 == 0,
00616 (msg, "repeat1: should be 0"));
00617 break;
00618 case INITVKIND_BLOCK:
00619 #ifndef KEY // need blk == 0 for init of size 0 structs, as in bug 961
00620 Is_True ( Blk () != 0, (msg, "blk: should not be 0"));
00621 #endif // KEY
00622 #ifdef KEY
00623 Is_True ( repeat1 != 0, (msg, "repeat1: should not be 0"));
00624 break;
00625 #endif // KEY
00626 case INITVKIND_LABEL:
00627 Is_True ( u.lab.flags >= INITVLABELFLAGS_FIRST && u.lab.flags <= INITVLABELFLAGS_LAST,
00628 (msg, "bad label flag"));
00629 if ( u.lab.flags == INITVLABELFLAGS_UNUSED ) {
00630 Is_True ( u.lab.mtype == MTYPE_UNKNOWN, (msg, "bad mtype for lab") );
00631 }
00632 else {
00633 Is_True ( u.lab.mtype != MTYPE_UNKNOWN, (msg, "bad mtype for lab value") );
00634 }
00635 Is_True ( repeat1 != 0,
00636 (msg, "repeat1: should not be 0"));
00637 break;
00638 case INITVKIND_PAD:
00639 Is_True (u.pad.unused == 0,
00640 (msg, "unused fillers for lab, blk, and pad must be zero"));
00641
00642 case INITVKIND_SYMDIFF:
00643 case INITVKIND_SYMDIFF16:
00644 Is_True ( repeat1 != 0,
00645 (msg, "repeat1: should not be 0"));
00646 break;
00647 case INITVKIND_UNK:
00648 default:
00649 Fail_FmtAssertion (msg, "kind: unknown");
00650 break;
00651 }
00652 #endif
00653 }
00654
00655
00656
00657
00658
00659
00660 void FLD::Verify (UINT64 record_size) const
00661 {
00662 #ifdef Is_True_On
00663 const int FLD_BIT_FIELD_SIZE = 64;
00664 const int FLD_BIT_OFFSET_SIZE = 64;
00665 static char msg[] = "Invalid entry for FLD Field: (%s)";
00666
00667 Is_True (name_idx < STR_Table_Size (), (msg, "name_idx"));
00668
00669 Is_True (TY_IDX_index (type) < TY_Table_Size (), (msg, "type"));
00670
00671 Is_True (bsize <= FLD_BIT_FIELD_SIZE, (msg, "bsize"));
00672
00673 Is_True (bofst <= FLD_BIT_OFFSET_SIZE, (msg, "bofst"));
00674
00675 if (ofst > record_size)
00676 Fail_FmtAssertion (msg, "ofst");
00677
00678 else if (ofst == record_size) {
00679
00680 if (flags & FLD_IS_BIT_FIELD) {
00681
00682
00683
00684
00685
00686
00687
00688
00689 Is_True (bsize == 0, (msg, "ofst"));
00690 } else {
00691
00692 if ( !(this->flags & FLD_LAST_FIELD) || (TY_kind (this->type) != KIND_ARRAY))
00693 Is_True (TY_size (type) == 0, (msg, "ofst"));
00694 }
00695
00696 }
00697
00698 if (! (flags & FLD_IS_BIT_FIELD)) {
00699 Is_True ( bsize == 0, (msg, "bsize"));
00700 Is_True ( bofst == 0, (msg, "bofst"));
00701 }
00702
00703 if (! (flags & FLD_EQUIVALENCE) && st) {
00704 Is_True (ST_IDX_level (st) == GLOBAL_SYMTAB, (msg, "st"));
00705 }
00706
00707
00708 #endif // Is_True_On
00709 }
00710
00711
00712 static void
00713 FLD_Verify_all (FLD_HANDLE fld_handle, UINT64 record_size)
00714 {
00715 #ifdef Is_True_On
00716 FLD_ITER iter = Make_fld_iter (fld_handle);
00717 FLD_ITER last = Fld_Table.end ();
00718
00719 do {
00720 (*iter).Verify (record_size);
00721 } while (!FLD_last_field(iter) && ++iter != last);
00722
00723 Is_True (iter != last && FLD_last_field (iter),
00724 ("Missing last field in FLD"));
00725 #endif
00726 }
00727
00728
00729
00730
00731
00732
00733 void ARB::Verify (mUINT16 dim) const
00734 {
00735 #ifdef Is_True_On
00736 static char msg[] = "Invalid entry for ARB Field: (%s)";
00737
00738 Is_True (dimension == dim, (msg, "invalid array dimension"));
00739
00740 Is_True (unused == 0, (msg, "Unused filler fields"));
00741
00742 if (!(flags & ARB_CONST_LBND) && Lbnd_var() != 0) {
00743 Is_True (u1.var.unused == 0, (msg, "Unused filler fields"));
00744 }
00745
00746 if ( ! (flags & ARB_CONST_UBND) && Ubnd_var() != 0) {
00747 Is_True( u2.var.unused == 0, (msg, "Unused filler fields"));
00748 }
00749
00750 if ( ! (flags & ARB_CONST_STRIDE) && Stride_var() != 0) {
00751 Is_True( u3.var.unused == 0, (msg, "Unused filler fields"));
00752 }
00753
00754 if (dim == 1)
00755 Is_True (flags & ARB_LAST_DIMEN, (msg, "missing ARB_LAST_DIMEN bit"));
00756 else
00757 Is_True (! (flags & ARB_LAST_DIMEN),
00758 (msg, "ARB_LAST_DIMEN bit inconsistent with dimension"));
00759
00760 #endif // Is_True_On
00761 }
00762
00763 static void
00764 ARB_Verify_all (ARB_HANDLE arb)
00765 {
00766 #ifdef Is_True_On
00767 ARB_IDX last = ARB_Table_Size ();
00768
00769 Is_True (ARB_first_dimen (arb), ("Invalid ARB_IDX"));
00770
00771 mUINT16 dim = ARB_dimension (arb);
00772 Is_True((dim>=1),("Invalid ARB dimension"));
00773 Is_True((arb.Idx() + dim <= last),("Invalid ARB_dimension"));
00774 Is_True(ARB_first_dimen(arb),("Missing ARB_FIRST_DIMEN bit"));
00775 for (INT i=0; i < dim; i++) {
00776 arb[i].Entry()->Verify(dim-i);
00777 }
00778 #endif
00779 }
00780
00781
00782
00783
00784
00785
00786 void LABEL::Verify(UINT) const
00787 {
00788 #ifdef Is_True_On
00789 Is_True( LABEL_name_idx (*this) < STR_Table_Size (),
00790 ("Invalid LABEL name"));
00791 #endif // Is_True_On
00792 }
00793
00794
00795
00796
00797
00798
00799 void PREG::Verify(UINT) const
00800 {
00801 #ifdef Is_True_On
00802 Is_True( PREG_name_idx (*this) < STR_Table_Size (),
00803 ("Invalid PREG name"));
00804 #endif // Is_True_On
00805 }
00806
00807
00808
00809
00810
00811 void
00812 ST_ATTR::Verify (UINT level) const
00813 {
00814 #ifdef Is_True_On
00815 Is_True(level == ST_IDX_level(st_idx),
00816 ("ST_ATTR/st_idx level mismatch"));
00817 Is_True(ST_IDX_index (st_idx) > 0 &&
00818 ST_IDX_index (st_idx) < ST_Table_Size (ST_IDX_level (st_idx)),
00819 ("Invalid st_idx for ST_ATTR"));
00820 const ST& st = St_Table[st_idx];
00821 switch (kind) {
00822 case ST_ATTR_UNKNOWN:
00823 break;
00824 case ST_ATTR_DEDICATED_REGISTER:
00825 Is_True(ST_assigned_to_dedicated_preg (st),
00826 ("ST_ASSIGNED_TO_DEDICATED_PREG not set"));
00827 Is_True(TY_is_volatile (ST_type (st)),
00828 ("dedicated registers must be marked volatile"));
00829 break;
00830 case ST_ATTR_SECTION_NAME:
00831 Is_True(u.section_name < STR_Table_Size (), ("Invalid section name"));
00832 break;
00833 default:
00834 Fail_FmtAssertion ("Unknown ST_ATTR kind");
00835 break;
00836 }
00837 #endif
00838 }
00839
00840
00841
00842
00843
00844
00845 void
00846 TY_Verify_Kind_Mtype (TY_KIND kind, mTYPE_ID mtype)
00847 {
00848 static char msg[] = "Invalid TY kind/mtype combination: %s";
00849
00850 switch (kind) {
00851 case KIND_SCALAR:
00852 Is_True ( mtype != MTYPE_UNKNOWN &&
00853 mtype != MTYPE_V &&
00854 mtype != MTYPE_A4 &&
00855 mtype != MTYPE_A8,
00856 (msg, "For KIND_SCALAR, mtype cannot be VOID/UNKNOWN"));
00857 break;
00858 case KIND_ARRAY:
00859 Is_True ( mtype == MTYPE_UNKNOWN || mtype == MTYPE_M,
00860 (msg, "For KIND_ARRAY, mtype must be UNKNOWN"));
00861 break;
00862 case KIND_STRUCT:
00863 Is_True ( mtype == MTYPE_M,
00864 (msg, "For KIND_STRUCT, mtype must be M"));
00865 break;
00866 case KIND_POINTER:
00867 {
00868 TYPE_ID a_type = (Pointer_Size == MTYPE_byte_size (MTYPE_A4)) ?
00869 MTYPE_A4 : MTYPE_A8;
00870 Is_True ( mtype == Pointer_Mtype || mtype == a_type,
00871 (msg, "For KIND_POINTER, mtype MUST be MTYPE_U4/U8/A4/A8"));
00872 }
00873 break;
00874 case KIND_FUNCTION:
00875 Is_True ( mtype == MTYPE_UNKNOWN,
00876 (msg, "For KIND_FUNCTION, mtype must be UNKNOWN"));
00877 break;
00878 case KIND_VOID:
00879 Is_True ( mtype == MTYPE_V,
00880 (msg, "For KIND_VOID, mtype must be VOID"));
00881 break;
00882 default:
00883 Fail_FmtAssertion (msg, "invalid KIND");
00884 break;
00885 }
00886 }
00887
00888
00889
00890
00891
00892
00893
00894 void TY::Verify(UINT) const
00895 {
00896 #ifdef Is_True_On
00897 static char msg[] = "Invalid TY entries: (%s)";
00898 FLD_IDX Fld_index;
00899 TYLIST_IDX Tylist_index;
00900 UINT32 ty_idx;
00901
00902 TY_Verify_Kind_Mtype (kind, mtype);
00903
00904 Is_True (name_idx < STR_Table_Size (), (msg, "name_idx out of bound"));
00905
00906 switch (kind) {
00907
00908 default:
00909 Fail_FmtAssertion (msg, "Invalid kind");
00910 break;
00911
00912 case KIND_STRUCT:
00913 Fld_index = Fld ();
00914
00915 Is_True (Fld_index < FLD_Table_Size (),
00916 (msg, "TY::fld should be a valid index to the Fld_Table"));
00917
00918
00919 if (Fld_index > 0)
00920 FLD_Verify_all (FLD_HANDLE (Fld_index), size);
00921
00922 #ifndef KEY // u2.copy_constructor
00923 Is_True (u2.etype == 0, (msg, "non-zero TY::etyp for KIND_STRUCT"));
00924 #endif
00925
00926 break;
00927
00928 case KIND_FUNCTION:
00929
00930 TY_Verify_Kind_Function (kind, size, mtype);
00931
00932 Tylist_index = TY_tylist (*this);
00933
00934 Is_True (Tylist_index > 0 && Tylist_index < TYLIST_Table_Size (),
00935 (msg, "Invalid TY::tylist for KIND_FUNCTION"));
00936
00937 ty_idx = TY_IDX_index (Tylist_Table[Tylist_index]);
00938
00939 do {
00940 Is_True (ty_idx > 0 && ty_idx < TY_Table_Size (),
00941 (msg, "Invalid TY_IDX in prototype"));
00942 ++Tylist_index;
00943 Is_True (Tylist_index < TYLIST_Table_Size (),
00944 (msg, "TYLIST_IDX out of bound"));
00945 ty_idx = TY_IDX_index (Tylist_Table[Tylist_index]);
00946 } while (ty_idx != 0);
00947
00948 break;
00949
00950 case KIND_ARRAY:
00951
00952 Is_True( TY_arb(*this).Idx() > 0 && TY_arb(*this).Idx() < ARB_Table_Size (),
00953 (msg, "TY::arb should be set for KIND_ARRAY"));
00954
00955 ARB_Verify_all (TY_arb (*this));
00956
00957 Is_True( TY_IDX_index (TY_etype (*this)) > 0 &&
00958 TY_IDX_index (TY_etype (*this)) < TY_Table_Size (),
00959 (msg, "TY::etype should be set for KIND_ARRAY"));
00960
00961 break;
00962
00963 case KIND_VOID:
00964
00965 Is_True (size == 0, (msg, "non-zero size for KIND_VOID"));
00966
00967 Is_True (u1.fld == 0, (msg, "non-zero TY::fld for KIND_VOID"));
00968
00969 Is_True (u2.etype == 0, (msg, "non-zero TY::etype for KIND_VOID"));
00970
00971 break;
00972
00973 case KIND_POINTER:
00974 Is_True (size == Pointer_Size, (msg, "Invalid size for KIND_POINTER"));
00975
00976 Is_True (u1.fld == 0,
00977 (msg, "non-zero TY::fld for KIND_POINTER"));
00978
00979 Is_True (TY_IDX_index (TY_pointed (*this)) > 0 &&
00980 TY_IDX_index (TY_pointed (*this)) < TY_Table_Size (),
00981 (msg, "invalid TY_IDX for KIND_POINTER"));
00982
00983 break;
00984
00985 case KIND_SCALAR:
00986
00987 Is_True (u1.fld == 0, (msg, "non-zero TY::fld for KIND_SCALAR"));
00988
00989 Is_True (u2.etype == 0, (msg, "non-zero TY::etype for KIND_SCALAR"));
00990
00991 break;
00992 }
00993
00994
00995
00996 if ( TY_is_union (*this))
00997 Is_True (kind == KIND_STRUCT,
00998 (msg, "TY_IS_UNION can only be set for STRUCTS"));
00999
01000 if ( TY_is_packed (*this))
01001 Is_True (kind == KIND_STRUCT,
01002 (msg, "TY_IS_PACKED can only be set for STRUCTS/CLASSES"));
01003
01004 if ( TY_ptr_as_array (*this))
01005 Is_True (kind == KIND_POINTER,
01006 (msg, "TY_PTR_AS_ARRAY can only be set for POINTERS"));
01007
01008 if ( TY_anonymous (*this))
01009 Is_True (kind == KIND_STRUCT || kind == KIND_ARRAY,
01010 (msg, "TY_ANONYMOUS can only be set for STRUCTS/CLASSES/ARRAYS"));
01011
01012 #endif // Is_True_On
01013 }
01014
01015
01016
01017
01018
01019
01020
01021 void PU::Verify(UINT) const
01022 {
01023 #ifdef Is_True_On
01024
01025
01026 Is_True (PU_target_idx (*this) == TARGET_INFO_IDX_ZERO,
01027 ("PU::target_info_idx != 0"));
01028
01029
01030 Is_True (TY_IDX_index (prototype) > 0 &&
01031 TY_IDX_index (prototype) < TY_Table_Size (),
01032 ("Invalid TY_IDX in PU::prototype"));
01033
01034 #ifdef KEY
01035
01036
01037 if (!(src_lang & PU_CXX_LANG) && !(src_lang & PU_C_LANG))
01038 Is_True (misc == 0, ("misc fields must be zero"));
01039 #endif // KEY
01040
01041 Is_True (unused == 0, ("unused fields must be zero"));
01042
01043
01044 static char msg[] = "Invalid PU flags: (%s)";
01045
01046 if ( PU_is_mainpu (*this) ||
01047 PU_has_return_address (*this))
01048 Is_True( PU_no_inline (*this),
01049 (msg, "Recursive or main pus and pus that contain return address, should be marked no-inline"));
01050
01051 if ( PU_no_inline (*this) && PU_must_inline (*this))
01052 Fail_FmtAssertion (msg, "must_inline and no_inline");
01053
01054 if ( PU_has_exc_scopes (*this))
01055 Is_True( PU_cxx_lang (*this),
01056 (msg, "exception scopes can only be set for a C++ language pu"));
01057
01058 Is_True (PU_lexical_level (*this) > 1,
01059 (msg, "Lexical level for pu should be > 1"));
01060
01061 if ( PU_is_nested_func (*this))
01062 Is_True( PU_lexical_level (*this) > 2,
01063 (msg, "Lexical level for nested pu should be > 2"));
01064
01065 if ( PU_args_aliased (*this))
01066 Is_True(PU_ftn_lang(*this),
01067 (msg, "PU_ARGS_ALIASED may only be set for F77 or F90"));
01068
01069 if ( PU_has_namelist (*this))
01070 Is_True(PU_ftn_lang(*this),
01071 (msg, "PU_HAS_NAMELIST may only be set for F77 or F90"));
01072
01073 if ( PU_has_altentry (*this))
01074 Is_True(PU_ftn_lang(*this),
01075 (msg, "PU_HAS_ALTENTRY may only be set for F77 or F90"));
01076
01077 if ( (PU_c_lang (*this) && PU_ftn_lang (*this)) ||
01078 (PU_cxx_lang (*this) && PU_ftn_lang (*this)) ||
01079 (PU_c_lang (*this) && PU_cxx_lang (*this)) ||
01080 (PU_f77_lang (*this) && PU_f90_lang (*this)))
01081 Fail_FmtAssertion (msg," PU src lang bits cannot be set to multiple languagess");
01082
01083 #endif // Is_True_On
01084 }
01085
01086
01087
01088
01089
01090
01091
01092
01093 void FILE_INFO::Verify() const
01094 {
01095 #ifdef Is_True_On
01096 Is_True(unused == 0,
01097 ("Invalid FILE_INFO field: unused"));
01098 #endif // Is_True_On
01099 }
01100
01101
01102
01103
01104
01105
01106
01107 template <class T>
01108 struct verify_op
01109 {
01110 UINT level;
01111 verify_op(UINT lev) : level(lev) { }
01112 void operator () (UINT idx, T *entry) const;
01113 };
01114
01115 template <class T>
01116 inline void
01117 verify_op<T>::operator () (UINT, T *entry) const {
01118 entry->Verify(level);
01119 }
01120
01121
01122
01123 template<>
01124 inline void
01125 verify_op <TCON>::operator () (UINT, TCON *tc) const
01126 {
01127 TCON_Verify(*tc);
01128 }
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139 void Verify_LOCAL_SYMTAB (const SCOPE& scope, SYMTAB_IDX level)
01140 {
01141 #ifdef Is_True_On
01142
01143
01144
01145 scope.st->Verify(level);
01146
01147
01148
01149 if (ST_Table_Size (level)) {
01150 For_all_entries(*scope.st_tab , verify_op<ST >(level), 1);
01151 }
01152 if (LABEL_Table_Size (level)) {
01153 For_all_entries(*scope.label_tab , verify_op<LABEL>(level), 1);
01154 }
01155 if (PREG_Table_Size (level)) {
01156 For_all_entries(*scope.preg_tab , verify_op<PREG >(level), 1);
01157 }
01158 if (INITO_Table_Size (level)) {
01159 For_all_entries(*scope.inito_tab , verify_op<INITO>(level), 1);
01160 }
01161 if (ST_ATTR_Table_Size (level)) {
01162 For_all_entries(*scope.st_attr_tab , verify_op<ST_ATTR >(level), 1);
01163 }
01164
01165 #endif // Is_True_On
01166 }
01167
01168
01169
01170
01171
01172 void Verify_GLOBAL_SYMTAB()
01173 {
01174 const SCOPE & scope = Scope_tab[GLOBAL_SYMTAB];
01175
01176 #ifdef Is_True_On
01177
01178 Is_True ( scope.label_tab == NULL,
01179 ("LABEL Table can only appear in LOCAL symtab"));
01180
01181 Is_True ( scope.preg_tab == NULL,
01182 ("PREG Table can only appear in LOCAL symtab"));
01183
01184
01185 if ( ST_Table_Size (GLOBAL_SYMTAB))
01186 For_all (St_Table, GLOBAL_SYMTAB, verify_op<ST>(GLOBAL_SYMTAB));
01187
01188 if ( INITO_Table_Size (GLOBAL_SYMTAB))
01189 For_all (Inito_Table, GLOBAL_SYMTAB, verify_op<INITO>(GLOBAL_SYMTAB));
01190
01191 if ( ST_ATTR_Table_Size (GLOBAL_SYMTAB))
01192 For_all (St_Attr_Table, GLOBAL_SYMTAB, verify_op<ST_ATTR>(GLOBAL_SYMTAB));
01193
01194
01195
01196
01197 File_info.Verify();
01198
01199 if ( TY_Table_Size () > 1)
01200 For_all (Ty_Table, verify_op<TY>(GLOBAL_SYMTAB));
01201 if ( TCON_Table_Size () )
01202 For_all (Tcon_Table, verify_op<TCON>(GLOBAL_SYMTAB));
01203 if ( INITV_Table_Size () > 1)
01204 For_all (Initv_Table, verify_op<INITV>(GLOBAL_SYMTAB));
01205
01206 #endif // Is_True_On
01207 }
01208