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
00076 #ifdef _KEEP_RCS_ID
00077
00078 static char *rcs_id = "$Source: /depot/CVSROOT/javi/src/sw/cmplr/be/whirl2f/init2f.cxx,v $ $Revision: 1.1 $";
00079 #endif
00080
00081 #include "whirl2f_common.h"
00082 #include "PUinfo.h"
00083 #include "st2f.h"
00084 #include "wn2f.h"
00085 #include "ty2f.h"
00086 #include "tcon2f.h"
00087 #include "init2f.h"
00088
00089
00090
00091
00092
00093
00094
00095
00096 extern TOKEN_BUFFER Data_Stmt_Tokens;
00097
00098
00099
00100
00101
00102
00103 #define OFFSET_IS_IN_FLD(fld, ofst) \
00104 (FLD_ofst(fld) == ofst || \
00105 (ofst > FLD_ofst(fld) && (ofst - FLD_ofst(fld) < TY_size(FLD_type(fld)))))
00106
00107
00108 static void
00109 Set_Tcon_Value(TCON *tcon, MTYPE mtype, INT typesize, char *bytes)
00110 {
00111 typedef struct Tcon_Value
00112 {
00113 union
00114 {
00115 INT8 i1;
00116 UINT8 u1;
00117 INT16 i2;
00118 UINT16 u2;
00119 INT32 i4;
00120 UINT32 u4;
00121 INT64 i8;
00122 UINT64 u8;
00123 float f[2];
00124 double d[2];
00125 QUAD_TYPE q;
00126 } val1;
00127 union
00128 {
00129 float f;
00130 double d;
00131 QUAD_TYPE q;
00132 } val2;
00133 } TCON_VALUE;
00134
00135 union
00136 {
00137 char byte[sizeof(TCON_VALUE)];
00138 TCON_VALUE val;
00139 } rep;
00140 INT i;
00141
00142 INT k = 0 ;
00143
00144 if (typesize < 4)
00145 k = 4 - typesize;
00146
00147 for (i = 0; i < typesize ; i++)
00148 rep.byte[i+k] = bytes[i];
00149
00150 switch (mtype)
00151 {
00152 case MTYPE_I1:
00153 rep.val.val1.i1 = ( rep.val.val1.i1 << 24) >> 24 ;
00154 *tcon = Host_To_Targ(mtype, rep.val.val1.i1);
00155 break;
00156
00157 case MTYPE_I2:
00158 rep.val.val1.i2 = ( rep.val.val1.i2 << 16) >> 16 ;
00159 *tcon = Host_To_Targ(mtype, rep.val.val1.i2);
00160 break;
00161
00162 case MTYPE_I4:
00163 *tcon = Host_To_Targ(mtype, rep.val.val1.i4);
00164 break;
00165
00166 case MTYPE_I8:
00167 *tcon = Host_To_Targ(mtype, rep.val.val1.i8);
00168 break;
00169
00170 case MTYPE_U1:
00171 *tcon = Host_To_Targ(mtype, rep.val.val1.u1);
00172 break;
00173
00174 case MTYPE_U2:
00175 *tcon = Host_To_Targ(mtype, rep.val.val1.u2);
00176 break;
00177
00178 case MTYPE_U4:
00179 *tcon = Host_To_Targ(mtype, rep.val.val1.u4);
00180 break;
00181
00182 case MTYPE_U8:
00183 *tcon = Host_To_Targ(mtype, rep.val.val1.u8);
00184 break;
00185
00186 case MTYPE_F4:
00187
00188
00189 *tcon = Host_To_Targ_Float(mtype, rep.val.val1.f[0]);
00190 break;
00191
00192 case MTYPE_F8:
00193 *tcon = Host_To_Targ_Float(mtype, rep.val.val1.d[0]);
00194 break;
00195
00196 case MTYPE_FQ:
00197 *tcon = Host_To_Targ_Quad(rep.val.val1.q);
00198 break;
00199
00200 case MTYPE_C4:
00201 *tcon = Host_To_Targ_Complex_4 (mtype,rep.val.val1.f[0],rep.val.val1.f[1]);
00202 break;
00203
00204 case MTYPE_C8:
00205 *tcon = Host_To_Targ_Complex (mtype,rep.val.val1.d[0],rep.val.val1.d[1]);
00206 break;
00207
00208 case MTYPE_CQ:
00209 *tcon = Host_To_Targ_Complex_Quad (rep.val.val1.q,rep.val.val2.q);
00210 break;
00211
00212 default:
00213 ASSERT_DBG_FATAL(FALSE,
00214 (DIAG_W2F_UNEXPECTED_TYPE_KIND,
00215 mtype, "Set_Tcon_Value"));
00216 break;
00217 }
00218 }
00219
00220
00221 static void
00222 INIT2F_Prepend_Equivalence(TOKEN_BUFFER tokens,
00223 TOKEN_BUFFER name1_tokens,
00224 UINT tmpvar_idx)
00225 {
00226
00227
00228
00229
00230 Prepend_F77_Indented_Newline(tokens, 1, NULL);
00231 Prepend_Token_Special(tokens, ')');
00232 Prepend_Token_String(tokens, W2CF_Symtab_Nameof_Tempvar(tmpvar_idx));
00233 Prepend_Token_Special(tokens, ',');
00234 Prepend_And_Copy_Token_List(tokens, name1_tokens);
00235 Prepend_Token_Special(tokens, '(');
00236 Prepend_Token_String(tokens, "EQUIVALENCE");
00237 }
00238
00239
00240 static void
00241 INIT2F_Append_Initializer(TOKEN_BUFFER tokens,
00242 TOKEN_BUFFER *init_tokens,
00243 INT repeat)
00244 {
00245
00246
00247
00248
00249 if (repeat > 1)
00250 {
00251 Prepend_Token_Special(*init_tokens, '*');
00252 Prepend_Token_String(*init_tokens, Number_as_String(repeat, "%llu"));
00253 }
00254 if (!Is_Empty_Token_Buffer(tokens))
00255 Append_Token_Special(tokens, ',');
00256 Append_And_Reclaim_Token_List(tokens, init_tokens);
00257 }
00258
00259 static UINT16
00260 INIT2F_choose_repeat(const INITV& initv)
00261 {
00262 UINT16 rep = 0 ;
00263
00264 switch(INITV_kind(initv))
00265 {
00266 case INITVKIND_ZERO:
00267 case INITVKIND_ONE:
00268 case INITVKIND_VAL:
00269 rep = INITV_repeat2(initv);
00270 break;
00271
00272 default:
00273 rep = INITV_repeat1(initv);
00274 break;
00275 }
00276
00277 return rep ;
00278 }
00279
00280 static void
00281 INIT2F_Next_Initv(const INITV& initv,
00282 UINT *initv_idx,
00283 UINT *initv_times)
00284 {
00285
00286
00287
00288
00289
00290 if (*initv_times+1 < INIT2F_choose_repeat(initv))
00291 {
00292 (*initv_times)++;
00293 }
00294 else
00295 {
00296 *initv_times = 0;
00297 (*initv_idx)++;
00298 }
00299 }
00300
00301 static void
00302 INIT2F_Skip_Padding(INITV_IDX *initv_array,
00303 TY_IDX object_ty,
00304 STAB_OFFSET *ofst,
00305 UINT *initv_idx)
00306 {
00307
00308
00309
00310
00311 INITV_IDX initv;
00312
00313 for (initv = initv_array[*initv_idx];
00314 (*ofst < TY_size(object_ty) &&
00315 initv != (INITV_IDX) 0 &&
00316 INITV_kind(Initv_Table[initv]) == INITVKIND_PAD);
00317 initv = initv_array[++(*initv_idx)])
00318 {
00319 *ofst += INITV_pad(Initv_Table[initv])*INIT2F_choose_repeat(Initv_Table[initv]);
00320 }
00321 if (*ofst < TY_size(object_ty) && initv == (INITV_IDX) 0)
00322 *ofst = TY_size(object_ty);
00323 }
00324
00325 static UINT
00326 INIT2F_Number_Of_Initvs(INITV_IDX initv)
00327 {
00328 UINT count = 0;
00329 UINT64 rep;
00330
00331 while (initv != 0)
00332 {
00333 INITV& ini = Initv_Table[initv];
00334
00335 if (INITV_kind(ini) == INITVKIND_BLOCK)
00336 {
00337 for (rep = 1; rep <= INIT2F_choose_repeat(ini) ; rep++)
00338 count += INIT2F_Number_Of_Initvs(INITV_blk(ini));
00339 }
00340 else
00341 count += 1;
00342
00343 initv = INITV_next(initv);
00344 }
00345 return count;
00346 }
00347
00348 static void
00349 INIT2F_Collect_Initvs(INITV_IDX *initv_array, UINT *initv_idx, INITV_IDX initv)
00350 {
00351 UINT64 rep;
00352
00353 while (initv != (INITV_IDX) 0)
00354 {
00355 if (INITV_kind(Initv_Table[initv]) == INITVKIND_BLOCK)
00356 for (rep = 1; rep <= INIT2F_choose_repeat(Initv_Table[initv]); rep++)
00357 INIT2F_Collect_Initvs(initv_array, initv_idx, INITV_blk(Initv_Table[initv]));
00358 else
00359 initv_array[(*initv_idx)++] = initv;
00360
00361 initv = INITV_next(initv);
00362 }
00363 }
00364
00365 static INITV_IDX *
00366 INIT2F_Get_Initv_Array(ST *st, INITO_IDX first_inito)
00367 {
00368
00369
00370
00371
00372
00373
00374 UINT number_of_initvs = 1;
00375 INITV_IDX *initv_array;
00376 UINT i ;
00377
00378
00379
00380 INITO *ini = &Inito_Table[first_inito] ;
00381
00382 FOREACH_INITO(ST_level(st),ini,i)
00383 {
00384 if (INITO_st(ini) == st)
00385 number_of_initvs += INIT2F_Number_Of_Initvs(INITO_val(*ini));
00386 }
00387
00388
00389
00390 initv_array = TYPE_ALLOC_N(INITV_IDX, number_of_initvs);
00391 initv_array[number_of_initvs-1] = (INITV_IDX) 0;
00392 number_of_initvs = 0;
00393
00394 ini = &Inito_Table[first_inito] ;
00395
00396 FOREACH_INITO(ST_level(st),ini,i)
00397 {
00398 if (INITO_st(ini) == st)
00399 INIT2F_Collect_Initvs(initv_array, &number_of_initvs, INITO_val(*ini));
00400 }
00401 return initv_array;
00402
00403 }
00404
00405
00406
00407
00408 static TY_IDX
00409 INITVKIND_ty(INITV_IDX initv_idx)
00410 {
00411
00412
00413 INITV& initv = Initv_Table[initv_idx] ;
00414 TY_IDX initv_ty;
00415
00416 switch (INITV_kind(initv))
00417 {
00418 case INITVKIND_VAL:
00419 if (TCON_ty(INITV_tc_val(initv)) == MTYPE_STRING)
00420 {
00421 initv_ty = Stab_Array_Of(Stab_Mtype_To_Ty(MTYPE_U1),
00422 Targ_String_Length(INITV_tc_val(initv)));
00423 Set_TY_is_character(Ty_Table[initv_ty]);
00424 }
00425 else
00426 initv_ty = Stab_Mtype_To_Ty(TCON_ty(INITV_tc_val(initv)));
00427 break;
00428
00429 case INITVKIND_SYMOFF:
00430
00431
00432
00433
00434 if (TY_Is_Structured(ST_type(INITV_st(initv))))
00435 initv_ty = Stab_Pointer_To(Void_Type);
00436 else
00437 initv_ty = Stab_Pointer_To(ST_type(INITV_st(initv)));
00438 break;
00439
00440 case INITVKIND_ZERO:
00441 case INITVKIND_ONE:
00442 initv_ty = Be_Type_Tbl(INITV_mtype(initv));
00443 break;
00444
00445 default:
00446 ASSERT_DBG_FATAL(FALSE,
00447 (DIAG_W2F_UNEXPECTED_INITV,
00448 INITV_kind(initv), "INITVKIND_ty"));
00449
00450 }
00451
00452 return initv_ty;
00453
00454 }
00455
00456 static void
00457 INITVKIND_symoff(TOKEN_BUFFER tokens,
00458 INT repeat,
00459 ST *st,
00460 STAB_OFFSET ofst,
00461 TY_IDX object_ty)
00462 {
00463 WN2F_CONTEXT context = INIT_WN2F_CONTEXT;
00464 TOKEN_BUFFER symref_tokens = New_Token_Buffer();
00465
00466 WN2F_Offset_Symref(symref_tokens,
00467 st,
00468 Stab_Pointer_To(ST_type(st)),
00469 object_ty,
00470 ofst,
00471 context);
00472 WN2F_Address_Of(symref_tokens);
00473 INIT2F_Append_Initializer(tokens, &symref_tokens, repeat);
00474 }
00475
00476 static void
00477 INITVKIND_val(TOKEN_BUFFER tokens,
00478 INT repeat,
00479 TCON *tcon,
00480 TY_IDX object_ty)
00481 {
00482
00483
00484
00485 TOKEN_BUFFER val_tokens = New_Token_Buffer();
00486
00487 if (TCON_ty(*tcon) == MTYPE_STRING &&
00488 !TY_Is_Array(object_ty) && !TY_Is_String(object_ty))
00489 {
00490
00491
00492 if (TY_Is_Scalar(object_ty))
00493 {
00494 char *strbase = Targ_String_Address(*tcon);
00495 INT strlen = Targ_String_Length(*tcon);
00496 INT stridx;
00497 INT repeatcount = 0;
00498 TCON t;
00499 char *valp = (TY_Is_Complex(object_ty)?
00500 (char *)&t.cmplxval :
00501 (char *)&t.vals);
00502
00503 while (repeatcount++ < repeat)
00504 {
00505 stridx = 0;
00506 while (stridx < strlen)
00507 {
00508 Set_Tcon_Value(&t,
00509 TY_mtype(object_ty),
00510 TY_size(object_ty),
00511 &strbase[stridx]);
00512 TCON2F_translate(val_tokens, t, TY_is_logical(Ty_Table[object_ty]));
00513 stridx += TY_size(object_ty);
00514 if (stridx < strlen)
00515 Append_Token_Special(val_tokens, ',');
00516
00517 }
00518 }
00519 }
00520 }
00521 else
00522 {
00523
00524
00525 TCON2F_translate(val_tokens, *tcon, TY_is_logical(Ty_Table[object_ty]));
00526 }
00527 INIT2F_Append_Initializer(tokens, &val_tokens, repeat);
00528 }
00529
00530
00531
00532
00533 static const char * one_consts[6] = { "1", ".TRUE.", "1_1", "1_2" , "1_4", "1_8"} ;
00534 static const char * zero_consts[6] = { "0", ".FALSE.","0_1", "0_2" , "0_4", "0_8"} ;
00535
00536 static void
00537 INITVKIND_const(TOKEN_BUFFER tokens,
00538 INT repeat,
00539 const char** tbl,
00540 TY_IDX ty)
00541 {
00542 const char *p = tbl[0];
00543
00544 TOKEN_BUFFER val_tokens = New_Token_Buffer();
00545
00546 if (TY_is_logical(Ty_Table[ty]))
00547 p = tbl[1];
00548 else {
00549
00550 if (WN2F_F90_pu) {
00551 switch (TY_mtype(ty)) {
00552 case MTYPE_I1: p = tbl[2]; break;
00553 case MTYPE_I2: p = tbl[3]; break;
00554 case MTYPE_I4: p = tbl[4]; break;
00555 case MTYPE_I8: p = tbl[5]; break;
00556 }
00557 }
00558 }
00559 Append_Token_String(val_tokens,p);
00560 INIT2F_Append_Initializer(tokens, &val_tokens, repeat);
00561 }
00562
00563
00564 static void
00565 INITVKIND_translate(TOKEN_BUFFER tokens,
00566 INITV_IDX initv_idx,
00567 TY_IDX object_ty,
00568 UINT repeat)
00569 {
00570 INITV& initv = Initv_Table[initv_idx];
00571
00572 switch (INITV_kind(initv))
00573 {
00574 case INITVKIND_SYMOFF:
00575 INITVKIND_symoff(tokens,
00576 repeat,
00577 &St_Table[INITV_st(initv)],
00578 INITV_ofst(initv),
00579 object_ty);
00580 break;
00581
00582 case INITVKIND_VAL:
00583 INITVKIND_val(tokens, repeat, &Tcon_Table[INITV_tc(initv)], object_ty);
00584 break;
00585
00586 case INITVKIND_ONE:
00587 INITVKIND_const(tokens, repeat, one_consts, object_ty);
00588 break;
00589
00590 case INITVKIND_ZERO:
00591 INITVKIND_const(tokens, repeat, zero_consts, object_ty);
00592 break;
00593
00594 default:
00595 ASSERT_DBG_WARN(FALSE, (DIAG_W2F_UNEXPECTED_INITV,
00596 INITV_kind(initv), "INITV2F_ptr_or_scalar"));
00597 break;
00598 }
00599 }
00600
00601
00602
00603
00604 static void
00605 INIT2F_Translate_Char_Ref(TOKEN_BUFFER tokens,
00606 ST *base_object,
00607 TY_IDX array_etype,
00608 STAB_OFFSET base_ofst,
00609 STAB_OFFSET array_ofst,
00610 STAB_OFFSET string_ofst,
00611 UINT string_size,
00612 WN2F_CONTEXT context)
00613 {
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623 WN2F_Offset_Symref(tokens,
00624 base_object,
00625 Stab_Pointer_To(ST_type(base_object)),
00626 array_etype,
00627 base_ofst + array_ofst,
00628 context);
00629
00630
00631 if (string_size != TY_size(array_etype))
00632 {
00633 Append_Token_Special(tokens, '(');
00634 Append_Token_String(tokens,
00635 Number_as_String(string_ofst+1, "%llu"));
00636 Append_Token_Special(tokens, ':');
00637 Append_Token_String(tokens,
00638 Number_as_String(string_ofst+string_size, "%llu"));
00639 Append_Token_Special(tokens, ')');
00640 }
00641 }
00642
00643
00644
00645
00646
00647 typedef struct Array_Segment
00648 {
00649 INITV_IDX *initv_array;
00650 BOOL missing_padding;
00651 UINT num_initvs;
00652 UINT first_idx;
00653 UINT last_idx;
00654 UINT first_repeat;
00655 UINT last_repeat;
00656 STAB_OFFSET start_ofst;
00657 STAB_OFFSET end_ofst;
00658 TY_IDX atype;
00659 TY_IDX etype;
00660 } ARRAY_SEGMENT;
00661
00662
00663 static BOOL
00664 INIT2F_is_string_initv(INITV& ini, TY_IDX ty)
00665 {
00666 BOOL res = FALSE;
00667
00668 if (INITV_kind(ini) == INITVKIND_VAL)
00669 {
00670 res = (TCON_ty(INITV_tc_val(ini)) == MTYPE_STRING &&
00671 TY_size(ty) > 0 &&
00672 TY_size(ty) < Targ_String_Length(INITV_tc_val(ini))) ;
00673
00674 }
00675 return res ;
00676 }
00677
00678 static ARRAY_SEGMENT
00679 INIT2F_Get_Array_Segment(INITV_IDX *initv_array,
00680 UINT *initv_idx,
00681 UINT *initv_times,
00682 TY_IDX object_type,
00683 STAB_OFFSET *object_ofst)
00684 {
00685
00686
00687
00688
00689
00690
00691
00692 const UINT first_already_repeated = *initv_times;
00693 STAB_OFFSET max_ofst;
00694 ARRAY_SEGMENT aseg;
00695 INITV_IDX initv;
00696
00697
00698 aseg.initv_array = initv_array;
00699 aseg.num_initvs = 0;
00700 aseg.first_idx = *initv_idx;
00701 aseg.last_idx = aseg.first_idx;
00702 aseg.start_ofst = *object_ofst;
00703 aseg.atype = object_type;
00704 aseg.etype = TY_AR_etype(object_type);
00705
00706
00707
00708
00709
00710
00711
00712 initv = initv_array[aseg.first_idx];
00713 max_ofst = TY_size(object_type);
00714 while (max_ofst > *object_ofst &&
00715 initv != (INITV_IDX) 0
00716 && INITV_kind(Initv_Table[initv]) != INITVKIND_PAD)
00717 {
00718
00719 INITV& ini = Initv_Table[initv];
00720 aseg.num_initvs++;
00721 aseg.last_idx = *initv_idx;
00722 aseg.last_repeat = *initv_times+1;
00723
00724 if (INIT2F_is_string_initv(ini,aseg.etype))
00725 {
00726
00727
00728 if (!WN2F_F90_pu)
00729 {
00730 ASSERT_DBG_WARN(FALSE,
00731 (DIAG_W2F_UNEXPECTED_INITV,
00732 TCON_ty(INITV_tc_val(ini)),
00733 "[character string exceeds size of element type] "
00734 "INIT2F_Get_Array_Segment"));
00735 }
00736 *object_ofst += Targ_String_Length(INITV_tc_val(ini));
00737 }
00738 else if (TY_is_character(Ty_Table[aseg.etype]) &&
00739 TCON_ty(INITV_tc_val(ini)) == MTYPE_STRING)
00740 {
00741 *object_ofst += Targ_String_Length(INITV_tc_val(ini));
00742 }
00743 else
00744 *object_ofst += TY_size(aseg.etype);
00745
00746
00747
00748
00749 INIT2F_Next_Initv(ini, initv_idx, initv_times);
00750 initv = initv_array[*initv_idx];
00751 }
00752
00753 if (max_ofst > *object_ofst && initv == (INITV_IDX) 0)
00754 {
00755 aseg.missing_padding = TRUE;
00756 ASSERT_DBG_WARN(FALSE,
00757 (DIAG_W2F_UNEXPEXTED_NULL_PTR,
00758 "initv (missing padding for object initializer?)",
00759 "INIT2F_Get_Array_Segment"));
00760 }
00761 else
00762 aseg.missing_padding = FALSE;
00763
00764
00765
00766
00767
00768
00769 aseg.end_ofst = *object_ofst;
00770 if (aseg.last_idx > aseg.first_idx)
00771 {
00772 aseg.first_repeat =
00773 INIT2F_choose_repeat(Initv_Table[initv_array[aseg.first_idx]]) - first_already_repeated;
00774 }
00775 else
00776 {
00777 aseg.first_repeat = aseg.last_repeat - first_already_repeated;
00778 aseg.last_repeat = aseg.first_repeat;
00779 }
00780
00781 return aseg;
00782 }
00783
00784 static void
00785 INIT2F_Translate_Array_Value(TOKEN_BUFFER tokens,
00786 const ARRAY_SEGMENT *aseg)
00787 {
00788 UINT initv_idx, repeat;
00789 INITV_IDX initv;
00790
00791 for (initv_idx = aseg->first_idx; initv_idx <= aseg->last_idx; initv_idx++)
00792 {
00793
00794 initv = aseg->initv_array[initv_idx];
00795 if (initv_idx == aseg->first_idx)
00796 repeat = aseg->first_repeat;
00797 else if (initv_idx == aseg->last_idx)
00798 repeat = aseg->last_repeat;
00799 else
00800 repeat = INIT2F_choose_repeat(Initv_Table[initv]);
00801
00802
00803 INITVKIND_translate(tokens, initv, aseg->etype, repeat);
00804 }
00805 }
00806
00807 static void
00808 INIT2F_Implied_DoLoop(TOKEN_BUFFER tokens,
00809 TOKEN_BUFFER *abase_tokens,
00810 const ARRAY_SEGMENT *aseg)
00811 {
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824 const UINT current_indent = Current_Indentation();
00825 TOKEN_BUFFER aref_tokens;
00826 UINT ivar_idx, avar_idx;
00827 const char *ivar_name;
00828 TY_IDX atype;
00829
00830
00831 ivar_idx = Stab_Lock_Tmpvar(Stab_Mtype_To_Ty(MTYPE_I8),
00832 &ST2F_Declare_Tempvar);
00833
00834
00835 aref_tokens = New_Token_Buffer();
00836 if (TY_AR_ndims(aseg->atype) > 1)
00837 {
00838
00839
00840
00841 atype = Stab_Array_Of(aseg->etype,
00842 TY_size(aseg->atype)/TY_size(aseg->etype));
00843 avar_idx = Stab_Lock_Tmpvar(atype, &ST2F_Declare_Tempvar);
00844 Set_Current_Indentation(PUinfo_local_decls_indent);
00845 INIT2F_Prepend_Equivalence(Data_Stmt_Tokens, *abase_tokens, avar_idx);
00846 Reclaim_Token_Buffer(abase_tokens);
00847 Set_Current_Indentation(current_indent);
00848
00849 Append_Token_String(aref_tokens, W2CF_Symtab_Nameof_Tempvar(avar_idx));
00850 Stab_Unlock_Tmpvar(avar_idx);
00851 }
00852 else
00853 {
00854 Append_And_Reclaim_Token_List(aref_tokens, abase_tokens);
00855 }
00856
00857
00858 ivar_name = W2CF_Symtab_Nameof_Tempvar(ivar_idx);
00859 Append_Token_Special(tokens, '(');
00860 Append_And_Reclaim_Token_List(tokens, &aref_tokens);
00861 Append_Token_Special(tokens, '(');
00862 Append_Token_String(tokens, ivar_name);
00863 Append_Token_Special(tokens, ')');
00864
00865 Append_Token_Special(tokens, ',');
00866 Append_Token_String(tokens, ivar_name);
00867 Append_Token_Special(tokens, '=');
00868 Append_Token_String(tokens,
00869 Number_as_String(aseg->start_ofst/TY_size(aseg->etype) + 1,
00870 "%llu"));
00871 Append_Token_Special(tokens, ',');
00872 Append_Token_String(tokens,
00873 Number_as_String(aseg->end_ofst/TY_size(aseg->etype),
00874 "%llu"));
00875 Append_Token_Special(tokens, ',');
00876 Append_Token_String(tokens, Number_as_String(1, "%llu"));
00877 Append_Token_Special(tokens, ')');
00878
00879 Stab_Unlock_Tmpvar(ivar_idx);
00880 }
00881
00882 static void
00883 INIT2F_Translate_Array_Ref(TOKEN_BUFFER tokens,
00884 ST *base_object,
00885 STAB_OFFSET base_ofst,
00886 const ARRAY_SEGMENT *aseg)
00887 {
00888
00889
00890
00891
00892
00893
00894
00895 const STAB_OFFSET esize = TY_size(aseg->etype);
00896 STAB_OFFSET ofst;
00897 WN2F_CONTEXT context = INIT_WN2F_CONTEXT;
00898 TOKEN_BUFFER abase_tokens, aref_tokens;
00899 UINT first_idx = aseg->first_idx;
00900 INITV_IDX first_initv = aseg->initv_array[first_idx];
00901
00902
00903 if (aseg->num_initvs == 1 &&
00904 INIT2F_is_string_initv(Initv_Table[first_initv],aseg->etype))
00905 {
00906
00907
00908 abase_tokens = New_Token_Buffer();
00909 WN2F_Offset_Symref(abase_tokens,
00910 base_object,
00911 Stab_Pointer_To(ST_type(base_object)),
00912 aseg->atype,
00913 base_ofst,
00914 context);
00915
00916 aref_tokens = New_Token_Buffer();
00917 INIT2F_Implied_DoLoop(aref_tokens,
00918 &abase_tokens,
00919 aseg);
00920 INIT2F_Append_Initializer(tokens, &aref_tokens, 1);
00921 }
00922 else if (aseg->start_ofst % TY_size(aseg->etype) != 0 ||
00923 aseg->end_ofst % TY_size(aseg->etype) != 0 ||
00924 (!aseg->missing_padding &&
00925 aseg->num_initvs !=
00926 (aseg->end_ofst - aseg->start_ofst)/TY_size(aseg->etype)))
00927 {
00928
00929
00930
00931
00932 UINT initc, substring_size;
00933 UINT initv_idx = first_idx;
00934 INITV_IDX ini_idx = first_initv;
00935 UINT initv_repeat = INIT2F_choose_repeat(Initv_Table[ini_idx]) - aseg->first_repeat;
00936
00937 ofst = aseg->start_ofst;
00938 for (initc = 1; initc <= aseg->num_initvs; initc++)
00939 {
00940 INITV& initv = Initv_Table[ini_idx];
00941 substring_size = Targ_String_Length(INITV_tc_val(initv));
00942 aref_tokens = New_Token_Buffer();
00943 INIT2F_Translate_Char_Ref(aref_tokens,
00944 base_object,
00945 aseg->etype,
00946 base_ofst,
00947 (ofst/esize)*esize,
00948 ofst%esize,
00949 substring_size,
00950 context);
00951 INIT2F_Append_Initializer(tokens, &aref_tokens, 1);
00952 if (initc < aseg->num_initvs) {
00953 INIT2F_Next_Initv(initv, &initv_idx, &initv_repeat);
00954 ini_idx = aseg->initv_array[initv_idx];
00955 }
00956 ofst += substring_size;
00957 }
00958 }
00959 else
00960 {
00961
00962 abase_tokens = New_Token_Buffer();
00963 WN2F_Offset_Symref(abase_tokens,
00964 base_object,
00965 Stab_Pointer_To(ST_type(base_object)),
00966 aseg->atype,
00967 base_ofst,
00968 context);
00969
00970
00971
00972 if (aseg->num_initvs*TY_size(aseg->etype) == TY_size(aseg->atype))
00973 {
00974
00975 INIT2F_Append_Initializer(tokens, &abase_tokens, 1);
00976 }
00977 else if (aseg->num_initvs > 4)
00978 {
00979
00980 aref_tokens = New_Token_Buffer();
00981 INIT2F_Implied_DoLoop(aref_tokens,
00982 &abase_tokens,
00983 aseg);
00984 INIT2F_Append_Initializer(tokens, &aref_tokens, 1);
00985 }
00986 else if (aseg->num_initvs > 0)
00987 {
00988 INT elt;
00989
00990
00991 ofst = aseg->start_ofst;
00992 for (elt = 0; elt < aseg->num_initvs; elt++)
00993 {
00994 aref_tokens = New_Token_Buffer();
00995 Append_And_Copy_Token_List(aref_tokens, abase_tokens);
00996 TY2F_Translate_ArrayElt(aref_tokens, aseg->atype, ofst);
00997 INIT2F_Append_Initializer(tokens, &aref_tokens, 1);
00998 ofst += TY_size(aseg->etype);
00999 }
01000 Reclaim_Token_Buffer(&abase_tokens);
01001 }
01002 }
01003 }
01004
01005
01006
01007
01008 static void
01009 INIT2F_translate(TOKEN_BUFFER lhs_tokens,
01010 TOKEN_BUFFER rhs_tokens,
01011 ST *base_object,
01012 STAB_OFFSET base_ofst,
01013 STAB_OFFSET *object_ofst,
01014 TY_IDX object_ty,
01015 INITV_IDX *initv_array,
01016 UINT *initv_idx,
01017 UINT *initv_times);
01018
01019 static void
01020 INIT2F_ptr_or_scalar(TOKEN_BUFFER lhs_tokens,
01021 TOKEN_BUFFER rhs_tokens,
01022 ST *base_object,
01023 STAB_OFFSET base_ofst,
01024 STAB_OFFSET *object_ofst,
01025 TY_IDX object_ty,
01026 INITV_IDX *initv_array,
01027 UINT *initv_idx,
01028 UINT *initv_times)
01029 {
01030
01031
01032
01033
01034 INITV& initv = Initv_Table[initv_array[*initv_idx]];
01035 WN2F_CONTEXT context = INIT_WN2F_CONTEXT;
01036 TOKEN_BUFFER sym_tokens;
01037
01038 ASSERT_DBG_WARN(*object_ofst == 0,
01039 (DIAG_W2F_UNEXPEXTED_OFFSET,
01040 *object_ofst, "INITV2F_ptr_or_scalar"));
01041
01042
01043 INITVKIND_translate(rhs_tokens,
01044 initv_array[*initv_idx],
01045 object_ty,
01046 1) ;
01047
01048 INIT2F_Next_Initv(initv, initv_idx, initv_times);
01049
01050
01051 sym_tokens = New_Token_Buffer();
01052 WN2F_Offset_Symref(sym_tokens,
01053 base_object,
01054 Stab_Pointer_To(ST_type(base_object)),
01055 object_ty,
01056 base_ofst,
01057 context);
01058 INIT2F_Append_Initializer(lhs_tokens, &sym_tokens, 1);
01059
01060
01061 *object_ofst += TY_size(object_ty);
01062
01063 }
01064
01065
01066 static void
01067 INIT2F_array(TOKEN_BUFFER lhs_tokens,
01068 TOKEN_BUFFER rhs_tokens,
01069 ST *base_object,
01070 STAB_OFFSET base_ofst,
01071 STAB_OFFSET *object_ofst,
01072 TY_IDX object_ty,
01073 INITV_IDX *initv_array,
01074 UINT *initv_idx,
01075 UINT *initv_times)
01076 {
01077
01078
01079
01080
01081
01082
01083
01084 ARRAY_SEGMENT a_segment;
01085
01086 ASSERT_DBG_FATAL(TY_Is_Array(object_ty) && !TY_is_character(object_ty),
01087 (DIAG_W2F_UNEXPECTED_TYPE_KIND,
01088 TY_kind(object_ty), "INITV2F_array"));
01089
01090 INIT2F_Skip_Padding(initv_array,
01091 object_ty,
01092 object_ofst,
01093 initv_idx);
01094 while (*object_ofst < TY_size(object_ty))
01095 {
01096
01097
01098
01099
01100 INITV& initv = Initv_Table[initv_array[*initv_idx]];
01101
01102 #if 0
01103 ASSERT_DBG_FATAL(!(TY_Is_Array_Of_Chars(object_ty) &&
01104 INITV_kind(initv) == INITVKIND_VAL &&
01105 TCON_ty(INITV_tc_val(initv)) == MTYPE_STRING),
01106 (DIAG_W2F_UNEXPECTED_INITV,
01107 INITV_kind(initv), "INITV2F_array"));
01108 #endif
01109
01110
01111
01112 a_segment =
01113 INIT2F_Get_Array_Segment(initv_array,
01114 initv_idx,
01115 initv_times,
01116 object_ty,
01117 object_ofst);
01118
01119
01120
01121 INIT2F_Translate_Array_Value(rhs_tokens, &a_segment);
01122
01123
01124
01125 INIT2F_Translate_Array_Ref(lhs_tokens,
01126 base_object,
01127 base_ofst,
01128 &a_segment);
01129
01130
01131
01132 INIT2F_Skip_Padding(initv_array,
01133 object_ty,
01134 object_ofst,
01135 initv_idx);
01136
01137
01138
01139
01140 }
01141
01142 }
01143
01144 static void
01145 INIT2F_substring(TOKEN_BUFFER lhs_tokens,
01146 TOKEN_BUFFER rhs_tokens,
01147 ST *base_object,
01148 STAB_OFFSET base_ofst,
01149 STAB_OFFSET *object_ofst,
01150 TY_IDX object_ty,
01151 INITV_IDX *initv_array,
01152 UINT *initv_idx,
01153 UINT *initv_times)
01154 {
01155
01156
01157
01158
01159
01160 STAB_OFFSET substring_size;
01161 TOKEN_BUFFER substring_tokens;
01162 WN2F_CONTEXT context = INIT_WN2F_CONTEXT;
01163
01164 ASSERT_DBG_FATAL((TY_Is_String(object_ty) ||
01165 TY_Is_Array_Of_Chars(object_ty)),
01166 (DIAG_W2F_UNEXPECTED_TYPE_KIND,
01167 TY_kind(object_ty), "INITV2F_substring"));
01168
01169 INIT2F_Skip_Padding(initv_array,
01170 object_ty,
01171 object_ofst,
01172 initv_idx);
01173
01174 if (*object_ofst < TY_size(object_ty))
01175 {
01176
01177
01178 INITV_IDX initv = initv_array[*initv_idx];
01179 INITV& ini = Initv_Table[initv];
01180
01181 INITVKIND_translate(rhs_tokens, initv, object_ty, 1);
01182
01183
01184
01185 substring_size = Targ_String_Length(INITV_tc_val(ini));
01186 substring_tokens = New_Token_Buffer();
01187 INIT2F_Translate_Char_Ref(substring_tokens,
01188 base_object,
01189 object_ty,
01190 base_ofst,
01191 0,
01192 *object_ofst,
01193 substring_size,
01194 context);
01195 INIT2F_Append_Initializer(lhs_tokens, &substring_tokens, 1);
01196 INIT2F_Next_Initv(ini, initv_idx, initv_times);
01197 *object_ofst += substring_size;
01198 }
01199 }
01200
01201 static void
01202 INIT2F_structured(TOKEN_BUFFER lhs_tokens,
01203 TOKEN_BUFFER rhs_tokens,
01204 ST *base_object,
01205 STAB_OFFSET *object_ofst,
01206 TY_IDX object_ty,
01207 INITV_IDX *initv_array,
01208 UINT *initv_idx,
01209 UINT *initv_times)
01210 {
01211
01212
01213
01214
01215
01216 TY_IDX initv_ty;
01217 STAB_OFFSET fld_ofst;
01218 FLD_PATH_INFO *fpath;
01219
01220 ASSERT_DBG_FATAL(TY_Is_Structured(object_ty),
01221 (DIAG_W2F_UNEXPECTED_TYPE_KIND,
01222 TY_kind(object_ty), "INITV2F_structured"));
01223
01224
01225
01226
01227 INIT2F_Skip_Padding(initv_array, object_ty, object_ofst, initv_idx);
01228 while (*object_ofst < TY_size(object_ty))
01229 {
01230
01231 initv_ty = INITVKIND_ty(initv_array[*initv_idx]);
01232
01233
01234
01235
01236
01237
01238
01239 fpath = TY2F_Get_Fld_Path(object_ty, initv_ty, *object_ofst);
01240 {
01241 FLD_HANDLE fld;
01242
01243 if (fpath == NULL || fpath->fld.Is_Null ())
01244 {
01245
01246
01247
01248
01249 FLD_ITER fld_iter = Make_fld_iter (TY_fld(Ty_Table[object_ty]));
01250
01251 do
01252 {
01253 fld = FLD_HANDLE (fld_iter);
01254 } while (!FLD_last_field (fld_iter++) &&
01255 !OFFSET_IS_IN_FLD(fld, *object_ofst)) ;
01256 } else
01257 fld = fpath->fld;
01258
01259 if (fpath != NULL)
01260 TY2F_Free_Fld_Path(fpath);
01261
01262
01263
01264
01265
01266 fld_ofst = *object_ofst - FLD_ofst(fld);
01267 INIT2F_translate(lhs_tokens,
01268 rhs_tokens,
01269 base_object,
01270 FLD_ofst(fld),
01271 &fld_ofst,
01272 FLD_type(fld),
01273 initv_array,
01274 initv_idx,
01275 initv_times);
01276
01277
01278
01279 *object_ofst = FLD_ofst(fld) + fld_ofst;
01280 INIT2F_Skip_Padding(initv_array,
01281 object_ty,
01282 object_ofst,
01283 initv_idx);
01284 }
01285 }
01286 }
01287
01288 static void
01289 INIT2F_translate(TOKEN_BUFFER lhs_tokens,
01290 TOKEN_BUFFER rhs_tokens,
01291 ST *base_object,
01292 STAB_OFFSET base_ofst,
01293 STAB_OFFSET *object_ofst,
01294 TY_IDX object_ty,
01295 INITV_IDX *initv_array,
01296 UINT *initv_idx,
01297 UINT *initv_times)
01298 {
01299 if (TY_Is_Structured(object_ty))
01300 {
01301 INIT2F_structured(lhs_tokens,
01302 rhs_tokens,
01303 base_object,
01304 object_ofst,
01305 object_ty,
01306 initv_array,
01307 initv_idx,
01308 initv_times);
01309 }
01310 else if (TY_Is_Array(object_ty))
01311 {
01312 if (TY_is_character(Ty_Table[object_ty]))
01313
01314 INIT2F_substring(lhs_tokens,
01315 rhs_tokens,
01316 base_object,
01317 base_ofst,
01318 object_ofst,
01319 object_ty,
01320 initv_array,
01321 initv_idx,
01322 initv_times);
01323 else
01324 INIT2F_array(lhs_tokens,
01325 rhs_tokens,
01326 base_object,
01327 base_ofst,
01328 object_ofst,
01329 object_ty,
01330 initv_array,
01331 initv_idx,
01332 initv_times);
01333 }
01334 else if (TY_Is_Pointer_Or_Scalar(object_ty))
01335 {
01336 INIT2F_ptr_or_scalar(lhs_tokens,
01337 rhs_tokens,
01338 base_object,
01339 base_ofst,
01340 object_ofst,
01341 object_ty,
01342 initv_array,
01343 initv_idx,
01344 initv_times);
01345 }
01346 else
01347 ASSERT_DBG_WARN(FALSE,
01348 (DIAG_W2F_UNEXPECTED_SYMBOL, "INITV2F_translate"));
01349 }
01350
01351
01352
01353
01354
01355 void
01356 INITO2F_translate(TOKEN_BUFFER tokens, INITO_IDX inito)
01357 {
01358
01359
01360
01361
01362
01363 TOKEN_BUFFER lhs_tokens = New_Token_Buffer();
01364 TOKEN_BUFFER rhs_tokens = New_Token_Buffer();
01365 UINT initv_idx = 0;
01366 UINT initv_times = 0;
01367 TY_IDX object_ty = ST_type(INITO_st(inito));
01368 STAB_OFFSET object_ofst = 0;
01369 INITV_IDX *initv_array;
01370
01371 ASSERT_DBG_FATAL(!TY_Is_Structured(object_ty) ||
01372 Stab_Is_Common_Block(INITO_st(inito)) ||
01373 Stab_Is_Equivalence_Block(INITO_st(inito)),
01374 (DIAG_W2F_UNEXPECTED_SYMBOL, "INITO2F_translate"));
01375
01376
01377
01378
01379
01380
01381
01382
01383 initv_array = INIT2F_Get_Initv_Array(INITO_st(inito), inito);
01384
01385
01386
01387
01388
01389 INIT2F_translate(lhs_tokens,
01390 rhs_tokens,
01391 INITO_st(inito),
01392 0,
01393 &object_ofst,
01394 object_ty,
01395 initv_array,
01396 &initv_idx,
01397 &initv_times);
01398
01399
01400
01401 FREE(initv_array);
01402 Append_F77_Indented_Newline(tokens, 1, NULL);
01403 Append_Token_String(tokens, "DATA");
01404 Append_And_Reclaim_Token_List(tokens, &lhs_tokens);
01405 Append_Token_Special(tokens, '/');
01406 Append_And_Reclaim_Token_List(tokens, &rhs_tokens);
01407 Append_Token_Special(tokens, '/');
01408 }