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
00075 static const char *source_file = __FILE__;
00076
00077 #ifdef _KEEP_RCS_ID
00078 static char *rcs_id = "$Source: crayf90/sgi/SCCS/s.cwh_types.cxx $ $Revision: 1.7 $";
00079 #endif
00080
00081
00082
00083 #include "defs.h"
00084 #include "glob.h"
00085 #include "stab.h"
00086 #include "ttype.h"
00087 #include "strtab.h"
00088 #include "config_targ.h"
00089 #include "errors.h"
00090 #include "wn.h"
00091 #include "wn_util.h"
00092
00093
00094
00095 #include "i_cvrt.h"
00096
00097
00098
00099 #include "cwh_defines.h"
00100 #include "cwh_expr.h"
00101 #include "cwh_addr.h"
00102 #include "cwh_block.h"
00103 #include "cwh_preg.h"
00104 #include "cwh_stab.h"
00105 #include "cwh_auxst.h"
00106
00107 #include "cwh_types.h"
00108 #include "cwh_stk.h"
00109 #include "cwh_types.i"
00110 #include "sgi_cmd_line.h"
00111
00112
00113
00114 #define BUMP_TY_COUNTER(x)
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 TYPE
00133 fei_descriptor (INT32 flag_matrix,
00134 INT32 table_type,
00135 INTPTR size,
00136 INT32 basic_type,
00137 INT32 aux_info,
00138 INT32 alignment)
00139
00140 {
00141 TYPE t ;
00142 mUINT16 al ;
00143 BOOL hosted ;
00144 #ifdef KEY
00145 TY_IDX ty_idx = 0;
00146 #else
00147 TY_IDX ty_idx;
00148 #endif
00149
00150 hosted = test_flag(flag_matrix,FEI_DESCRIPTOR_HOSTED_TYPE) || in_hosted_dtype ;
00151
00152 switch(table_type) {
00153 case Basic:
00154 al = bit_to_byte(size);
00155 ty_idx = cwh_types_mk_basic_TY((BASIC_TYPE)basic_type,size,al) ;
00156 break;
00157
00158 case Array:
00159 Is_True((top_of_decl_bounds != ANULL),("Bad array info"));
00160 ty_idx = cwh_types_mk_array_TY(decl_bounds,
00161 top_of_decl_bounds + 1,
00162 ty_dim1,
00163 bit_to_byte(last_bitsize));
00164 if (hosted)
00165 (void) cwh_types_mk_pointer_TY(ty_idx,TRUE);
00166
00167
00168
00169 if (decl_distributed_pragma_id!=WN_PRAGMA_UNDEFINED) {
00170 int i;
00171 WN *wn;
00172 decl_distribute_pragmas=WN_CreateBlock();
00173 for(i=top_of_decl_bounds; i>=0; i--) {
00174
00175
00176
00177 WN *lb,*ub,*st;
00178 wn = WN_CreatePragma(decl_distributed_pragma_id, (ST_IDX) NULL, 0, 0);
00179 WN_pragma_distr_type(wn) =decl_distribution[i];
00180 WN_pragma_index(wn) = top_of_decl_bounds-i;
00181 switch(decl_distribution[i]) {
00182 case DISTRIBUTE_CYCLIC_EXPR:
00183 WN_INSERT_BlockLast(decl_distribute_pragmas,wn);
00184
00185 wn = WN_CreateXpragma(decl_distributed_pragma_id, (ST_IDX) NULL, 1);
00186 WN_kid0(wn) = decl_cyclic_val[i].wn;
00187 WN_INSERT_BlockLast(decl_distribute_pragmas,wn);
00188 break;
00189 case DISTRIBUTE_CYCLIC_CONST:
00190 WN_pragma_preg(wn) = decl_cyclic_val[i].val;
00191 WN_INSERT_BlockLast(decl_distribute_pragmas,wn);
00192 break;
00193 default:
00194 WN_INSERT_BlockLast(decl_distribute_pragmas,wn);
00195 break;
00196 }
00197
00198 lb = cwh_types_bound_WN(ty_idx,i,LOW);
00199 ub = cwh_types_bound_WN(ty_idx,i,UPPER);
00200 st = WN_Intconst(MTYPE_I4,1);
00201 wn = WN_CreateXpragma(decl_distributed_pragma_id, (ST_IDX) NULL, 1);
00202 WN_kid0(wn) = cwh_addr_extent(lb,ub,st);
00203 WN_INSERT_BlockLast(decl_distribute_pragmas,wn);
00204 }
00205
00206 if (distribute_onto) {
00207 for(i=top_of_decl_bounds; i>=0; i--) {
00208
00209 if (decl_distribution[i]!=DISTRIBUTE_STAR) {
00210
00211 wn = WN_CreateXpragma(WN_PRAGMA_ONTO, (ST_IDX) NULL, 1);
00212 WN_kid0(wn) = decl_onto[i];
00213 WN_INSERT_BlockLast(decl_distribute_pragmas,wn);
00214 }
00215 }
00216 }
00217 }
00218 top_of_decl_bounds = ANULL ;
00219 break ;
00220
00221 case Func_tion:
00222 ty_idx = cwh_types_mk_procedure_TY(Be_Type_Tbl(MTYPE_V), 0,TRUE,FALSE);
00223 break ;
00224
00225 default:
00226
00227 DevWarn((" Unsupported type "));
00228 }
00229
00230 t.table_type = (TABLE_TYPE)table_type ;
00231 t.basic_type = (BASIC_TYPE)basic_type ;
00232
00233 cwh_types_fill_type(flag_matrix,&t,ty_idx);
00234
00235 return(t);
00236 }
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 extern INTPTR
00258 fei_array_dimen(INT32 flag_bits,
00259 INT64 low_bound,
00260 INT64 extent,
00261 INT32 axis,
00262 TYPE span_type,
00263 INT64 bitsize,
00264 INT distribution,
00265 INT64 upper_bound)
00266 {
00267 ST * st;
00268 STB_pkt *b;
00269 WN *wn ;
00270 BOOL hosted ;
00271 ST_IDX st_idx;
00272 ARB_HANDLE p;
00273 BOOL flow_dependent;
00274
00275 hosted = test_flag(flag_bits,FEI_ARRAY_DIMEN_HOSTED_TYPE) || in_hosted_dtype ;
00276
00277 top_of_decl_bounds = axis - 1 ;
00278 if (top_of_decl_bounds == 0) {
00279 decl_bounds = New_ARB();
00280 p = decl_bounds;
00281 } else {
00282 p = New_ARB();
00283 }
00284
00285 flow_dependent = test_flag(flag_bits,FEI_ARRAY_DIMEN_FLOW_DEPENDENT);
00286
00287 ARB_Init (p, 1, 1, 1);
00288
00289 if (test_flag(flag_bits,FEI_ARRAY_DIMEN_VARY_LB)) {
00290
00291 b = cast_to_STB((UINTPS) low_bound) ;
00292 Is_True((b->form == is_ST),("Odd lbound"));
00293
00294 st = cast_to_ST(b->item);
00295 Clear_ARB_const_lbnd(p);
00296 Set_ARB_lbnd_var(p, ST_st_idx(st));
00297
00298 if (!hosted && !flow_dependent)
00299 cwh_types_copyin_pragma(st);
00300
00301 } else {
00302
00303 Set_ARB_const_lbnd(p);
00304 Set_ARB_lbnd_val (p, low_bound);
00305 }
00306
00307 if (test_flag(flag_bits,FEI_ARRAY_DIMEN_VARY_UB)) {
00308
00309 b = cast_to_STB((UINTPS) upper_bound) ;
00310 if (b != NULL) {
00311 Is_True((b->form == is_ST),("Odd extent"));
00312
00313 st = cast_to_ST(b->item);
00314
00315 Clear_ARB_const_ubnd(p);
00316 Set_ARB_ubnd_var(p, ST_st_idx(st));
00317
00318 if (!hosted && !flow_dependent)
00319 cwh_types_copyin_pragma(st);
00320
00321 } else {
00322
00323 Set_ARB_const_ubnd(p);
00324 Set_ARB_ubnd_val (p, 0);
00325 }
00326
00327 } else {
00328
00329 Set_ARB_const_ubnd(p);
00330 Set_ARB_ubnd_val (p, upper_bound);
00331 }
00332
00333
00334
00335 if (test_flag(flag_bits,FEI_ARRAY_DIMEN_VARY_EXT)) {
00336
00337 b = cast_to_STB((UINTPS) extent) ;
00338 if (b != NULL) {
00339 Is_True((b->form == is_ST),("Odd extent"));
00340
00341 st = cast_to_ST(b->item);
00342
00343 if (!hosted && !flow_dependent)
00344 cwh_types_copyin_pragma(st);
00345 }
00346 }
00347
00348
00349
00350
00351
00352
00353
00354 if (axis == 1) {
00355
00356 ty_dim1 = cast_to_TY(t_TY(span_type)) ;
00357
00358 Set_ARB_const_stride(p);
00359 Set_ARB_stride_val(p, TY_size(Ty_Table[ty_dim1]));
00360
00361 } else {
00362 ARB_HANDLE q = p[-1];
00363 if (ARB_const_ubnd(p) &&
00364 ARB_const_lbnd(p) &&
00365 ARB_const_stride(q)) {
00366
00367 Set_ARB_const_stride(p);
00368 Set_ARB_stride_val(p, bit_to_byte(last_bitsize));
00369
00370 } else {
00371
00372 Set_ARB_const_stride(p);
00373 Set_ARB_stride_val(p, ARB_stride_val(decl_bounds[0]));
00374 }
00375 }
00376
00377 last_bitsize = bitsize ;
00378
00379 if (axis == 1) {
00380
00381 distribute_onto=FALSE;
00382 decl_distributed_pragma_id=WN_PRAGMA_UNDEFINED;
00383 decl_distribute_pragmas =NULL;
00384 }
00385
00386 if (test_flag(flag_bits,FEI_ARRAY_DIMEN_ONTO_EXPR)) {
00387 distribute_onto=TRUE;
00388
00389 wn = cwh_expr_operand(NULL);
00390 Is_True( (WN_operator(wn)==OPR_INTCONST),("ONTO: expected integer constant"));
00391 Is_True( (distribution!=Star_Dist),("ONTO: unexpected for * distribution"));
00392 decl_onto[top_of_decl_bounds]=wn;
00393 }
00394
00395
00396 switch(distribution) {
00397 case Block_Dist:
00398 decl_distribution[top_of_decl_bounds] = DISTRIBUTE_BLOCK;
00399 break;
00400 case Star_Dist:
00401 decl_distribution[top_of_decl_bounds]=DISTRIBUTE_STAR;
00402 break;
00403 case Cyclic_Dist:
00404 if (test_flag(flag_bits,FEI_ARRAY_DIMEN_DIST_EXPR)) {
00405
00406 wn = cwh_expr_operand(NULL);
00407 if(WN_operator(wn)==OPR_INTCONST) {
00408 decl_cyclic_val[top_of_decl_bounds].val=WN_const_val(wn);
00409 decl_distribution[top_of_decl_bounds]=DISTRIBUTE_CYCLIC_CONST;
00410 } else {
00411
00412 decl_cyclic_val[top_of_decl_bounds].wn=wn;
00413 decl_distribution[top_of_decl_bounds]=DISTRIBUTE_CYCLIC_EXPR;
00414 }
00415 } else {
00416
00417 decl_cyclic_val[top_of_decl_bounds].val=1;
00418 decl_distribution[top_of_decl_bounds]=DISTRIBUTE_CYCLIC_CONST;
00419 }
00420 break;
00421 }
00422
00423 if (distribution != No_Dist) {
00424 decl_distributed_pragma_id=test_flag(flag_bits,FEI_ARRAY_DIMEN_DIST_RESHAPE)?WN_PRAGMA_DISTRIBUTE_RESHAPE:WN_PRAGMA_DISTRIBUTE;
00425 }
00426
00427 return 0;
00428 }
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438 extern INT32
00439 fei_next_type_idx(INT32 flag, INT32 align)
00440 {
00441 TY_IDX ty_idx;
00442
00443 if (!cwh_types_in_dtype())
00444 in_hosted_dtype = test_flag(flag,FEI_NEXT_TYPE_IDX_HOSTED_TYPE);
00445
00446 ty_idx = cwh_types_new_TY(in_hosted_dtype,
00447 bit_to_byte(align)) ;
00448
00449 BUMP_TY_COUNTER(c_TY_DTYPE);
00450
00451 return(cast_to_int(ty_idx));
00452 }
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474 void
00475 fei_user_type(char *name_string,
00476 INT32 nbr_components,
00477 INT32 first_idx,
00478 INT64 size,
00479 INT32 sequence_arg,
00480 INTPTR cr_ty_idx,
00481 INT32 align)
00482
00483 {
00484 TY_IDX ty_idx ;
00485 dtype_t d ;
00486 #ifdef KEY
00487 memset(&d, 0, sizeof d);
00488 #endif
00489 FORT_SEQUENCE sequence;
00490 INT32 i;
00491
00492 sequence = (FORT_SEQUENCE) sequence_arg;
00493
00494 ty_idx = cast_to_TY(cr_ty_idx);
00495
00496 TY& ty = Ty_Table[ty_idx];
00497
00498 TY_Init (ty, bit_to_byte(size), KIND_STRUCT, MTYPE_M, Save_Str(name_string));
00499
00500 for (i=0; i<nbr_components; i++) {
00501 FLD_HANDLE fld = New_FLD ();
00502 if (i == 0) {
00503 Set_TY_fld(ty, fld);
00504 d.dty_last = fld.Idx ();
00505 }
00506 }
00507
00508
00509
00510
00511 if (sequence == Seq_Char) {
00512 Set_TY_is_packed(ty);
00513 }
00514
00515 d.dty = ty_idx ;
00516 d.ncompos = nbr_components ;
00517 d.seq = (sequence != Seq_None);
00518 d.hosted = in_hosted_dtype ;
00519
00520 cwh_types_push_dtype(d);
00521
00522 }
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536 INT32
00537 fei_member(char *name_string,
00538 TYPE member_type,
00539 INT64 offset,
00540 INT64 size,
00541 INT32 alignment,
00542 INT32 lineno,
00543 INT64 flag_bits,
00544 INT64 io_code)
00545 {
00546 dtype_t d ;
00547 TY_IDX ty_idx;
00548 BOOL p1 ;
00549 INT64 off;
00550 INT32 ret_val;
00551
00552 ty_idx = cast_to_TY(t_TY(member_type));
00553 p1 = test_flag(flag_bits, FEI_OBJECT_DV_IS_PTR);
00554
00555
00556
00557 off = bit_to_byte(offset);
00558
00559 Is_True((off%TY_align(ty_idx) == 0), ("Misalign"));
00560
00561 if (p1) {
00562 Is_True(TY_is_f90_pointer(Ty_Table[ty_idx]),(" Missing f90ptr"));
00563 } else {
00564 Is_True(!TY_is_f90_pointer(Ty_Table[ty_idx]),(" extra f90ptr"));
00565 }
00566
00567 d = cwh_types_pop_dtype();
00568
00569
00570
00571 Is_True((TY_align(d.dty) >= TY_align(ty_idx)), ("Misalign, enclosing"));
00572
00573 FLD_HANDLE fld (d.dty_last);
00574
00575 FLD_Init (fld, Save_Str(name_string), ty_idx, off);
00576
00577 ret_val = d.dty_last;
00578
00579 d.dty_last++;
00580
00581 if (--d.ncompos == 0) {
00582
00583 Set_FLD_last_field(fld);
00584
00585
00586 if (!cwh_types_in_dtype())
00587 in_hosted_dtype = FALSE ;
00588
00589 } else
00590 cwh_types_push_dtype(d);
00591
00592 return (ret_val);
00593 }
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604 extern TYPE
00605 fei_dope_vector(INT32 num_dims,TYPE base_type, INT32 flag,
00606 #ifdef KEY
00607 INT32 n_allocatable_cpnt
00608 #endif
00609 )
00610 {
00611 TY_IDX ty_idx ;
00612 TY_IDX ts_idx ;
00613 TYPE t ;
00614 BOOL b ;
00615
00616 ts_idx = cast_to_TY(t_TY(base_type));
00617 b = test_flag(flag,FEI_DOPE_VECTOR_HOSTED_TYPE) || in_hosted_dtype;
00618 ty_idx = cwh_types_dope_TY(num_dims,ts_idx,b,test_flag(flag,FEI_DOPE_VECTOR_POINTER),
00619 #ifdef KEY
00620 n_allocatable_cpnt
00621 #endif
00622 ) ;
00623
00624 t.table_type = Basic ;
00625 t.basic_type = S_tructure ;
00626
00627 cwh_types_fill_type(0,&t,ty_idx);
00628
00629 return(t);
00630 }
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651 static TY_IDX
00652 cwh_types_mk_basic_TY (BASIC_TYPE basic_type,
00653 INTPTR size,
00654 mUINT16 alignment)
00655 {
00656 TY_IDX ty_idx ;
00657 TYPE_ID bt ;
00658 STB_pkt * p ;
00659 WN * wn;
00660 static TY_IDX char_ptr_ty_idx = 0 ;
00661
00662 ty_idx = 0 ;
00663
00664 switch(basic_type) {
00665
00666 case L_ogical:
00667 ty_idx = cwh_types_mk_logical_TY(size,alignment);
00668 break ;
00669
00670 case Char_Fortran:
00671 p = cast_to_STB(size);
00672
00673 switch (p->form) {
00674 case is_WN:
00675 wn = cast_to_WN(p->item);
00676 if (WNOPR(wn) == OPR_INTCONST)
00677 wn = bit_to_byte_WN(wn);
00678 ty_idx = cwh_types_mk_character_TY(wn,NULL,TRUE);
00679 break;
00680
00681 case is_ST:
00682 ty_idx = cwh_types_mk_character_TY(NULL,cast_to_ST(p->item),FALSE);
00683 break;
00684
00685 default:
00686 Is_True((0),("odd TY const"));
00687 }
00688 break ;
00689
00690 case C_omplex:
00691 bt = Mtypes[align_index(size/2)][basic_index(basic_type)];
00692 ty_idx = Be_Type_Tbl(bt);
00693 ty_idx = cwh_types_mk_misaligned_TY(ty_idx,alignment) ;
00694 break ;
00695
00696 case S_tructure:
00697 ty_idx = cast_to_TY(size);
00698 break ;
00699
00700 case CRI_Pointer_Char:
00701
00702
00703
00704 if (char_ptr_ty_idx == 0 ) {
00705
00706 FLD_HANDLE list = cwh_types_fld_util("base", Be_Type_Tbl(Pointer_Mtype),
00707 0,TRUE);
00708 FLD_HANDLE fld = cwh_types_fld_util("len", Be_Type_Tbl(Pointer_Mtype),
00709 Pointer_Size,TRUE);
00710 Set_FLD_last_field(fld);
00711 char_ptr_ty_idx = cwh_types_mk_struct(2*Pointer_Size, Pointer_Size, list,
00712 ".char_pointer");
00713 }
00714
00715 ty_idx = char_ptr_ty_idx ;
00716 break;
00717
00718
00719 case CRI_Pointer:
00720 ty_idx = Be_Type_Tbl(Pointer_Mtype);
00721 break ;
00722
00723 case T_ypeless:
00724
00725
00726
00727
00728
00729 if (size == 8) {
00730 ty_idx = Be_Type_Tbl(MTYPE_U1);
00731 } else if (size==16) {
00732 ty_idx = Be_Type_Tbl(MTYPE_U2);
00733 } else if (size==32) {
00734 ty_idx = Be_Type_Tbl(MTYPE_U4);
00735 } else if (size==64) {
00736 ty_idx = Be_Type_Tbl(MTYPE_U8);
00737 } else {
00738
00739 ty_idx = cwh_types_array_util(1,Be_Type_Tbl(MTYPE_U1),1,bit_to_byte(size),".typeless.",TRUE);
00740
00741 ARB_HANDLE arb = TY_arb(ty_idx);
00742 Set_ARB_stride_val(arb, 1);
00743 Set_ARB_ubnd_val(arb, bit_to_byte(size) - 1);
00744
00745 ty_idx = cwh_types_unique_TY(ty_idx);
00746 }
00747 break ;
00748
00749 default:
00750 bt = Mtypes[align_index(size)][basic_index(basic_type)];
00751 ty_idx = Be_Type_Tbl(bt);
00752 ty_idx = cwh_types_mk_misaligned_TY(ty_idx,alignment) ;
00753 break;
00754 }
00755
00756 return(ty_idx);
00757 }
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777 static TY_IDX
00778 cwh_types_mk_misaligned_TY(TY_IDX ty_idx, mUINT16 alignment)
00779 {
00780 TY_IDX tc_idx = ty_idx ;
00781 TY& ty = Ty_Table[ty_idx];
00782
00783 if (TY_kind(ty) == KIND_SCALAR) {
00784 if (alignment <= 4) {
00785 if (alignment > 0) {
00786 if (TY_align(ty_idx) > alignment ) {
00787
00788 tc_idx = unaligned_type [TY_mtype(ty)][alignment_to_align(alignment)];
00789
00790 if (tc_idx == 0) {
00791
00792 BUMP_TY_COUNTER(c_TY_MISC);
00793 tc_idx = cwh_types_new_TY ( TRUE , alignment);
00794 TY& tc = Ty_Table[tc_idx];
00795
00796 TY_Init (tc, TY_size(ty), TY_kind(ty), TY_mtype(ty), Save_Str2(TY_name(ty),alstr[alignment_to_align(alignment)]));
00797
00798 Set_TY_flags(tc, TY_flags(ty));
00799
00800 tc_idx = cwh_types_unique_TY(tc_idx);
00801
00802 unaligned_type [TY_mtype(ty)][alignment_to_align(alignment)] = tc_idx ;
00803 }
00804 }
00805 }
00806 }
00807 }
00808 return tc_idx ;
00809 }
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834 extern TY_IDX
00835 cwh_types_form_misaligned_TY(TY_IDX ty_idx, mUINT16 alignment)
00836 {
00837 TY_IDX tr_idx ;
00838 TY_IDX tt_idx ;
00839 INT num ;
00840 const char * const misstr = ".mis";
00841
00842 TY& ty = Ty_Table[ty_idx];
00843
00844 if (TY_align(ty_idx) <= alignment)
00845 return ty_idx ;
00846
00847 switch(TY_kind(ty)) {
00848 case KIND_SCALAR:
00849 if (TY_is_logical(ty))
00850 tr_idx = cwh_types_mk_logical_TY(byte_to_bit(TY_size(ty)),alignment) ;
00851 else
00852 tr_idx = cwh_types_mk_misaligned_TY(ty_idx,alignment) ;
00853 break ;
00854
00855 case KIND_ARRAY:
00856 {
00857 tt_idx = cwh_types_form_misaligned_TY(TY_etype(ty),alignment);
00858 tr_idx = Copy_TY(ty_idx);
00859 TY &tr = Ty_Table[tr_idx];
00860 Set_TY_etype(tr, tt_idx);
00861 Set_TY_align(tr_idx, alignment);
00862 Set_TY_name_idx(tr, Save_Str2(TY_name(tr),misstr));
00863 break;
00864 }
00865 case KIND_STRUCT:
00866 if (cwh_types_is_dope(ty_idx)) {
00867 tr_idx = ty_idx ;
00868
00869 } else {
00870 FLD_ITER fld_iter = Make_fld_iter (TY_fld (ty));
00871 FLD_HANDLE c_fld;
00872 do {
00873 FLD_HANDLE p (fld_iter);
00874 FLD_HANDLE fld = New_FLD ();
00875 if (p == TY_fld (ty))
00876 c_fld = fld;
00877 FLD_Init (fld,
00878 Save_Str2(FLD_name(p),misstr),
00879 cwh_types_form_misaligned_TY(FLD_type(p), alignment),
00880 FLD_ofst(p));
00881 Set_FLD_bofst(fld, FLD_bofst(p));
00882 Set_FLD_bsize(fld, FLD_bsize(p));
00883 Set_FLD_flags(fld, FLD_flags(p));
00884 } while (!FLD_last_field (fld_iter++));
00885
00886 tr_idx = Copy_TY(ty_idx);
00887 TY &tr = Ty_Table[tr_idx];
00888 Set_TY_align(tr_idx, alignment);
00889 Set_TY_fld(tr, c_fld);
00890
00891 Set_TY_name_idx(tr, Save_Str2(TY_name(ty),misstr));
00892 }
00893 break;
00894
00895
00896 case KIND_POINTER:
00897 tr_idx = ty_idx ;
00898 break ;
00899
00900 default:
00901 Is_True((0),("Odd misalignment"));
00902
00903 }
00904
00905 return tr_idx;
00906 }
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922 extern TY_IDX
00923 cwh_types_mk_procedure_TY (TY_IDX ret_typ_idx, INT32 nparms, BOOL global, BOOL host)
00924 {
00925 TY_IDX ty_idx ;
00926 TYLIST tylist_idx;
00927
00928 static TY_IDX basic_subroutine_TY_idx = 0 ;
00929 TY &ret_typ = Ty_Table[ret_typ_idx];
00930
00931 if ( nparms == 0 )
00932 if (MTYPE_is_void(TY_mtype(ret_typ)))
00933 if (basic_subroutine_TY_idx != 0)
00934 return (basic_subroutine_TY_idx) ;
00935 else
00936 global = TRUE;
00937
00938 BUMP_TY_COUNTER(c_TY_PROC) ;
00939 ty_idx = cwh_types_new_TY (global,1) ;
00940 TY &ty = Ty_Table[ty_idx];
00941
00942 TY_Init (ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, Save_Str(cwh_types_mk_anon_name(".proc.")));
00943
00944
00945
00946
00947
00948
00949
00950 if (nparms == 0) {
00951 (void) New_TYLIST (tylist_idx);
00952 Set_TY_tylist(ty, tylist_idx);
00953 Tylist_Table [tylist_idx] = ret_typ_idx;
00954 (void) New_TYLIST (tylist_idx);
00955 Tylist_Table [tylist_idx] = 0;
00956 }
00957
00958 if (nparms == 0)
00959 if (MTYPE_is_void(TY_mtype(ret_typ)))
00960 basic_subroutine_TY_idx = ty_idx ;
00961
00962 return (ty_idx);
00963
00964 }
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985 static TY_IDX
00986 cwh_types_mk_array_TY(ARB_HANDLE bounds,INT16 n,TY_IDX base_idx, INT64 size)
00987 {
00988 TY_IDX ty_idx ;
00989 BOOL const_str = TRUE;
00990 int i;
00991
00992
00993 ty_idx = cwh_types_array_util(n,base_idx,TY_align(base_idx),0,".array.",FALSE);
00994 Set_TY_arb(ty_idx,bounds);
00995
00996
00997
00998 for (i = 0; i < n/2; i++) {
00999 ARB_swap(bounds[i],bounds[n-i-1]);
01000 }
01001
01002
01003 for (i = 0; i < n ; i++) {
01004 Clear_ARB_first_dimen(bounds[i]);
01005 Clear_ARB_last_dimen(bounds[i]);
01006 Set_ARB_dimension(bounds[i],n-i);
01007 const_str = const_str && ARB_const_stride(bounds[i]);
01008 }
01009 Set_ARB_first_dimen(bounds[0]);
01010 Set_ARB_last_dimen(bounds[n-1]);
01011
01012 if ( const_str ) {
01013
01014 Set_TY_size(ty_idx, size);
01015
01016 } else {
01017
01018 Set_TY_size(ty_idx, 0);
01019
01020 }
01021
01022 ty_idx = cwh_types_unique_TY(ty_idx);
01023
01024 return (ty_idx);
01025 }
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036 extern TY_IDX
01037 cwh_types_mk_logical_TY(INT32 size, mUINT16 alignment)
01038 {
01039
01040 TYPE_ID bt ;
01041 TY_IDX ty_idx ;
01042 INT16 i ;
01043 const char * csz;
01044 const char * aln;
01045 INT32 size_in_bytes;
01046
01047 i = align_index(size) ;
01048
01049 Is_True((i < NUM_LOG_KINDS),("Odd logical type")) ;
01050
01051 if (basic_logical_ty[i][alignment_to_align(alignment)] == 0) {
01052
01053 csz = logstr[i];
01054 aln = "";
01055
01056 bt = Mtypes[align_index(size)][basic_index(L_ogical)];
01057 ty_idx = cwh_types_new_TY (TRUE,alignment) ;
01058
01059 BUMP_TY_COUNTER(c_TY_MISC);
01060
01061 size_in_bytes = bit_to_byte(size);
01062
01063 if (size_in_bytes != alignment)
01064 aln = alstr[alignment_to_align(alignment)];
01065
01066 TY &ty = Ty_Table[ty_idx];
01067
01068 TY_Init (ty, size_in_bytes, KIND_SCALAR, bt, Save_Str2(csz,aln));
01069
01070 Set_TY_is_logical(ty);
01071
01072 ty_idx = cwh_types_unique_TY(ty_idx);
01073
01074 basic_logical_ty[i][alignment_to_align(alignment)] = ty_idx ;
01075
01076 }
01077 return (basic_logical_ty[i][alignment_to_align(alignment)]);
01078 }
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091 TY_IDX
01092 cwh_types_mk_character_TY(WN *sz_wn, ST *sz_st, BOOL sz_is_wn)
01093 {
01094 INT64 i ;
01095 TY_IDX ty_idx ;
01096 BOOL global;
01097 BOOL const_sz;
01098
01099 static TY_IDX basic_character_ty_idx = 0;
01100
01101 if (basic_character_ty_idx == 0) {
01102
01103 BUMP_TY_COUNTER(c_TY_MISC) ;
01104
01105 ty_idx = cwh_types_new_TY (TRUE,1) ;
01106 TY &ty = Ty_Table[ty_idx];
01107
01108 TY_Init (ty, 1, KIND_SCALAR, MTYPE_U1, Save_Str(".character."));
01109 Set_TY_is_character(ty);
01110
01111 ty_idx = cwh_types_unique_TY(ty_idx);
01112
01113 basic_character_ty_idx = ty_idx ;
01114 }
01115
01116 ty_idx = cwh_types_array_util(1,basic_character_ty_idx,1,0,".ch_str.",TRUE);
01117 TY& ty = Ty_Table[ty_idx];
01118
01119 ARB_HANDLE arb = TY_arb(ty);
01120
01121 Set_ARB_lbnd_val(arb, 1);
01122 Set_ARB_stride_val(arb, 1);
01123
01124
01125
01126 if (!sz_is_wn) {
01127
01128 Clear_ARB_const_ubnd(arb);
01129 Set_TY_size(ty, 0);
01130 Set_ARB_ubnd_var(arb,ST_st_idx(sz_st));
01131
01132 } else if (WNOPR(sz_wn) == OPR_INTCONST) {
01133
01134 i = WN_const_val(sz_wn) ;
01135 Set_ARB_ubnd_val(arb,i) ;
01136 Set_TY_size(ty, i);
01137
01138 } else {
01139
01140 ST *st = cwh_types_make_bounds_ST();
01141
01142 Clear_ARB_const_ubnd(arb);
01143 Set_TY_size(ty, 0);
01144 cwh_addr_store_ST(st,0,0,sz_wn);
01145 Set_ARB_ubnd_var(arb, ST_st_idx(st));
01146 }
01147
01148 Set_TY_is_character(ty);
01149 ty_idx = cwh_types_unique_TY(ty_idx);
01150 return(ty_idx);
01151 }
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163 extern TY_IDX
01164 cwh_types_scalar_TY(TY_IDX ty_idx)
01165 {
01166 #ifdef KEY
01167 TY_IDX rty_idx = 0;
01168 #else
01169 TY_IDX rty_idx ;
01170 #endif
01171
01172 TY& ty = Ty_Table[ty_idx];
01173
01174 switch(TY_kind(ty)) {
01175
01176 case KIND_VOID:
01177 case KIND_SCALAR:
01178 case KIND_STRUCT:
01179 case KIND_POINTER:
01180 case KIND_FUNCTION:
01181 rty_idx = ty_idx;
01182 break;
01183
01184 case KIND_ARRAY:
01185 rty_idx = cwh_types_scalar_TY(TY_etype(ty)) ;
01186 break;
01187
01188 default:
01189 DUMP_TY(ty_idx);
01190 Is_True((0),("Odd ty"));
01191 break;
01192 }
01193
01194 return(rty_idx);
01195 }
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207 extern TY_IDX
01208 cwh_types_array_TY(TY_IDX ty_idx)
01209 {
01210 #ifdef KEY
01211 TY_IDX rty_idx = 0;
01212 #else
01213 TY_IDX rty_idx ;
01214 #endif
01215
01216 TY& ty = Ty_Table[ty_idx];
01217
01218 switch(TY_kind(ty)) {
01219 case KIND_ARRAY:
01220 case KIND_SCALAR:
01221 case KIND_STRUCT:
01222 case KIND_FUNCTION:
01223 case KIND_VOID:
01224 rty_idx = ty_idx;
01225 break;
01226
01227 case KIND_POINTER:
01228 rty_idx = cwh_types_array_TY(TY_pointed(ty)) ;
01229 break;
01230
01231 default:
01232 DUMP_TY(ty_idx);
01233 Is_True((0),("Odd array ty"));
01234 break;
01235 }
01236
01237 return(rty_idx);
01238 }
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258 extern TY_IDX
01259 cwh_types_WN_TY(WN * wn, BOOL addr)
01260 {
01261 TY_IDX ty_idx = 0 ;
01262 WN *kid;
01263 INT i;
01264
01265 switch (WNOPR(wn)) {
01266 case OPR_ARRAY:
01267 case OPR_ARRSECTION:
01268 case OPR_ARRAYEXP:
01269 case OPR_MLOAD:
01270 case OPR_PARM:
01271 ty_idx = cwh_types_WN_TY(WN_kid0(wn),addr);
01272 break ;
01273
01274 case OPR_INTCONST:
01275 if (addr) {
01276 ty_idx = Make_Pointer_Type(Be_Type_Tbl(MTYPE_V));
01277 } else {
01278 ty_idx = Be_Type_Tbl(WN_rtype(wn));
01279 }
01280 break;
01281
01282 case OPR_INTRINSIC_OP:
01283
01284
01285 if (MTYPE_is_pointer(WN_rtype(wn)) || WN_opcode(wn) == OPC_MINTRINSIC_OP) {
01286 ty_idx = cwh_types_WN_TY(WN_kid0(wn),addr);
01287 } else {
01288 ty_idx = Be_Type_Tbl(WN_rtype(wn));
01289 }
01290 break;
01291
01292 case OPR_LDA:
01293 case OPR_ILOAD:
01294 case OPR_LDID:
01295 {
01296 ty_idx = WN_ty(wn) ;
01297 TY &ty = Ty_Table[ty_idx];
01298
01299 if (! addr)
01300 if (TY_kind(ty) == KIND_POINTER)
01301 ty_idx = TY_pointed(ty);
01302 }
01303 break;
01304
01305 case OPR_CIOR:
01306 case OPR_CAND:
01307 case OPR_LIOR:
01308 case OPR_LAND:
01309 case OPR_LNOT:
01310 case OPR_EQ:
01311 case OPR_NE:
01312 ty_idx = cwh_types_WN_TY(WN_kid0(wn),addr);
01313 break;
01314
01315
01316 case OPR_ADD:
01317 case OPR_SUB:
01318 for (i=0; i <= 1; i++) {
01319 kid = WN_kid(wn,i);
01320 switch (WNOPR(kid)) {
01321 case OPR_ARRAY:
01322 case OPR_ARRSECTION:
01323 case OPR_ARRAYEXP:
01324 case OPR_LDA:
01325 case OPR_LDID:
01326 case OPR_ILOAD:
01327 ty_idx = cwh_types_WN_TY(kid,addr);
01328 return (ty_idx);
01329 }
01330 }
01331
01332
01333 default:
01334 Is_True((OPCODE_is_expression(WN_opcode(wn))),(" Unexpected WN"));
01335
01336 ty_idx = Be_Type_Tbl(WN_rtype(wn));
01337 break;
01338 }
01339
01340 return (ty_idx) ;
01341 }
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352 extern TY_IDX
01353 cwh_types_ch_parm_TY(WN *ln)
01354 {
01355 TY_IDX ty_idx ;
01356
01357 ty_idx = cwh_types_mk_character_TY(ln,NULL,TRUE);
01358 ty_idx = Make_Pointer_Type( ty_idx);
01359
01360 return(ty_idx);
01361 }
01362
01363
01364
01365
01366
01367
01368
01369
01370
01371 extern BOOL
01372 cwh_types_is_character(TY_IDX ty_idx)
01373 {
01374 TY_IDX ts_idx ;
01375
01376 ts_idx = cwh_types_array_TY(ty_idx);
01377 ts_idx = cwh_types_scalar_TY(ts_idx);
01378
01379 TY& ts = Ty_Table[ts_idx];
01380
01381 return (TY_is_character(ts));
01382 }
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392 extern BOOL
01393 cwh_types_is_logical(TY_IDX ty_idx)
01394 {
01395 TY_IDX ts_idx ;
01396
01397 ts_idx = cwh_types_array_TY(ty_idx);
01398 ts_idx = cwh_types_scalar_TY(ts_idx);
01399
01400 TY& ts = Ty_Table[ts_idx];
01401
01402 return (TY_is_logical(ts));
01403 }
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413 extern BOOL
01414 cwh_types_is_character_function(TY_IDX ty_idx)
01415 {
01416 TY_IDX ts_idx ;
01417
01418 ts_idx = cwh_types_array_TY(ty_idx);
01419 ts_idx = cwh_types_scalar_TY(ts_idx);
01420
01421 TY& ts = Ty_Table[ts_idx];
01422
01423 if (TY_kind(ts) != KIND_FUNCTION) return (FALSE);
01424
01425 ts_idx = Tylist_Table[TY_tylist(ts)];
01426
01427 ts_idx = cwh_types_scalar_TY(ts_idx);
01428
01429 return (TY_is_character(Ty_Table[ts_idx]));
01430 }
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442 extern ST *
01443 cwh_types_character_extra(ST *dummy)
01444 {
01445 TY_IDX ty_idx ;
01446 ST * st ;
01447
01448 st = NULL;
01449
01450 if (cwh_types_is_character(ST_type(dummy))) {
01451
01452 ty_idx = Be_Type_Tbl(cwh_addr_char_len_typeid);
01453 st = cwh_types_formal_util(ty_idx);
01454 Set_ST_is_value_parm(st);
01455 Set_ST_is_temp_var(st);
01456 }
01457
01458 return(st);
01459 }
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471
01472 static ST *
01473 cwh_types_formal_util(TY_IDX ty_idx)
01474 {
01475 ST * st;
01476
01477 st = New_ST(CURRENT_SYMTAB);
01478 cwh_auxst_clear(st);
01479
01480 ST_Init(st, Save_Str(cwh_types_mk_anon_name(".len")), CLASS_VAR, SCLASS_FORMAL, EXPORT_LOCAL, ty_idx);
01481
01482 return st ;
01483 }
01484
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498 static TY_IDX
01499 cwh_types_mk_struct(INT64 size, INT32 align, FLD_HANDLE list, const char *name)
01500 {
01501 TY_IDX ty_idx ;
01502
01503 BUMP_TY_COUNTER(c_TY_STRUCT) ;
01504
01505 ty_idx = cwh_types_new_TY(TRUE,align) ;
01506 TY& ty = Ty_Table[ty_idx];
01507
01508 TY_Init (ty, size, KIND_STRUCT, MTYPE_M, Save_Str(cwh_types_mk_anon_name(name)));
01509
01510 Set_TY_fld(ty, list);
01511 return (ty_idx);
01512
01513 }
01514
01515
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529 extern TY_IDX
01530 cwh_types_array_util(INT16 rank, TY_IDX ety_idx, INT32 align, INT64 size, const char * name, BOOL alloc_arbs)
01531 {
01532 TY_IDX ty_idx ;
01533 INT16 i ;
01534
01535 if (rank == 0)
01536 return (0);
01537
01538 BUMP_TY_COUNTER(c_TY_ARRAY);
01539
01540 ty_idx = cwh_types_new_TY(TRUE,align);
01541 TY &ty = Ty_Table[ty_idx];
01542 TY_Init (ty, size, KIND_ARRAY, MTYPE_UNKNOWN, Save_Str(cwh_types_mk_anon_name(name)));
01543
01544 Set_TY_etype(ty, ety_idx);
01545
01546 if (alloc_arbs) {
01547 for (i = 0 ; i < rank ; i++) {
01548
01549 ARB_HANDLE arb = New_ARB();
01550 ARB_Init (arb, 1, 1, 1);
01551
01552 if (i == 0) {
01553 Set_ARB_first_dimen(arb);
01554 Set_TY_arb (ty, arb);
01555 }
01556
01557 Set_ARB_dimension (arb, rank - i );
01558
01559 if (i == rank - 1)
01560 Set_ARB_last_dimen (arb);
01561
01562 Set_ARB_const_lbnd (arb);
01563 Set_ARB_lbnd_val (arb, 0);
01564
01565 Set_ARB_const_stride (arb);
01566 Set_ARB_stride_val (arb, 0);
01567
01568 Set_ARB_const_ubnd (arb);
01569 Set_ARB_ubnd_val (arb, 0);
01570
01571 }
01572 }
01573
01574 return (ty_idx);
01575 }
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586 static TY_IDX
01587 cwh_types_dim_struct_TY(void)
01588 {
01589 INT16 i ;
01590
01591 static TY_IDX dim_TY_idx = 0;
01592
01593 INT32 sz ;
01594
01595 if (dim_TY_idx == 0) {
01596
01597 sz = DOPE_bound_sz ;
01598
01599 DOPE_bound_ty = Be_Type_Tbl(cwh_bound_int_typeid);
01600
01601 FLD_HANDLE first;
01602 for (i=0; i < BOUND_NM; i++) {
01603 FLD_HANDLE fld = cwh_types_fld_util(bound_name[i],DOPE_bound_ty,(OFFSET_64)i*sz, TRUE);
01604 if (i == 0)
01605 first = fld;
01606 if (i == BOUND_NM - 1)
01607 Set_FLD_last_field(fld);
01608 }
01609
01610 dim_TY_idx = cwh_types_mk_struct(DIM_SZ,Pointer_Size,first,".dope_bnd.");
01611 }
01612
01613 return(dim_TY_idx);
01614 }
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625 static TY_IDX
01626 cwh_types_dim_TY(INT32 num_dims)
01627 {
01628 INT32 sz ;
01629 TY_IDX ta_idx ;
01630 TY_IDX tb_idx ;
01631 ARB_HANDLE arb;
01632
01633 static TY_IDX tbl[MAX_ARY_DIMS+1] = {0,0,0,0,0,0,0,0};
01634
01635 if (num_dims == 0)
01636 return (0);
01637
01638 if (tbl[num_dims] == 0) {
01639
01640 tb_idx = cwh_types_dim_struct_TY() ;
01641
01642 sz = num_dims * DIM_SZ ;
01643 ta_idx = cwh_types_array_util(1,tb_idx,Pointer_Size,sz,".dims.",TRUE) ;
01644
01645 arb = TY_arb(ta_idx);
01646
01647 Set_ARB_ubnd_val(arb, num_dims - 1);
01648 Set_ARB_stride_val(arb, DIM_SZ);
01649
01650 ta_idx = cwh_types_unique_TY(ta_idx);
01651
01652 tbl[num_dims] = ta_idx ;
01653 }
01654
01655 return(tbl[num_dims]) ;
01656 }
01657
01658
01659
01660
01661
01662
01663
01664
01665
01666
01667
01668
01669
01670 extern TY_IDX
01671 cwh_types_dope_TY(INT32 num_dims,TY_IDX base_idx, BOOL host, BOOL ptr,
01672 #ifdef KEY
01673 INT32 n_allocatable_cpnt
01674 #endif
01675 )
01676 {
01677 TY_IDX ty_idx ;
01678 TY_IDX ta_idx ;
01679 TY_IDX dope_invariant_ty;
01680 INT i;
01681
01682 static BOOL dims_ty_inited = FALSE;
01683 static TY_IDX dims_ty[MAX_ARY_DIMS];
01684
01685
01686 if (!dims_ty_inited) {
01687 for(i=0; i < MAX_ARY_DIMS; i++) {
01688 dims_ty[i] = 0;
01689 }
01690 dims_ty_inited = TRUE;
01691 }
01692
01693 if (num_dims > 0 && dims_ty[num_dims-1] == 0) {
01694 dims_ty[num_dims-1] = cwh_types_dim_TY(num_dims);
01695 }
01696
01697
01698 dope_invariant_ty = cwh_types_mk_dope_invariant_TY();
01699
01700
01701
01702
01703 FLD_HANDLE base_fld = cwh_types_fld_util(dope_name[0],
01704 Be_Type_Tbl(dope_btype[0]),
01705 (OFFSET_64)dope_offset[0],
01706 TRUE);
01707
01708
01709
01710
01711 FLD_HANDLE fld = cwh_types_fld_util(".flds",
01712 dope_invariant_ty,
01713 (OFFSET_64)dope_offset[1],
01714 TRUE);
01715
01716 if (num_dims != 0) {
01717 fld = cwh_types_fld_util(".dims.",
01718 dims_ty[num_dims-1],
01719 (OFFSET_64)DOPE_sz,
01720 TRUE);
01721 }
01722
01723 Set_FLD_last_field(fld);
01724
01725 ta_idx = cwh_types_array_util(num_dims,base_idx,Pointer_Size,0,".base.",TRUE);
01726
01727 if (ta_idx != 0)
01728 ta_idx = cwh_types_unique_TY(ta_idx);
01729 else
01730 ta_idx = base_idx ;
01731
01732
01733
01734
01735
01736
01737 TY& ta = Ty_Table[ta_idx];
01738
01739 if ((TY_kind(ta) == KIND_STRUCT) && (TY_fld(ta).Is_Null ()))
01740 Set_FLD_type(base_fld, cwh_types_mk_unique_pointer_TY(ta_idx, host));
01741 else
01742 Set_FLD_type(base_fld, cwh_types_mk_pointer_TY(ta_idx, host));
01743
01744
01745
01746 ty_idx = cwh_types_shared_dope(base_fld,num_dims,ptr,
01747 #ifdef KEY
01748 n_allocatable_cpnt
01749 #endif
01750 );
01751
01752 return(ty_idx);
01753 }
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764 static TY_IDX
01765 cwh_types_mk_dope_invariant_TY(void)
01766 {
01767 INT i ;
01768 OFFSET_64 first_offset;
01769 static TY_IDX invariant_ty=0;
01770
01771 if (invariant_ty != 0) return (invariant_ty);
01772
01773
01774
01775
01776
01777
01778 FLD_HANDLE first = cwh_types_fld_util(dope_name[1],
01779 Be_Type_Tbl(dope_btype[1]),
01780 (OFFSET_64) 0,
01781 TRUE);
01782 first_offset = dope_offset[1];
01783
01784 FLD_HANDLE fld;
01785 for(i=2; i < DOPE_NM; i++) {
01786 fld = cwh_types_fld_util(dope_name[i],
01787 Be_Type_Tbl(dope_btype[i]),
01788 (OFFSET_64)dope_offset[i] - first_offset ,
01789 TRUE);
01790 Set_FLD_bofst(fld, dope_bofst[i]);
01791 Set_FLD_bsize(fld, dope_bsize[i]);
01792 if (dope_bsize[i] != 0)
01793 Set_FLD_is_bit_field(fld);
01794 }
01795 Set_FLD_last_field(fld);
01796
01797
01798 invariant_ty = cwh_types_mk_struct(DOPE_sz - first_offset,
01799 Pointer_Size,first,(char *)dope_invariant_str);
01800 return (invariant_ty);
01801 }
01802
01803
01804
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818 static TY_IDX
01819 cwh_types_shared_dope(FLD_HANDLE fld, int ndims, BOOL is_ptr,
01820 #ifdef KEY
01821 int n_allocatable_cpnt
01822 #endif
01823 )
01824 {
01825 static TY_IDX intrn_dope[MAX_ARY_DIMS+1][NUM_DOPE_TYPES] ;
01826 static TY_IDX intrn_ptrs_dope[MAX_ARY_DIMS+1][NUM_DOPE_TYPES] ;
01827 TY_IDX *p ;
01828 TY_IDX dv_idx ;
01829 TY_IDX tp_idx ;
01830 TY_IDX tb_idx ;
01831 TYPE_ID bt ;
01832
01833 INT64 sz ;
01834 INT32 al ;
01835
01836
01837
01838 dv_idx = 0 ;
01839
01840 tp_idx = TY_pointed(Ty_Table[FLD_type(fld)]);
01841 tb_idx = cwh_types_scalar_TY(tp_idx);
01842
01843 TY& tb = Ty_Table[tb_idx];
01844
01845
01846 if (IS_SHARED_DOPE_BASE(tb)) {
01847
01848 bt = TY_mtype(tb);
01849
01850 if (TY_is_logical(tb))
01851 bt = LOGICAL_OFFSET(bt);
01852
01853 if (is_ptr)
01854 p = &intrn_ptrs_dope[ndims][bt];
01855 else
01856 p = &intrn_dope[ndims][bt];
01857
01858 if (*p == 0) {
01859
01860 sz = DOPE_sz + ndims * DIM_SZ ;
01861 al = Pointer_Size;
01862 *p = cwh_types_mk_struct(sz,al,fld,(char *)dope_str);
01863
01864 TY& ty = Ty_Table[*p];
01865
01866 if (is_ptr)
01867 Set_TY_is_f90_pointer(ty);
01868 else
01869 Clear_TY_is_f90_pointer(ty);
01870
01871 }
01872
01873 BUMP_TY_COUNTER(c_TY_DOPE_INTRIN);
01874 dv_idx = *p;
01875
01876 } else {
01877
01878 sz = DOPE_sz + ndims * DIM_SZ ;
01879 #ifdef KEY
01880
01881
01882
01883
01884
01885
01886
01887 if (n_allocatable_cpnt) {
01888 n_allocatable_cpnt += 1;
01889 sz += n_allocatable_cpnt * DOPE_bound_sz;
01890 }
01891 #endif
01892
01893 al = Pointer_Size;
01894 dv_idx = cwh_types_mk_struct(sz,al,fld,(char *)dope_str);
01895
01896 TY& dv = Ty_Table[dv_idx];
01897
01898 if (is_ptr)
01899 Set_TY_is_f90_pointer(dv);
01900 else
01901 Clear_TY_is_f90_pointer(dv);
01902 }
01903
01904 return dv_idx ;
01905 }
01906
01907
01908
01909
01910
01911
01912
01913
01914
01915
01916
01917
01918
01919 extern BOOL
01920 cwh_types_is_dope(TY_IDX ty)
01921 {
01922
01923 while (TY_kind(ty) == KIND_POINTER) {
01924 ty = TY_pointed(ty);
01925 }
01926
01927 if (strncmp(TY_name(ty),dope_str,DOPENM_LEN) == 0 )
01928 return TRUE;
01929
01930 return FALSE ;
01931 }
01932
01933
01934
01935
01936
01937
01938
01939
01940
01941 extern INT32
01942 cwh_types_dope_rank(TY_IDX ty_idx)
01943 {
01944 INT32 nd ;
01945
01946 nd = 0 ;
01947
01948 TY &ty = Ty_Table[ty_idx];
01949
01950 FLD_HANDLE fl = TY_fld(ty);
01951
01952 while(!FLD_last_field(fl))
01953 fl = FLD_next(fl);
01954
01955 if (!fl.Is_Null ()) {
01956
01957 if (FLD_ofst(fl) > dope_offset[DOPE_NM-1]) {
01958 ARB_HANDLE arb = TY_arb(FLD_type(fl));
01959 nd = 1 + ARB_ubnd_val(arb);
01960 }
01961 }
01962
01963 return (nd);
01964 }
01965
01966
01967
01968
01969
01970
01971
01972
01973
01974
01975 extern TY_IDX
01976 cwh_types_dope_basic_TY(TY_IDX ty)
01977 {
01978 while (TY_kind(ty) == KIND_POINTER)
01979 ty = TY_pointed(ty);
01980
01981 return (TY_pointed(FLD_type(TY_fld(Ty_Table[ty]))));
01982 }
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993 extern FLD_HANDLE
01994 cwh_types_dope_dims_FLD(TY_IDX ty)
01995 {
01996 while (TY_kind(ty) == KIND_POINTER)
01997 ty = TY_pointed(ty);
01998
01999 FLD_HANDLE fl = TY_fld(Ty_Table[ty]);
02000
02001 while (!FLD_last_field(fl)) {
02002 fl = FLD_next(fl);
02003 }
02004
02005 if (FLD_ofst(fl) <= dope_offset[DOPE_NM-1])
02006 fl = FLD_HANDLE ();
02007
02008 return fl;
02009 }
02010
02011
02012
02013
02014
02015
02016
02017
02018
02019
02020
02021
02022
02023 extern bool
02024 cwh_types_contains_dope(TY_IDX ty)
02025 {
02026 bool res = false;
02027
02028 if (TY_kind(ty) == KIND_STRUCT) {
02029 res = cwh_types_is_dope(ty);
02030
02031 if (!res) {
02032
02033 FLD_ITER fld_iter = Make_fld_iter(TY_fld(ty));
02034
02035 do {
02036
02037 FLD_HANDLE p (fld_iter);
02038 res = cwh_types_contains_dope(FLD_type(p));
02039
02040 } while (!res && !FLD_last_field(fld_iter++)) ;
02041 }
02042 }
02043
02044 return res;
02045 }
02046
02047
02048
02049
02050
02051
02052
02053
02054
02055
02056 static FLD_HANDLE
02057 cwh_types_fld_util(const char* name_string, TY_IDX fld_ty, OFFSET_64 offset, BOOL global)
02058 {
02059
02060 FLD_HANDLE fld;
02061
02062 if (fld_ty == 0)
02063 return(fld);
02064
02065 fld = New_FLD ();
02066 FLD_Init (fld, Save_Str(name_string), fld_ty, offset);
02067 Set_FLD_bofst(fld, 0);
02068 Set_FLD_bsize(fld, 0);
02069
02070 return(fld);
02071 }
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082
02083 extern FLD_HANDLE
02084 cwh_types_fld_dummy(OFFSET_64 off,TY_IDX ty)
02085 {
02086 FLD_HANDLE fld ;
02087
02088 fld = cwh_types_fld_util(".dummy.",ty,off,FALSE);
02089 return (fld);
02090 }
02091
02092
02093
02094
02095
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106 extern TY_IDX
02107 cwh_types_array_temp_TY(WN *ar, TY_IDX sc )
02108 {
02109 TY_IDX ty ;
02110 WN * wn ;
02111 ARB_HANDLE bound;
02112 TYPE_ID bt ;
02113 INT64 size;
02114 INT16 nd,i,j ;
02115
02116
02117 nd = WN_kid_count(ar) - 1;
02118 bt = cwh_bound_int_typeid ;
02119
02120
02121
02122 for (i = 0 ; i < nd ; i ++) {
02123
02124 j = nd - i;
02125
02126 ARB_HANDLE arb = New_ARB();
02127 ARB_Init (arb, 1, 1, 1);
02128 if (i == 0) {
02129 bound = arb;
02130 }
02131
02132 Set_ARB_const_lbnd(arb);
02133 Set_ARB_lbnd_val(arb, 0);
02134 Clear_ARB_first_dimen(arb);
02135 Clear_ARB_last_dimen(arb);
02136
02137 if (WNOPR(WN_kid(ar,j)) == OPR_INTCONST) {
02138
02139 Set_ARB_const_ubnd(arb);
02140 Set_ARB_ubnd_val(arb, WN_const_val(WN_kid(ar,j)) -1);
02141
02142 } else {
02143
02144 WN *expr;
02145 ST *st;
02146
02147 expr = cwh_expr_bincalc(OPR_SUB,
02148 WN_COPY_Tree(WN_kid(ar,j)),
02149 WN_Intconst(bt,1));
02150
02151 Clear_ARB_const_ubnd(arb);
02152
02153 st = cwh_types_make_bounds_ST();
02154 cwh_addr_store_ST(st,0,0,expr);
02155 Set_ARB_ubnd_var(arb, ST_st_idx(st));
02156
02157 }
02158 }
02159
02160
02161
02162 if (TY_size(sc) != 0) {
02163
02164 Set_ARB_const_stride(bound[0]);
02165 Set_ARB_stride_val(bound[0], TY_size(sc));
02166
02167 } else {
02168
02169 ARB_HANDLE sc_arb = TY_arb(sc);
02170
02171 Clear_ARB_const_stride(bound[0]);
02172 Set_ARB_stride_var(bound[0], ARB_ubnd_var(sc_arb));
02173 }
02174
02175 for (i = 1 ; i < nd ; i ++) {
02176
02177 ARB_HANDLE arb = bound[i-1];
02178
02179 if (ARB_const_stride(arb)) {
02180 if (ARB_const_ubnd(arb)) {
02181
02182 ARB_HANDLE arb2 = bound[i];
02183
02184 Set_ARB_const_stride(arb2);
02185 Set_ARB_stride_val(arb2, ARB_stride_val(arb) * (ARB_ubnd_val(arb) + 1 ));
02186 } else {
02187
02188 ST *st;
02189 WN *wn2;
02190
02191 ARB_HANDLE arb2 = bound[i];
02192
02193 Clear_ARB_const_stride(arb2);
02194
02195 wn = WN_Intconst(cwh_bound_int_typeid,1 + ARB_const_ubnd(arb));
02196 wn2 = cwh_addr_load_ST(&St_Table[ARB_ubnd_var(arb)],0,0);
02197 wn = cwh_expr_bincalc(OPR_MPY, wn2, wn);
02198
02199 st = cwh_types_make_bounds_ST();
02200 cwh_addr_store_ST(st,0,0,wn);
02201 Set_ARB_stride_var(arb2, ST_st_idx(st));
02202 }
02203 } else {
02204
02205 ARB_HANDLE arb2 = bound[i];
02206 ST *st;
02207
02208 Clear_ARB_const_stride(arb2);
02209
02210 if (ARB_const_ubnd(arb)) {
02211 wn = cwh_expr_bincalc(OPR_ADD,
02212 WN_Intconst(bt,ARB_ubnd_val(arb)),
02213 WN_Intconst(bt,1));
02214 } else {
02215 WN *wn2 = cwh_addr_load_ST(&St_Table[ARB_ubnd_var(arb)],0,0);
02216 wn = cwh_expr_bincalc(OPR_ADD,wn2,WN_Intconst(bt,1));
02217 }
02218
02219 wn = cwh_expr_bincalc(OPR_MPY,
02220 wn,
02221 cwh_addr_load_ST(&St_Table[ARB_stride_var(arb)], 0, 0));
02222 st = cwh_types_make_bounds_ST();
02223 cwh_addr_store_ST(st,0,0,wn);
02224 Set_ARB_stride_var(arb2, ST_st_idx(st));
02225 }
02226 }
02227
02228 ARB_HANDLE last_arb = bound[nd-1];
02229
02230 if (ARB_const_stride(last_arb) && ARB_const_ubnd(last_arb)
02231 && ARB_const_lbnd(last_arb)) {
02232 size = ARB_stride_val(last_arb)*(ARB_ubnd_val(last_arb)
02233 - ARB_lbnd_val(last_arb)
02234 + 1);
02235 } else {
02236 size = 0;
02237 }
02238
02239 Set_ARB_first_dimen(bound[0]);
02240 Set_ARB_last_dimen(last_arb);
02241
02242 ty = cwh_types_mk_array_TY(bound,nd,sc,size);
02243 return(ty);
02244 }
02245
02246
02247
02248
02249
02250
02251
02252
02253
02254
02255 extern WN *
02256 cwh_types_size_WN(TY_IDX ty, WN *e_sz)
02257 {
02258 INT16 nd ;
02259 WN *wn ;
02260 WN *lb ;
02261 WN *ub ;
02262 WN *st ;
02263 WN *wt ;
02264 INT i;
02265
02266 Is_True((TY_kind(ty) == KIND_ARRAY),("Odd size calc"));
02267
02268 nd = ARB_dimension (TY_arb (ty));
02269 wn = e_sz;
02270
02271 for (i = 0; i < nd ; i++) {
02272 lb = cwh_types_bound_WN(ty,i,LOW);
02273 ub = cwh_types_bound_WN(ty,i,UPPER);
02274 st = WN_Intconst(MTYPE_I4,1);
02275 wt = cwh_addr_extent(lb,ub,st);
02276 wn = cwh_expr_bincalc(OPR_MPY,wt,wn);
02277 }
02278
02279 return(wn);
02280 }
02281
02282
02283
02284
02285
02286
02287
02288
02289
02290
02291 extern WN *
02292 cwh_types_bound_WN(TY_IDX ty, INT16 i, enum ty_bound_enum b)
02293 {
02294 #ifdef KEY
02295 WN * wn = 0;
02296 #else
02297 WN * wn ;
02298 #endif
02299
02300 ARB_HANDLE arb = TY_arb(ty);
02301 INT16 nd = ARB_dimension(arb);
02302 arb = arb[nd-i-1];
02303
02304 switch (b) {
02305 case LOW:
02306 if (ARB_const_lbnd(arb))
02307 wn = WN_Intconst(cwh_bound_int_typeid,ARB_lbnd_val(arb)) ;
02308 else
02309 wn = cwh_addr_load_ST(&St_Table[ARB_lbnd_var(arb)],0,0);
02310 break ;
02311
02312 case UPPER:
02313 if (ARB_const_ubnd(arb))
02314 wn = WN_Intconst(cwh_bound_int_typeid,ARB_ubnd_val(arb)) ;
02315 else
02316 wn = cwh_addr_load_ST(&St_Table[ARB_ubnd_var(arb)],0,0);
02317 break ;
02318
02319 case STRIDE:
02320 if (ARB_const_stride(arb))
02321 wn = WN_Intconst(cwh_bound_int_typeid,ARB_stride_val(arb)) ;
02322 else
02323 wn = cwh_addr_load_ST(&St_Table[ARB_stride_var(arb)],0,0);
02324 break ;
02325 }
02326
02327 return (wn) ;
02328 }
02329
02330
02331
02332
02333
02334
02335
02336
02337
02338
02339
02340
02341
02342
02343
02344
02345
02346
02347
02348
02349
02350
02351
02352
02353
02354
02355
02356
02357 extern void
02358 cwh_types_get_dope_info(
02359 #ifdef KEY
02360 dv_idx_type crayfield,
02361 #else
02362 INT32 crayfield,
02363 #endif
02364 INT32 *offset, INT32 *rshift,
02365 INT64 *mask, TYPE_ID *ty)
02366 {
02367 INT real_field;
02368 INT shift;
02369 INT size;
02370 INT ty_size;
02371
02372 #ifdef KEY
02373 real_field = (INT) crayfield;
02374 #else
02375
02376 if (crayfield >= 8) {
02377
02378 real_field = crayfield;
02379 } else if (crayfield == 7) {
02380 real_field = crayfield;
02381 } else {
02382 real_field = crayfield - 1;
02383 }
02384 #endif
02385
02386 *offset = dope_offset[real_field];
02387 *ty = dope_btype[real_field];
02388 shift = dope_bofst[real_field];
02389 size = dope_bsize[real_field];
02390 ty_size = MTYPE_size_best(*ty);
02391
02392 #ifdef KEY
02393 if (size == (sizeof(1LL) * CHAR_BIT)) {
02394 *mask = 0;
02395 } else
02396 #endif
02397 if (size != 0) {
02398 *mask = (1LL << size) - 1;
02399 } else {
02400 *mask = 0;
02401 }
02402 if (shift != 0 || size != 0) {
02403 # if defined(linux) || defined(BUILD_OS_DARWIN)
02404 *rshift = shift;
02405 # else
02406 *rshift = ty_size - shift - size;
02407 # endif
02408 } else {
02409 *rshift = 0;
02410 }
02411 return;
02412 }
02413
02414
02415
02416
02417
02418
02419
02420
02421
02422 extern TY_IDX
02423 cwh_types_mk_pointer_TY(TY_IDX ty_idx, BOOL host)
02424 {
02425 TY_IDX tr_idx ;
02426
02427 tr_idx = Make_Pointer_Type(ty_idx);
02428
02429 return(tr_idx);
02430 }
02431
02432
02433
02434
02435
02436
02437
02438
02439
02440
02441 static TY_IDX
02442 cwh_types_mk_unique_pointer_TY(TY_IDX ty, BOOL host)
02443 {
02444 TY_IDX tp_idx;
02445
02446 BUMP_TY_COUNTER(c_TY_UNIQ_POINTER) ;
02447
02448 tp_idx = cwh_types_new_TY (TRUE,Pointer_Size);
02449 TY& tp = Ty_Table[tp_idx];
02450 TY_Init(tp, Pointer_Size, KIND_POINTER, Pointer_Mtype, Save_Str(cwh_types_mk_anon_name(".uniq_p.")));
02451
02452 Set_TY_pointed(tp, ty);
02453
02454 tp_idx = cwh_types_unique_TY(tp_idx);
02455
02456 return tp_idx;
02457 }
02458
02459
02460
02461
02462
02463
02464
02465
02466
02467
02468
02469
02470
02471
02472
02473
02474 extern TY_IDX
02475 cwh_types_mk_common_TY(INT64 size, mUINT16 al )
02476 {
02477 TY_IDX ty ;
02478 INT64 sz ;
02479
02480 if (al == 0)
02481 al = 4;
02482
02483 sz = bit_to_byte(size);
02484 ty = cwh_types_mk_struct(sz,al,FLD_HANDLE(),".common.");
02485
02486 return(ty);
02487 }
02488
02489
02490
02491
02492
02493
02494
02495
02496
02497
02498
02499 extern TY_IDX
02500 cwh_types_mk_equiv_TY(INT64 size)
02501 {
02502 TY_IDX ty ;
02503 INT64 sz ;
02504
02505 sz = bit_to_byte(size);
02506 ty = cwh_types_mk_struct(sz,MAX_ALIGN,FLD_HANDLE(),".equiv.") ;
02507
02508 return ty ;
02509 }
02510
02511
02512
02513
02514
02515
02516
02517
02518
02519
02520
02521
02522
02523 extern TY_IDX
02524 cwh_types_mk_namelist_TY(INT32 nitems)
02525 {
02526 TY_IDX ty ;
02527 TY_IDX tn ;
02528 TY_IDX te ;
02529 TY_IDX ta_idx ;
02530 WN *wn ;
02531 FLD_HANDLE f1 ;
02532 FLD_HANDLE f2 ;
02533
02534
02535
02536 te = cwh_types_mk_namelist_item_TY();
02537 ta_idx = cwh_types_array_util(1,
02538 te,
02539 NL_Tables[ALIGN_Nlentry][NL_Table_Index],
02540 TY_size(te),
02541 ".NL_item_array.",
02542 TRUE);
02543
02544 TY& ta = Ty_Table[ta_idx];
02545
02546 Set_TY_AR_ubnd_val(ta, 0, nitems - 1);
02547 Set_TY_AR_stride_val(ta, 0, TY_size(te));
02548
02549 ta_idx = cwh_types_unique_TY(ta_idx);
02550
02551
02552
02553
02554
02555 wn = WN_Intconst(MTYPE_I4,NL_Name_Length) ;
02556 tn = cwh_types_mk_character_TY(wn,NULL,TRUE);
02557 f1 = cwh_types_fld_util(".NL_name.",tn,NL_Tables[OFFSET_Namelist_nlname][NL_Table_Index],TRUE);
02558
02559 f2 = cwh_types_fld_util(".NL_vars.",ta_idx,NL_Tables[OFFSET_Namelist_nlvnames][NL_Table_Index],TRUE);
02560
02561 Set_FLD_last_field(f2);
02562
02563 ty = cwh_types_mk_struct(TY_size(tn) + TY_size(ta),
02564 NL_Tables[ALIGN_Namelist][NL_Table_Index],
02565 f1,
02566 ".Namelist.");
02567 return ty ;
02568 }
02569
02570
02571
02572
02573
02574
02575
02576
02577
02578
02579
02580
02581
02582
02583
02584 static TY_IDX
02585 cwh_types_mk_namelist_item_TY(void)
02586 {
02587 TY_IDX ty ;
02588 TY_IDX tp ;
02589 TY_IDX tc ;
02590 FLD_HANDLE f1 ;
02591 FLD_HANDLE f2 ;
02592 FLD_HANDLE f3 ;
02593 FLD_HANDLE f4 ;
02594 WN * wn ;
02595
02596 static TY_IDX gl_ty = 0 ;
02597
02598 if (gl_ty == 0) {
02599
02600 tp = Make_Pointer_Type(Be_Type_Tbl(MTYPE_V));
02601
02602 ty = Be_Type_Tbl(MTYPE_I4);
02603
02604 wn = WN_Intconst(MTYPE_I4,NL_Name_Length) ;
02605
02606 tc = cwh_types_mk_character_TY(wn,NULL,TRUE);
02607
02608
02609 f1 = cwh_types_fld_util("varname",tc,NL_Tables[OFFSET_Nlentry_varname][NL_Table_Index],TRUE);
02610 f2 = cwh_types_fld_util("varaddr",tp,NL_Tables[OFFSET_Nlentry_varaddr][NL_Table_Index],TRUE);
02611 f3 = cwh_types_fld_util("type",ty,NL_Tables[OFFSET_Nlentry_type][NL_Table_Index],TRUE);
02612 f4 = cwh_types_fld_util("dimp",tp,NL_Tables[OFFSET_Nlentry_dimp][NL_Table_Index],TRUE);
02613
02614 Set_FLD_last_field(f4);
02615
02616 WN_DELETE_Tree(wn);
02617 gl_ty = cwh_types_mk_struct(NL_Tables[SIZE_Nlentry][NL_Table_Index],
02618 NL_Tables[ALIGN_Nlentry][NL_Table_Index],
02619 f1,
02620 ".NL_item.");
02621 }
02622
02623 return gl_ty ;
02624 }
02625
02626
02627
02628
02629
02630
02631
02632
02633
02634
02635
02636
02637
02638 extern void
02639 cwh_types_mk_element(ST *c, ST * st)
02640 {
02641 TY_IDX cbty ;
02642 FLD_HANDLE fld ;
02643 FLD_HANDLE nfld ;
02644 FLD_HANDLE pfld ;
02645
02646 cbty = ST_type(c);
02647 fld = cwh_types_fld_util(ST_name(st),ST_type(st),ST_ofst(st),TRUE);
02648
02649
02650
02651 if (ST_is_equivalenced(st))
02652 if (!(IS_COMMON(st)))
02653 Set_FLD_equivalence(fld);
02654
02655 if (ST_sclass(st) == SCLASS_COMMON) {
02656 Set_FLD_st(fld, ST_st_idx(st));
02657 Is_True((ST_level(st) == 1),("Bad common st level"));
02658 }
02659
02660
02661
02662
02663 if (TY_align(ST_type(st)) > TY_align(cbty)) {
02664 Set_TY_align(cbty, TY_align(ST_type(st)));
02665 Set_ST_type(*c,cbty);
02666 }
02667
02668 if (TY_fld(Ty_Table[cbty]).Is_Null ()) {
02669 Set_TY_fld(Ty_Table[cbty], fld);
02670 } else {
02671 Clear_FLD_last_field(FLD_HANDLE (fld.Idx () - 1));
02672 }
02673 Set_FLD_last_field(fld);
02674
02675 }
02676
02677
02678
02679
02680
02681
02682
02683
02684
02685
02686
02687
02688 extern TY_IDX
02689 cwh_types_mk_result_temp_TY(void)
02690 {
02691 TY_IDX ty ;
02692 FLD_HANDLE f1 ;
02693 FLD_HANDLE f2 ;
02694
02695 f1 = cwh_types_fld_util("rt1", Be_Type_Tbl(MTYPE_I8),0,TRUE);
02696 f2 = cwh_types_fld_util("rt2", Be_Type_Tbl(MTYPE_I8),0,TRUE);
02697
02698 Set_FLD_last_field(f2);
02699
02700 ty = cwh_types_mk_struct(RESULT_SIZE, RESULT_ALIGN,f1,"res_temp");
02701
02702 return ty;
02703 }
02704 #ifdef KEY
02705
02706
02707
02708
02709 extern unsigned
02710 fei_set_volatile(unsigned t) {
02711 TY_IDX tmp = t;
02712 Set_TY_is_volatile(tmp);
02713 return tmp;
02714 }
02715 #endif
02716
02717
02718
02719
02720
02721
02722
02723
02724 static void
02725 cwh_types_fill_type(INT32 flag_bits, TYPE *t, TY_IDX ty)
02726 {
02727
02728 t->const_flag = test_flag(flag_bits,FEI_DESCRIPTOR_CONST_C);
02729 t->volatile_flag = test_flag(flag_bits,FEI_DESCRIPTOR_VOLAT_C);
02730 t->signed_flag = test_flag(flag_bits,FEI_DESCRIPTOR_SIGN_C);
02731 t->automatic = test_flag(flag_bits,FEI_DESCRIPTOR_AUTO_F);
02732 t->restricted = test_flag(flag_bits,FEI_DESCRIPTOR_RESTR_C);
02733 t->short_flag = test_flag(flag_bits,FEI_DESCRIPTOR_SHORT_C);
02734 t->long_flag = test_flag(flag_bits,FEI_DESCRIPTOR_LONG_C);
02735 t->bitfield = test_flag(flag_bits,FEI_DESCRIPTOR_BITFLD_C);
02736 t->aux_info = 0 ;
02737 t->shrd_pointee = test_flag(flag_bits,FEI_DESCRIPTOR_SHRD_PTEE);
02738 t_TY((*t)) = cast_to_uint(ty);
02739
02740 }
02741
02742
02743
02744
02745
02746
02747
02748
02749
02750
02751
02752
02753
02754 extern char *
02755 cwh_types_mk_anon_name (const char * nm)
02756 {
02757 static char anonymous_str [64] ;
02758 static INT32 anonymous_index = 0;
02759
02760 INT32 len ;
02761
02762 if (nm == NULL) {
02763 len = 6;
02764 strcpy(anonymous_str,".anon.");
02765
02766 } else {
02767
02768 len = strlen(nm);
02769 Is_True((len < 40),("name too long"));
02770 strcpy(anonymous_str,nm);
02771 }
02772
02773 #if 0
02774
02775
02776
02777
02778
02779 sprintf(&anonymous_str[len], "%d", ++ anonymous_index);
02780 #endif
02781
02782 return(anonymous_str);
02783 }
02784
02785
02786
02787
02788
02789
02790
02791
02792
02793
02794
02795 static void
02796 cwh_types_push_dtype(dtype_t d)
02797 {
02798
02799 dtype_top ++ ;
02800
02801 if (dtype_top >= dtype_stk_size) {
02802 dtype_stk_size += STK_SIZE_CHANGE;
02803 dtype_stk = (dtype_t *) realloc(dtype_stk,sizeof(dtype_t)*dtype_stk_size);
02804 }
02805
02806 dtype_stk[dtype_top].dty = d.dty ;
02807 dtype_stk[dtype_top].dty_last = d.dty_last;
02808 dtype_stk[dtype_top].ncompos = d.ncompos ;
02809 dtype_stk[dtype_top].seq = d.seq;
02810 dtype_stk[dtype_top].hosted = d.hosted;
02811
02812 return ;
02813 }
02814
02815
02816
02817
02818
02819
02820
02821
02822
02823 static dtype_t
02824 cwh_types_pop_dtype(void)
02825 {
02826 dtype_t d ;
02827
02828 Is_True((dtype_top >= 0),(" Dtype stack underflow"));
02829
02830 d.dty = dtype_stk[dtype_top].dty ;
02831 d.dty_last = dtype_stk[dtype_top].dty_last;
02832 d.ncompos = dtype_stk[dtype_top].ncompos ;
02833 d.seq = dtype_stk[dtype_top].seq ;
02834 d.hosted = dtype_stk[dtype_top].hosted ;
02835
02836 dtype_top --;
02837
02838 return(d);
02839 }
02840
02841
02842
02843
02844
02845
02846
02847
02848
02849
02850 static BOOL
02851 cwh_types_in_dtype(void)
02852 {
02853 BOOL res = FALSE ;
02854
02855 if (dtype_top >= 0 )
02856 res = TRUE ;
02857
02858 return res ;
02859 }
02860
02861
02862
02863
02864
02865
02866
02867
02868
02869 extern INT64
02870 cwh_cray_type_from_TY(TY_IDX ty_idx)
02871 {
02872 #ifdef KEY
02873 TY_IDX base_ty_idx = 0;
02874 #else
02875 TY_IDX base_ty_idx;
02876 #endif
02877 INT64 rtype;
02878 f90_type_t *f90_type_ptr;
02879
02880 TY& ty = Ty_Table[ty_idx];
02881
02882 rtype = 0;
02883 f90_type_ptr = (f90_type_t *)&rtype;
02884
02885 if (TY_kind(ty) == KIND_ARRAY) {
02886 return (cwh_cray_type_from_TY(TY_etype(ty)));
02887 } else if (TY_kind(ty) == KIND_SCALAR) {
02888 base_ty_idx = ty_idx;
02889 } else if (TY_kind(ty) == KIND_STRUCT) {
02890 f90_type_ptr->type = 8;
02891 return (rtype);
02892 } else {
02893 Is_True((0),("Do not know what to do with type"));
02894 }
02895
02896 TY& base_ty = Ty_Table[base_ty_idx];
02897
02898 if (TY_is_character(base_ty)) {
02899 f90_type_ptr->type = 6;
02900 f90_type_ptr->int_len = 8;
02901 return (rtype);
02902 }
02903
02904 rtype = cwh_cray_type_from_MTYPE(TY_mtype(base_ty));
02905 if (TY_is_logical(base_ty)) {
02906 f90_type_ptr->type = 5;
02907 }
02908
02909 return (rtype);
02910 }
02911
02912
02913
02914
02915
02916
02917
02918
02919
02920
02921
02922 extern INT64
02923 cwh_cray_type_from_MTYPE(TYPE_ID ty)
02924 {
02925 INT64 rtype;
02926 f90_type_t *f90_type_ptr;
02927
02928 rtype = 0;
02929 f90_type_ptr = (f90_type_t *)&rtype;
02930
02931 switch (ty) {
02932 case MTYPE_I1:
02933 f90_type_ptr->type = 2;
02934 f90_type_ptr->kind_or_star = 3;
02935 f90_type_ptr->int_len = 8;
02936 f90_type_ptr->dec_len = 1;
02937 return (rtype);
02938
02939
02940 case MTYPE_I2:
02941 f90_type_ptr->type = 2;
02942 f90_type_ptr->kind_or_star = 3;
02943 f90_type_ptr->int_len = 16;
02944 f90_type_ptr->dec_len = 2;
02945 return (rtype);
02946
02947
02948 case MTYPE_I4:
02949 f90_type_ptr->type = 2;
02950 f90_type_ptr->kind_or_star = 3;
02951 f90_type_ptr->int_len = 32;
02952 f90_type_ptr->dec_len = 4;
02953 return (rtype);
02954
02955
02956 case MTYPE_I8:
02957 f90_type_ptr->type = 2;
02958 f90_type_ptr->kind_or_star = 3;
02959 f90_type_ptr->int_len = 64;
02960 f90_type_ptr->dec_len = 8;
02961 return (rtype);
02962
02963
02964 case MTYPE_F4:
02965 f90_type_ptr->type = 3;
02966 f90_type_ptr->kind_or_star = 3;
02967 f90_type_ptr->int_len = 32;
02968 f90_type_ptr->dec_len = 4;
02969 return (rtype);
02970
02971
02972 case MTYPE_F8:
02973 f90_type_ptr->type = 3;
02974 f90_type_ptr->kind_or_star = 3;
02975 f90_type_ptr->int_len = 64;
02976 f90_type_ptr->dec_len = 8;
02977 return (rtype);
02978
02979
02980 case MTYPE_FQ:
02981 f90_type_ptr->type = 3;
02982 f90_type_ptr->kind_or_star = 3;
02983 f90_type_ptr->int_len = 128;
02984 f90_type_ptr->dec_len = 16;
02985 return (rtype);
02986
02987
02988 case MTYPE_C4:
02989 f90_type_ptr->type = 4;
02990 f90_type_ptr->kind_or_star = 3;
02991 f90_type_ptr->int_len = 64;
02992 f90_type_ptr->dec_len = 4;
02993 return (rtype);
02994
02995
02996 case MTYPE_C8:
02997 f90_type_ptr->type = 4;
02998 f90_type_ptr->kind_or_star = 3;
02999 f90_type_ptr->int_len = 128;
03000 f90_type_ptr->dec_len = 8;
03001 return (rtype);
03002
03003
03004 case MTYPE_CQ:
03005 f90_type_ptr->type = 4;
03006 f90_type_ptr->kind_or_star = 3;
03007 f90_type_ptr->int_len = 256;
03008 f90_type_ptr->dec_len = 16;
03009 return (rtype);
03010
03011 }
03012 Is_True(0,("Do not know what to do with type"));
03013
03014 return(rtype);
03015 }
03016
03017
03018
03019
03020
03021
03022
03023
03024
03025 extern void
03026 cwh_types_init_target(void)
03027 {
03028 if (Pointer_Size == 4) {
03029 DOPE_bound_sz = 4;
03030 DOPE_dim_offset = 32;
03031 DOPE_sz = 32;
03032 dope_btype = dope_btype_32;
03033 dope_offset = dope_offset_32;
03034 NL_Table_Index = 0 ;
03035
03036 } else {
03037 DOPE_bound_sz = 8;
03038 DOPE_dim_offset = 48;
03039 DOPE_sz = 48;
03040 dope_btype = dope_btype_64;
03041 dope_offset = dope_offset_64;
03042 NL_Table_Index = 1 ;
03043 }
03044 logical4_ty = cwh_types_mk_logical_TY(32,4);
03045 }
03046
03047
03048
03049
03050
03051
03052
03053
03054
03055
03056
03057 typedef struct {
03058 TY_IDX ty;
03059 TY_IDX f90_pointed;
03060 } type_pair_t;
03061
03062 static type_pair_t * pairs;
03063 static INT num_type_pairs=0;
03064 static INT max_type_pairs=0;
03065 static INT pair_typenum=0;
03066 #define TYPE_ALLOC_CHUNK_SIZE 32
03067
03068 static TY_IDX
03069 cwh_types_find_f90_pointer_ty (TY_IDX ty)
03070 {
03071 INT i;
03072 for (i=0; i < num_type_pairs; i++) {
03073 if (pairs[i].ty == ty) {
03074 return(pairs[i].f90_pointed);
03075 }
03076 }
03077 return 0;
03078 }
03079
03080 extern TY_IDX
03081 cwh_types_mk_f90_pointer_ty (TY_IDX ty)
03082 {
03083 static BOOL made_real_types=FALSE;
03084 static BOOL made_unsigned_types=FALSE;
03085 TY_IDX t_idx;
03086 char buf[32];
03087
03088 t_idx = cwh_types_find_f90_pointer_ty (ty);
03089 if (t_idx) return (t_idx);
03090
03091 num_type_pairs += 1;
03092 if (num_type_pairs > max_type_pairs) {
03093
03094 max_type_pairs += TYPE_ALLOC_CHUNK_SIZE;
03095 if (max_type_pairs==TYPE_ALLOC_CHUNK_SIZE) {
03096 pairs = (type_pair_t *) malloc(max_type_pairs * sizeof(type_pair_t));
03097 } else {
03098 pairs = (type_pair_t *) realloc(pairs,max_type_pairs * sizeof(type_pair_t));
03099 }
03100 }
03101
03102
03103
03104 BUMP_TY_COUNTER(c_TY_f90_POINTER) ;
03105
03106 sprintf ( buf, ".anon_f90pointer.%d",++pair_typenum);
03107
03108 t_idx = cwh_types_new_TY ( TRUE, Pointer_Size);
03109 TY& t = Ty_Table[t_idx];
03110 TY_Init(t, Pointer_Size, KIND_POINTER, Pointer_Mtype, Save_Str (buf));
03111 Set_TY_pointed(t, ty);
03112 Set_TY_is_f90_pointer(t);
03113
03114 t_idx = cwh_types_unique_TY(t_idx);
03115
03116 pairs[num_type_pairs-1].ty = ty;
03117 pairs[num_type_pairs-1].f90_pointed = t_idx;
03118
03119
03120
03121
03122 if (!made_real_types && MTYPE_is_complex(TY_mtype(ty))) {
03123
03124 made_real_types = TRUE;
03125 (void) cwh_types_mk_f90_pointer_ty (Be_Type_Tbl(MTYPE_F4));
03126 (void) cwh_types_mk_f90_pointer_ty (Be_Type_Tbl(MTYPE_F8));
03127 (void) cwh_types_mk_f90_pointer_ty (Be_Type_Tbl(MTYPE_FQ));
03128 }
03129
03130
03131 if (!made_unsigned_types && MTYPE_is_m(TY_mtype(ty))) {
03132 made_unsigned_types = TRUE;
03133 (void) cwh_types_mk_f90_pointer_ty (Be_Type_Tbl(MTYPE_U8));
03134 (void) cwh_types_mk_f90_pointer_ty (Be_Type_Tbl(MTYPE_U4));
03135 (void) cwh_types_mk_f90_pointer_ty (Be_Type_Tbl(MTYPE_U1));
03136 }
03137
03138 return t_idx;
03139 }
03140
03141
03142
03143
03144
03145
03146
03147
03148
03149
03150 static TY_IDX
03151 cwh_types_new_TY(BOOL global, INT32 align)
03152 {
03153 TY_IDX idx;
03154
03155 TY& ty = New_TY(idx);
03156
03157 Set_TY_align(idx,align);
03158
03159 Last_TY_Created = idx;
03160
03161 return idx ;
03162 }
03163
03164
03165
03166
03167
03168
03169
03170
03171
03172
03173
03174
03175
03176
03177
03178
03179
03180 TY_IDX
03181 cwh_types_unique_TY(TY_IDX ty_idx)
03182 {
03183 TY_IDX new_ty_idx;
03184
03185 new_ty_idx = TY_is_unique(ty_idx);
03186
03187 if (new_ty_idx != ty_idx) {
03188 if (ty_idx == Last_TY_Created) {
03189 Ty_tab.Delete_last();
03190 Last_TY_Created-- ;
03191 }
03192
03193 }
03194 return new_ty_idx;
03195 }
03196
03197 TY_IDX
03198 cwh_types_make_pointer_type(TY_IDX ty, BOOL f90_pointer)
03199 {
03200 if (f90_pointer) {
03201 return Make_F90_Pointer_Type (ty);
03202 } else {
03203 return Make_Pointer_Type (ty);
03204 }
03205 }
03206
03207
03208
03209
03210
03211
03212
03213
03214
03215 static ST *
03216 cwh_types_make_bounds_ST(void)
03217 {
03218 ST * st;
03219
03220 TY_IDX bnd_ty = Be_Type_Tbl(cwh_bound_int_typeid);
03221
03222 st = cwh_stab_temp_ST(bnd_ty,"bnd") ;
03223 return st;
03224 }
03225
03226
03227
03228
03229
03230
03231
03232
03233
03234
03235
03236 extern void
03237 cwh_types_copyin_pragma(ST *st)
03238 {
03239 WN *pragma;
03240
03241 #if 0
03242 if (enable_mp_processing || process_cri_mp_pragmas) {
03243 #endif
03244 if (ST_sym_class(st) == CLASS_VAR &&
03245 !ST_auxst_xpragma_copyin(st)) {
03246
03247 pragma = WN_CreateXpragma ( WN_PRAGMA_COPYIN_BOUND, (ST_IDX) NULL, 1 );
03248 WN_kid0(pragma) = cwh_addr_load_ST(st,0,0);
03249 cwh_block_append_given_id(pragma,Preamble_Block,FALSE);
03250 Set_ST_auxst_xpragma_copyin(st,TRUE);
03251 }
03252 #if 0
03253 }
03254 #endif
03255 }
03256