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
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 static const char *source_file = __FILE__;
00068
00069 #ifdef _KEEP_RCS_ID
00070 static char *rcs_id = "$Source: /home/bos/bk/kpro64-pending/crayf90/sgi/SCCS/s.cwh_stk.cxx $ $Revision: 1.6 $";
00071 #endif
00072
00073
00074
00075
00076 #include "defs.h"
00077 #include "symtab.h"
00078 #include "wn.h"
00079 #include "wn_util.h"
00080 #include "ir_reader.h"
00081
00082
00083
00084 #include "cwh_defines.h"
00085 #include "cwh_stk.h"
00086
00087 typedef struct {
00088 void * item ;
00089 TY_IDX it_ty ;
00090 enum item_class Class;
00091 } stk_entry_t ;
00092
00093 #define STK_SIZE_CHANGE 512
00094 #define STK_EMPTY -1
00095
00096 static INT32 current_size = 0;
00097 static stk_entry_t *stk=NULL;
00098 static INT32 top = STK_EMPTY ;
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 extern void
00109 cwh_stk_push( void * item, enum item_class Class)
00110 {
00111 cwh_stk_push_typed(item,Class,0) ;
00112
00113 return ;
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 extern void
00130 cwh_stk_push_typed( void * item, enum item_class Class, TY_IDX ty)
00131 {
00132 if (ty != 0) {
00133 DevAssert(((Class == ADDR_item) ||
00134 (Class == WN_item) ||
00135 (Class == WN_item_whole_array) ||
00136 (Class == ST_item) ||
00137 (Class == ST_item_whole_array) ||
00138 (Class == DEREF_item)),
00139 (" Cannot type this item"));
00140 }
00141
00142 top ++ ;
00143
00144 if (top >= current_size) {
00145
00146 current_size += STK_SIZE_CHANGE;
00147 stk = (stk_entry_t *) realloc(stk,sizeof(stk_entry_t)*current_size);
00148 }
00149
00150 stk[top].item = item ;
00151 stk[top].Class = Class ;
00152 stk[top].it_ty = ty ;
00153
00154 return ;
00155 }
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 extern void
00168 cwh_stk_push_STR(void * len,void * addr, TY_IDX ty, enum item_class addr_class)
00169 {
00170 #ifdef KEY
00171 DevAssert((ty != 0),("STR missing TY"));
00172 #else
00173 DevAssert((ty != NULL),("STR missing TY"));
00174 #endif
00175 cwh_stk_push_typed(addr,addr_class,ty) ;
00176 cwh_stk_push(len,WN_item);
00177 cwh_stk_push(NULL,STR_item);
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 extern WN *
00189 cwh_stk_pop_WN(void)
00190 {
00191
00192 DevAssert((top >= 0), ("Stack underflow"));
00193 DevAssert((stk[top].Class == WN_item || stk[top].Class == WN_item_whole_array), (" TOS is not WN"));
00194
00195 stk[top].Class = UNDEF ;
00196 return ((WN *) stk[top--].item) ;
00197 }
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 extern WN *
00211 cwh_stk_pop_WHIRL(void)
00212 {
00213
00214 DevAssert((top >= 0), ("Stack underflow"));
00215 DevAssert((stk[top].Class == WN_item ||
00216 stk[top].Class == WN_item_whole_array ||
00217 stk[top].Class == DEREF_item ||
00218 stk[top].Class == ADDR_item), (" TOS is not WN"));
00219
00220 stk[top].Class = UNDEF ;
00221 return ((WN *) stk[top--].item) ;
00222 }
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 extern ST *
00233 cwh_stk_pop_ST(void)
00234 {
00235 DevAssert((top >= 0), ("Stack underflow"));
00236 DevAssert((stk[top].Class == ST_item || stk[top].Class == ST_item_whole_array), (" TOS is not ST"));
00237
00238 stk[top].Class = UNDEF ;
00239 return ((ST *) stk[top--].item) ;
00240
00241 }
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251 extern FLD_IDX
00252 cwh_stk_pop_FLD(void)
00253 {
00254 DevAssert((top >= 0), ("Stack underflow"));
00255 DevAssert((stk[top].Class == FLD_item), (" TOS is not FLD"));
00256
00257 stk[top].Class = UNDEF ;
00258 return ((FLD_IDX ) (INTPTR)stk[top--].item) ;
00259 }
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 extern WN *
00273 cwh_stk_pop_ADDR(void)
00274 {
00275 DevAssert((top >= 0), ("Stack underflow"));
00276 DevAssert((stk[top].Class == ADDR_item), (" TOS is not ADDR"));
00277
00278 stk[top].Class = UNDEF ;
00279 return ((WN *) stk[top--].item) ;
00280 }
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 extern WN *
00294 cwh_stk_pop_DEREF(void)
00295 {
00296 DevAssert((top >= 0), ("Stack underflow"));
00297 DevAssert((stk[top].Class == DEREF_item), (" TOS is not DEREF"));
00298
00299 stk[top].Class = UNDEF ;
00300 return ((WN *) stk[top--].item) ;
00301 }
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311 extern void
00312 cwh_stk_pop_STR(void)
00313 {
00314 DevAssert((top-2 >= 0), ("Stack underflow"));
00315 DevAssert((stk[top].Class == STR_item), (" TOS is not STR"));
00316 #ifdef KEY
00317 DevAssert((stk[top-2].Class != 0), (" STR missing TY"));
00318 #else
00319 DevAssert((stk[top-2].Class != NULL), (" STR missing TY"));
00320 #endif
00321
00322 stk[top--].Class = UNDEF ;
00323 }
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335 extern ST *
00336 cwh_stk_pop_PCONST(void)
00337 {
00338 DevAssert((top >= 0), ("Stack underflow"));
00339 DevAssert((stk[top].Class == PCONST_item), (" TOS is not PCONST"));
00340
00341 stk[top].Class = UNDEF ;
00342 return ((ST *) stk[top--].item) ;
00343 }
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 extern LABEL_IDX
00354 cwh_stk_pop_LB(void)
00355 {
00356 DevAssert((top >= 0), ("Stack underflow"));
00357 DevAssert((stk[top].Class == LB_item), (" TOS is not LB"));
00358
00359 stk[top].Class = UNDEF ;
00360 return ((LABEL_IDX) (INTPTR)stk[top--].item) ;
00361 }
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371 extern void
00372 cwh_stk_pop_whatever(void)
00373 {
00374 DevAssert((top >= 0), ("Stack underflow"));
00375
00376 stk[top--].Class = UNDEF ;
00377
00378 }
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 extern enum item_class
00389 cwh_stk_get_class(void)
00390 {
00391 DevAssert((top >= 0), ("Stack underflow"));
00392
00393 return (stk[top].Class) ;
00394
00395 }
00396
00397
00398
00399
00400
00401
00402
00403
00404 extern TY_IDX
00405 cwh_stk_get_TY(void)
00406 {
00407 DevAssert((top >= 0), ("Stack underflow"));
00408
00409 return (stk[top].it_ty) ;
00410
00411 }
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423 extern TY_IDX
00424 cwh_stk_get_FLD_TY(void)
00425 {
00426 FLD_IDX fld ;
00427 DevAssert((top >= 0), ("Stack underflow"));
00428 DevAssert((stk[top].Class == FLD_item), (" TOS is not FLD"));
00429
00430 fld = (FLD_IDX ) (INTPTR)stk[top].item;
00431 return (FLD_type(FLD_HANDLE (fld)));
00432 }
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442 extern INT32
00443 cwh_stk_count_STRs(INT32 n)
00444 {
00445 INT32 i = top;
00446 INT32 c = 0 ;
00447
00448
00449 while (n-- > 0) {
00450 DevAssert((i >= 0 ), (" stk miscount"));
00451
00452 if (stk[i].Class == STR_item) {
00453 c++ ;
00454 i -= 3 ;
00455 } else
00456 i -- ;
00457
00458 }
00459 return (c) ;
00460
00461 }
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475 extern BOOL
00476 cwh_stk_is_byte_STR(INT32 n)
00477 {
00478 INT32 i = top;
00479 BOOL res = FALSE;
00480
00481 while (n-- > 0) {
00482
00483 DevAssert((i >= 0 ), (" stk miscount"));
00484 DevAssert((stk[i].Class == STR_item),(" all STRs?"));
00485
00486 i -= 3 ;
00487 }
00488
00489 DevAssert((stk[i].Class == STR_item),(" all STRs?"));
00490 i -- ;
00491 DevAssert((stk[i].Class == WN_item),("size?"));
00492
00493 if (WN_operator((WN *)stk[i].item) == OPR_INTCONST) {
00494 if (WN_const_val((WN *)stk[i].item) == 1) {
00495
00496
00497
00498 i --;
00499 if ((stk[i].Class == ST_item) ||
00500 (stk[i].Class == ST_item_whole_array) ||
00501 (stk[i].Class == FLD_item))
00502 res = TRUE;
00503
00504 else if ((stk[i].Class == WN_item) ||
00505 (stk[i].Class == WN_item_whole_array) ||
00506 (stk[i].Class == DEREF_item)) {
00507
00508 WN * wn = (WN *)stk[i].item ;
00509 OPERATOR op = WN_operator(wn);
00510
00511 if (op == OPR_ARRAYEXP) {
00512 wn = WN_kid0(wn);
00513 op = WN_operator(wn);
00514 }
00515
00516 if (op == OPR_INTRINSIC_OP && WN_intrinsic(wn) == INTRN_CHAR) {
00517 wn = WN_kid0(WN_kid0(wn));
00518 op = WN_operator(wn);
00519 }
00520
00521 res = (op == OPR_ARRAY) || (op == OPR_ARRSECTION) ||
00522 (op == OPR_LDID) || (op == OPR_ILOAD);
00523 }
00524 }
00525 }
00526 return (res) ;
00527 }
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538 extern void
00539 cwh_stk_verify_empty(void)
00540 {
00541 DevAssert((top == STK_EMPTY), ("Stack not empty"));
00542
00543 top = STK_EMPTY ;
00544
00545 }
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556 extern void
00557 cwh_stk_dump(void)
00558 {
00559 static const char * str_name[] = {
00560 " ???? ",
00561 "WN_item",
00562 "ADDR_item",
00563 "DEREF_item",
00564 "FLD_item",
00565 "ST_item",
00566 "PCONST_item",
00567 "STR_item - length & address below",
00568 "ST_item_whole_array",
00569 "WN_item_whole_array",
00570 "LB_item"
00571 };
00572
00573 static const char * null_str = " <null>\n";
00574 int i,j ;
00575
00576 printf ("\n Stack --- \n\n");
00577
00578 for (i = top ; i >= 0 ; i-- ) {
00579 switch(stk[i].Class) {
00580 case WN_item: j = 1; break;
00581 case ADDR_item: j = 2; break;
00582 case DEREF_item: j = 3; break;
00583 case FLD_item: j = 4; break;
00584 case ST_item: j = 5; break;
00585 case PCONST_item:j = 6; break;
00586 case STR_item: j = 7; break;
00587 case ST_item_whole_array: j=8; break;
00588 case WN_item_whole_array: j=9; break;
00589 case LB_item : j=10; break;
00590 default: j = 0; break;
00591
00592 }
00593
00594 if (stk[i].it_ty == 0)
00595 printf("%s\n",str_name[j]);
00596 else
00597 printf("%s TY = 0x%x \n",str_name[j],stk[i].it_ty) ;
00598
00599 switch(stk[i].Class) {
00600 case WN_item:
00601 case WN_item_whole_array:
00602 case ADDR_item:
00603 case DEREF_item:
00604 if (stk[i].item == NULL)
00605 printf("%s",null_str);
00606 else
00607 DUMP_WN((WN *)stk[i].item) ;
00608 break ;
00609
00610 case PCONST_item:
00611 case ST_item:
00612 case ST_item_whole_array:
00613 if (stk[i].item == NULL)
00614 printf("%s",null_str);
00615 else
00616 DUMP_ST((ST *)stk[i].item) ;
00617 break ;
00618
00619 case FLD_item:
00620 if (stk[i].item == NULL)
00621 printf("%s",null_str);
00622 else {
00623 FLD_HANDLE f ((FLD_IDX )(INTPTR)stk[i].item);
00624 printf ("%s: offset: %lld \n",FLD_name(f), FLD_ofst(f));
00625 }
00626 break;
00627
00628 case LB_item:
00629 if (stk[i].item == NULL)
00630 printf("%s",null_str);
00631 else
00632 DUMP_LB((LABEL_IDX)(INTPTR)stk[i].item);
00633 break;
00634
00635 case STR_item:
00636 break ;
00637
00638 }
00639 }
00640 }
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655 extern WN *
00656 cwh_stk_pop_iostmt ( IOSTATEMENT opc , INT32 eeeflag)
00657 {
00658 INT i, j;
00659 WN * wn;
00660 INT top_adjustment = 0;
00661 INT num_items = 0;
00662 INT bottom;
00663
00664 for(i=top; i>=0; i--) {
00665 if (stk[i].Class == WN_item || stk[i].Class == WN_item_whole_array) {
00666 wn = (WN *)stk[i].item;
00667 if ((wn == NULL) || (WN_operator_is(wn, OPR_IO_ITEM))) {
00668 top_adjustment++;
00669 } else {
00670 break;
00671 }
00672 } else {
00673 break;
00674 }
00675 }
00676
00677 bottom = top - top_adjustment + 1;
00678
00679 for(i = bottom; i <= top; i++ )
00680 if (stk[i].item != NULL)
00681 num_items++;
00682
00683
00684 wn = WN_CreateIo ( opc, num_items);
00685
00686 for ( i = bottom, j=0; i <= top;) {
00687 if (stk[i].item != NULL) {
00688 WN_kid(wn,j++) = (WN *)stk[i++].item ;
00689 } else {
00690 i++;
00691 }
00692 }
00693
00694 top = top - top_adjustment;
00695
00696 return wn;
00697 }
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709 extern INT32
00710 cwh_stk_get_num_inquire_items(void)
00711 {
00712 INT32 i;
00713 WN *wn;
00714 INT32 num_items = 0;
00715
00716 for(i=top; i>=0; i--) {
00717 if (stk[i].Class == WN_item || stk[i].Class == WN_item_whole_array) {
00718 wn = (WN *)stk[i].item;
00719 if (wn == NULL) {
00720 cwh_stk_pop_WN();
00721 break;
00722 } else if (WN_operator_is(wn, OPR_IO_ITEM)) {
00723 num_items++;
00724 } else {
00725 break;
00726 }
00727 } else {
00728 break;
00729 }
00730 }
00731 return num_items;
00732 }
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742 extern void
00743 cwh_stk_push_top_item_again(void)
00744 {
00745 INT fld_count,i;
00746
00747 switch (stk[top].Class) {
00748 case ST_item:
00749 case ST_item_whole_array:
00750 case LB_item:
00751 cwh_stk_push_typed(stk[top].item,stk[top].Class,stk[top].it_ty) ;
00752 break;
00753
00754 case ADDR_item:
00755 case DEREF_item:
00756 case WN_item:
00757 case WN_item_whole_array:
00758 case PCONST_item:
00759
00760 cwh_stk_push_typed(WN_COPY_Tree((WN *)stk[top].item),stk[top].Class,stk[top].it_ty) ;
00761 break;
00762
00763 case STR_item:
00764
00765
00766 if (stk[top-2].Class == ST_item_whole_array ||
00767 stk[top-2].Class == ST_item) {
00768 cwh_stk_push_typed(stk[top-2].item,stk[top-2].Class,stk[top-2].it_ty) ;
00769 } else {
00770 cwh_stk_push_typed(WN_COPY_Tree((WN *)stk[top-2].item),stk[top-2].Class,stk[top-2].it_ty) ;
00771 }
00772
00773 cwh_stk_push_typed(WN_COPY_Tree((WN *)stk[top-2].item),stk[top-2].Class,stk[top-2].it_ty) ;
00774
00775
00776 cwh_stk_push_typed(stk[top-2].item,stk[top-2].Class,stk[top-2].it_ty) ;
00777 case FLD_item:
00778 fld_count = 0;
00779 while ((stk[top-fld_count].Class == FLD_item) && fld_count <= top) {
00780 ++fld_count;
00781 }
00782
00783
00784 if (stk[top-fld_count].Class == ST_item_whole_array ||
00785 stk[top-fld_count].Class == ST_item) {
00786 cwh_stk_push_typed(stk[top-fld_count].item,stk[top-fld_count].Class,
00787 stk[top-fld_count].it_ty) ;
00788 } else {
00789 cwh_stk_push_typed(WN_COPY_Tree((WN *)stk[top-fld_count].item),stk[top-fld_count].Class,
00790 stk[top-fld_count].it_ty) ;
00791 }
00792
00793 for (i = 0; i < fld_count; i++) {
00794 cwh_stk_push_typed(stk[top-fld_count].item,stk[top-fld_count].Class,
00795 stk[top-fld_count].it_ty) ;
00796 }
00797 break;
00798
00799 default:
00800 DevAssert((0), (" unduplicatable stack item"));
00801 break;
00802 }
00803
00804 return ;
00805 }
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817 extern char *
00818 cwh_stk_fld_name(void)
00819 {
00820 INT i;
00821 char *r;
00822 char *s, *fname;
00823
00824 r = (char *) malloc(1);
00825 *r = 0;
00826
00827 for (i=top; i >= 0; i--) {
00828 if (stk[i].Class != FLD_item) break;
00829
00830
00831 if (stk[i].item != NULL) {
00832 fname = FLD_name(FLD_HANDLE ((FLD_IDX)(INTPTR)stk[i].item));
00833 s = (char *) malloc(strlen(r) + strlen(fname) + 2) ;
00834 sprintf(s,"%%%s%s",fname,r);
00835 free(r);
00836 r = s;
00837 }
00838 }
00839
00840 return (r);
00841 }
00842