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
00068
00069
00070
00071
00072
00073
00074 static const char *source_file = __FILE__;
00075
00076 #ifdef _KEEP_RCS_ID
00077 static char *rcs_id = "$Source: crayf90/sgi/SCCS/s.cwh_auxst.cxx $ $Revision: 1.8 $";
00078 #endif
00079
00080
00081
00082 #include "defs.h"
00083 #include "glob.h"
00084 #include "stab.h"
00085 #include "strtab.h"
00086 #include "errors.h"
00087 #include "targ_const.h"
00088 #include "config_targ.h"
00089 #include "const.h"
00090 #include "wn.h"
00091 #include "cxx_memory.h"
00092 #include <stdio.h>
00093
00094
00095
00096 #include "cwh_defines.h"
00097 #include "cwh_preg.h"
00098 #include "cwh_types.h"
00099 #include "cwh_addr.h"
00100 #include "cwh_auxst.h"
00101 #include "cwh_auxst.i"
00102 #include "sgi_cmd_line.h"
00103
00104 AUXST_TAB *Auxst_tab;
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 extern void
00117 cwh_auxst_register_table(void)
00118 {
00119 Auxst_tab[CURRENT_SYMTAB].Auxst_table = CXX_NEW(AUXST_PTR_ARRAY(FE_Mempool), FE_Mempool);
00120 Scope_tab[CURRENT_SYMTAB].st_tab->Register(*(Auxst_tab[CURRENT_SYMTAB].Auxst_table));
00121
00122 if (CURRENT_SYMTAB != GLOBAL_SYMTAB)
00123 Scope_tab[CURRENT_SYMTAB].label_tab->Register(Auxlabel_Table);
00124
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 extern void
00136 cwh_auxst_un_register_table(void)
00137 {
00138 Scope_tab[CURRENT_SYMTAB].st_tab->Un_register(*(Auxst_tab[CURRENT_SYMTAB].Auxst_table));
00139 CXX_DELETE(Auxst_tab[CURRENT_SYMTAB].Auxst_table, FE_Mempool);
00140
00141 if (CURRENT_SYMTAB != GLOBAL_SYMTAB)
00142 Scope_tab[CURRENT_SYMTAB].label_tab->Un_register(Auxlabel_Table);
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 void
00159 cwh_auxst_alloc_container_table(void)
00160 {
00161 Auxst_tab = (AUXST_TAB *) MEM_POOL_Alloc (FE_Mempool,
00162 MAX_AUXST_LEVEL * sizeof(AUXST_TAB));
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 static AUXST *
00176 cwh_auxst_find(ST *st, BOOL create)
00177 {
00178 AUXST * o ;
00179
00180 o = Auxst_Table[ST_st_idx(st)];
00181
00182 if (o == NULL) {
00183 if (create) {
00184 o = (AUXST *) malloc(sizeof(AUXST));
00185
00186 bzero(o,sizeof(AUXST));
00187
00188 AUXST_OwningST(o)= st ;
00189 AUXST_Next(o) = Top_Auxst[ST_level(st)];
00190 AUXST_AssignId(o) = -1 ;
00191 AUXST_DstrPreg(o).preg = -1;
00192
00193 USRCPOS_clear(AUXST_SrcPos(o));
00194
00195 Auxst_Table[ST_st_idx(st)] = o;
00196 Top_Auxst[ST_level(st)] = o ;
00197 }
00198 }
00199 return(o);
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 extern void
00211 cwh_auxst_clear(ST *st)
00212 {
00213 Auxst_Table[ST_st_idx(st)] = NULL;
00214 }
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 extern void
00226 cwh_auxst_free(void)
00227 {
00228 AUXST *o,*n;
00229 LIST *l ;
00230
00231
00232 o = Top_Auxst[CURRENT_SYMTAB];
00233
00234 while (o != NULL ) {
00235
00236 AUXST_Pragma(o) = NULL ;
00237 n = AUXST_Next(o);
00238
00239 ST *st = AUXST_OwningST(o);
00240
00241 Auxst_Table[ST_st_idx(st)] = NULL;
00242
00243 l = cwh_auxst_find_list(o,l_COMLIST);
00244 cwh_auxst_free_list(&l);
00245
00246 #ifdef KEY
00247 l = cwh_auxst_find_list(o,l_PU_COMLIST);
00248 cwh_auxst_free_list(&l);
00249 #endif
00250
00251 l = cwh_auxst_find_list(o,l_ALTENTRY);
00252 cwh_auxst_free_list(&l);
00253
00254 l = cwh_auxst_find_list(o,l_RETURN_TEMPS);
00255 cwh_auxst_free_list(&l);
00256
00257 l = cwh_auxst_find_list(o,l_NAMELIST);
00258 cwh_auxst_free_list(&l);
00259
00260 l = cwh_auxst_find_list(o,l_SPLITLIST);
00261 cwh_auxst_free_list(&l);
00262
00263 l = cwh_auxst_find_list(o,l_EQVLIST);
00264 cwh_auxst_free_list(&l);
00265
00266 l = cwh_auxst_find_list(o,l_DST_COMLIST);
00267 cwh_auxst_free_list(&l);
00268
00269 l = cwh_auxst_find_list(o,l_DST_PARMLIST);
00270 cwh_auxst_free_list(&l);
00271
00272 if (AUXST_Stem(o) != NULL)
00273 free (AUXST_Stem(o)) ;
00274
00275 if (AUXST_Dummies(o) != NULL) {
00276 if (AUXST_Dummies(o)->arglist != NULL)
00277 free (AUXST_Dummies(o)->arglist) ;
00278 free (AUXST_Dummies(o)) ;
00279 }
00280 free(o);
00281 o = n;
00282 }
00283
00284 Top_Auxst[CURRENT_SYMTAB] = NULL;
00285 }
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 extern void
00299 cwh_auxst_clear_per_PU(void)
00300 {
00301 AUXST * o ;
00302 SYMTAB_IDX s = CURRENT_SYMTAB;
00303
00304 while (s >= GLOBAL_SYMTAB) {
00305 o = Top_Auxst[s] ;
00306 while (o != NULL ) {
00307 AUXST_Pragma(o) = NULL;
00308 o = AUXST_Next(o);
00309 }
00310 s-- ;
00311 }
00312
00313 Auxlabel_Table.Clear();
00314 }
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326 extern LIST *
00327 cwh_auxst_get_list(ST * st,enum list_name list)
00328 {
00329 LIST * l = NULL;
00330 AUXST * o = cwh_auxst_find(st,FALSE);
00331
00332 if (o)
00333 l = cwh_auxst_find_list(o,list);
00334
00335 return l;
00336 }
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 static LIST *
00349 cwh_auxst_find_list(AUXST * o, enum list_name list)
00350 {
00351 #ifdef KEY
00352 LIST *l = 0;
00353 #else
00354 LIST *l ;
00355 #endif
00356
00357 switch (list) {
00358 case l_COMLIST:
00359 l = AUXST_Commons(o);
00360 break;
00361
00362 #ifdef KEY
00363 case l_PU_COMLIST:
00364 l = AUXST_PU_Commons(o);
00365 break;
00366 #endif
00367
00368 case l_ALTENTRY:
00369 l = AUXST_Altentries(o);
00370 break;
00371
00372 case l_NAMELIST:
00373 l = AUXST_Namelist(o);
00374 break;
00375
00376 case l_RETURN_TEMPS:
00377 l = AUXST_RtnTemps(o);
00378 break;
00379
00380 case l_SPLITLIST:
00381 l = AUXST_SplitCommons(o);
00382 break;
00383
00384 case l_EQVLIST:
00385 l = AUXST_Equivs(o);
00386 break;
00387
00388 case l_DST_COMLIST:
00389 l = AUXST_Dstcomlist(o);
00390 break;
00391
00392 case l_DST_PARMLIST:
00393 l = AUXST_Dstparmlist(o);
00394 break;
00395
00396 default:
00397 DevAssert((0),("list?"));
00398 }
00399
00400 return l;
00401 }
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423 extern void
00424 cwh_auxst_add_item(ST * parent, ST *st, enum list_name list)
00425 {
00426 AUXST *o ;
00427 LIST *c ;
00428 BOOL b ;
00429
00430 b = FALSE;
00431
00432 if (list == l_COMLIST)
00433 b = TRUE;
00434 #ifdef KEY
00435 if (list == l_PU_COMLIST)
00436 b = TRUE;
00437 #endif
00438
00439 o = cwh_auxst_find(parent,TRUE);
00440 c = cwh_auxst_find_list(o, list);
00441
00442 cwh_auxst_add_to_list(&c,st,b);
00443 }
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454 extern ST *
00455 cwh_auxst_find_item(LIST *l, const char * name)
00456 {
00457 ITEM *t ;
00458 ST *st;
00459
00460 st = NULL ;
00461 if (l == NULL) return (NULL);
00462 t = L_first(l) ;
00463
00464 while (t != NULL) {
00465 if (strcmp(ST_name(I_element(t)),name) == 0) {
00466 st = I_element(t);
00467 break ;
00468 }
00469 t = I_next(t);
00470 }
00471
00472 return(st);
00473 }
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485 extern void
00486 cwh_auxst_add_list(ST * parent, LIST *l, enum list_name list)
00487 {
00488 AUXST *o ;
00489
00490 o = cwh_auxst_find(parent,TRUE);
00491
00492 switch (list) {
00493 case l_NAMELIST:
00494 *AUXST_Namelist(o) = *l;
00495 break;
00496
00497 #if 0
00498 case l_COMLIST:
00499 *AUXST_Commons(o) = *l ;
00500 break;
00501
00502 #ifdef KEY
00503 case l_PU_COMLIST:
00504 *AUXST_PU_Commons(o) = *l ;
00505 break;
00506 #endif
00507
00508 case l_ALTENTRY:
00509 *AUXST_Altentries(o) = *l ;
00510 break;
00511
00512 case l_RETURN_TEMPS:
00513 *AUXST_RtnTemps(o) = *l;
00514 break;
00515
00516 case l_SPLITLIST:
00517 *AUXST_SplitCommons(o) = *l ;
00518 break;
00519
00520 case l_EQVLIST:
00521 *AUXST_Equivs(o) = *l;
00522 break;
00523
00524 case l_DST_COMLIST:
00525 *AUXST_Dstcomlist(o) = *l;
00526 break;
00527
00528 case l_DST_PARMLIST:
00529 *AUXST_Dstparmlist(o) = *l;
00530 break;
00531 #endif
00532
00533 default:
00534 DevAssert((0),("list?"));
00535
00536 }
00537 }
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553 extern ITEM *
00554 cwh_auxst_next_element(ST * parent, ITEM *i, enum list_name list)
00555 {
00556 AUXST *o;
00557 LIST *l;
00558
00559 if (i == NULL) {
00560 o = cwh_auxst_find(parent,TRUE);
00561
00562 if (o != NULL) {
00563 l = cwh_auxst_find_list(o,list);
00564 i = L_first(l);
00565 }
00566 } else
00567 i = I_next(i) ;
00568
00569 return (i);
00570 }
00571
00572 #ifdef KEY
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582 extern void
00583 cwh_clear_PU_common_list(ST *st)
00584 {
00585 AUXST *o = cwh_auxst_find(st,TRUE);
00586 LIST *c = cwh_auxst_find_list(o, l_PU_COMLIST);
00587 LIST *d = c;
00588 cwh_auxst_free_list(&c);
00589
00590
00591 d->first = d->last = NULL;
00592 d->nitems = 0;
00593 }
00594 #endif
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608 extern ITEM *
00609 cwh_auxst_add_to_list(LIST ** lp, ST *st, BOOL order)
00610 {
00611 ITEM * i;
00612 ITEM * n;
00613 ITEM * p;
00614 LIST * l;
00615
00616 if (*lp == NULL) {
00617 *lp = (LIST *) malloc(sizeof(LIST));
00618 l = *lp ;
00619 L_first(l) = NULL ;
00620 L_last(l) = NULL ;
00621 L_num(l) = 0 ;
00622 }
00623
00624 l = *lp ;
00625 i = (ITEM *)malloc(sizeof(ITEM)) ;
00626
00627 I_element(i) = st;
00628 I_next(i) = NULL;
00629
00630 if ( order ) {
00631 n = L_first(l) ;
00632 p = NULL ;
00633
00634 while (n != NULL) {
00635
00636 if (ST_ofst(I_element(n)) > ST_ofst(st)) {
00637 I_next(i) = n;
00638
00639 if (L_first(l) == n)
00640 L_first(l) = i ;
00641 else
00642 I_next(p) = i;
00643
00644 break;
00645 }
00646 p = n ;
00647 n = I_next(n);
00648 }
00649
00650 if (L_first(l) == NULL)
00651 L_first(l) = i;
00652
00653 if (L_last(l) == NULL)
00654 L_last(l) = i;
00655
00656 if (L_last(l) == p) {
00657 I_next(L_last(l)) = i;
00658 L_last(l) = i;
00659 }
00660
00661 } else {
00662
00663 if (L_first(l) == NULL)
00664 L_first(l) = i;
00665
00666 if (L_last(l) != NULL)
00667 I_next(L_last(l)) = i ;
00668
00669 L_last(l) = i;
00670 }
00671
00672 L_num(l) ++ ;
00673
00674 return i;
00675 }
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686 extern void
00687 cwh_auxst_free_list (LIST ** lp)
00688 {
00689 ITEM *i;
00690 ITEM *n;
00691 LIST *l;
00692
00693 if (*lp != NULL) {
00694 l = *lp ;
00695
00696 i = L_first(l) ;
00697
00698 while (i != NULL) {
00699 n = I_next(i);
00700 free(i) ;
00701 i = n ;
00702 }
00703
00704 *lp = NULL ;
00705 }
00706 }
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717 extern void
00718 cwh_auxst_set_flag(ST * st, enum flags_a f, BOOL val)
00719 {
00720 AUXST *o ;
00721
00722 o = cwh_auxst_find(st,TRUE);
00723
00724 if (val)
00725 Set_AUXST_Flag(o,f);
00726 else
00727 Clear_AUXST_Flag(o,f);
00728 }
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739 extern BOOL
00740 cwh_auxst_read_flag(ST * st, enum flags_a f)
00741 {
00742 AUXST *o ;
00743 BOOL res = FALSE ;
00744
00745 res = FALSE;
00746
00747 o = cwh_auxst_find(st,FALSE);
00748
00749 if (o != NULL)
00750 res = AUXST_Flag(o,f);
00751
00752 return res ;
00753 }
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763 extern void
00764 Set_ST_auxst_data_info(ST *st, data_info_s * data_info)
00765 {
00766 AUXST * o ;
00767
00768 o = cwh_auxst_find(st,TRUE);
00769 AUXST_DataInfo(o) = data_info;
00770 return ;
00771 }
00772
00773
00774
00775
00776
00777
00778
00779
00780 extern data_info_s *
00781 ST_auxst_data_info(ST *st)
00782 {
00783 AUXST * o ;
00784
00785 o = cwh_auxst_find(st,FALSE);
00786 if (o) {
00787 return AUXST_DataInfo(o);
00788 } else {
00789 return (NULL);
00790 }
00791 }
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811 extern void
00812 cwh_auxst_alloc_proc_entry(ST *st,INT32 num_dum_args, TY_IDX ret_type)
00813 {
00814 DUMMIES *p ;
00815 AUXST *o ;
00816
00817 o = cwh_auxst_find(st,TRUE);
00818 p = cwh_auxst_find_entry(st);
00819
00820 if (p == NULL)
00821 p = AUXST_Dummies(o) = (DUMMIES *) malloc(sizeof(DUMMIES));
00822
00823 p->total_args = num_dum_args ;
00824 p->fe_given_args = num_dum_args ;
00825 p->args_seen = 0;
00826 p->arg_lengths_index = num_dum_args ;
00827
00828 p->parms = NULL;
00829
00830 if (num_dum_args > 0) {
00831 p->parms = (PARMS *)malloc(sizeof(PARMS)*num_dum_args);
00832 for (INT32 i = 1; i < num_dum_args; i++) {
00833 PARMS_next(&(p->parms[i-1])) = &(p->parms[i]);
00834 }
00835 PARMS_next(&(p->parms[num_dum_args-1])) = NULL;
00836 }
00837
00838 p->last_parm_ty_seen = p->parms;
00839 p->orig_ret_type = ret_type;
00840 p->ret_type = ret_type;
00841
00842 p->last_len_ty_seen = NULL;
00843 p->arglist = NULL;
00844 if (num_dum_args > 0)
00845 p->arglist = (ST **) malloc(2 * num_dum_args * sizeof(ST *)) ;
00846
00847 EP_Current = o ;
00848
00849 }
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866 extern void
00867 cwh_auxst_add_dummy(ST * dummy, BOOL result)
00868 {
00869 DUMMIES *e ;
00870 ST *ln ;
00871 TY_IDX ty ;
00872 PARMS *tl ;
00873 PARMS *te ;
00874 PARMS *tn ;
00875
00876 e = AUXST_Dummies(EP_Current);
00877 ln = cwh_types_character_extra(dummy);
00878
00879 DevAssert((e->total_args > e->args_seen),(" arglist overflow"));
00880
00881 e->arglist[e->args_seen++] = dummy ;
00882
00883 ty = ST_type(dummy);
00884 tl = e->last_parm_ty_seen ;
00885
00886 if (ST_sclass(dummy) == SCLASS_FORMAL_REF)
00887 ty = Make_Pointer_Type(ty);
00888
00889 PARMS_ty(tl) = ty;
00890
00891 if (result)
00892 e->ret_type = ST_type(dummy);
00893
00894
00895
00896
00897
00898 if (ln != NULL) {
00899
00900 tn = (PARMS *) malloc(sizeof(PARMS));
00901 PARMS_ty(tn) = Be_Type_Tbl(cwh_addr_char_len_typeid);
00902 PARMS_next(tn) = NULL;
00903
00904 if (result) {
00905 e->arg_lengths_index++ ;
00906 e->fe_given_args++ ;
00907 e->arglist[e->args_seen++] = ln ;
00908
00909 te = (PARMS *) malloc(sizeof(PARMS));
00910 PARMS_ty(te) = ST_type(ln);
00911 PARMS_next(te) = PARMS_next(tl);
00912 PARMS_next(tl) = te;
00913 tl = te ;
00914
00915 } else {
00916
00917 if (e->last_len_ty_seen == NULL) {
00918 te = e->last_parm_ty_seen ;
00919
00920 while(PARMS_next(te))
00921 te = PARMS_next(te);
00922
00923 } else
00924 te = e->last_len_ty_seen ;
00925
00926 PARMS_next(te) = tn ;
00927 e->last_len_ty_seen = tn ;
00928 e->arglist[e->arg_lengths_index++] = ln ;
00929 }
00930 e->total_args++;
00931 }
00932
00933 e->last_parm_ty_seen = PARMS_next(tl) ;
00934
00935 }
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948 extern void
00949 cwh_auxst_patch_proc(TY_IDX rty_idx)
00950 {
00951 DUMMIES *e ;
00952
00953 e = AUXST_Dummies(EP_Current) ;
00954
00955 e->ret_type = rty_idx ;
00956 e->parms = PARMS_next(e->parms);
00957 e->total_args --;
00958 e->arg_lengths_index --;
00959 e->fe_given_args --;
00960
00961 e->last_parm_ty_seen = e->parms;
00962 }
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975 static DUMMIES *
00976 cwh_auxst_find_entry(ST * entry)
00977 {
00978 AUXST *o ;
00979
00980 o = cwh_auxst_find(entry,FALSE);
00981 EP_Current = o ;
00982 return (AUXST_Dummies(o)) ;
00983 }
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993 extern USRCPOS *
00994 cwh_auxst_srcpos_addr(ST * st)
00995 {
00996 AUXST *o ;
00997
00998 o = cwh_auxst_find(st, TRUE);
00999 return (&(AUXST_SrcPos(o))) ;
01000 }
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010 extern USRCPOS
01011 cwh_auxst_srcpos_val(ST * st)
01012 {
01013 AUXST *o ;
01014
01015 o = cwh_auxst_find(st, TRUE);
01016 return (AUXST_SrcPos(o)) ;
01017 }
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028 extern PREG_det
01029 cwh_auxst_distr_preg(ST * st)
01030 {
01031 AUXST *o ;
01032
01033 o = cwh_auxst_find(st, TRUE);
01034 if (AUXST_DstrReg(o) == -1) {
01035 AUXST_DstrPreg(o) = cwh_preg_next_preg(MTYPE_I4, NULL, NULL);
01036 }
01037 return (AUXST_DstrPreg(o)) ;
01038 }
01039
01040 #ifdef KEY
01041
01042
01043
01044
01045
01046
01047
01048
01049 extern void
01050 cwh_auxst_clear_stem_name(ST * st)
01051 {
01052 AUXST *o = cwh_auxst_find(st, FALSE);
01053 if (o) {
01054 char *name = AUXST_Stem(o);
01055 if (name) {
01056 free(AUXST_Stem(o));
01057 AUXST_Stem(o) = NULL;
01058 }
01059 }
01060 }
01061 #endif
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071 extern char *
01072 cwh_auxst_stem_name(ST * st, char * name)
01073 {
01074 char * r ;
01075 AUXST * o ;
01076
01077 r = name ;
01078 o = cwh_auxst_find(st, name != NULL) ;
01079
01080 if ( o != NULL) {
01081 if (name)
01082 AUXST_Stem(o) = name;
01083 else
01084 r = AUXST_Stem(o) ;
01085 }
01086
01087 return r ;
01088 }
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100 extern ST *
01101 cwh_auxst_cri_pointee(ST * ptr, ST * pointee)
01102 {
01103 AUXST *o ;
01104 ST * res = pointee ;
01105
01106 o = cwh_auxst_find(ptr,res != NULL);
01107
01108 if (o) {
01109 if (pointee)
01110 AUXST_CRIPointee(o) = pointee ;
01111 else
01112 res = AUXST_CRIPointee(o);
01113 }
01114 return res;
01115 }
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127 extern WN *
01128 cwh_auxst_pragma(ST * ptr, WN * wn)
01129 {
01130 AUXST *o ;
01131 WN * res = wn ;
01132
01133 o = cwh_auxst_find(ptr,wn != NULL);
01134
01135 if (o) {
01136 if (wn)
01137 AUXST_Pragma(o) = wn ;
01138 else
01139 res = AUXST_Pragma(o);
01140 }
01141 return res;
01142 }
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152 INT32 *
01153 cwh_auxst_assign_id(SYMTAB_IDX level, LABEL_IDX idx)
01154 {
01155 return &(Auxlabel_Table[idx].assign_id);
01156 }
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167 extern BOOL
01168 cwh_auxst_find_dummy(ST * arg)
01169 {
01170 DUMMIES *p ;
01171 INT16 i ;
01172 ST **ap ;
01173
01174 p = AUXST_Dummies(EP_Current);
01175 ap = p->arglist;
01176
01177 for (i = 0 ; i < p->args_seen ; i ++ )
01178 if (arg == *ap++ )
01179 return (TRUE);
01180
01181 return(FALSE);
01182 }
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195 extern ST *
01196 cwh_auxst_find_dummy_len(ST * arg)
01197 {
01198 DUMMIES *p ;
01199 INT16 i,c ;
01200 ST **ap ;
01201
01202 p = AUXST_Dummies(EP_Current);
01203 c = 0 ;
01204 ap = p->arglist;
01205
01206
01207
01208 if (AUXST_Flag(EP_Current,f_RSLTTMP) &&
01209 cwh_types_is_character(p->ret_type))
01210 if (arg == *ap++ )
01211 return (p->arglist[1]);
01212
01213 DevAssert((p->args_seen >= p->fe_given_args ),("Missing args"));
01214
01215
01216
01217 for (i = 0 ; i < p->fe_given_args ; i ++ ) {
01218 if(cwh_types_is_character(ST_type(*ap))) {
01219 if (arg == *ap)
01220 return(p->arglist[p->args_seen+c]);
01221 else
01222 c++ ;
01223 }
01224 ap++ ;
01225 }
01226
01227 return (NULL);
01228 }
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241 extern ST **
01242 cwh_auxst_arglist(ST * entry)
01243 {
01244 DUMMIES * e ;
01245
01246 e = cwh_auxst_find_entry(entry);
01247
01248 return (e->arglist);
01249 }
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261 extern INT16
01262 cwh_auxst_num_dummies(ST * entry)
01263 {
01264 DUMMIES * e ;
01265
01266 e = cwh_auxst_find_entry(entry);
01267
01268 return (e->total_args);
01269 }
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284 extern void
01285 cwh_auxst_set_tylist(ST *en)
01286 {
01287 AUXST * o ;
01288 DUMMIES *e ;
01289 INT32 i;
01290 TYLIST_IDX tylist_idx;
01291 PARMS *parms;
01292
01293 o = cwh_auxst_find(en, FALSE);
01294 e = AUXST_Dummies(o);
01295
01296
01297
01298
01299 if (e->fe_given_args == 0 && !e->ret_type)
01300 return;
01301
01302 TY& ty = Ty_Table[ST_pu_type(en)];
01303
01304 (void) New_TYLIST (tylist_idx);
01305 Set_TY_tylist (ty, tylist_idx);
01306
01307 if (ST_auxst_has_rslt_tmp(en) &&
01308 !(e->ret_type && (STRUCT_BY_VALUE(e->ret_type)))) {
01309
01310 Tylist_Table [tylist_idx] = e->orig_ret_type;
01311
01312 } else {
01313 Tylist_Table [tylist_idx] = e->ret_type;
01314 }
01315
01316
01317
01318
01319 parms = e->parms;
01320
01321 for (i= 0 ; i < e->total_args; i++) {
01322
01323 (void) New_TYLIST (tylist_idx);
01324 Tylist_Table [tylist_idx] = PARMS_ty(parms);
01325 parms = PARMS_next(parms);
01326 }
01327
01328
01329
01330 (void) New_TYLIST (tylist_idx);
01331 Tylist_Table [tylist_idx] = 0;
01332
01333 }
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343 extern void
01344 cwh_auxst_dump_list (LIST * l, BOOL verbose)
01345 {
01346 ITEM * i;
01347
01348 if (l == NULL)
01349 return ;
01350
01351 if (L_num(l) == 0)
01352 return ;
01353
01354 i = L_first(l);
01355
01356 while (i != NULL) {
01357 if (I_element(i) == NULL)
01358 printf (" < NULL ITEM ?>\n");
01359 else {
01360 if (verbose)
01361 DUMP_ST(I_element(i));
01362 else
01363 printf (" %p (%s) \n",I_element(i),ST_name(I_element(i)));
01364
01365 i = I_next(i);
01366 }
01367 }
01368 printf (" \n");
01369 }
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379 static void
01380 cwh_auxst_dump_dummies(DUMMIES * d)
01381 {
01382 INT32 i,k,j ;
01383
01384 if (d == NULL)
01385 return ;
01386
01387 printf (" DUMMIES : %p next : %p \n",
01388 d,
01389 d->next_entry);
01390
01391 if (d->ret_type != 0)
01392 printf (" result TY : %d, \n",d->ret_type);
01393
01394
01395 if (d->total_args != 0) {
01396
01397 printf (" args : total# %d, #fe_given %d, #seen %d, # including lengths %d \n",
01398 d->total_args,
01399 d->fe_given_args,
01400 d->args_seen,
01401 d->arg_lengths_index);
01402
01403 for (i = 0 ; i < d->args_seen ; i ++ ) {
01404 printf (" arg ST : %p (%s) \n",
01405 d->arglist[i],
01406 ST_name( d->arglist[i]));
01407 }
01408
01409 for (i = d->fe_given_args;
01410 i < d->arg_lengths_index ;
01411 i ++) {
01412
01413 printf (" len ST : %p (%s) \n",
01414 d->arglist[i],
01415 ST_name( d->arglist[i]));
01416 }
01417
01418 j = d->args_seen;
01419
01420 PARMS * te = d->parms;
01421 while(te && (j-- >0)) {
01422 printf (" TY : 0x%x %s \n", PARMS_ty(te),
01423 TY_name(PARMS_ty(te))) ;
01424 te = PARMS_next(te);
01425 }
01426 }
01427 printf("\n");
01428 }
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438 extern void
01439 cwh_auxst_dump (ST * st)
01440 {
01441 AUXST * o;
01442 LIST * l;
01443
01444 o = cwh_auxst_find(st,FALSE);
01445
01446 if (o == NULL)
01447 return ;
01448
01449 printf ("AUXST: %p next: %p \n",o,AUXST_Next(o));
01450
01451 if (AUXST_OwningST(o) != NULL ) {
01452 printf (" associated ST: %p (%s) \n",
01453 AUXST_OwningST(o),
01454 ST_name(AUXST_OwningST(o)));
01455 }
01456
01457 if (USRCPOS_filenum(AUXST_SrcPos(o)) != 0) {
01458 printf (" file: %d line: %d \n",
01459 USRCPOS_filenum(AUXST_SrcPos(o)),
01460 USRCPOS_linenum(AUXST_SrcPos(o)));
01461 }
01462
01463 if (AUXST_Flag(o,f_ALTENT))
01464 printf (" is alternate entry pt \n") ;
01465
01466 if (AUXST_Flag(o,f_ALTTY))
01467 printf (" alternate entry STs have same TY \n") ;
01468
01469 if (AUXST_Flag(o,f_RSLTTMP))
01470 printf (" first argument is result varbl \n");
01471
01472 if (AUXST_Flag(o,f_ELEM))
01473 printf (" elemental function \n");
01474
01475 if (AUXST_Flag(o,f_NONCONT))
01476 printf (" non-contiguous \n");
01477
01478 if (AUXST_Flag(o,f_AUTO_OR_CPTR))
01479 printf (" auto or cray pointer\n");
01480
01481 if (AUXST_Flag(o,f_F90_PTR))
01482 printf (" f90 pointer \n");
01483
01484 if (AUXST_Flag(o,f_MODULE))
01485 printf (" Common for module data \n");
01486
01487 if (AUXST_Stem(o) != NULL)
01488 printf (" DST name: %s \n",AUXST_Stem(o));
01489
01490 if (AUXST_Pragma(o))
01491 printf (" pragma: WN %p \n",AUXST_Pragma(o)) ;
01492
01493 if (AUXST_CRIPointee(o))
01494 printf (" cri_pointee: ST %p (%s)\n",AUXST_CRIPointee(o),ST_name(AUXST_CRIPointee(o))) ;
01495
01496 if (AUXST_DataInfo(o))
01497 printf (" data info: %p \n",AUXST_DataInfo(o)) ;
01498
01499 l = cwh_auxst_find_list(o,l_ALTENTRY) ;
01500 if (L_first(l) != NULL){
01501 printf (" alternate entry points: \n") ;
01502 cwh_auxst_dump_list(l,FALSE);
01503 }
01504
01505 l = cwh_auxst_find_list(o,l_COMLIST);
01506 if (L_first(l) != NULL){
01507 printf (" common items: \n") ;
01508 cwh_auxst_dump_list(l,FALSE);
01509 }
01510
01511 #ifdef KEY
01512 l = cwh_auxst_find_list(o,l_PU_COMLIST);
01513 if (L_first(l) != NULL){
01514 printf (" common items in current program unit: \n") ;
01515 cwh_auxst_dump_list(l,FALSE);
01516 }
01517 #endif
01518
01519 l = cwh_auxst_find_list(o,l_EQVLIST);
01520 if (L_first(l) != NULL){
01521 printf (" equivalence items: \n") ;
01522 cwh_auxst_dump_list(l,FALSE);
01523 }
01524
01525 l = cwh_auxst_find_list(o,l_DST_COMLIST);
01526 if (L_first(l) != NULL){
01527 printf (" commons for dst info: \n") ;
01528 cwh_auxst_dump_list(l,FALSE);
01529 }
01530
01531 l = cwh_auxst_find_list(o,l_DST_PARMLIST);
01532 if (L_first(l) != NULL){
01533 printf (" parameters for dst info: \n") ;
01534 cwh_auxst_dump_list(l,FALSE);
01535 }
01536
01537 if (AUXST_Dummies(o) != NULL)
01538 cwh_auxst_dump_dummies(AUXST_Dummies(o));
01539
01540 l = cwh_auxst_find_list(o,l_NAMELIST);
01541 if (L_first(l) != NULL){
01542 printf (" namelist items: \n") ;
01543 cwh_auxst_dump_list(l,FALSE);
01544 }
01545
01546 l = cwh_auxst_find_list(o,l_RETURN_TEMPS);
01547 if (L_first(l) != NULL){
01548 printf (" result temps: \n") ;
01549 cwh_auxst_dump_list(l,FALSE);
01550 }
01551
01552 l = cwh_auxst_find_list(o,l_SPLITLIST);
01553 if (L_first(l) != NULL){
01554 printf (" split commons: \n") ;
01555 cwh_auxst_dump_list(l,FALSE);
01556 }
01557
01558 if (AUXST_AssignId(o) != -1)
01559 printf (" assign id: 0x%x \n", AUXST_AssignId(o));
01560
01561 if (AUXST_DstrReg(o) != -1)
01562 printf (" distr preg: %d \n", AUXST_DstrReg(o));
01563
01564 printf ("--\n");
01565
01566 }