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 static char USMID[] = "\n@(#)5.0_pl/sources/s_rcnstrct.c 5.5 09/29/99 17:38:13\n";
00038
00039 # include "defines.h"
00040
00041 # include "host.m"
00042 # include "host.h"
00043 # include "target.m"
00044 # include "target.h"
00045
00046 # include "globals.m"
00047 # include "tokens.m"
00048 # include "sytb.m"
00049 # include "s_globals.m"
00050 # include "debug.m"
00051 # include "s_asg_expr.m"
00052 # include "s_cnstrct.m"
00053
00054 # include "globals.h"
00055 # include "tokens.h"
00056 # include "sytb.h"
00057 # include "s_globals.h"
00058 # include "s_rcnstrct.h"
00059
00060 # if defined(_HOST_OS_UNICOS) || defined(_HOST_OS_MAX)
00061 # include <fortran.h>
00062 # endif
00063
00064
00065
00066
00067
00068
00069
00070 static void check_for_dependencies(opnd_type *, size_level_type *);
00071 static void create_array_constructor_asg(opnd_type *, opnd_type *, int, int);
00072 static void do_slice_asg(int, opnd_type *, int, int);
00073 static void determine_slice_size(int, opnd_type *, size_level_type *);
00074 static void create_interp_stmts(int, int);
00075 static void do_single_asg(opnd_type *, expr_arg_type *, opnd_type *, int,
00076 int);
00077 static void create_struct_constructor_asg(opnd_type *, opnd_type *);
00078 static void increment_subscript(int);
00079 static void test_size_stmts(int, int, int);
00080 static void expand_stmts(opnd_type *, expr_arg_type *);
00081 static void check_for_constructors(opnd_type *, expr_arg_type *);
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 boolean create_runtime_array_constructor(opnd_type *top_opnd,
00115 expr_arg_type *exp_desc)
00116
00117 {
00118 int alloc_idx;
00119 int allocate_tmp_idx;
00120 int asg_idx;
00121 int base_asg_idx;
00122 int base_tmp_idx;
00123 int bd_idx;
00124 int call_idx;
00125 opnd_type char_len_opnd;
00126 int char_len_tmp;
00127 int cn_idx;
00128 int col;
00129 size_level_type constructor_size_level;
00130 int dealloc_idx;
00131 int dump_dv_idx;
00132 int dv_idx;
00133 int ir_idx;
00134 opnd_type l_opnd;
00135 int line;
00136 int list_idx;
00137 expr_arg_type loc_exp_desc;
00138 int loc_idx;
00139 int max_idx;
00140 int minus_idx;
00141 opnd_type num_opnd;
00142 int num_tmp_idx;
00143 boolean ok = TRUE;
00144 int realloc_size_attr;
00145 boolean save_defer_stmt_expansion;
00146 boolean save_in_constructor;
00147 int save_curr_stmt_sh_idx;
00148 int shift_idx;
00149 size_offset_type size;
00150 int size_limit_attr;
00151 opnd_type size_opnd;
00152 int size_tmp_idx;
00153 size_offset_type stride;
00154 int subscript_idx;
00155 opnd_type target_base_opnd;
00156 long the_constant;
00157 int tmp_idx;
00158 int tmp_sub_idx;
00159 int type_idx;
00160
00161
00162 TRACE (Func_Entry, "create_runtime_array_constructor", NULL);
00163
00164 stmt_expansion_control_start();
00165 save_defer_stmt_expansion = defer_stmt_expansion;
00166 defer_stmt_expansion = FALSE;
00167
00168 ir_idx = OPND_IDX((*top_opnd));
00169 line = IR_LINE_NUM(ir_idx);
00170 col = IR_COL_NUM(ir_idx);
00171
00172 save_in_constructor = in_constructor;
00173 in_constructor = TRUE;
00174
00175 COPY_OPND(num_opnd, (exp_desc->shape[0]));
00176 constructor_size_level = (size_level_type) exp_desc->constructor_size_level;
00177
00178 GEN_COMPILER_TMP_ASG(asg_idx,
00179 tmp_sub_idx,
00180 TRUE,
00181 line,
00182 col,
00183 SA_INTEGER_DEFAULT_TYPE,
00184 Priv);
00185
00186 IR_FLD_R(asg_idx) = CN_Tbl_Idx;
00187 IR_IDX_R(asg_idx) = CN_INTEGER_ONE_IDX;
00188 IR_LINE_NUM_R(asg_idx) = line;
00189 IR_COL_NUM_R(asg_idx) = col;
00190
00191 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00192
00193 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00194 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00195
00196 if (TYP_TYPE(IR_TYPE_IDX(ir_idx)) == Character) {
00197
00198
00199 copy_subtree(&(exp_desc->char_len), &char_len_opnd);
00200 OPND_LINE_NUM(char_len_opnd) = line;
00201 OPND_COL_NUM(char_len_opnd) = col;
00202
00203 process_char_len(&char_len_opnd);
00204
00205 expand_stmts(&char_len_opnd, NULL);
00206
00207 if (OPND_FLD(char_len_opnd) == IR_Tbl_Idx &&
00208 IR_OPR(OPND_IDX(char_len_opnd)) != Subscript_Opr &&
00209 IR_OPR(OPND_IDX(char_len_opnd)) != Whole_Subscript_Opr &&
00210 IR_OPR(OPND_IDX(char_len_opnd)) != Section_Subscript_Opr &&
00211 IR_OPR(OPND_IDX(char_len_opnd)) != Substring_Opr &&
00212 IR_OPR(OPND_IDX(char_len_opnd)) != Whole_Substring_Opr &&
00213 IR_OPR(OPND_IDX(char_len_opnd)) != Struct_Opr &&
00214 IR_OPR(OPND_IDX(char_len_opnd)) != Dv_Deref_Opr) {
00215
00216 loc_exp_desc = init_exp_desc;
00217
00218 loc_exp_desc.type_idx = SA_INTEGER_DEFAULT_TYPE;
00219 loc_exp_desc.type = TYP_TYPE(loc_exp_desc.type_idx);
00220 loc_exp_desc.linear_type = SA_INTEGER_DEFAULT_TYPE;
00221
00222 char_len_tmp = create_tmp_asg(&char_len_opnd, &loc_exp_desc,
00223 &l_opnd, Intent_In, FALSE, FALSE);
00224 OPND_FLD(char_len_opnd) = AT_Tbl_Idx;
00225 OPND_IDX(char_len_opnd) = char_len_tmp;
00226 OPND_LINE_NUM(char_len_opnd) = line;
00227 OPND_COL_NUM(char_len_opnd) = col;
00228 }
00229
00230
00231 # ifdef _DEBUG
00232 if (OPND_FLD(char_len_opnd) == NO_Tbl_Idx) {
00233 PRINTMSG(line, 902, Internal, col);
00234 }
00235 # endif
00236
00237 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00238 TYP_TYPE(TYP_WORK_IDX) = Character;
00239 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
00240 TYP_CHAR_CLASS(TYP_WORK_IDX) = (OPND_FLD(char_len_opnd) == CN_Tbl_Idx ?
00241 Const_Len_Char : Var_Len_Char);
00242 TYP_FLD(TYP_WORK_IDX) = OPND_FLD(char_len_opnd);
00243 TYP_IDX(TYP_WORK_IDX) = OPND_IDX(char_len_opnd);
00244
00245 if (TYP_CHAR_CLASS(TYP_WORK_IDX) == Var_Len_Char) {
00246 TYP_ORIG_LEN_IDX(TYP_WORK_IDX) = OPND_IDX(char_len_opnd);
00247 }
00248
00249 type_idx = ntr_type_tbl();
00250 COPY_OPND(exp_desc->char_len, char_len_opnd);
00251 }
00252 else {
00253
00254 type_idx = IR_TYPE_IDX(ir_idx);
00255 }
00256
00257 exp_desc->type_idx = type_idx;
00258
00259 if (constructor_size_level == Simple_Expr_Size) {
00260
00261
00262 ok = expr_semantics(&num_opnd, &loc_exp_desc);
00263
00264 if (OPND_FLD(num_opnd) == CN_Tbl_Idx &&
00265 (TYP_TYPE(IR_TYPE_IDX(ir_idx)) != Character ||
00266 OPND_FLD(char_len_opnd) == CN_Tbl_Idx)) {
00267
00268
00269
00270 tmp_idx = gen_compiler_tmp(line, col, Priv, TRUE);
00271 AT_SEMANTICS_DONE(tmp_idx) = TRUE;
00272 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_STACK_IDX(curr_scp_idx);
00273
00274 ATD_TYPE_IDX(tmp_idx) = type_idx;
00275 exp_desc->shape[0].fld = OPND_FLD(num_opnd);
00276 exp_desc->shape[0].idx = OPND_IDX(num_opnd);
00277 exp_desc->rank = 1;
00278 ATD_ARRAY_IDX(tmp_idx) = create_bd_ntry_for_const(exp_desc,
00279 line,
00280 col);
00281
00282 OPND_FLD(target_base_opnd) = AT_Tbl_Idx;
00283 OPND_IDX(target_base_opnd) = tmp_idx;
00284 OPND_LINE_NUM(target_base_opnd) = line;
00285 OPND_COL_NUM(target_base_opnd) = col;
00286
00287 create_array_constructor_asg(top_opnd,
00288 &target_base_opnd,
00289 tmp_sub_idx,
00290 0);
00291
00292 }
00293 else {
00294 COPY_OPND(size_opnd, num_opnd);
00295 OPND_LINE_NUM(size_opnd) = line;
00296 OPND_COL_NUM(size_opnd) = col;
00297
00298
00299
00300 determine_tmp_size(&size_opnd, type_idx);
00301
00302 NTR_IR_TBL(max_idx);
00303 IR_OPR(max_idx) = Max_Opr;
00304 IR_LINE_NUM(max_idx) = line;
00305 IR_COL_NUM(max_idx) = col;
00306 IR_TYPE_IDX(max_idx) = SA_INTEGER_DEFAULT_TYPE;
00307 IR_FLD_L(max_idx) = IL_Tbl_Idx;
00308 IR_LIST_CNT_L(max_idx) = 2;
00309
00310 NTR_IR_LIST_TBL(list_idx);
00311 IR_IDX_L(max_idx) = list_idx;
00312
00313 IL_FLD(list_idx) = CN_Tbl_Idx;
00314 IL_IDX(list_idx) = CN_INTEGER_ZERO_IDX;
00315 IL_LINE_NUM(list_idx) = line;
00316 IL_COL_NUM(list_idx) = col;
00317
00318 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
00319 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
00320 list_idx = IL_NEXT_LIST_IDX(list_idx);
00321
00322 COPY_OPND(IL_OPND(list_idx), size_opnd);
00323
00324 OPND_FLD(size_opnd) = IR_Tbl_Idx;
00325 OPND_IDX(size_opnd) = max_idx;
00326
00327
00328 GEN_COMPILER_TMP_ASG(asg_idx,
00329 size_tmp_idx,
00330 TRUE,
00331 line,
00332 col,
00333 SA_INTEGER_DEFAULT_TYPE,
00334 Priv);
00335
00336 COPY_OPND(IR_OPND_R(asg_idx), size_opnd);
00337
00338 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00339
00340 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00341 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00342
00343 GEN_COMPILER_TMP_ASG(asg_idx,
00344 num_tmp_idx,
00345 TRUE,
00346 line,
00347 col,
00348 SA_INTEGER_DEFAULT_TYPE,
00349 Priv);
00350
00351 COPY_OPND(IR_OPND_R(asg_idx), num_opnd);
00352
00353 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00354
00355 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00356 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00357
00358 tmp_idx = gen_compiler_tmp(line, col, Priv, TRUE);
00359 AT_SEMANTICS_DONE(tmp_idx) = TRUE;
00360 ATD_TYPE_IDX(tmp_idx) = type_idx;
00361 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_BASED_IDX(curr_scp_idx);
00362 exp_desc->shape[0].fld = OPND_FLD(num_opnd);
00363 exp_desc->shape[0].idx = OPND_IDX(num_opnd);
00364 exp_desc->rank = 1;
00365
00366 bd_idx = reserve_array_ntry(1);
00367 BD_RANK(bd_idx) = 1;
00368 BD_LINE_NUM(bd_idx) = line;
00369 BD_COLUMN_NUM(bd_idx) = col;
00370 BD_LEN_FLD(bd_idx) = AT_Tbl_Idx;
00371 BD_LEN_IDX(bd_idx) = num_tmp_idx;
00372
00373 BD_ARRAY_SIZE(bd_idx) = Var_Len_Array;
00374
00375 BD_LB_FLD(bd_idx,1) = CN_Tbl_Idx;
00376 BD_LB_IDX(bd_idx,1) = CN_INTEGER_ONE_IDX;
00377
00378 BD_UB_FLD(bd_idx,1) = AT_Tbl_Idx;
00379 BD_UB_IDX(bd_idx,1) = num_tmp_idx;
00380
00381 BD_XT_FLD(bd_idx,1) = AT_Tbl_Idx;
00382 BD_XT_IDX(bd_idx,1) = num_tmp_idx;
00383
00384 gen_copyin_bounds_stmt(num_tmp_idx);
00385
00386 set_stride_for_first_dim(type_idx, &stride);
00387
00388 BD_SM_FLD(bd_idx, 1) = stride.fld;
00389 BD_SM_IDX(bd_idx, 1) = stride.idx;
00390
00391 BD_RESOLVED(bd_idx) = TRUE;
00392
00393 BD_FLOW_DEPENDENT(bd_idx) = TRUE;
00394
00395 ATD_ARRAY_IDX(tmp_idx) = ntr_array_in_bd_tbl(bd_idx);
00396 ATD_AUTOMATIC(tmp_idx) = TRUE;
00397
00398 GEN_COMPILER_TMP_ASG(base_asg_idx,
00399 base_tmp_idx,
00400 TRUE,
00401 line,
00402 col,
00403 SA_INTEGER_DEFAULT_TYPE,
00404 Priv);
00405
00406 ATD_AUTO_BASE_IDX(tmp_idx) = base_tmp_idx;
00407
00408 NTR_IR_TBL(alloc_idx);
00409 IR_OPR(alloc_idx) = Alloc_Opr;
00410 IR_TYPE_IDX(alloc_idx) = TYPELESS_DEFAULT_TYPE;
00411 IR_LINE_NUM(alloc_idx) = line;
00412 IR_COL_NUM(alloc_idx) = col;
00413 IR_FLD_L(alloc_idx) = AT_Tbl_Idx;
00414 IR_IDX_L(alloc_idx) = size_tmp_idx;
00415 IR_LINE_NUM_L(alloc_idx) = line;
00416 IR_COL_NUM_L(alloc_idx) = col;
00417 IR_FLD_R(base_asg_idx) = IR_Tbl_Idx;
00418 IR_IDX_R(base_asg_idx) = alloc_idx;
00419
00420 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00421
00422 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = base_asg_idx;
00423 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00424
00425 NTR_IR_TBL(dealloc_idx);
00426 IR_OPR(dealloc_idx) = Dealloc_Opr;
00427 IR_TYPE_IDX(dealloc_idx) = TYPELESS_DEFAULT_TYPE;
00428 IR_LINE_NUM(dealloc_idx) = line;
00429 IR_COL_NUM(dealloc_idx) = col;
00430 COPY_OPND(IR_OPND_L(dealloc_idx), IR_OPND_L(base_asg_idx));
00431
00432 gen_sh(After, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00433
00434 SH_IR_IDX(curr_stmt_sh_idx) = dealloc_idx;
00435 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
00436
00437 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
00438
00439 OPND_FLD(target_base_opnd) = AT_Tbl_Idx;
00440 OPND_IDX(target_base_opnd) = tmp_idx;
00441 OPND_LINE_NUM(target_base_opnd) = line;
00442 OPND_COL_NUM(target_base_opnd) = col;
00443
00444 create_array_constructor_asg(top_opnd,
00445 &target_base_opnd,
00446 tmp_sub_idx,
00447 0);
00448 }
00449
00450 OPND_FLD((*top_opnd)) = AT_Tbl_Idx;
00451 OPND_IDX((*top_opnd)) = tmp_idx;
00452 OPND_LINE_NUM((*top_opnd)) = line;
00453 OPND_COL_NUM((*top_opnd)) = col;
00454
00455
00456 ok = gen_whole_subscript(top_opnd, exp_desc) && ok;
00457
00458 exp_desc->tmp_reference = TRUE;
00459 exp_desc->contig_array = TRUE;
00460 }
00461 else if (constructor_size_level == Interp_Loop_Size) {
00462
00463 GEN_COMPILER_TMP_ASG(asg_idx,
00464 num_tmp_idx,
00465 TRUE,
00466 line,
00467 col,
00468 SA_INTEGER_DEFAULT_TYPE,
00469 Priv);
00470
00471 IR_FLD_R(asg_idx) = CN_Tbl_Idx;
00472 IR_IDX_R(asg_idx) = CN_INTEGER_ZERO_IDX;
00473 IR_LINE_NUM_R(asg_idx) = line;
00474 IR_COL_NUM_R(asg_idx) = col;
00475
00476 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00477
00478 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00479 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00480
00481 create_interp_stmts(OPND_IDX(num_opnd), num_tmp_idx);
00482
00483 OPND_FLD(size_opnd) = AT_Tbl_Idx;
00484 OPND_IDX(size_opnd) = num_tmp_idx;
00485 OPND_LINE_NUM(size_opnd) = line;
00486 OPND_COL_NUM(size_opnd) = col;
00487
00488 determine_tmp_size(&size_opnd, type_idx);
00489
00490 NTR_IR_TBL(max_idx);
00491 IR_OPR(max_idx) = Max_Opr;
00492 IR_TYPE_IDX(max_idx) = SA_INTEGER_DEFAULT_TYPE;
00493 IR_LINE_NUM(max_idx) = line;
00494 IR_COL_NUM(max_idx) = col;
00495 IR_FLD_L(max_idx) = IL_Tbl_Idx;
00496 IR_LIST_CNT_L(max_idx) = 2;
00497
00498 NTR_IR_LIST_TBL(list_idx);
00499 IR_IDX_L(max_idx) = list_idx;
00500
00501 IL_FLD(list_idx) = CN_Tbl_Idx;
00502 IL_IDX(list_idx) = CN_INTEGER_ZERO_IDX;
00503 IL_LINE_NUM(list_idx) = line;
00504 IL_COL_NUM(list_idx) = col;
00505
00506 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
00507 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
00508 list_idx = IL_NEXT_LIST_IDX(list_idx);
00509
00510 COPY_OPND(IL_OPND(list_idx), size_opnd);
00511
00512 OPND_FLD(size_opnd) = IR_Tbl_Idx;
00513 OPND_IDX(size_opnd) = max_idx;
00514
00515 GEN_COMPILER_TMP_ASG(asg_idx,
00516 size_tmp_idx,
00517 TRUE,
00518 line,
00519 col,
00520 SA_INTEGER_DEFAULT_TYPE,
00521 Priv);
00522
00523 COPY_OPND(IR_OPND_R(asg_idx), size_opnd);
00524
00525 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00526
00527 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00528 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00529
00530 tmp_idx = gen_compiler_tmp(line, col, Priv, TRUE);
00531 AT_SEMANTICS_DONE(tmp_idx)= TRUE;
00532
00533 ATD_TYPE_IDX(tmp_idx) = type_idx;
00534 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_BASED_IDX(curr_scp_idx);
00535 exp_desc->shape[0].fld = OPND_FLD(num_opnd);
00536 exp_desc->shape[0].idx = OPND_IDX(num_opnd);
00537 exp_desc->rank = 1;
00538
00539 bd_idx = reserve_array_ntry(1);
00540 BD_RESOLVED(bd_idx) = TRUE;
00541 BD_RANK(bd_idx) = 1;
00542 BD_LINE_NUM(bd_idx) = line;
00543 BD_COLUMN_NUM(bd_idx) = col;
00544 BD_LEN_FLD(bd_idx) = AT_Tbl_Idx;
00545 BD_LEN_IDX(bd_idx) = num_tmp_idx;
00546
00547
00548 BD_ARRAY_SIZE(bd_idx) = Var_Len_Array;
00549
00550 BD_LB_FLD(bd_idx,1) = CN_Tbl_Idx;
00551 BD_LB_IDX(bd_idx,1) = CN_INTEGER_ONE_IDX;
00552
00553 BD_UB_FLD(bd_idx,1) = AT_Tbl_Idx;
00554 BD_UB_IDX(bd_idx,1) = num_tmp_idx;
00555
00556 BD_XT_FLD(bd_idx,1) = AT_Tbl_Idx;
00557 BD_XT_IDX(bd_idx,1) = num_tmp_idx;
00558
00559 gen_copyin_bounds_stmt(num_tmp_idx);
00560
00561 set_stride_for_first_dim(type_idx, &stride);
00562
00563 BD_SM_FLD(bd_idx, 1) = stride.fld;
00564 BD_SM_IDX(bd_idx, 1) = stride.idx;
00565
00566 BD_FLOW_DEPENDENT(bd_idx) = TRUE;
00567
00568 ATD_ARRAY_IDX(tmp_idx) = ntr_array_in_bd_tbl(bd_idx);
00569 ATD_AUTOMATIC(tmp_idx) = TRUE;
00570
00571 GEN_COMPILER_TMP_ASG(base_asg_idx,
00572 base_tmp_idx,
00573 TRUE,
00574 line,
00575 col,
00576 SA_INTEGER_DEFAULT_TYPE,
00577 Priv);
00578
00579 ATD_AUTO_BASE_IDX(tmp_idx) = base_tmp_idx;
00580
00581 NTR_IR_TBL(alloc_idx);
00582 IR_OPR(alloc_idx) = Alloc_Opr;
00583 IR_TYPE_IDX(alloc_idx) = TYPELESS_DEFAULT_TYPE;
00584 IR_LINE_NUM(alloc_idx) = line;
00585 IR_COL_NUM(alloc_idx) = col;
00586 IR_FLD_L(alloc_idx) = AT_Tbl_Idx;
00587 IR_IDX_L(alloc_idx) = size_tmp_idx;
00588 IR_LINE_NUM_L(alloc_idx) = line;
00589 IR_COL_NUM_L(alloc_idx) = col;
00590 IR_FLD_R(base_asg_idx) = IR_Tbl_Idx;
00591 IR_IDX_R(base_asg_idx) = alloc_idx;
00592
00593 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00594
00595 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = base_asg_idx;
00596 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00597
00598 NTR_IR_TBL(dealloc_idx);
00599 IR_OPR(dealloc_idx) = Dealloc_Opr;
00600 IR_TYPE_IDX(dealloc_idx) = TYPELESS_DEFAULT_TYPE;
00601 IR_LINE_NUM(dealloc_idx) = line;
00602 IR_COL_NUM(dealloc_idx) = col;
00603 COPY_OPND(IR_OPND_L(dealloc_idx), IR_OPND_L(base_asg_idx));
00604
00605 gen_sh(After, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00606
00607 SH_IR_IDX(curr_stmt_sh_idx) = dealloc_idx;
00608 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
00609
00610 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
00611
00612 OPND_FLD(target_base_opnd) = AT_Tbl_Idx;
00613 OPND_IDX(target_base_opnd) = tmp_idx;
00614 OPND_LINE_NUM(target_base_opnd) = line;
00615 OPND_COL_NUM(target_base_opnd) = col;
00616
00617 create_array_constructor_asg(top_opnd,
00618 &target_base_opnd,
00619 tmp_sub_idx,
00620 0);
00621
00622
00623 OPND_FLD((*top_opnd)) = AT_Tbl_Idx;
00624 OPND_IDX((*top_opnd)) = tmp_idx;
00625 OPND_LINE_NUM((*top_opnd)) = line;
00626 OPND_COL_NUM((*top_opnd)) = col;
00627
00628 ok = gen_whole_subscript(top_opnd, exp_desc) && ok;
00629
00630 exp_desc->tmp_reference = TRUE;
00631 exp_desc->contig_array = TRUE;
00632 }
00633 else {
00634
00635
00636 tmp_idx = gen_compiler_tmp(line, col, Priv, TRUE);
00637 AT_SEMANTICS_DONE(tmp_idx)= TRUE;
00638
00639 ATD_TYPE_IDX(tmp_idx) = type_idx;
00640
00641 assign_storage_blk(tmp_idx);
00642
00643 ATD_ALLOCATABLE(tmp_idx) = TRUE;
00644
00645 ATD_ARRAY_IDX(tmp_idx) = BD_DEFERRED_1_IDX;
00646
00647 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
00648 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
00649
00650 gen_entry_dope_code(tmp_idx);
00651
00652 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
00653
00654
00655
00656 GEN_COMPILER_TMP_ASG(asg_idx,
00657 size_limit_attr,
00658 TRUE,
00659 stmt_start_line,
00660 stmt_start_col,
00661 SA_INTEGER_DEFAULT_TYPE,
00662 Priv);
00663
00664 IR_FLD_R(asg_idx) = CN_Tbl_Idx;
00665 IR_IDX_R(asg_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
00666 CONSTRUCTOR_GUESS_SIZE);
00667 IR_LINE_NUM_R(asg_idx) = line;
00668 IR_COL_NUM_R(asg_idx) = col;
00669
00670 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00671 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00672 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00673
00674
00675 NTR_IR_TBL(dv_idx);
00676 IR_OPR(dv_idx) = Dv_Set_Low_Bound;
00677 IR_TYPE_IDX(dv_idx) = SA_INTEGER_DEFAULT_TYPE;
00678 IR_LINE_NUM(dv_idx) = line;
00679 IR_COL_NUM(dv_idx) = col;
00680
00681 IR_FLD_L(dv_idx) = AT_Tbl_Idx;
00682 IR_IDX_L(dv_idx) = tmp_idx;
00683 IR_LINE_NUM_L(dv_idx) = line;
00684 IR_COL_NUM_L(dv_idx) = col;
00685
00686 IR_FLD_R(dv_idx) = CN_Tbl_Idx;
00687 IR_IDX_R(dv_idx) = CN_INTEGER_ONE_IDX;
00688 IR_LINE_NUM_R(dv_idx) = line;
00689 IR_COL_NUM_R(dv_idx) = col;
00690
00691 IR_DV_DIM(dv_idx) = 1;
00692
00693 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00694 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = dv_idx;
00695 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00696
00697 NTR_IR_TBL(dv_idx);
00698 IR_OPR(dv_idx) = Dv_Set_Extent;
00699 IR_TYPE_IDX(dv_idx) = SA_INTEGER_DEFAULT_TYPE;
00700 IR_LINE_NUM(dv_idx) = line;
00701 IR_COL_NUM(dv_idx) = col;
00702
00703 IR_FLD_L(dv_idx) = AT_Tbl_Idx;
00704 IR_IDX_L(dv_idx) = tmp_idx;
00705 IR_LINE_NUM_L(dv_idx) = line;
00706 IR_COL_NUM_L(dv_idx) = col;
00707
00708 IR_FLD_R(dv_idx) = CN_Tbl_Idx;
00709 IR_IDX_R(dv_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
00710 CONSTRUCTOR_GUESS_SIZE);
00711 IR_LINE_NUM_R(dv_idx) = line;
00712 IR_COL_NUM_R(dv_idx) = col;
00713
00714 IR_DV_DIM(dv_idx) = 1;
00715
00716 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00717 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = dv_idx;
00718 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00719
00720 NTR_IR_TBL(dv_idx);
00721 IR_OPR(dv_idx) = Dv_Set_Stride_Mult;
00722 IR_TYPE_IDX(dv_idx) = SA_INTEGER_DEFAULT_TYPE;
00723 IR_LINE_NUM(dv_idx) = line;
00724 IR_COL_NUM(dv_idx) = col;
00725
00726 IR_FLD_L(dv_idx) = AT_Tbl_Idx;
00727 IR_IDX_L(dv_idx) = tmp_idx;
00728 IR_LINE_NUM_L(dv_idx) = line;
00729 IR_COL_NUM_L(dv_idx) = col;
00730 type_idx = ATD_TYPE_IDX(tmp_idx);
00731
00732 switch (TYP_TYPE(type_idx)) {
00733
00734 case Typeless:
00735 IR_FLD_R(dv_idx) = CN_Tbl_Idx;
00736 IR_IDX_R(dv_idx) = C_INT_TO_CN(NULL_IDX,
00737 STORAGE_WORD_SIZE(TYP_BIT_LEN(type_idx)));
00738 IR_LINE_NUM_R(dv_idx) = line;
00739 IR_COL_NUM_R(dv_idx) = col;
00740 break;
00741
00742 case Integer:
00743 case Logical:
00744 case CRI_Ptr:
00745 case CRI_Ch_Ptr:
00746 case Real:
00747 case Complex:
00748 the_constant = TARGET_BITS_TO_WORDS(storage_bit_size_tbl[
00749 TYP_LINEAR(type_idx)]);
00750 IR_FLD_R(dv_idx) = CN_Tbl_Idx;
00751 IR_IDX_R(dv_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
00752 the_constant);
00753 IR_LINE_NUM_R(dv_idx) = line;
00754 IR_COL_NUM_R(dv_idx) = col;
00755 break;
00756
00757 case Character:
00758 IR_FLD_R(dv_idx) = TYP_FLD(type_idx);
00759 IR_IDX_R(dv_idx) = TYP_IDX(type_idx);
00760 IR_LINE_NUM_R(dv_idx) = line;
00761 IR_COL_NUM_R(dv_idx) = col;
00762
00763 break;
00764
00765 case Structure:
00766 size.fld = ATT_STRUCT_BIT_LEN_FLD(TYP_IDX(type_idx));
00767 size.idx = ATT_STRUCT_BIT_LEN_IDX(TYP_IDX(type_idx));
00768
00769 BITS_TO_WORDS(size, TARGET_BITS_PER_WORD);
00770
00771 if (size.fld == NO_Tbl_Idx) {
00772 IR_FLD_R(dv_idx) = CN_Tbl_Idx;
00773 IR_IDX_R(dv_idx) = ntr_const_tbl(size.type_idx,
00774 FALSE,
00775 size.constant);
00776 }
00777 else {
00778 IR_FLD_R(dv_idx) = size.fld;
00779 IR_IDX_R(dv_idx) = size.idx;
00780 }
00781
00782 IR_LINE_NUM_R(dv_idx) = line;
00783 IR_COL_NUM_R(dv_idx) = col;
00784 break;
00785
00786 }
00787
00788 IR_DV_DIM(dv_idx) = 1;
00789
00790 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00791 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = dv_idx;
00792 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00793
00794
00795 allocate_tmp_idx = create_alloc_descriptor(1,line,col,FALSE);
00796
00797
00798
00799
00800 NTR_IR_TBL(loc_idx);
00801 IR_OPR(loc_idx) = Aloc_Opr;
00802 IR_TYPE_IDX(loc_idx) = CRI_Ptr_8;
00803 IR_LINE_NUM(loc_idx) = line;
00804 IR_COL_NUM(loc_idx) = col;
00805 IR_FLD_L(loc_idx) = AT_Tbl_Idx;
00806 IR_IDX_L(loc_idx) = tmp_idx;
00807 IR_LINE_NUM_L(loc_idx) = line;
00808 IR_COL_NUM_L(loc_idx) = col;
00809
00810 NTR_IR_TBL(asg_idx);
00811 IR_OPR(asg_idx) = Asg_Opr;
00812 IR_TYPE_IDX(asg_idx) = SA_INTEGER_DEFAULT_TYPE;
00813 IR_LINE_NUM(asg_idx) = line;
00814 IR_COL_NUM(asg_idx) = col;
00815
00816 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
00817 IR_IDX_R(asg_idx) = loc_idx;
00818
00819 NTR_IR_TBL(subscript_idx);
00820 IR_OPR(subscript_idx) = Subscript_Opr;
00821 IR_TYPE_IDX(subscript_idx) = SA_INTEGER_DEFAULT_TYPE;
00822 IR_LINE_NUM(subscript_idx) = line;
00823 IR_COL_NUM(subscript_idx) = col;
00824 IR_FLD_L(subscript_idx) = AT_Tbl_Idx;
00825 IR_IDX_L(subscript_idx) = allocate_tmp_idx;
00826 IR_LINE_NUM_L(subscript_idx) = line;
00827 IR_COL_NUM_L(subscript_idx) = col;
00828
00829 IR_FLD_L(asg_idx) = IR_Tbl_Idx;
00830 IR_IDX_L(asg_idx) = subscript_idx;
00831
00832 the_constant = 2;
00833
00834 # if defined(GENERATE_WHIRL)
00835 if (TYP_LINEAR(ATD_TYPE_IDX(allocate_tmp_idx)) == Integer_4) {
00836 the_constant++;
00837 }
00838 # endif
00839
00840 NTR_IR_LIST_TBL(list_idx);
00841 IL_FLD(list_idx) = CN_Tbl_Idx;
00842 IL_IDX(list_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, the_constant);
00843 IL_LINE_NUM(list_idx) = line;
00844 IL_COL_NUM(list_idx) = col;
00845
00846 IR_FLD_R(subscript_idx) = IL_Tbl_Idx;
00847 IR_LIST_CNT_R(subscript_idx) = 1;
00848 IR_IDX_R(subscript_idx) = list_idx;
00849
00850 gen_sh(Before, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
00851 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00852
00853
00854
00855 NTR_IR_TBL(call_idx);
00856 IR_OPR(call_idx) = Call_Opr;
00857 IR_TYPE_IDX(call_idx) = TYPELESS_DEFAULT_TYPE;
00858 IR_LINE_NUM(call_idx) = line;
00859 IR_COL_NUM(call_idx) = col;
00860 IR_LINE_NUM_L(call_idx) = line;
00861 IR_COL_NUM_L(call_idx) = col;
00862 IR_FLD_L(call_idx) = AT_Tbl_Idx;
00863
00864 if (glb_tbl_idx[Allocate_Attr_Idx] == NULL_IDX) {
00865 glb_tbl_idx[Allocate_Attr_Idx] = create_lib_entry_attr(
00866 ALLOCATE_LIB_ENTRY,
00867 ALLOCATE_NAME_LEN,
00868 line,
00869 col);
00870 }
00871
00872 ADD_ATTR_TO_LOCAL_LIST(glb_tbl_idx[Allocate_Attr_Idx]);
00873
00874 IR_IDX_L(call_idx) = glb_tbl_idx[Allocate_Attr_Idx];
00875 IR_FLD_R(call_idx) = IL_Tbl_Idx;
00876 IR_LIST_CNT_R(call_idx) = 2;
00877 NTR_IR_LIST_TBL(list_idx);
00878 IR_IDX_R(call_idx) = list_idx;
00879
00880 NTR_IR_TBL(loc_idx);
00881 IR_OPR(loc_idx) = Aloc_Opr;
00882 IR_TYPE_IDX(loc_idx) = CRI_Ptr_8;
00883 IR_LINE_NUM(loc_idx) = line;
00884 IR_COL_NUM(loc_idx) = col;
00885 IR_FLD_L(loc_idx) = AT_Tbl_Idx;
00886 IR_IDX_L(loc_idx) = allocate_tmp_idx;
00887 IR_LINE_NUM_L(loc_idx) = line;
00888 IR_COL_NUM_L(loc_idx) = col;
00889 IL_FLD(list_idx) = IR_Tbl_Idx;
00890 IL_IDX(list_idx) = loc_idx;
00891
00892
00893
00894
00895 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
00896 list_idx = IL_NEXT_LIST_IDX(list_idx);
00897 IL_FLD(list_idx) = CN_Tbl_Idx;
00898 IL_IDX(list_idx) = CN_INTEGER_ZERO_IDX;
00899 IL_LINE_NUM(list_idx) = line;
00900 IL_COL_NUM(list_idx) = col;
00901
00902 gen_sh(Before, Call_Stmt, line, col, FALSE, FALSE, TRUE);
00903 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = call_idx;
00904 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00905
00906 NTR_IR_TBL(dv_idx);
00907 IR_OPR(dv_idx) = Dv_Deref_Opr;
00908 IR_TYPE_IDX(dv_idx) = ATD_TYPE_IDX(tmp_idx);
00909 IR_LINE_NUM(dv_idx) = line;
00910 IR_COL_NUM(dv_idx) = col;
00911
00912 IR_FLD_L(dv_idx) = AT_Tbl_Idx;
00913 IR_IDX_L(dv_idx) = tmp_idx;
00914 IR_LINE_NUM_L(dv_idx) = line;
00915 IR_COL_NUM_L(dv_idx) = col;
00916
00917 OPND_FLD(target_base_opnd) = IR_Tbl_Idx;
00918 OPND_IDX(target_base_opnd) = dv_idx;
00919
00920 create_array_constructor_asg(top_opnd,
00921 &target_base_opnd,
00922 tmp_sub_idx,
00923 size_limit_attr);
00924
00925
00926
00927
00928 NTR_IR_TBL(asg_idx);
00929 IR_OPR(asg_idx) = Asg_Opr;
00930 IR_TYPE_IDX(asg_idx) = ATD_TYPE_IDX(tmp_sub_idx);
00931 IR_LINE_NUM(asg_idx) = line;
00932 IR_COL_NUM(asg_idx) = col;
00933
00934 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
00935 IR_IDX_L(asg_idx) = tmp_sub_idx;
00936 IR_LINE_NUM_L(asg_idx) = line;
00937 IR_COL_NUM_L(asg_idx) = col;
00938
00939 NTR_IR_TBL(minus_idx);
00940 IR_OPR(minus_idx) = Minus_Opr;
00941 IR_TYPE_IDX(minus_idx) = SA_INTEGER_DEFAULT_TYPE;
00942 IR_LINE_NUM(minus_idx) = line;
00943 IR_COL_NUM(minus_idx) = col;
00944 IR_FLD_L(minus_idx) = AT_Tbl_Idx;
00945 IR_IDX_L(minus_idx) = tmp_sub_idx;
00946 IR_LINE_NUM_L(minus_idx) = line;
00947 IR_COL_NUM_L(minus_idx) = col;
00948 IR_FLD_R(minus_idx) = CN_Tbl_Idx;
00949 IR_IDX_R(minus_idx) = CN_INTEGER_ONE_IDX;
00950 IR_LINE_NUM_R(minus_idx) = line;
00951 IR_COL_NUM_R(minus_idx) = col;
00952
00953 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
00954 IR_IDX_R(asg_idx) = minus_idx;
00955
00956 gen_sh(Before, Assignment_Stmt, stmt_start_line, stmt_start_col,
00957 FALSE, FALSE, TRUE);
00958 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00959 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00960
00961
00962
00963 GEN_COMPILER_TMP_ASG(asg_idx,
00964 realloc_size_attr,
00965 TRUE,
00966 line,
00967 col,
00968 SA_INTEGER_DEFAULT_TYPE,
00969 Priv);
00970
00971 NTR_IR_TBL(ir_idx);
00972 IR_OPR(ir_idx) = Mult_Opr;
00973 IR_TYPE_IDX(ir_idx) = SA_INTEGER_DEFAULT_TYPE;
00974 IR_LINE_NUM(ir_idx) = line;
00975 IR_COL_NUM(ir_idx) = col;
00976 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
00977 IR_IDX_L(ir_idx) = tmp_sub_idx;
00978 IR_LINE_NUM_L(ir_idx) = line;
00979 IR_COL_NUM_L(ir_idx) = col;
00980
00981 NTR_IR_TBL(dv_idx);
00982 IR_OPR(dv_idx) = Dv_Access_El_Len;
00983 IR_TYPE_IDX(dv_idx) = SA_INTEGER_DEFAULT_TYPE;
00984 IR_LINE_NUM(dv_idx) = line;
00985 IR_COL_NUM(dv_idx) = col;
00986 IR_FLD_L(dv_idx) = AT_Tbl_Idx;
00987 IR_IDX_L(dv_idx) = tmp_idx;
00988 IR_LINE_NUM_L(dv_idx) = line;
00989 IR_COL_NUM_L(dv_idx) = col;
00990
00991 IR_FLD_R(ir_idx) = IR_Tbl_Idx;
00992 IR_IDX_R(ir_idx) = dv_idx;
00993
00994 if (char_len_in_bytes) {
00995 if (TYP_TYPE(type_idx) == Character) {
00996
00997 NTR_IR_TBL(shift_idx);
00998 IR_TYPE_IDX(shift_idx) = SA_INTEGER_DEFAULT_TYPE;
00999 IR_LINE_NUM(shift_idx) = line;
01000 IR_COL_NUM(shift_idx) = col;
01001 IR_OPR(shift_idx) = Shiftl_Opr;
01002
01003 NTR_IR_LIST_TBL(list_idx);
01004 IR_FLD_L(shift_idx) = IL_Tbl_Idx;
01005 IR_IDX_L(shift_idx) = list_idx;
01006 IR_LIST_CNT_L(shift_idx) = 2;
01007
01008 COPY_OPND(IL_OPND(list_idx), IR_OPND_R(ir_idx));
01009
01010 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01011 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01012 list_idx = IL_NEXT_LIST_IDX(list_idx);
01013
01014 IL_LINE_NUM(list_idx) = line;
01015 IL_COL_NUM(list_idx) = col;
01016
01017 IL_FLD(list_idx) = CN_Tbl_Idx;
01018 IL_IDX(list_idx) = CN_INTEGER_THREE_IDX;
01019 IR_IDX_R(ir_idx) = shift_idx;
01020 }
01021 }
01022
01023 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
01024 IR_IDX_R(asg_idx) = ir_idx;
01025
01026 gen_sh(Before, Assignment_Stmt, stmt_start_line,
01027 stmt_start_col, FALSE, FALSE, TRUE);
01028
01029 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
01030 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
01031
01032
01033
01034
01035 if (glb_tbl_idx[Realloc_Attr_Idx] == NULL_IDX) {
01036 glb_tbl_idx[Realloc_Attr_Idx] =
01037 create_lib_entry_attr(REALLOC_LIB_ENTRY,
01038 REALLOC_NAME_LEN,
01039 line,
01040 col);
01041 }
01042
01043 ADD_ATTR_TO_LOCAL_LIST(glb_tbl_idx[Realloc_Attr_Idx]);
01044
01045 NTR_IR_TBL(call_idx);
01046 IR_OPR(call_idx) = Call_Opr;
01047 IR_TYPE_IDX(call_idx) = TYPELESS_DEFAULT_TYPE;
01048 IR_LINE_NUM(call_idx) = line;
01049 IR_COL_NUM(call_idx) = col;
01050 IR_FLD_L(call_idx) = AT_Tbl_Idx;
01051 IR_IDX_L(call_idx) = glb_tbl_idx[Realloc_Attr_Idx];
01052 IR_LINE_NUM_L(call_idx) = line;
01053 IR_COL_NUM_L(call_idx) = col;
01054
01055 NTR_IR_LIST_TBL(list_idx);
01056 IR_FLD_R(call_idx) = IL_Tbl_Idx;
01057 IR_IDX_R(call_idx) = list_idx;
01058 IR_LIST_CNT_R(call_idx) = 2;
01059
01060 NTR_IR_TBL(ir_idx);
01061 IR_OPR(ir_idx) = Aloc_Opr;
01062 IR_TYPE_IDX(ir_idx) = CRI_Ptr_8;
01063 IR_LINE_NUM(ir_idx) = line;
01064 IR_COL_NUM(ir_idx) = col;
01065
01066 IL_FLD(list_idx) = IR_Tbl_Idx;
01067 IL_IDX(list_idx) = ir_idx;
01068
01069 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
01070 IR_IDX_L(ir_idx) = tmp_idx;
01071 IR_LINE_NUM_L(ir_idx) = line;
01072 IR_COL_NUM_L(ir_idx) = col;
01073
01074
01075 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01076 list_idx = IL_NEXT_LIST_IDX(list_idx);
01077
01078 NTR_IR_TBL(ir_idx);
01079 IR_OPR(ir_idx) = Aloc_Opr;
01080 IR_TYPE_IDX(ir_idx) = CRI_Ptr_8;
01081 IR_LINE_NUM(ir_idx) = line;
01082 IR_COL_NUM(ir_idx) = col;
01083
01084 IL_FLD(list_idx) = IR_Tbl_Idx;
01085 IL_IDX(list_idx) = ir_idx;
01086
01087 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
01088 IR_IDX_L(ir_idx) = realloc_size_attr;
01089 IR_LINE_NUM_L(ir_idx) = line;
01090 IR_COL_NUM_L(ir_idx) = col;
01091
01092 gen_sh(Before, Call_Stmt, stmt_start_line,
01093 stmt_start_col, FALSE, FALSE, TRUE);
01094
01095 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = call_idx;
01096 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
01097
01098
01099
01100
01101 NTR_IR_TBL(dv_idx);
01102 IR_OPR(dv_idx) = Dv_Set_Extent;
01103 IR_TYPE_IDX(dv_idx) = SA_INTEGER_DEFAULT_TYPE;
01104 IR_DV_DIM(dv_idx) = 1;
01105 IR_LINE_NUM(dv_idx) = line;
01106 IR_COL_NUM(dv_idx) = col;
01107
01108 IR_FLD_L(dv_idx) = AT_Tbl_Idx;
01109 IR_IDX_L(dv_idx) = tmp_idx;
01110 IR_LINE_NUM_L(dv_idx) = line;
01111 IR_COL_NUM_L(dv_idx) = col;
01112
01113 IR_FLD_R(dv_idx) = AT_Tbl_Idx;
01114 IR_IDX_R(dv_idx) = tmp_sub_idx;
01115 IR_LINE_NUM_R(dv_idx) = line;
01116 IR_COL_NUM_R(dv_idx) = col;
01117
01118 gen_sh(Before, Assignment_Stmt, stmt_start_line,
01119 stmt_start_col, FALSE, FALSE, TRUE);
01120
01121 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = dv_idx;
01122 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
01123
01124 NTR_IR_TBL(dv_idx);
01125 IR_OPR(dv_idx) = Dv_Deref_Opr;
01126 IR_TYPE_IDX(dv_idx) = ATD_TYPE_IDX(tmp_idx);
01127 IR_LINE_NUM(dv_idx) = line;
01128 IR_COL_NUM(dv_idx) = col;
01129
01130 IR_FLD_L(dv_idx) = AT_Tbl_Idx;
01131 IR_IDX_L(dv_idx) = tmp_idx;
01132 IR_LINE_NUM_L(dv_idx) = line;
01133 IR_COL_NUM_L(dv_idx) = col;
01134
01135 OPND_FLD((*top_opnd)) = IR_Tbl_Idx;
01136 OPND_IDX((*top_opnd)) = dv_idx;
01137
01138 NTR_IR_TBL(subscript_idx);
01139 IR_OPR(subscript_idx) = Whole_Subscript_Opr;
01140 IR_TYPE_IDX(subscript_idx) = ATD_TYPE_IDX(tmp_idx);
01141 IR_LINE_NUM(subscript_idx) = line;
01142 IR_COL_NUM(subscript_idx) = col;
01143
01144 COPY_OPND(IR_OPND_L(subscript_idx), (*top_opnd));
01145
01146 NTR_IR_LIST_TBL(list_idx);
01147 IR_FLD_R(subscript_idx) = IL_Tbl_Idx;
01148 IR_IDX_R(subscript_idx) = list_idx;
01149 IR_LIST_CNT_R(subscript_idx) = 1;
01150
01151 NTR_IR_TBL(dv_idx);
01152 IR_OPR(dv_idx) = Triplet_Opr;
01153 IR_TYPE_IDX(dv_idx) = SA_INTEGER_DEFAULT_TYPE;
01154 IR_LINE_NUM(dv_idx) = line;
01155 IR_COL_NUM(dv_idx) = col;
01156
01157 IL_FLD(list_idx) = IR_Tbl_Idx;
01158 IL_IDX(list_idx) = dv_idx;
01159
01160 NTR_IR_LIST_TBL(list_idx);
01161 IR_FLD_L(dv_idx) = IL_Tbl_Idx;
01162 IR_IDX_L(dv_idx) = list_idx;
01163 IR_LIST_CNT_L(dv_idx) = 3;
01164
01165 IL_FLD(list_idx) = CN_Tbl_Idx;
01166 IL_IDX(list_idx) = CN_INTEGER_ONE_IDX;
01167 IL_LINE_NUM(list_idx) = line;
01168 IL_COL_NUM(list_idx) = col;
01169
01170 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01171 list_idx = IL_NEXT_LIST_IDX(list_idx);
01172
01173 IL_FLD(list_idx) = AT_Tbl_Idx;
01174 IL_IDX(list_idx) = tmp_sub_idx;
01175 IL_LINE_NUM(list_idx) = line;
01176 IL_COL_NUM(list_idx) = col;
01177
01178 COPY_OPND((exp_desc->shape[0]), IL_OPND(list_idx));
01179 exp_desc->rank = 1;
01180
01181 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01182 list_idx = IL_NEXT_LIST_IDX(list_idx);
01183
01184 IL_FLD(list_idx) = CN_Tbl_Idx;
01185 IL_IDX(list_idx) = CN_INTEGER_ONE_IDX;
01186 IL_LINE_NUM(list_idx) = line;
01187 IL_COL_NUM(list_idx) = col;
01188
01189 OPND_FLD((*top_opnd)) = IR_Tbl_Idx;
01190 OPND_IDX((*top_opnd)) = subscript_idx;
01191
01192
01193 exp_desc->reference = TRUE;
01194 exp_desc->allocatable = TRUE;
01195 exp_desc->contig_array = TRUE;
01196
01197 if (exp_desc->type == Character) {
01198 ok = gen_whole_substring(top_opnd, exp_desc->rank) && ok;
01199 }
01200
01201 # if 0
01202
01203
01204 dump_dv_idx = create_lib_entry_attr("DUMP_DV",
01205 7,
01206 line,
01207 col);
01208
01209 ADD_ATTR_TO_LOCAL_LIST(dump_dv_idx);
01210
01211 NTR_IR_TBL(call_idx);
01212 IR_OPR(call_idx) = Call_Opr;
01213 IR_TYPE_IDX(call_idx) = SA_INTEGER_DEFAULT_TYPE;
01214 IR_LINE_NUM(call_idx) = line;
01215 IR_COL_NUM(call_idx) = col;
01216 IR_FLD_L(call_idx) = AT_Tbl_Idx;
01217 IR_IDX_L(call_idx) = dump_dv_idx;
01218 IR_LINE_NUM_L(call_idx) = line;
01219 IR_COL_NUM_L(call_idx) = col;
01220
01221 NTR_IR_LIST_TBL(list_idx);
01222 IR_FLD_R(call_idx) = IL_Tbl_Idx;
01223 IR_IDX_R(call_idx) = list_idx;
01224 IR_LIST_CNT_R(call_idx) = 1;
01225
01226 NTR_IR_TBL(loc_idx);
01227 IR_OPR(loc_idx) = Aloc_Opr;
01228 IR_TYPE_IDX(loc_idx) = CRI_Ptr_8;
01229 IR_LINE_NUM(loc_idx) = line;
01230 IR_COL_NUM(loc_idx) = col;
01231 IL_FLD(list_idx) = IR_Tbl_Idx;
01232 IL_IDX(list_idx) = loc_idx;
01233
01234 IR_FLD_L(loc_idx) = AT_Tbl_Idx;
01235 IR_IDX_L(loc_idx) = tmp_idx;
01236 IR_LINE_NUM_L(loc_idx) = line;
01237 IR_COL_NUM_L(loc_idx) = col;
01238
01239 gen_sh(Before, Call_Stmt, stmt_start_line,
01240 stmt_start_col, FALSE, FALSE, TRUE);
01241
01242 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = call_idx;
01243 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
01244
01245 # endif
01246
01247 if (glb_tbl_idx[Dealloc_Attr_Idx] == NULL_IDX) {
01248 glb_tbl_idx[Dealloc_Attr_Idx] = create_lib_entry_attr(
01249 DEALLOC_LIB_ENTRY,
01250 DEALLOC_NAME_LEN,
01251 line,
01252 col);
01253 }
01254
01255 ADD_ATTR_TO_LOCAL_LIST(glb_tbl_idx[Dealloc_Attr_Idx]);
01256
01257 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
01258
01259 # ifdef _ALLOCATE_IS_CALL
01260
01261
01262 allocate_tmp_idx = create_alloc_descriptor(1, line, col,FALSE);
01263
01264
01265
01266 NTR_IR_TBL(subscript_idx);
01267 IR_OPR(subscript_idx) = Subscript_Opr;
01268 IR_TYPE_IDX(subscript_idx) = SA_INTEGER_DEFAULT_TYPE;
01269 IR_LINE_NUM(subscript_idx) = line;
01270 IR_COL_NUM(subscript_idx) = col;
01271 IR_FLD_L(subscript_idx) = AT_Tbl_Idx;
01272 IR_IDX_L(subscript_idx) = allocate_tmp_idx;
01273 IR_LINE_NUM_L(subscript_idx) = line;
01274 IR_COL_NUM_L(subscript_idx) = col;
01275
01276 NTR_IR_LIST_TBL(list_idx);
01277 IR_FLD_R(subscript_idx) = IL_Tbl_Idx;
01278 IR_IDX_R(subscript_idx) = list_idx;
01279 IR_LIST_CNT_R(subscript_idx) = 1;
01280
01281 IL_FLD(list_idx) = CN_Tbl_Idx;
01282 the_constant = 2L;
01283
01284 # if defined(GENERATE_WHIRL)
01285 if (TYP_LINEAR(ATD_TYPE_IDX(allocate_tmp_idx)) == Integer_4) {
01286 the_constant++;
01287 }
01288 # endif
01289
01290 IL_IDX(list_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
01291 the_constant);
01292 IL_LINE_NUM(list_idx) = line;
01293 IL_COL_NUM(list_idx) = col;
01294
01295 NTR_IR_TBL(asg_idx);
01296 IR_OPR(asg_idx) = Asg_Opr;
01297 IR_TYPE_IDX(asg_idx) = SA_INTEGER_DEFAULT_TYPE;
01298
01299 IR_LINE_NUM(asg_idx) = line;
01300 IR_COL_NUM(asg_idx) = col;
01301 IR_FLD_L(asg_idx) = IR_Tbl_Idx;
01302 IR_IDX_L(asg_idx) = subscript_idx;
01303 NTR_IR_TBL(loc_idx);
01304 IR_OPR(loc_idx) = Loc_Opr;
01305 IR_TYPE_IDX(loc_idx) = CRI_Ptr_8;
01306 IR_LINE_NUM(loc_idx) = line;
01307 IR_COL_NUM(loc_idx) = col;
01308
01309 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
01310 IR_IDX_R(asg_idx) = loc_idx;
01311
01312 IR_FLD_L(loc_idx) = AT_Tbl_Idx;
01313 IR_IDX_L(loc_idx) = tmp_idx;
01314 IR_LINE_NUM_L(loc_idx) = line;
01315 IR_COL_NUM_L(loc_idx) = col;
01316
01317 gen_sh(After, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
01318 SH_IR_IDX(curr_stmt_sh_idx) = asg_idx;
01319 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
01320
01321
01322
01323 NTR_IR_TBL(call_idx);
01324 IR_OPR(call_idx) = Call_Opr;
01325 IR_TYPE_IDX(call_idx) = TYPELESS_DEFAULT_TYPE;
01326 IR_LINE_NUM(call_idx) = line;
01327 IR_COL_NUM(call_idx) = col;
01328 IR_FLD_L(call_idx) = AT_Tbl_Idx;
01329 IR_IDX_L(call_idx) = glb_tbl_idx[Dealloc_Attr_Idx];
01330 IR_LINE_NUM_L(call_idx) = line;
01331 IR_COL_NUM_L(call_idx) = col;
01332
01333 NTR_IR_LIST_TBL(list_idx);
01334 IR_FLD_R(call_idx) = IL_Tbl_Idx;
01335 IR_IDX_R(call_idx) = list_idx;
01336 IR_LIST_CNT_R(call_idx) = 1;
01337
01338 NTR_IR_TBL(loc_idx);
01339 IR_OPR(loc_idx) = Aloc_Opr;
01340 IR_TYPE_IDX(loc_idx) = CRI_Ptr_8;
01341 IR_FLD_L(loc_idx) = AT_Tbl_Idx;
01342 IR_IDX_L(loc_idx) = allocate_tmp_idx;
01343 IR_LINE_NUM(loc_idx) = line;
01344 IR_COL_NUM(loc_idx) = col;
01345 IR_LINE_NUM_L(loc_idx) = line;
01346 IR_COL_NUM_L(loc_idx) = col;
01347 IL_FLD(list_idx) = IR_Tbl_Idx;
01348 IL_IDX(list_idx) = loc_idx;
01349
01350 gen_sh(After, Call_Stmt, line, col, FALSE, FALSE, TRUE);
01351 SH_IR_IDX(curr_stmt_sh_idx) = call_idx;
01352 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
01353
01354 # else
01355 NTR_IR_TBL(asg_idx);
01356 IR_OPR(asg_idx) = Deallocate_Opr;
01357 IR_TYPE_IDX(asg_idx) = TYPELESS_DEFAULT_TYPE;
01358 IR_LINE_NUM(asg_idx) = line;
01359 IR_COL_NUM(asg_idx) = col;
01360
01361 NTR_IR_LIST_TBL(list_idx);
01362 IR_FLD_L(asg_idx) = IL_Tbl_Idx;
01363 IR_IDX_L(asg_idx) = list_idx;
01364 IR_LIST_CNT_L(asg_idx) = 1;
01365
01366 NTR_IR_TBL(loc_idx);
01367 IR_OPR(loc_idx) = Aloc_Opr;
01368 IR_TYPE_IDX(loc_idx) = CRI_Ptr_8;
01369 IR_FLD_L(loc_idx) = AT_Tbl_Idx;
01370 IR_IDX_L(loc_idx) = tmp_idx;
01371 IR_LINE_NUM(loc_idx) = line;
01372 IR_COL_NUM(loc_idx) = col;
01373 IR_LINE_NUM_L(loc_idx) = line;
01374 IR_COL_NUM_L(loc_idx) = col;
01375 IL_FLD(list_idx) = IR_Tbl_Idx;
01376 IL_IDX(list_idx) = loc_idx;
01377
01378 NTR_IR_LIST_TBL(list_idx);
01379 IR_FLD_R(asg_idx) = IL_Tbl_Idx;
01380 IR_IDX_R(asg_idx) = list_idx;
01381 IR_LIST_CNT_R(asg_idx) = 3;
01382 IL_FLD(list_idx) = AT_Tbl_Idx;
01383 IL_IDX(list_idx) = glb_tbl_idx[Dealloc_Attr_Idx];
01384 IL_LINE_NUM(list_idx) = line;
01385 IL_COL_NUM(list_idx) = col;
01386
01387 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01388 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01389 list_idx = IL_NEXT_LIST_IDX(list_idx);
01390
01391 IL_FLD(list_idx) = CN_Tbl_Idx;
01392 IL_IDX(list_idx) = gen_alloc_header_const(Integer_8,
01393 1,
01394 FALSE,
01395 &cn_idx);
01396 IL_LINE_NUM(list_idx) = line;
01397 IL_COL_NUM(list_idx) = col;
01398
01399 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01400 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01401 list_idx = IL_NEXT_LIST_IDX(list_idx);
01402
01403 IL_FLD(list_idx) = CN_Tbl_Idx;
01404 IL_IDX(list_idx) = CN_INTEGER_ZERO_IDX;
01405 IL_LINE_NUM(list_idx) = line;
01406 IL_COL_NUM(list_idx) = col;
01407
01408 gen_sh(After, Call_Stmt, line, col, FALSE, FALSE, TRUE);
01409 SH_IR_IDX(curr_stmt_sh_idx) = asg_idx;
01410 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
01411 # endif
01412
01413 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
01414 }
01415
01416 in_constructor = save_in_constructor;
01417
01418 defer_stmt_expansion = save_defer_stmt_expansion;
01419 stmt_expansion_control_end(top_opnd);
01420
01421 TRACE (Func_Exit, "create_runtime_array_constructor", NULL);
01422
01423 return(ok);
01424
01425 }
01426
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446 boolean create_runtime_struct_constructor(opnd_type *top_opnd)
01447
01448 {
01449 int col;
01450 int ir_idx;
01451 int line;
01452 boolean ok = TRUE;
01453 opnd_type opnd;
01454 boolean save_defer_stmt_expansion;
01455 int tmp_idx;
01456
01457
01458 TRACE (Func_Entry, "create_runtime_struct_constructor", NULL);
01459
01460 stmt_expansion_control_start();
01461 save_defer_stmt_expansion = defer_stmt_expansion;
01462 defer_stmt_expansion = FALSE;
01463
01464 ir_idx = OPND_IDX((*top_opnd));
01465 line = IR_LINE_NUM(ir_idx);
01466 col = IR_COL_NUM(ir_idx);
01467 tmp_idx = gen_compiler_tmp(line, col, Priv, TRUE);
01468 AT_SEMANTICS_DONE(tmp_idx) = TRUE;
01469 ATD_TYPE_IDX(tmp_idx) = IR_TYPE_IDX(ir_idx);
01470 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_STACK_IDX(curr_scp_idx);
01471
01472 OPND_FLD(opnd) = AT_Tbl_Idx;
01473 OPND_IDX(opnd) = tmp_idx;
01474 OPND_LINE_NUM(opnd) = line;
01475 OPND_COL_NUM(opnd) = col;
01476
01477 create_struct_constructor_asg(top_opnd,
01478 &opnd);
01479
01480 OPND_FLD((*top_opnd)) = AT_Tbl_Idx;
01481 OPND_IDX((*top_opnd)) = tmp_idx;
01482 OPND_LINE_NUM((*top_opnd)) = line;
01483 OPND_COL_NUM((*top_opnd)) = col;
01484
01485 defer_stmt_expansion = save_defer_stmt_expansion;
01486 stmt_expansion_control_end(top_opnd);
01487
01488 TRACE (Func_Exit, "create_runtime_struct_constructor", NULL);
01489
01490 return(ok);
01491
01492 }
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514 void analyse_loops(opnd_type *top_opnd,
01515 opnd_type *size_opnd,
01516 size_level_type *constructor_size_level)
01517
01518 {
01519 int col;
01520 int div_idx;
01521 opnd_type end_opnd;
01522 opnd_type inc_opnd;
01523 int ir_idx;
01524 int line;
01525 int lcv_attr;
01526 int list_idx;
01527 int list2_idx;
01528 int max_idx;
01529 int minus_idx;
01530 opnd_type mopnd;
01531 int mult_idx;
01532 opnd_type opnd;
01533 int plus_idx;
01534 opnd_type popnd;
01535 size_level_type size_level_l;
01536 size_level_type size_level_r;
01537 opnd_type size_opnd_l;
01538 opnd_type size_opnd_r;
01539 opnd_type slice_size_opnd;
01540 opnd_type start_opnd;
01541
01542
01543 TRACE (Func_Entry, "analyse_loops", NULL);
01544
01545 find_opnd_line_and_column(top_opnd, &line, &col);
01546
01547 *size_opnd = null_opnd;
01548 OPND_LINE_NUM((*size_opnd)) = line;
01549 OPND_COL_NUM((*size_opnd)) = col;
01550
01551 switch(OPND_FLD((*top_opnd))) {
01552 case CN_Tbl_Idx :
01553 OPND_FLD((*size_opnd)) = CN_Tbl_Idx;
01554 OPND_IDX((*size_opnd)) = CN_INTEGER_ONE_IDX;
01555 break;
01556
01557 case AT_Tbl_Idx :
01558 OPND_FLD((*size_opnd)) = CN_Tbl_Idx;
01559 OPND_IDX((*size_opnd)) = CN_INTEGER_ONE_IDX;
01560 break;
01561
01562 case IR_Tbl_Idx :
01563
01564 ir_idx = OPND_IDX((*top_opnd));
01565
01566 switch(IR_OPR(ir_idx)) {
01567
01568 case Array_Construct_Opr :
01569 case Constant_Array_Construct_Opr :
01570
01571
01572 determine_slice_size(IR_IDX_R(ir_idx), size_opnd,
01573 constructor_size_level);
01574
01575 break;
01576
01577 case Struct_Construct_Opr :
01578 case Constant_Struct_Construct_Opr :
01579
01580 OPND_FLD((*size_opnd)) = CN_Tbl_Idx;
01581 OPND_IDX((*size_opnd)) = CN_INTEGER_ONE_IDX;
01582 break;
01583
01584 case Implied_Do_Opr :
01585
01586 determine_slice_size(IR_IDX_L(ir_idx), &slice_size_opnd,
01587 constructor_size_level);
01588
01589 line = IR_LINE_NUM(ir_idx);
01590 col = IR_COL_NUM(ir_idx);
01591
01592 list_idx = IR_IDX_R(ir_idx);
01593 lcv_attr = IL_IDX(list_idx);
01594
01595 list_idx = IL_NEXT_LIST_IDX(list_idx);
01596 COPY_OPND(start_opnd, IL_OPND(list_idx));
01597
01598 list_idx = IL_NEXT_LIST_IDX(list_idx);
01599 COPY_OPND(end_opnd, IL_OPND(list_idx));
01600
01601 list_idx = IL_NEXT_LIST_IDX(list_idx);
01602 COPY_OPND(inc_opnd, IL_OPND(list_idx));
01603
01604 if (*constructor_size_level == Simple_Expr_Size) {
01605
01606
01607 minus_idx = gen_ir(OPND_FLD(end_opnd), OPND_IDX(end_opnd),
01608 Minus_Opr, SA_INTEGER_DEFAULT_TYPE, line, col,
01609 OPND_FLD(start_opnd),OPND_IDX(start_opnd));
01610
01611 plus_idx = gen_ir(IR_Tbl_Idx, minus_idx,
01612 Plus_Opr, SA_INTEGER_DEFAULT_TYPE, line, col,
01613 OPND_FLD(inc_opnd), OPND_IDX(inc_opnd));
01614
01615 div_idx = gen_ir(IR_Tbl_Idx, plus_idx,
01616 Div_Opr, SA_INTEGER_DEFAULT_TYPE, line, col,
01617 OPND_FLD(inc_opnd), OPND_IDX(inc_opnd));
01618
01619 NTR_IR_TBL(max_idx);
01620 IR_OPR(max_idx) = Max_Opr;
01621 IR_TYPE_IDX(max_idx) = SA_INTEGER_DEFAULT_TYPE;
01622 IR_LINE_NUM(max_idx) = line;
01623 IR_COL_NUM(max_idx) = col;
01624 IR_FLD_L(max_idx) = IL_Tbl_Idx;
01625 IR_LIST_CNT_L(max_idx)= 2;
01626 NTR_IR_LIST_TBL(list2_idx);
01627 IR_IDX_L(max_idx) = list2_idx;
01628 IL_FLD(list2_idx) = CN_Tbl_Idx;
01629 IL_IDX(list2_idx) = CN_INTEGER_ZERO_IDX;
01630 IL_LINE_NUM(list2_idx) = line;
01631 IL_COL_NUM(list2_idx) = col;
01632
01633 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list2_idx));
01634 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list2_idx)) = list2_idx;
01635 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
01636
01637 IL_FLD(list2_idx) = IR_Tbl_Idx;
01638 IL_IDX(list2_idx) = div_idx;
01639
01640 OPND_FLD(mopnd) = IR_Tbl_Idx;
01641 OPND_IDX(mopnd) = max_idx;
01642
01643 check_for_dependencies(&mopnd, constructor_size_level);
01644 }
01645
01646 if (*constructor_size_level == Guess_Size) {
01647 *size_opnd = null_opnd;
01648 goto EXIT;
01649 }
01650 else if (*constructor_size_level == Simple_Expr_Size) {
01651 mult_idx = gen_ir(OPND_FLD(mopnd), OPND_IDX(mopnd),
01652 Mult_Opr, SA_INTEGER_DEFAULT_TYPE, line, col,
01653 OPND_FLD(slice_size_opnd),
01654 OPND_IDX(slice_size_opnd));
01655
01656 OPND_FLD((*size_opnd)) = IR_Tbl_Idx;
01657 OPND_IDX((*size_opnd)) = mult_idx;
01658
01659 }
01660 else {
01661
01662 NTR_IR_TBL(ir_idx);
01663 IR_OPR(ir_idx) = Implied_Do_Opr;
01664 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
01665 IR_LINE_NUM(ir_idx) = line;
01666 IR_COL_NUM(ir_idx) = col;
01667
01668 NTR_IR_LIST_TBL(list_idx);
01669 IR_FLD_R(ir_idx) = IL_Tbl_Idx;
01670 IR_IDX_R(ir_idx) = list_idx;
01671 IR_LIST_CNT_R(ir_idx) = 4;
01672
01673 IL_FLD(list_idx) = AT_Tbl_Idx;
01674 IL_IDX(list_idx) = lcv_attr;
01675 IL_LINE_NUM(list_idx) = line;
01676 IL_COL_NUM(list_idx) = col;
01677
01678 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01679 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01680 list_idx = IL_NEXT_LIST_IDX(list_idx);
01681
01682 COPY_OPND(IL_OPND(list_idx), start_opnd);
01683
01684 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01685 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01686 list_idx = IL_NEXT_LIST_IDX(list_idx);
01687
01688 COPY_OPND(IL_OPND(list_idx), end_opnd);
01689
01690 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01691 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01692 list_idx = IL_NEXT_LIST_IDX(list_idx);
01693
01694 COPY_OPND(IL_OPND(list_idx), inc_opnd);
01695
01696 COPY_OPND(IR_OPND_L(ir_idx), slice_size_opnd);
01697
01698 OPND_FLD((*size_opnd)) = IR_Tbl_Idx;
01699 OPND_IDX((*size_opnd)) = ir_idx;
01700 }
01701
01702 break;
01703
01704
01705 case Uplus_Opr :
01706 case Uminus_Opr :
01707 case Paren_Opr :
01708 case Not_Opr :
01709 case Bnot_Opr :
01710 COPY_OPND(opnd, IR_OPND_L(ir_idx));
01711 analyse_loops(&opnd, size_opnd, constructor_size_level);
01712 break;
01713
01714 case Power_Opr :
01715 case Mult_Opr :
01716 case Div_Opr :
01717 case Minus_Opr :
01718 case Plus_Opr :
01719 case Concat_Opr :
01720 case Eq_Opr :
01721 case Ne_Opr :
01722 case Lg_Opr :
01723 case Lt_Opr :
01724 case Le_Opr :
01725 case Gt_Opr :
01726 case Ge_Opr :
01727 case And_Opr :
01728 case Or_Opr :
01729 case Eqv_Opr :
01730 case Neqv_Opr :
01731 case Band_Opr :
01732 case Bor_Opr :
01733 case Beqv_Opr :
01734 case Bneqv_Opr :
01735 size_level_l = *constructor_size_level;
01736 size_level_r = *constructor_size_level;
01737
01738 COPY_OPND(opnd, IR_OPND_L(ir_idx));
01739 analyse_loops(&opnd, &size_opnd_l, &size_level_l);
01740 COPY_OPND(opnd, IR_OPND_R(ir_idx));
01741 analyse_loops(&opnd, &size_opnd_r, &size_level_r);
01742
01743 if (OPND_FLD(size_opnd_l) == CN_Tbl_Idx &&
01744 compare_cn_and_value(OPND_IDX(size_opnd_l), 1, Eq_Opr)) {
01745 COPY_OPND((*size_opnd), size_opnd_r);
01746 *constructor_size_level = size_level_r;
01747 }
01748 else if (OPND_FLD(size_opnd_r) == CN_Tbl_Idx &&
01749 compare_cn_and_value(OPND_IDX(size_opnd_r),
01750 1,
01751 Eq_Opr)) {
01752 COPY_OPND((*size_opnd), size_opnd_l);
01753 *constructor_size_level = size_level_l;
01754 }
01755 else if (size_level_l < size_level_r) {
01756 COPY_OPND((*size_opnd), size_opnd_l);
01757 *constructor_size_level = size_level_l;
01758 }
01759 else {
01760 COPY_OPND((*size_opnd), size_opnd_r);
01761 *constructor_size_level = size_level_r;
01762 }
01763 break;
01764
01765 case Whole_Subscript_Opr :
01766 case Section_Subscript_Opr :
01767
01768 mopnd = null_opnd;
01769
01770 list_idx = IR_IDX_R(ir_idx);
01771
01772 while (list_idx) {
01773
01774 COPY_OPND(opnd, IL_OPND(list_idx));
01775 analyse_loops(&opnd, &popnd, constructor_size_level);
01776
01777 if (*constructor_size_level == Guess_Size) {
01778 *size_opnd = null_opnd;
01779 goto EXIT;
01780 }
01781
01782 if (OPND_FLD(mopnd) == NO_Tbl_Idx) {
01783 COPY_OPND(mopnd, popnd);
01784 }
01785 else {
01786 NTR_IR_TBL(mult_idx);
01787 IR_OPR(mult_idx) = Mult_Opr;
01788 IR_TYPE_IDX(mult_idx) = SA_INTEGER_DEFAULT_TYPE;
01789 IR_LINE_NUM(mult_idx) = line;
01790 IR_COL_NUM(mult_idx) = col;
01791 COPY_OPND(IR_OPND_L(mult_idx), mopnd);
01792 COPY_OPND(IR_OPND_R(mult_idx), popnd);
01793 OPND_FLD(mopnd) = IR_Tbl_Idx;
01794 OPND_IDX(mopnd) = mult_idx;
01795 }
01796 list_idx = IL_NEXT_LIST_IDX(list_idx);
01797 }
01798
01799 COPY_OPND((*size_opnd), mopnd);
01800 break;
01801
01802 case Subscript_Opr :
01803 case Struct_Opr :
01804 case Whole_Substring_Opr :
01805 case Substring_Opr :
01806 COPY_OPND(opnd, IR_OPND_L(ir_idx));
01807 analyse_loops(&opnd, size_opnd, constructor_size_level);
01808 break;
01809
01810 case Call_Opr :
01811
01812 break;
01813
01814 default :
01815 *constructor_size_level = Guess_Size;
01816 *size_opnd = null_opnd;
01817 break;
01818 }
01819 break;
01820
01821 case IL_Tbl_Idx :
01822 break;
01823 }
01824
01825 EXIT:
01826
01827 TRACE (Func_Exit, "analyse_loops", NULL);
01828
01829 return;
01830
01831 }
01832
01833
01834
01835
01836
01837
01838
01839
01840
01841
01842
01843
01844
01845
01846
01847
01848
01849
01850 static void check_for_dependencies(opnd_type *opnd,
01851 size_level_type *constructor_size_level)
01852
01853 {
01854 int attr_idx;
01855 int col;
01856 int line;
01857 int list_idx;
01858 opnd_type topnd;
01859
01860 TRACE (Func_Entry, "check_for_dependencies", NULL);
01861
01862 if (*constructor_size_level == Guess_Size) {
01863 TRACE (Func_Exit, "check_for_dependencies", NULL);
01864 return;
01865 }
01866
01867
01868 switch (OPND_FLD((*opnd))) {
01869 case AT_Tbl_Idx :
01870 attr_idx = OPND_IDX((*opnd));
01871 find_opnd_line_and_column(opnd, &line, &col);
01872
01873 if (ATD_IMP_DO_LCV(attr_idx)) {
01874 *constructor_size_level = Interp_Loop_Size;
01875 }
01876 else if (ATD_CLASS(attr_idx) == Compiler_Tmp &&
01877 ATD_FLD(attr_idx) == IR_Tbl_Idx &&
01878 IR_OPR(ATD_TMP_IDX(attr_idx)) == Asg_Opr &&
01879 line <= AT_DEF_LINE(attr_idx)) {
01880
01881
01882 COPY_OPND((*opnd), IR_OPND_R(ATD_TMP_IDX(attr_idx)));
01883 check_for_dependencies(opnd, constructor_size_level);
01884 }
01885 break;
01886 case IR_Tbl_Idx :
01887 if (IR_OPR(OPND_IDX((*opnd))) == Call_Opr) {
01888 *constructor_size_level = Guess_Size;
01889 }
01890 else if (IR_OPR(OPND_IDX((*opnd))) == Stmt_Expansion_Opr) {
01891 *constructor_size_level = Guess_Size;
01892 }
01893 else if (IR_OPR(OPND_IDX((*opnd))) == Dv_Access_El_Len ||
01894 IR_OPR(OPND_IDX((*opnd))) == Dv_Access_Low_Bound ||
01895 IR_OPR(OPND_IDX((*opnd))) == Dv_Access_Extent ||
01896 IR_OPR(OPND_IDX((*opnd))) == Dv_Access_Stride_Mult) {
01897
01898 *constructor_size_level = Guess_Size;
01899 }
01900 else {
01901 COPY_OPND(topnd, IR_OPND_L(OPND_IDX((*opnd))));
01902 check_for_dependencies(&topnd, constructor_size_level);
01903 COPY_OPND(IR_OPND_L(OPND_IDX((*opnd))), topnd);
01904
01905 if (*constructor_size_level != Guess_Size) {
01906 COPY_OPND(topnd, IR_OPND_R(OPND_IDX((*opnd))));
01907 check_for_dependencies(&topnd, constructor_size_level);
01908 COPY_OPND(IR_OPND_R(OPND_IDX((*opnd))), topnd);
01909 }
01910 }
01911
01912 break;
01913
01914 case IL_Tbl_Idx :
01915 list_idx = OPND_IDX((*opnd));
01916 while (list_idx) {
01917
01918 COPY_OPND(topnd, IL_OPND(list_idx));
01919 check_for_dependencies(&topnd, constructor_size_level);
01920 COPY_OPND(IL_OPND(list_idx), topnd);
01921
01922 if (*constructor_size_level == Guess_Size) {
01923 break;
01924 }
01925
01926 list_idx = IL_NEXT_LIST_IDX(list_idx);
01927 }
01928 break;
01929
01930 case CN_Tbl_Idx :
01931 case NO_Tbl_Idx :
01932 break;
01933 }
01934
01935 TRACE (Func_Exit, "check_for_dependencies", NULL);
01936
01937 return;
01938
01939 }
01940
01941
01942
01943
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953
01954
01955
01956
01957
01958
01959
01960
01961 static void create_array_constructor_asg(opnd_type *top_opnd,
01962 opnd_type *target_base_opnd,
01963 int target_sub_idx,
01964 int size_limit_attr)
01965
01966 {
01967 int attr_idx;
01968 int col;
01969 opnd_type end_opnd;
01970 expr_arg_type exp_desc;
01971 opnd_type inc_opnd;
01972 int ir_idx;
01973 int lcv_attr;
01974 int line;
01975 int list_idx;
01976 opnd_type opnd;
01977 int place_idx;
01978 int save_curr_stmt_sh_idx;
01979 int sh_idx;
01980 opnd_type start_opnd;
01981 int sub_idx;
01982
01983
01984 TRACE (Func_Entry, "create_array_constructor_asg", NULL);
01985
01986 if (OPND_FLD((*top_opnd)) == IR_Tbl_Idx) {
01987 ir_idx = OPND_IDX((*top_opnd));
01988 }
01989 else {
01990 find_opnd_line_and_column(top_opnd, &line, &col);
01991 PRINTMSG(line, 985, Internal, col);
01992 return;
01993 }
01994
01995 if (IR_OPR(ir_idx) == Array_Construct_Opr) {
01996
01997 do_slice_asg(IR_IDX_R(ir_idx), target_base_opnd, target_sub_idx,
01998 size_limit_attr);
01999 }
02000 else if (IR_OPR(ir_idx) == Constant_Array_Construct_Opr) {
02001
02002 exp_desc = arg_info_list[IR_IDX_L(ir_idx)].ed;
02003 create_constructor_constant(top_opnd, &exp_desc);
02004
02005 do_single_asg(top_opnd, &exp_desc, target_base_opnd, target_sub_idx,
02006 size_limit_attr);
02007
02008 }
02009 else if (IR_OPR(ir_idx) == Implied_Do_Opr) {
02010 gen_sh(Before, Assignment_Stmt, IR_LINE_NUM(ir_idx), IR_COL_NUM(ir_idx),
02011 FALSE, FALSE, TRUE);
02012 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
02013 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
02014 NTR_IR_TBL(place_idx);
02015 IR_OPR(place_idx) = Null_Opr;
02016 SH_IR_IDX(curr_stmt_sh_idx) = place_idx;
02017
02018 list_idx = IR_IDX_R(ir_idx);
02019 lcv_attr = IL_IDX(list_idx);
02020 list_idx = IL_NEXT_LIST_IDX(list_idx);
02021 COPY_OPND(start_opnd, IL_OPND(list_idx));
02022 expand_stmts(&start_opnd, NULL);
02023
02024 list_idx = IL_NEXT_LIST_IDX(list_idx);
02025 COPY_OPND(end_opnd, IL_OPND(list_idx));
02026 expand_stmts(&end_opnd, NULL);
02027
02028 list_idx = IL_NEXT_LIST_IDX(list_idx);
02029 COPY_OPND(inc_opnd, IL_OPND(list_idx));
02030 expand_stmts(&inc_opnd, NULL);
02031
02032 create_loop_stmts(lcv_attr,
02033 &start_opnd,
02034 &end_opnd,
02035 &inc_opnd,
02036 curr_stmt_sh_idx,
02037 curr_stmt_sh_idx);
02038
02039 do_slice_asg(IR_IDX_L(ir_idx), target_base_opnd, target_sub_idx,
02040 size_limit_attr);
02041
02042
02043
02044 sh_idx = curr_stmt_sh_idx;
02045
02046 remove_sh(sh_idx);
02047 FREE_IR_NODE(SH_IR_IDX(sh_idx));
02048 FREE_SH_NODE(sh_idx);
02049
02050 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
02051 }
02052 else if (IR_OPR(ir_idx) == Struct_Construct_Opr) {
02053
02054 line = IR_LINE_NUM(ir_idx);
02055 col = IR_COL_NUM(ir_idx);
02056
02057 NTR_IR_TBL(sub_idx);
02058 IR_OPR(sub_idx) = Subscript_Opr;
02059 IR_TYPE_IDX(sub_idx) = SA_INTEGER_DEFAULT_TYPE;
02060 IR_LINE_NUM(sub_idx) = line;
02061 IR_COL_NUM(sub_idx) = col;
02062 COPY_OPND(IR_OPND_L(sub_idx), (*target_base_opnd));
02063 NTR_IR_LIST_TBL(list_idx);
02064 IR_FLD_R(sub_idx) = IL_Tbl_Idx;
02065 IR_IDX_R(sub_idx) = list_idx;
02066 IR_LIST_CNT_R(sub_idx) = 1;
02067 IL_FLD(list_idx) = AT_Tbl_Idx;
02068 IL_IDX(list_idx) = target_sub_idx;
02069 IL_LINE_NUM(list_idx) = line;
02070 IL_COL_NUM(list_idx) = col;
02071
02072 OPND_FLD(opnd) = IR_Tbl_Idx;
02073 OPND_IDX(opnd) = sub_idx;
02074
02075 create_struct_constructor_asg(top_opnd, &opnd);
02076
02077 increment_subscript(target_sub_idx);
02078
02079 if (size_limit_attr) {
02080 attr_idx = find_left_attr(target_base_opnd);
02081 test_size_stmts(attr_idx, target_sub_idx, size_limit_attr);
02082 }
02083 }
02084 else if (IR_OPR(ir_idx) == Constant_Struct_Construct_Opr) {
02085
02086 create_constructor_constant(top_opnd, &exp_desc);
02087 do_single_asg(top_opnd, &exp_desc, target_base_opnd, target_sub_idx,
02088 size_limit_attr);
02089 }
02090 else {
02091 PRINTMSG(IR_LINE_NUM(ir_idx), 986, Internal, IR_COL_NUM(ir_idx));
02092 }
02093
02094 TRACE (Func_Exit, "create_array_constructor_asg", NULL);
02095
02096 return;
02097
02098 }
02099
02100
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116
02117
02118
02119
02120 static void do_slice_asg(int list_idx,
02121 opnd_type *target_base_opnd,
02122 int target_sub_idx,
02123 int size_limit_attr)
02124
02125 {
02126 expr_arg_type exp_desc;
02127 int info_idx;
02128 opnd_type opnd;
02129
02130
02131 TRACE (Func_Entry, "do_slice_asg", NULL);
02132
02133 while (list_idx) {
02134
02135 if (IL_FLD(list_idx) == IR_Tbl_Idx &&
02136 (IR_OPR(IL_IDX(list_idx)) == Array_Construct_Opr ||
02137 IR_OPR(IL_IDX(list_idx)) == Struct_Construct_Opr ||
02138 IR_OPR(IL_IDX(list_idx)) == Constant_Array_Construct_Opr ||
02139 IR_OPR(IL_IDX(list_idx)) == Constant_Struct_Construct_Opr ||
02140 IR_OPR(IL_IDX(list_idx)) == Implied_Do_Opr)) {
02141
02142 COPY_OPND(opnd, IL_OPND(list_idx));
02143 create_array_constructor_asg(&opnd, target_base_opnd, target_sub_idx,
02144 size_limit_attr);
02145 }
02146 else {
02147
02148 info_idx = IL_ARG_DESC_IDX(list_idx);
02149 COPY_OPND(opnd, IL_OPND(list_idx));
02150 exp_desc = arg_info_list[info_idx].ed;
02151 expand_stmts(&opnd, &exp_desc);
02152 COPY_OPND(IL_OPND(list_idx), opnd);
02153
02154 do_single_asg(&opnd, &exp_desc, target_base_opnd, target_sub_idx,
02155 size_limit_attr);
02156 }
02157
02158 list_idx = IL_NEXT_LIST_IDX(list_idx);
02159 }
02160
02161 TRACE (Func_Exit, "do_slice_asg", NULL);
02162
02163 return;
02164
02165 }
02166
02167
02168
02169
02170
02171
02172
02173
02174
02175
02176
02177
02178
02179
02180
02181
02182
02183
02184
02185 static void determine_slice_size(int list_idx,
02186 opnd_type *size_opnd,
02187 size_level_type *constructor_size_level)
02188
02189 {
02190 expr_arg_type exp_desc;
02191 int i;
02192 opnd_type mopnd;
02193 int mult_idx;
02194 opnd_type opnd;
02195 int plus_idx;
02196 opnd_type popnd;
02197 long_type scalar_cnt;
02198
02199
02200 TRACE (Func_Entry, "determine_slice_size", NULL);
02201
02202 scalar_cnt = 0L;
02203
02204 popnd = null_opnd;
02205
02206 while (list_idx) {
02207
02208 if (IL_FLD(list_idx) == IR_Tbl_Idx &&
02209 (IR_OPR(IL_IDX(list_idx)) == Array_Construct_Opr ||
02210 IR_OPR(IL_IDX(list_idx)) == Constant_Array_Construct_Opr ||
02211 IR_OPR(IL_IDX(list_idx)) == Implied_Do_Opr)) {
02212
02213 COPY_OPND(opnd, IL_OPND(list_idx));
02214 analyse_loops(&opnd, &mopnd, constructor_size_level);
02215
02216 if (*constructor_size_level == Guess_Size) {
02217 *size_opnd = null_opnd;
02218 goto EXIT;
02219 }
02220
02221 if (OPND_FLD(popnd) == NO_Tbl_Idx) {
02222 COPY_OPND(popnd, mopnd);
02223 }
02224 else {
02225 NTR_IR_TBL(plus_idx);
02226 IR_OPR(plus_idx) = Plus_Opr;
02227 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02228 IR_LINE_NUM(plus_idx) = stmt_start_line;
02229 IR_COL_NUM(plus_idx) = stmt_start_col;
02230 COPY_OPND(IR_OPND_L(plus_idx), popnd);
02231 COPY_OPND(IR_OPND_R(plus_idx), mopnd);
02232
02233 OPND_FLD(popnd) = IR_Tbl_Idx;
02234 OPND_IDX(popnd) = plus_idx;
02235 }
02236 list_idx = IL_NEXT_LIST_IDX(list_idx);
02237 continue;
02238 }
02239
02240 exp_desc = arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed;
02241
02242 if (exp_desc.has_constructor) {
02243
02244 COPY_OPND(opnd, IL_OPND(list_idx));
02245 analyse_loops(&opnd, &mopnd, constructor_size_level);
02246
02247 if (*constructor_size_level == Guess_Size) {
02248 *size_opnd = null_opnd;
02249 goto EXIT;
02250 }
02251
02252 if (OPND_FLD(popnd) == NO_Tbl_Idx) {
02253 COPY_OPND(popnd, mopnd);
02254 }
02255 else {
02256 NTR_IR_TBL(plus_idx);
02257 IR_OPR(plus_idx) = Plus_Opr;
02258 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02259 IR_LINE_NUM(plus_idx) = stmt_start_line;
02260 IR_COL_NUM(plus_idx) = stmt_start_col;
02261 COPY_OPND(IR_OPND_L(plus_idx), popnd);
02262 COPY_OPND(IR_OPND_R(plus_idx), mopnd);
02263 OPND_FLD(popnd) = IR_Tbl_Idx;
02264 OPND_IDX(popnd) = plus_idx;
02265 }
02266 }
02267 else if (exp_desc.rank) {
02268 for (i = 0; i < exp_desc.rank; i++) {
02269
02270 if (exp_desc.shape[i].fld == NO_Tbl_Idx) {
02271 *constructor_size_level = Guess_Size;
02272 *size_opnd = null_opnd;
02273 goto EXIT;
02274 }
02275
02276 if (i == 0) {
02277 COPY_OPND(mopnd, exp_desc.shape[i]);
02278 OPND_LINE_NUM(mopnd) = stmt_start_line;
02279 OPND_COL_NUM(mopnd) = stmt_start_col;
02280 }
02281 else {
02282 NTR_IR_TBL(mult_idx);
02283 IR_OPR(mult_idx) = Mult_Opr;
02284 IR_TYPE_IDX(mult_idx) = SA_INTEGER_DEFAULT_TYPE;
02285 IR_LINE_NUM(mult_idx) = stmt_start_line;
02286 IR_COL_NUM(mult_idx) = stmt_start_col;
02287 COPY_OPND(IR_OPND_L(mult_idx), mopnd);
02288 COPY_OPND(IR_OPND_R(mult_idx), exp_desc.shape[i]);
02289 IR_LINE_NUM_R(mult_idx) = stmt_start_line;
02290 IR_COL_NUM_R(mult_idx) = stmt_start_col;
02291 OPND_FLD(mopnd) = IR_Tbl_Idx;
02292 OPND_IDX(mopnd) = mult_idx;
02293 }
02294 }
02295
02296 check_for_dependencies(&mopnd, constructor_size_level);
02297
02298 if (*constructor_size_level == Guess_Size) {
02299 *size_opnd = null_opnd;
02300 goto EXIT;
02301 }
02302
02303 if (OPND_FLD(popnd) == NO_Tbl_Idx) {
02304 COPY_OPND(popnd, mopnd);
02305 }
02306 else {
02307 NTR_IR_TBL(plus_idx);
02308 IR_OPR(plus_idx) = Plus_Opr;
02309 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02310 IR_LINE_NUM(plus_idx) = stmt_start_line;
02311 IR_COL_NUM(plus_idx) = stmt_start_col;
02312 COPY_OPND(IR_OPND_L(plus_idx), popnd);
02313 COPY_OPND(IR_OPND_R(plus_idx), mopnd);
02314 OPND_FLD(popnd) = IR_Tbl_Idx;
02315 OPND_IDX(popnd) = plus_idx;
02316 }
02317 }
02318 else {
02319 scalar_cnt++;
02320 }
02321 list_idx = IL_NEXT_LIST_IDX(list_idx);
02322 }
02323
02324 if (scalar_cnt > 0) {
02325 OPND_FLD(mopnd) = CN_Tbl_Idx;
02326 OPND_IDX(mopnd) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, scalar_cnt);
02327 OPND_LINE_NUM(mopnd) = stmt_start_line;
02328 OPND_COL_NUM(mopnd) = stmt_start_col;
02329
02330 if (OPND_FLD(popnd) == NO_Tbl_Idx) {
02331 COPY_OPND(popnd, mopnd);
02332 }
02333 else {
02334 NTR_IR_TBL(plus_idx);
02335 IR_OPR(plus_idx) = Plus_Opr;
02336 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02337 IR_LINE_NUM(plus_idx) = stmt_start_line;
02338 IR_COL_NUM(plus_idx) = stmt_start_col;
02339 COPY_OPND(IR_OPND_L(plus_idx), popnd);
02340 COPY_OPND(IR_OPND_R(plus_idx), mopnd);
02341 OPND_FLD(popnd) = IR_Tbl_Idx;
02342 OPND_IDX(popnd) = plus_idx;
02343 }
02344 }
02345
02346 COPY_OPND((*size_opnd), popnd);
02347
02348 EXIT:
02349
02350 TRACE (Func_Exit, "determine_slice_size", NULL);
02351
02352 return;
02353
02354 }
02355
02356
02357
02358
02359
02360
02361
02362
02363
02364
02365
02366
02367
02368
02369
02370
02371
02372
02373 static void create_interp_stmts(int ir_idx,
02374 int size_tmp_idx)
02375
02376 {
02377 int asg_idx;
02378 int col;
02379 opnd_type end_opnd;
02380 opnd_type inc_opnd;
02381 int lcv_attr;
02382 int line;
02383 int list_idx;
02384 int plus_idx;
02385 int save_curr_stmt_sh_idx;
02386 int sh_idx;
02387 opnd_type start_opnd;
02388
02389
02390 TRACE (Func_Entry, "create_interp_stmts", NULL);
02391
02392 line = IR_LINE_NUM(ir_idx);
02393 col = IR_COL_NUM(ir_idx);
02394
02395 if (IR_OPR(ir_idx) == Implied_Do_Opr) {
02396 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
02397
02398 gen_sh(Before, Assignment_Stmt, line, col,
02399 FALSE, FALSE, TRUE);
02400
02401 NTR_IR_TBL(asg_idx);
02402 IR_OPR(asg_idx) = Null_Opr;
02403
02404 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
02405 SH_IR_IDX(curr_stmt_sh_idx) = asg_idx;
02406
02407 list_idx = IR_IDX_R(ir_idx);
02408
02409 lcv_attr = IL_IDX(list_idx);
02410
02411 list_idx = IL_NEXT_LIST_IDX(list_idx);
02412 COPY_OPND(start_opnd, IL_OPND(list_idx));
02413
02414 list_idx = IL_NEXT_LIST_IDX(list_idx);
02415 COPY_OPND(end_opnd, IL_OPND(list_idx));
02416
02417 list_idx = IL_NEXT_LIST_IDX(list_idx);
02418 COPY_OPND(inc_opnd, IL_OPND(list_idx));
02419
02420
02421
02422 create_loop_stmts(lcv_attr,
02423 &start_opnd,
02424 &end_opnd,
02425 &inc_opnd,
02426 curr_stmt_sh_idx,
02427 curr_stmt_sh_idx);
02428
02429 if (IR_FLD_L(ir_idx) == IR_Tbl_Idx &&
02430 (IR_OPR(IR_IDX_L(ir_idx)) == Implied_Do_Opr ||
02431 IR_OPR(IR_IDX_L(ir_idx)) == Plus_Opr)) {
02432
02433
02434 create_interp_stmts(IR_IDX_L(ir_idx), size_tmp_idx);
02435 }
02436 else {
02437 NTR_IR_TBL(asg_idx);
02438 IR_OPR(asg_idx) = Asg_Opr;
02439 IR_TYPE_IDX(asg_idx) = ATD_TYPE_IDX(size_tmp_idx);
02440 IR_LINE_NUM(asg_idx) = line;
02441 IR_COL_NUM(asg_idx) = col;
02442 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
02443 IR_IDX_L(asg_idx) = size_tmp_idx;
02444 IR_LINE_NUM_L(asg_idx) = line;
02445 IR_COL_NUM_L(asg_idx) = col;
02446
02447 NTR_IR_TBL(plus_idx);
02448 IR_OPR(plus_idx) = Plus_Opr;
02449 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02450 IR_LINE_NUM(plus_idx) = line;
02451 IR_COL_NUM(plus_idx) = col;
02452 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
02453 IR_IDX_R(asg_idx) = plus_idx;
02454 IR_FLD_L(plus_idx) = AT_Tbl_Idx;
02455 IR_IDX_L(plus_idx) = size_tmp_idx;
02456 IR_LINE_NUM_L(plus_idx) = line;
02457 IR_COL_NUM_L(plus_idx) = col;
02458 COPY_OPND(IR_OPND_R(plus_idx), IR_OPND_L(ir_idx));
02459
02460 gen_sh(Before, Assignment_Stmt, line, col,
02461 FALSE, FALSE, TRUE);
02462 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
02463 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02464 }
02465
02466
02467 sh_idx = curr_stmt_sh_idx;
02468 remove_sh(sh_idx);
02469 FREE_IR_NODE(SH_IR_IDX(sh_idx));
02470 FREE_SH_NODE(sh_idx);
02471
02472 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
02473 }
02474 else if (IR_OPR(ir_idx) == Plus_Opr) {
02475
02476 if (IR_FLD_L(ir_idx) == IR_Tbl_Idx &&
02477 (IR_OPR(IR_IDX_L(ir_idx)) == Implied_Do_Opr ||
02478 IR_OPR(IR_IDX_L(ir_idx)) == Plus_Opr)) {
02479
02480 create_interp_stmts(IR_IDX_L(ir_idx), size_tmp_idx);
02481 }
02482 else {
02483 NTR_IR_TBL(asg_idx);
02484 IR_OPR(asg_idx) = Asg_Opr;
02485 IR_TYPE_IDX(asg_idx) = SA_INTEGER_DEFAULT_TYPE;
02486 IR_LINE_NUM(asg_idx) = line;
02487 IR_COL_NUM(asg_idx) = col;
02488 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
02489 IR_IDX_L(asg_idx) = size_tmp_idx;
02490 IR_LINE_NUM_L(asg_idx) = line;
02491 IR_COL_NUM_L(asg_idx) = col;
02492
02493 NTR_IR_TBL(plus_idx);
02494 IR_OPR(plus_idx) = Plus_Opr;
02495 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02496 IR_LINE_NUM(plus_idx) = line;
02497 IR_COL_NUM(plus_idx) = col;
02498 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
02499 IR_IDX_R(asg_idx) = plus_idx;
02500 IR_FLD_L(plus_idx) = AT_Tbl_Idx;
02501 IR_IDX_L(plus_idx) = size_tmp_idx;
02502 IR_LINE_NUM_L(plus_idx) = line;
02503 IR_COL_NUM_L(plus_idx) = col;
02504 COPY_OPND(IR_OPND_R(plus_idx), IR_OPND_L(ir_idx));
02505
02506 gen_sh(Before, Assignment_Stmt, line, col,
02507 FALSE, FALSE, TRUE);
02508 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
02509 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02510 }
02511
02512 if (IR_FLD_R(ir_idx) == IR_Tbl_Idx &&
02513 (IR_OPR(IR_IDX_R(ir_idx)) == Implied_Do_Opr ||
02514 IR_OPR(IR_IDX_R(ir_idx)) == Plus_Opr)) {
02515
02516 create_interp_stmts(IR_IDX_R(ir_idx), size_tmp_idx);
02517 }
02518 else {
02519 NTR_IR_TBL(asg_idx);
02520 IR_OPR(asg_idx) = Asg_Opr;
02521 IR_TYPE_IDX(asg_idx) = SA_INTEGER_DEFAULT_TYPE;
02522 IR_LINE_NUM(asg_idx) = line;
02523 IR_COL_NUM(asg_idx) = col;
02524 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
02525 IR_IDX_L(asg_idx) = size_tmp_idx;
02526 IR_LINE_NUM_L(asg_idx) = line;
02527 IR_COL_NUM_L(asg_idx) = col;
02528
02529 NTR_IR_TBL(plus_idx);
02530 IR_OPR(plus_idx) = Plus_Opr;
02531 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02532 IR_LINE_NUM(plus_idx) = line;
02533 IR_COL_NUM(plus_idx) = col;
02534 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
02535 IR_IDX_R(asg_idx) = plus_idx;
02536 IR_FLD_L(plus_idx) = AT_Tbl_Idx;
02537 IR_IDX_L(plus_idx) = size_tmp_idx;
02538 IR_LINE_NUM_L(plus_idx) = line;
02539 IR_COL_NUM_L(plus_idx) = col;
02540 COPY_OPND(IR_OPND_R(plus_idx), IR_OPND_R(ir_idx));
02541
02542 gen_sh(Before, Assignment_Stmt, line, col,
02543 FALSE, FALSE, TRUE);
02544 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
02545 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02546 }
02547 }
02548
02549 TRACE (Func_Exit, "create_interp_stmts", NULL);
02550
02551 return;
02552
02553 }
02554
02555
02556
02557
02558
02559
02560
02561
02562
02563
02564
02565
02566
02567
02568
02569
02570
02571
02572
02573
02574
02575 static void do_single_asg(opnd_type *r_opnd,
02576 expr_arg_type *exp_desc,
02577 opnd_type *target_base_opnd,
02578 int target_sub_idx,
02579 int size_limit_attr)
02580
02581 {
02582 int asg_idx;
02583 int asg_idx2;
02584 int attr_idx;
02585 int col;
02586 int i;
02587 int line;
02588 int list2_idx;
02589 int minus_idx;
02590 int mult_idx;
02591 opnd_type opnd;
02592 int plus_idx;
02593 int sub_idx;
02594 int tmp_idx;
02595 int trip_idx;
02596
02597
02598 TRACE (Func_Entry, "do_single_asg", NULL);
02599
02600 find_opnd_line_and_column(r_opnd, &line, &col);
02601
02602 if (exp_desc->rank == 0) {
02603
02604 NTR_IR_TBL(sub_idx);
02605 IR_OPR(sub_idx) = Subscript_Opr;
02606 IR_TYPE_IDX(sub_idx) = exp_desc->type_idx;
02607 IR_LINE_NUM(sub_idx) = line;
02608 IR_COL_NUM(sub_idx) = col;
02609 COPY_OPND(IR_OPND_L(sub_idx), (*target_base_opnd));
02610
02611 NTR_IR_LIST_TBL(list2_idx);
02612 IR_FLD_R(sub_idx) = IL_Tbl_Idx;
02613 IR_IDX_R(sub_idx) = list2_idx;
02614 IR_LIST_CNT_R(sub_idx) = 1;
02615
02616 IL_FLD(list2_idx) = AT_Tbl_Idx;
02617 IL_IDX(list2_idx) = target_sub_idx;
02618 IL_LINE_NUM(list2_idx) = line;
02619 IL_COL_NUM(list2_idx) = col;
02620
02621 OPND_FLD(opnd) = IR_Tbl_Idx;
02622 OPND_IDX(opnd) = sub_idx;
02623
02624 if (exp_desc->type == Character) {
02625 gen_whole_substring(&opnd, 0);
02626 }
02627
02628 NTR_IR_TBL(asg_idx);
02629 IR_OPR(asg_idx) = Asg_Opr;
02630 IR_TYPE_IDX(asg_idx) = exp_desc->type_idx;
02631 IR_LINE_NUM(asg_idx) = line;
02632 IR_COL_NUM(asg_idx) = col;
02633 COPY_OPND(IR_OPND_L(asg_idx), opnd);
02634 COPY_OPND(IR_OPND_R(asg_idx), (*r_opnd));
02635
02636 gen_sh(Before, Assignment_Stmt, line, col,
02637 FALSE, FALSE, TRUE);
02638
02639 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
02640 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02641
02642 increment_subscript(target_sub_idx);
02643
02644 if (size_limit_attr) {
02645 attr_idx = find_left_attr(target_base_opnd);
02646 test_size_stmts(attr_idx, target_sub_idx, size_limit_attr);
02647 }
02648 }
02649 else if (exp_desc->rank == 1) {
02650
02651
02652
02653 NTR_IR_TBL(asg_idx);
02654 IR_OPR(asg_idx) = Asg_Opr;
02655 IR_TYPE_IDX(asg_idx) = SA_INTEGER_DEFAULT_TYPE;
02656 IR_LINE_NUM(asg_idx) = line;
02657 IR_COL_NUM(asg_idx) = col;
02658 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
02659 IR_IDX_L(asg_idx) = target_sub_idx;
02660 IR_LINE_NUM_L(asg_idx) = line;
02661 IR_COL_NUM_L(asg_idx) = col;
02662 NTR_IR_TBL(plus_idx);
02663 IR_OPR(plus_idx) = Plus_Opr;
02664 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02665 IR_LINE_NUM(plus_idx) = line;
02666 IR_COL_NUM(plus_idx) = col;
02667 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
02668 IR_IDX_R(asg_idx) = plus_idx;
02669
02670 IR_FLD_L(plus_idx) = AT_Tbl_Idx;
02671 IR_IDX_L(plus_idx) = target_sub_idx;
02672 IR_LINE_NUM_L(plus_idx) = line;
02673 IR_COL_NUM_L(plus_idx) = col;
02674 IR_FLD_R(plus_idx) = exp_desc->shape[0].fld;
02675 IR_IDX_R(plus_idx) = exp_desc->shape[0].idx;
02676 IR_LINE_NUM_R(plus_idx) = line;
02677 IR_COL_NUM_R(plus_idx) = col;
02678
02679 gen_sh(Before, Assignment_Stmt, line, col,
02680 FALSE, FALSE, TRUE);
02681
02682 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
02683 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02684
02685 if (size_limit_attr) {
02686 attr_idx = find_left_attr(target_base_opnd);
02687 test_size_stmts(attr_idx, target_sub_idx, size_limit_attr);
02688 }
02689
02690 NTR_IR_TBL(sub_idx);
02691 IR_OPR(sub_idx) = Section_Subscript_Opr;
02692 IR_TYPE_IDX(sub_idx) = exp_desc->type_idx;
02693 IR_LINE_NUM(sub_idx) = line;
02694 IR_COL_NUM(sub_idx) = col;
02695 COPY_OPND(IR_OPND_L(sub_idx), (*target_base_opnd));
02696
02697 NTR_IR_LIST_TBL(list2_idx);
02698 IR_FLD_R(sub_idx) = IL_Tbl_Idx;
02699 IR_IDX_R(sub_idx) = list2_idx;
02700 IR_LIST_CNT_R(sub_idx) = 1;
02701
02702 NTR_IR_TBL(trip_idx);
02703 IR_OPR(trip_idx) = Triplet_Opr;
02704 IR_TYPE_IDX(trip_idx) = SA_INTEGER_DEFAULT_TYPE;
02705 IR_LINE_NUM(trip_idx) = line;
02706 IR_COL_NUM(trip_idx) = col;
02707
02708 IL_FLD(list2_idx) = IR_Tbl_Idx;
02709 IL_IDX(list2_idx) = trip_idx;
02710
02711 NTR_IR_LIST_TBL(list2_idx);
02712 IR_FLD_L(trip_idx) = IL_Tbl_Idx;
02713 IR_IDX_L(trip_idx) = list2_idx;
02714 IR_LIST_CNT_L(trip_idx) = 3;
02715
02716 NTR_IR_TBL(minus_idx);
02717 IR_OPR(minus_idx) = Minus_Opr;
02718 IR_TYPE_IDX(minus_idx) = SA_INTEGER_DEFAULT_TYPE;
02719 IR_LINE_NUM(minus_idx) = line;
02720 IR_COL_NUM(minus_idx) = col;
02721 IR_FLD_L(minus_idx) = AT_Tbl_Idx;
02722 IR_IDX_L(minus_idx) = target_sub_idx;
02723 IR_LINE_NUM_L(minus_idx) = line;
02724 IR_COL_NUM_L(minus_idx) = col;
02725 IR_FLD_R(minus_idx) = exp_desc->shape[0].fld;
02726 IR_IDX_R(minus_idx) = exp_desc->shape[0].idx;
02727 IR_LINE_NUM_R(minus_idx) = line;
02728 IR_COL_NUM_R(minus_idx) = col;
02729
02730 IL_FLD(list2_idx) = IR_Tbl_Idx;
02731 IL_IDX(list2_idx) = minus_idx;
02732
02733 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list2_idx));
02734 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list2_idx)) = list2_idx;
02735 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
02736
02737 NTR_IR_TBL(minus_idx);
02738 IR_OPR(minus_idx) = Minus_Opr;
02739 IR_TYPE_IDX(minus_idx) = SA_INTEGER_DEFAULT_TYPE;
02740 IR_LINE_NUM(minus_idx) = line;
02741 IR_COL_NUM(minus_idx) = col;
02742 IR_FLD_L(minus_idx) = AT_Tbl_Idx;
02743 IR_IDX_L(minus_idx) = target_sub_idx;
02744 IR_LINE_NUM_L(minus_idx) = line;
02745 IR_COL_NUM_L(minus_idx) = col;
02746 IR_FLD_R(minus_idx) = CN_Tbl_Idx;
02747 IR_IDX_R(minus_idx) = CN_INTEGER_ONE_IDX;
02748 IR_LINE_NUM_R(minus_idx) = line;
02749 IR_COL_NUM_R(minus_idx) = col;
02750
02751 IL_FLD(list2_idx) = IR_Tbl_Idx;
02752 IL_IDX(list2_idx) = minus_idx;
02753
02754 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list2_idx));
02755 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list2_idx)) = list2_idx;
02756 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
02757 IL_FLD(list2_idx) = CN_Tbl_Idx;
02758 IL_IDX(list2_idx) = CN_INTEGER_ONE_IDX;
02759 IL_LINE_NUM(list2_idx) = line;
02760 IL_COL_NUM(list2_idx) = col;
02761
02762 OPND_FLD(opnd) = IR_Tbl_Idx;
02763 OPND_IDX(opnd) = sub_idx;
02764
02765 if (exp_desc->type == Character) {
02766 gen_whole_substring(&opnd, 1);
02767 }
02768
02769 NTR_IR_TBL(asg_idx);
02770 IR_OPR(asg_idx) = Asg_Opr;
02771 IR_TYPE_IDX(asg_idx) = exp_desc->type_idx;
02772 IR_LINE_NUM(asg_idx) = line;
02773 IR_COL_NUM(asg_idx) = col;
02774 COPY_OPND(IR_OPND_L(asg_idx), opnd);
02775
02776 COPY_OPND(IR_OPND_R(asg_idx), (*r_opnd));
02777
02778 gen_sh(Before, Assignment_Stmt, line, col,
02779 FALSE, FALSE, TRUE);
02780
02781 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
02782 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02783
02784 }
02785 else {
02786
02787
02788
02789
02790
02791 tmp_idx = gen_compiler_tmp(line,col, Priv, TRUE);
02792 AT_SEMANTICS_DONE(tmp_idx)= TRUE;
02793 ATD_TYPE_IDX(tmp_idx) = SA_INTEGER_DEFAULT_TYPE;
02794 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_STACK_IDX(curr_scp_idx);
02795
02796 NTR_IR_TBL(asg_idx2);
02797 IR_OPR(asg_idx2) = Asg_Opr;
02798 IR_TYPE_IDX(asg_idx2) = SA_INTEGER_DEFAULT_TYPE;
02799 IR_LINE_NUM(asg_idx2) = line;
02800 IR_COL_NUM(asg_idx2) = col;
02801 IR_FLD_L(asg_idx2) = AT_Tbl_Idx;
02802 IR_IDX_L(asg_idx2) = tmp_idx;
02803 IR_LINE_NUM_L(asg_idx2) = line;
02804 IR_COL_NUM_L(asg_idx2) = col;
02805
02806 COPY_OPND(opnd, exp_desc->shape[0]);
02807 OPND_LINE_NUM(opnd) = line;
02808 OPND_COL_NUM(opnd) = col;
02809
02810 for (i = 1; i < exp_desc->rank; i++) {
02811 NTR_IR_TBL(mult_idx);
02812 IR_OPR(mult_idx) = Mult_Opr;
02813 IR_TYPE_IDX(mult_idx) = SA_INTEGER_DEFAULT_TYPE;
02814 IR_LINE_NUM(mult_idx) = line;
02815 IR_COL_NUM(mult_idx) = col;
02816
02817 COPY_OPND(IR_OPND_L(mult_idx), opnd);
02818
02819 COPY_OPND(IR_OPND_R(mult_idx), exp_desc->shape[i]);
02820 IR_LINE_NUM_R(mult_idx) = line;
02821 IR_COL_NUM_R(mult_idx) = col;
02822
02823 OPND_FLD(opnd) = IR_Tbl_Idx;
02824 OPND_IDX(opnd) = mult_idx;
02825 }
02826
02827 COPY_OPND(IR_OPND_R(asg_idx2), opnd);
02828
02829 gen_sh(Before, Assignment_Stmt, line, col,
02830 FALSE, FALSE, TRUE);
02831
02832 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx2;
02833 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02834
02835
02836 NTR_IR_TBL(asg_idx);
02837 IR_OPR(asg_idx) = Asg_Opr;
02838 IR_TYPE_IDX(asg_idx) = SA_INTEGER_DEFAULT_TYPE;
02839 IR_LINE_NUM(asg_idx) = line;
02840 IR_COL_NUM(asg_idx) = col;
02841 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
02842 IR_IDX_L(asg_idx) = target_sub_idx;
02843 IR_LINE_NUM_L(asg_idx) = line;
02844 IR_COL_NUM_L(asg_idx) = col;
02845 NTR_IR_TBL(plus_idx);
02846 IR_OPR(plus_idx) = Plus_Opr;
02847 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
02848 IR_LINE_NUM(plus_idx) = line;
02849 IR_COL_NUM(plus_idx) = col;
02850 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
02851 IR_IDX_R(asg_idx) = plus_idx;
02852
02853 IR_FLD_L(plus_idx) = AT_Tbl_Idx;
02854 IR_IDX_L(plus_idx) = target_sub_idx;
02855 IR_LINE_NUM_L(plus_idx) = line;
02856 IR_COL_NUM_L(plus_idx) = col;
02857 IR_FLD_R(plus_idx) = AT_Tbl_Idx;
02858 IR_IDX_R(plus_idx) = tmp_idx;
02859 IR_LINE_NUM_R(plus_idx) = line;
02860 IR_COL_NUM_R(plus_idx) = col;
02861
02862 gen_sh(Before, Assignment_Stmt, line, col,
02863 FALSE, FALSE, TRUE);
02864
02865 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
02866 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02867
02868 if (size_limit_attr) {
02869 attr_idx = find_left_attr(target_base_opnd);
02870 test_size_stmts(attr_idx, target_sub_idx, size_limit_attr);
02871 }
02872
02873 NTR_IR_TBL(sub_idx);
02874 IR_OPR(sub_idx) = Section_Subscript_Opr;
02875 IR_TYPE_IDX(sub_idx) = exp_desc->type_idx;
02876 IR_LINE_NUM(sub_idx) = line;
02877 IR_COL_NUM(sub_idx) = col;
02878 COPY_OPND(IR_OPND_L(sub_idx), (*target_base_opnd));
02879
02880 NTR_IR_LIST_TBL(list2_idx);
02881 IR_FLD_R(sub_idx) = IL_Tbl_Idx;
02882 IR_IDX_R(sub_idx) = list2_idx;
02883 IR_LIST_CNT_R(sub_idx) = 1;
02884
02885 NTR_IR_TBL(trip_idx);
02886 IR_OPR(trip_idx) = Triplet_Opr;
02887 IR_TYPE_IDX(trip_idx) = SA_INTEGER_DEFAULT_TYPE;
02888 IR_LINE_NUM(trip_idx) = line;
02889 IR_COL_NUM(trip_idx) = col;
02890
02891 IL_FLD(list2_idx) = IR_Tbl_Idx;
02892 IL_IDX(list2_idx) = trip_idx;
02893
02894 NTR_IR_LIST_TBL(list2_idx);
02895 IR_FLD_L(trip_idx) = IL_Tbl_Idx;
02896 IR_IDX_L(trip_idx) = list2_idx;
02897 IR_LIST_CNT_L(trip_idx) = 3;
02898
02899 NTR_IR_TBL(minus_idx);
02900 IR_OPR(minus_idx) = Minus_Opr;
02901 IR_TYPE_IDX(minus_idx) = SA_INTEGER_DEFAULT_TYPE;
02902 IR_LINE_NUM(minus_idx) = line;
02903 IR_COL_NUM(minus_idx) = col;
02904 IR_FLD_L(minus_idx) = AT_Tbl_Idx;
02905 IR_IDX_L(minus_idx) = target_sub_idx;
02906 IR_LINE_NUM_L(minus_idx) = line;
02907 IR_COL_NUM_L(minus_idx) = col;
02908 IR_FLD_R(minus_idx) = AT_Tbl_Idx;
02909 IR_IDX_R(minus_idx) = tmp_idx;
02910 IR_LINE_NUM_R(minus_idx) = line;
02911 IR_COL_NUM_R(minus_idx) = col;
02912
02913 IL_FLD(list2_idx) = IR_Tbl_Idx;
02914 IL_IDX(list2_idx) = minus_idx;
02915
02916 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list2_idx));
02917 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list2_idx)) = list2_idx;
02918 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
02919
02920 NTR_IR_TBL(minus_idx);
02921 IR_OPR(minus_idx) = Minus_Opr;
02922 IR_TYPE_IDX(minus_idx) = SA_INTEGER_DEFAULT_TYPE;
02923 IR_LINE_NUM(minus_idx) = line;
02924 IR_COL_NUM(minus_idx) = col;
02925 IR_FLD_L(minus_idx) = AT_Tbl_Idx;
02926 IR_IDX_L(minus_idx) = target_sub_idx;
02927 IR_LINE_NUM_L(minus_idx) = line;
02928 IR_COL_NUM_L(minus_idx) = col;
02929 IR_FLD_R(minus_idx) = CN_Tbl_Idx;
02930 IR_IDX_R(minus_idx) = CN_INTEGER_ONE_IDX;
02931 IR_LINE_NUM_R(minus_idx) = line;
02932 IR_COL_NUM_R(minus_idx) = col;
02933
02934 IL_FLD(list2_idx) = IR_Tbl_Idx;
02935 IL_IDX(list2_idx) = minus_idx;
02936
02937 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list2_idx));
02938 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list2_idx)) = list2_idx;
02939 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
02940 IL_FLD(list2_idx) = CN_Tbl_Idx;
02941 IL_IDX(list2_idx) = CN_INTEGER_ONE_IDX;
02942 IL_LINE_NUM(list2_idx) = line;
02943 IL_COL_NUM(list2_idx) = col;
02944
02945 OPND_FLD(opnd) = IR_Tbl_Idx;
02946 OPND_IDX(opnd) = sub_idx;
02947
02948 if (exp_desc->type == Character) {
02949 gen_whole_substring(&opnd, exp_desc->rank);
02950 }
02951
02952 NTR_IR_TBL(asg_idx);
02953 IR_OPR(asg_idx) = Flat_Array_Asg_Opr;
02954 IR_TYPE_IDX(asg_idx) = exp_desc->type_idx;
02955 IR_LINE_NUM(asg_idx) = line;
02956 IR_COL_NUM(asg_idx) = col;
02957 COPY_OPND(IR_OPND_L(asg_idx), opnd);
02958
02959 COPY_OPND(IR_OPND_R(asg_idx), (*r_opnd));
02960
02961 gen_sh(Before, Assignment_Stmt, line, col,
02962 FALSE, FALSE, TRUE);
02963
02964 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
02965 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
02966
02967
02968 }
02969
02970
02971 TRACE (Func_Exit, "do_single_asg", NULL);
02972
02973 return;
02974
02975 }
02976
02977
02978
02979
02980
02981
02982
02983
02984
02985
02986
02987
02988
02989
02990
02991
02992
02993
02994
02995 static void create_struct_constructor_asg(opnd_type *top_opnd,
02996 opnd_type *target_base_opnd)
02997
02998 {
02999 int asg_idx;
03000 int attr_idx;
03001 int col;
03002 int ir_idx;
03003 expr_arg_type l_exp_desc;
03004 opnd_type l_opnd;
03005 int line;
03006 int list_idx;
03007 opnd_type opnd;
03008 int sn_idx;
03009 int struct_idx;
03010
03011
03012 TRACE (Func_Entry, "create_struct_constructor_asg", NULL);
03013
03014 # ifdef _DEBUG
03015 if (OPND_FLD((*top_opnd)) != IR_Tbl_Idx ||
03016 IR_OPR(OPND_IDX((*top_opnd))) != Struct_Construct_Opr) {
03017 find_opnd_line_and_column(top_opnd, &line, &col);
03018 PRINTMSG(line, 987, Internal, col);
03019 }
03020 # endif
03021
03022 ir_idx = OPND_IDX((*top_opnd));
03023
03024 list_idx = IR_IDX_R(ir_idx);
03025 sn_idx = ATT_FIRST_CPNT_IDX(IR_IDX_L(ir_idx));
03026
03027 while (list_idx) {
03028 find_opnd_line_and_column((opnd_type *) &IL_OPND(list_idx), &line, &col);
03029
03030 attr_idx = SN_ATTR_IDX(sn_idx);
03031
03032 NTR_IR_TBL(struct_idx);
03033 IR_OPR(struct_idx) = Struct_Opr;
03034 IR_TYPE_IDX(struct_idx) = ATD_TYPE_IDX(attr_idx);
03035 IR_LINE_NUM(struct_idx) = line;
03036 IR_COL_NUM(struct_idx) = col;
03037 COPY_OPND(IR_OPND_L(struct_idx), (*target_base_opnd));
03038 IR_FLD_R(struct_idx) = AT_Tbl_Idx;
03039 IR_IDX_R(struct_idx) = attr_idx;
03040 IR_LINE_NUM_R(struct_idx) = line;
03041 IR_COL_NUM_R(struct_idx) = col;
03042
03043
03044 OPND_FLD(l_opnd) = IR_Tbl_Idx;
03045 OPND_IDX(l_opnd) = struct_idx;
03046
03047 if (! ATD_POINTER(attr_idx)) {
03048
03049 if (ATD_ARRAY_IDX(attr_idx)) {
03050 gen_whole_subscript(&l_opnd, &l_exp_desc);
03051 }
03052 else if (TYP_TYPE(ATD_TYPE_IDX(attr_idx)) == Character) {
03053 gen_whole_substring(&l_opnd, 0);
03054 }
03055 }
03056
03057 NTR_IR_TBL(asg_idx);
03058 IR_OPR(asg_idx) = Asg_Opr;
03059 IR_TYPE_IDX(asg_idx) = ATD_TYPE_IDX(attr_idx);
03060 IR_LINE_NUM(asg_idx) = line;
03061 IR_COL_NUM(asg_idx) = col;
03062 COPY_OPND(IR_OPND_L(asg_idx), l_opnd);
03063
03064
03065
03066 l_exp_desc = arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed;
03067 COPY_OPND(opnd, IL_OPND(list_idx));
03068 expand_stmts(&opnd, &l_exp_desc);
03069
03070
03071 COPY_OPND(IR_OPND_R(asg_idx), opnd);
03072
03073 if (ATD_POINTER(attr_idx)) {
03074
03075
03076
03077 gen_dv_whole_def_init(&l_opnd, attr_idx, Before);
03078
03079 IR_OPR(asg_idx) = Ptr_Asg_Opr;
03080
03081
03082
03083 COPY_OPND(l_opnd, IR_OPND_L(asg_idx));
03084
03085 if (l_exp_desc.pointer || l_exp_desc.allocatable) {
03086 ptr_assign_from_ptr(&l_opnd, &opnd);
03087 list_idx = IL_NEXT_LIST_IDX(list_idx);
03088 sn_idx = SN_SIBLING_LINK(sn_idx);
03089 continue;
03090 }
03091 else if (l_exp_desc.target) {
03092 dope_vector_setup(&opnd, &l_exp_desc, &l_opnd,
03093 TRUE);
03094 }
03095 }
03096
03097 gen_sh(Before, Assignment_Stmt, line, col,
03098 FALSE, FALSE, TRUE);
03099
03100 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
03101 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
03102
03103
03104 list_idx = IL_NEXT_LIST_IDX(list_idx);
03105 sn_idx = SN_SIBLING_LINK(sn_idx);
03106 }
03107
03108 TRACE (Func_Exit, "create_struct_constructor_asg", NULL);
03109
03110 return;
03111
03112 }
03113
03114
03115
03116
03117
03118
03119
03120
03121
03122
03123
03124
03125
03126
03127
03128
03129
03130
03131 static void increment_subscript(int target_sub_idx)
03132
03133 {
03134 int asg_idx;
03135 int plus_idx;
03136
03137 TRACE (Func_Entry, "increment_subscript", NULL);
03138
03139 NTR_IR_TBL(asg_idx);
03140 IR_OPR(asg_idx) = Asg_Opr;
03141 IR_TYPE_IDX(asg_idx) = SA_INTEGER_DEFAULT_TYPE;
03142 IR_LINE_NUM(asg_idx) = stmt_start_line;
03143 IR_COL_NUM(asg_idx) = stmt_start_col;
03144 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
03145 IR_IDX_L(asg_idx) = target_sub_idx;
03146 IR_LINE_NUM_L(asg_idx) = stmt_start_line;
03147 IR_COL_NUM_L(asg_idx) = stmt_start_col;
03148 NTR_IR_TBL(plus_idx);
03149 IR_OPR(plus_idx) = Plus_Opr;
03150 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
03151 IR_LINE_NUM(plus_idx) = stmt_start_line;
03152 IR_COL_NUM(plus_idx) = stmt_start_col;
03153 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
03154 IR_IDX_R(asg_idx) = plus_idx;
03155
03156 IR_FLD_L(plus_idx) = AT_Tbl_Idx;
03157 IR_IDX_L(plus_idx) = target_sub_idx;
03158 IR_LINE_NUM_L(plus_idx) = stmt_start_line;
03159 IR_COL_NUM_L(plus_idx) = stmt_start_col;
03160 IR_FLD_R(plus_idx) = CN_Tbl_Idx;
03161 IR_IDX_R(plus_idx) = CN_INTEGER_ONE_IDX;
03162 IR_LINE_NUM_R(plus_idx) = stmt_start_line;
03163 IR_COL_NUM_R(plus_idx) = stmt_start_col;
03164
03165 gen_sh(Before, Assignment_Stmt, stmt_start_line, stmt_start_col,
03166 FALSE, FALSE, TRUE);
03167
03168 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
03169 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
03170
03171
03172 TRACE (Func_Exit, "increment_subscript", NULL);
03173
03174 return;
03175
03176 }
03177
03178
03179
03180
03181
03182
03183
03184
03185
03186
03187
03188
03189
03190
03191
03192
03193
03194
03195
03196 static void test_size_stmts(int target_dope_idx,
03197 int target_sub_idx,
03198 int size_idx)
03199
03200 {
03201 int asg_idx;
03202 int br_idx;
03203 int call_idx;
03204 int dv_idx;
03205 int ir_idx;
03206 int lt_idx;
03207 int label_idx;
03208 int list_idx;
03209 int minus_idx;
03210 int plus_idx;
03211 int realloc_size_attr;
03212 int save_curr_stmt_sh_idx;
03213
03214
03215 TRACE (Func_Entry, "test_size_stmts", NULL);
03216
03217 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
03218
03219
03220
03221 label_idx = gen_internal_lbl(stmt_start_line);
03222
03223 gen_sh(Before, Continue_Stmt, stmt_start_line, stmt_start_col,
03224 FALSE, TRUE, TRUE);
03225
03226 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
03227
03228 NTR_IR_TBL(ir_idx);
03229 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
03230 IR_OPR(ir_idx) = Label_Opr;
03231 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
03232 IR_LINE_NUM(ir_idx) = stmt_start_line;
03233 IR_COL_NUM(ir_idx) = stmt_start_col;
03234 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03235 IR_IDX_L(ir_idx) = label_idx;
03236 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03237 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03238
03239 AT_DEFINED(label_idx) = TRUE;
03240 ATL_DEF_STMT_IDX(label_idx) = curr_stmt_sh_idx;
03241
03242 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
03243
03244
03245
03246
03247 NTR_IR_TBL(br_idx);
03248 IR_OPR(br_idx) = Br_True_Opr;
03249 IR_TYPE_IDX(br_idx) = LOGICAL_DEFAULT_TYPE;
03250 IR_LINE_NUM(br_idx) = stmt_start_line;
03251 IR_COL_NUM(br_idx) = stmt_start_col;
03252
03253 NTR_IR_TBL(lt_idx);
03254 IR_OPR(lt_idx) = Lt_Opr;
03255 IR_TYPE_IDX(lt_idx) = LOGICAL_DEFAULT_TYPE;
03256 IR_LINE_NUM(lt_idx) = stmt_start_line;
03257 IR_COL_NUM(lt_idx) = stmt_start_col;
03258
03259 IR_FLD_L(lt_idx) = AT_Tbl_Idx;
03260 IR_IDX_L(lt_idx) = target_sub_idx;
03261 IR_LINE_NUM_L(lt_idx) = stmt_start_line;
03262 IR_COL_NUM_L(lt_idx) = stmt_start_col;
03263
03264 IR_FLD_R(lt_idx) = AT_Tbl_Idx;
03265 IR_IDX_R(lt_idx) = size_idx;
03266 IR_LINE_NUM_R(lt_idx) = stmt_start_line;
03267 IR_COL_NUM_R(lt_idx) = stmt_start_col;
03268
03269 IR_FLD_L(br_idx) = IR_Tbl_Idx;
03270 IR_IDX_L(br_idx) = lt_idx;
03271
03272 IR_FLD_R(br_idx) = AT_Tbl_Idx;
03273 IR_IDX_R(br_idx) = label_idx;
03274 IR_LINE_NUM_R(br_idx) = stmt_start_line;
03275 IR_COL_NUM_R(br_idx) = stmt_start_col;
03276
03277 gen_sh(Before, If_Stmt, stmt_start_line, stmt_start_col,
03278 FALSE, FALSE, TRUE);
03279
03280 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = br_idx;
03281 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
03282
03283
03284
03285
03286
03287 if (glb_tbl_idx[Realloc_Attr_Idx] == NULL_IDX) {
03288 glb_tbl_idx[Realloc_Attr_Idx] = create_lib_entry_attr(REALLOC_LIB_ENTRY,
03289 REALLOC_NAME_LEN,
03290 stmt_start_line,
03291 stmt_start_col);
03292 }
03293
03294 ADD_ATTR_TO_LOCAL_LIST(glb_tbl_idx[Realloc_Attr_Idx]);
03295
03296
03297
03298 NTR_IR_TBL(asg_idx);
03299 IR_OPR(asg_idx) = Asg_Opr;
03300 IR_TYPE_IDX(asg_idx) = SA_INTEGER_DEFAULT_TYPE;
03301 IR_LINE_NUM(asg_idx) = stmt_start_line;
03302 IR_COL_NUM(asg_idx) = stmt_start_col;
03303 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
03304 IR_IDX_L(asg_idx) = size_idx;
03305 IR_LINE_NUM_L(asg_idx) = stmt_start_line;
03306 IR_COL_NUM_L(asg_idx) = stmt_start_col;
03307
03308 NTR_IR_TBL(ir_idx);
03309 IR_OPR(ir_idx) = Plus_Opr;
03310 IR_TYPE_IDX(ir_idx) = SA_INTEGER_DEFAULT_TYPE;
03311 IR_LINE_NUM(ir_idx) = stmt_start_line;
03312 IR_COL_NUM(ir_idx) = stmt_start_col;
03313 IR_FLD_R(ir_idx) = AT_Tbl_Idx;
03314 IR_IDX_R(ir_idx) = size_idx;
03315 IR_LINE_NUM_R(ir_idx) = stmt_start_line;
03316 IR_COL_NUM_R(ir_idx) = stmt_start_col;
03317
03318 NTR_IR_TBL(plus_idx);
03319 IR_OPR(plus_idx) = Plus_Opr;
03320 IR_TYPE_IDX(plus_idx) = SA_INTEGER_DEFAULT_TYPE;
03321 IR_LINE_NUM(plus_idx) = stmt_start_line;
03322 IR_COL_NUM(plus_idx) = stmt_start_col;
03323 IR_FLD_L(ir_idx) = IR_Tbl_Idx;
03324 IR_IDX_L(ir_idx) = plus_idx;
03325
03326 IR_FLD_R(plus_idx) = CN_Tbl_Idx;
03327 IR_IDX_R(plus_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
03328 CONSTRUCTOR_GUESS_SIZE);
03329 IR_LINE_NUM_R(plus_idx) = stmt_start_line;
03330 IR_COL_NUM_R(plus_idx) = stmt_start_col;
03331
03332 NTR_IR_TBL(minus_idx);
03333 IR_OPR(minus_idx) = Minus_Opr;
03334 IR_TYPE_IDX(minus_idx) = SA_INTEGER_DEFAULT_TYPE;
03335 IR_LINE_NUM(minus_idx) = stmt_start_line;
03336 IR_COL_NUM(minus_idx) = stmt_start_col;
03337 IR_FLD_L(minus_idx) = AT_Tbl_Idx;
03338 IR_IDX_L(minus_idx) = target_sub_idx;
03339 IR_LINE_NUM_L(minus_idx) = stmt_start_line;
03340 IR_COL_NUM_L(minus_idx) = stmt_start_col;
03341 IR_FLD_R(minus_idx) = AT_Tbl_Idx;
03342 IR_IDX_R(minus_idx) = size_idx;
03343 IR_LINE_NUM_R(minus_idx) = stmt_start_line;
03344 IR_COL_NUM_R(minus_idx) = stmt_start_col;
03345
03346 IR_FLD_L(plus_idx) = IR_Tbl_Idx;
03347 IR_IDX_L(plus_idx) = minus_idx;
03348
03349 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
03350 IR_IDX_R(asg_idx) = ir_idx;
03351
03352 gen_sh(Before, Assignment_Stmt, stmt_start_line, stmt_start_col,
03353 FALSE, FALSE, TRUE);
03354 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
03355 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
03356
03357
03358
03359 GEN_COMPILER_TMP_ASG(asg_idx,
03360 realloc_size_attr,
03361 TRUE,
03362 stmt_start_line,
03363 stmt_start_col,
03364 SA_INTEGER_DEFAULT_TYPE,
03365 Priv);
03366
03367 NTR_IR_TBL(ir_idx);
03368 IR_OPR(ir_idx) = Mult_Opr;
03369 IR_TYPE_IDX(ir_idx) = SA_INTEGER_DEFAULT_TYPE;
03370 IR_LINE_NUM(ir_idx) = stmt_start_line;
03371 IR_COL_NUM(ir_idx) = stmt_start_col;
03372 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03373 IR_IDX_L(ir_idx) = size_idx;
03374 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03375 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03376
03377 NTR_IR_TBL(dv_idx);
03378 IR_OPR(dv_idx) = Dv_Access_El_Len;
03379 IR_TYPE_IDX(dv_idx) = SA_INTEGER_DEFAULT_TYPE;
03380 IR_LINE_NUM(dv_idx) = stmt_start_line;
03381 IR_COL_NUM(dv_idx) = stmt_start_col;
03382 IR_FLD_L(dv_idx) = AT_Tbl_Idx;
03383 IR_IDX_L(dv_idx) = target_dope_idx;
03384 IR_LINE_NUM_L(dv_idx) = stmt_start_line;
03385 IR_COL_NUM_L(dv_idx) = stmt_start_col;
03386
03387 IR_FLD_R(ir_idx) = IR_Tbl_Idx;
03388 IR_IDX_R(ir_idx) = dv_idx;
03389
03390 IR_FLD_R(asg_idx) = IR_Tbl_Idx;
03391 IR_IDX_R(asg_idx) = ir_idx;
03392
03393 gen_sh(Before, Assignment_Stmt, stmt_start_line,
03394 stmt_start_col, FALSE, FALSE, TRUE);
03395
03396 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
03397 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
03398
03399
03400
03401 NTR_IR_TBL(call_idx);
03402 IR_OPR(call_idx) = Call_Opr;
03403 IR_TYPE_IDX(call_idx) = TYPELESS_DEFAULT_TYPE;
03404 IR_LINE_NUM(call_idx) = stmt_start_line;
03405 IR_COL_NUM(call_idx) = stmt_start_col;
03406 IR_FLD_L(call_idx) = AT_Tbl_Idx;
03407 IR_IDX_L(call_idx) = glb_tbl_idx[Realloc_Attr_Idx];
03408 IR_LINE_NUM_L(call_idx) = stmt_start_line;
03409 IR_COL_NUM_L(call_idx) = stmt_start_col;
03410
03411 NTR_IR_LIST_TBL(list_idx);
03412 IR_FLD_R(call_idx) = IL_Tbl_Idx;
03413 IR_IDX_R(call_idx) = list_idx;
03414 IR_LIST_CNT_R(call_idx) = 2;
03415
03416 NTR_IR_TBL(ir_idx);
03417 IR_OPR(ir_idx) = Aloc_Opr;
03418 IR_TYPE_IDX(ir_idx) = CRI_Ptr_8;
03419 IR_LINE_NUM(ir_idx) = stmt_start_line;
03420 IR_COL_NUM(ir_idx) = stmt_start_col;
03421
03422 IL_FLD(list_idx) = IR_Tbl_Idx;
03423 IL_IDX(list_idx) = ir_idx;
03424
03425 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03426 IR_IDX_L(ir_idx) = target_dope_idx;
03427 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03428 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03429
03430 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
03431 list_idx = IL_NEXT_LIST_IDX(list_idx);
03432
03433 NTR_IR_TBL(ir_idx);
03434 IR_OPR(ir_idx) = Aloc_Opr;
03435 IR_TYPE_IDX(ir_idx) = CRI_Ptr_8;
03436 IR_LINE_NUM(ir_idx) = stmt_start_line;
03437 IR_COL_NUM(ir_idx) = stmt_start_col;
03438
03439 IL_FLD(list_idx) = IR_Tbl_Idx;
03440 IL_IDX(list_idx) = ir_idx;
03441
03442 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03443 IR_IDX_L(ir_idx) = realloc_size_attr;
03444 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03445 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03446
03447 gen_sh(Before, Call_Stmt, stmt_start_line,
03448 stmt_start_col, FALSE, FALSE, TRUE);
03449
03450 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = call_idx;
03451 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
03452
03453
03454 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
03455
03456 TRACE (Func_Exit, "test_size_stmts", NULL);
03457
03458 return;
03459
03460 }
03461
03462
03463
03464
03465
03466
03467
03468
03469
03470
03471
03472
03473
03474
03475
03476
03477
03478
03479 void process_char_len(opnd_type *top_opnd)
03480
03481 {
03482 expr_arg_type exp_desc;
03483 int list_idx;
03484 opnd_type opnd;
03485 cif_usage_code_type save_xref_state;
03486
03487
03488 TRACE (Func_Entry, "process_char_len", NULL);
03489
03490 switch (OPND_FLD((*top_opnd))) {
03491 case IR_Tbl_Idx:
03492 COPY_OPND(opnd, IR_OPND_L(OPND_IDX((*top_opnd))));
03493 process_char_len(&opnd);
03494 COPY_OPND(IR_OPND_L(OPND_IDX((*top_opnd))), opnd);
03495
03496 COPY_OPND(opnd, IR_OPND_R(OPND_IDX((*top_opnd))));
03497 process_char_len(&opnd);
03498 COPY_OPND(IR_OPND_R(OPND_IDX((*top_opnd))), opnd);
03499
03500 if (IR_OPR(OPND_IDX((*top_opnd))) == Call_Opr) {
03501
03502 list_idx = IR_IDX_R(OPND_IDX((*top_opnd)));
03503
03504 while (list_idx) {
03505
03506 if (IL_FLD(list_idx) != NO_Tbl_Idx) {
03507
03508 COPY_OPND(opnd, IL_OPND(list_idx));
03509 exp_desc.rank = 0;
03510 save_xref_state = xref_state;
03511 xref_state = CIF_No_Usage_Rec;
03512 expr_sem(&opnd, &exp_desc);
03513 xref_state = save_xref_state;
03514
03515
03516 arg_info_list_base = arg_info_list_top;
03517 arg_info_list_top = arg_info_list_base + 1;
03518
03519 if (arg_info_list_top >= arg_info_list_size) {
03520 enlarge_info_list_table();
03521 }
03522
03523 arg_info_list[arg_info_list_top] =
03524 arg_info_list[IL_ARG_DESC_IDX(list_idx)];
03525 IL_ARG_DESC_IDX(list_idx) = arg_info_list_top;
03526 arg_info_list[arg_info_list_top].ed = exp_desc;
03527 }
03528
03529 list_idx = IL_NEXT_LIST_IDX(list_idx);
03530 }
03531 }
03532 break;
03533
03534 case AT_Tbl_Idx:
03535
03536 if (AT_OBJ_CLASS(OPND_IDX((*top_opnd))) == Data_Obj &&
03537 ATD_IMP_DO_LCV(OPND_IDX((*top_opnd)))) {
03538
03539 gen_opnd(&opnd, ATD_TMP_IDX(OPND_IDX((*top_opnd))),
03540 (fld_type) ATD_FLD(OPND_IDX((*top_opnd))),
03541 OPND_LINE_NUM((*top_opnd)),
03542 OPND_COL_NUM((*top_opnd)));
03543 copy_subtree(&opnd, &opnd);
03544
03545 process_char_len(&opnd);
03546 COPY_OPND((*top_opnd), opnd);
03547 }
03548 break;
03549
03550 case IL_Tbl_Idx:
03551
03552 list_idx = OPND_IDX((*top_opnd));
03553
03554 while (list_idx) {
03555 COPY_OPND(opnd, IL_OPND(list_idx));
03556 process_char_len(&opnd);
03557 COPY_OPND(IL_OPND(list_idx), opnd);
03558
03559 list_idx = IL_NEXT_LIST_IDX(list_idx);
03560 }
03561 break;
03562
03563 case NO_Tbl_Idx:
03564 break;
03565 }
03566
03567 TRACE (Func_Exit, "process_char_len", NULL);
03568
03569 return;
03570
03571 }
03572
03573
03574
03575
03576
03577
03578
03579
03580
03581
03582
03583
03584
03585
03586
03587
03588
03589 static void expand_stmts(opnd_type *top_opnd,
03590 expr_arg_type *exp_desc)
03591
03592 {
03593
03594
03595 TRACE (Func_Entry, "expand_stmts", NULL);
03596
03597 check_for_constructors(top_opnd, exp_desc);
03598
03599 process_deferred_functions(top_opnd);
03600
03601 TRACE (Func_Exit, "expand_stmts", NULL);
03602
03603 return;
03604
03605 }
03606
03607
03608
03609
03610
03611
03612
03613
03614
03615
03616
03617
03618
03619
03620
03621
03622
03623 static void check_for_constructors(opnd_type *top_opnd,
03624 expr_arg_type *exp_desc)
03625
03626 {
03627 int ir_idx;
03628 int list_idx;
03629 expr_arg_type loc_exp_desc;
03630 boolean ok;
03631 opnd_type tmp_opnd;
03632
03633 TRACE (Func_Entry, "check_for_constructors", NULL);
03634
03635 switch (OPND_FLD((*top_opnd))) {
03636 case IR_Tbl_Idx:
03637 ir_idx = OPND_IDX((*top_opnd));
03638
03639 switch (IR_OPR(ir_idx)) {
03640
03641 case Array_Construct_Opr :
03642
03643 loc_exp_desc = arg_info_list[IR_IDX_L(ir_idx)].ed;
03644
03645
03646 ok = TRUE;
03647 if (exp_desc != NULL) {
03648 COPY_SHAPE((exp_desc->shape),
03649 loc_exp_desc.shape, loc_exp_desc.rank);
03650 }
03651 break;
03652
03653 case Constant_Array_Construct_Opr :
03654
03655 loc_exp_desc = arg_info_list[IR_IDX_L(ir_idx)].ed;
03656 ok = create_constructor_constant(top_opnd, &loc_exp_desc);
03657 if (exp_desc != NULL) {
03658 COPY_SHAPE((exp_desc->shape),
03659 loc_exp_desc.shape, loc_exp_desc.rank);
03660 }
03661 break;
03662
03663 case Struct_Construct_Opr :
03664 ok = create_runtime_struct_constructor(top_opnd);
03665 break;
03666
03667 case Constant_Struct_Construct_Opr :
03668 ok = create_constructor_constant(top_opnd, &loc_exp_desc);
03669 break;
03670
03671 default:
03672 if (exp_desc != NULL) {
03673 loc_exp_desc.dope_vector = exp_desc->dope_vector;
03674 loc_exp_desc.pointer = exp_desc->pointer;
03675 loc_exp_desc.reference = exp_desc->reference;
03676 loc_exp_desc.tmp_reference = exp_desc->tmp_reference;
03677 }
03678
03679 COPY_OPND(tmp_opnd, IR_OPND_L(ir_idx));
03680 check_for_constructors(&tmp_opnd, exp_desc);
03681 COPY_OPND(IR_OPND_L(ir_idx), tmp_opnd);
03682
03683 COPY_OPND(tmp_opnd, IR_OPND_R(ir_idx));
03684 check_for_constructors(&tmp_opnd, exp_desc);
03685 COPY_OPND(IR_OPND_R(ir_idx), tmp_opnd);
03686
03687 if (exp_desc != NULL) {
03688 exp_desc->dope_vector = loc_exp_desc.dope_vector;
03689 exp_desc->pointer = loc_exp_desc.pointer;
03690 exp_desc->reference = loc_exp_desc.reference;
03691 exp_desc->tmp_reference = loc_exp_desc.tmp_reference;
03692 }
03693
03694 break;
03695
03696 }
03697 break;
03698
03699 case IL_Tbl_Idx:
03700 list_idx = OPND_IDX((*top_opnd));
03701
03702 while (list_idx) {
03703 COPY_OPND(tmp_opnd, IL_OPND(list_idx));
03704 check_for_constructors(&tmp_opnd, exp_desc);
03705 COPY_OPND(IL_OPND(list_idx), tmp_opnd);
03706
03707 list_idx = IL_NEXT_LIST_IDX(list_idx);
03708 }
03709 break;
03710 }
03711
03712 TRACE (Func_Exit, "check_for_constructors", NULL);
03713
03714 return;
03715
03716 }