00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 static char USMID[] = "\n@(#)5.0_pl/sources/p_end.c 5.7 09/01/99 09:11:00\n";
00049
00050 # include "defines.h"
00051
00052 # include "host.m"
00053 # include "host.h"
00054 # include "target.m"
00055 # include "target.h"
00056
00057 # include "globals.m"
00058 # include "tokens.m"
00059 # include "sytb.m"
00060 # include "p_globals.m"
00061 # include "debug.m"
00062
00063 # include "globals.h"
00064 # include "tokens.h"
00065 # include "sytb.h"
00066 # include "p_globals.h"
00067 # include "p_end.h"
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 static char *blk_desc_str(int);
00078 static boolean end_task_do_blk(void);
00079 static void finish_cdir_id(void);
00080 static void loop_end_processing(void);
00081
00082 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
00083 static void check_loop_bottom_nesting(void);
00084 # endif
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
00115 static void finish_cdir_id(void)
00116 {
00117
00118 size_offset_type aligned_length;
00119 int column;
00120 int init_idx;
00121 size_offset_type length;
00122 int line;
00123 int list_idx;
00124 id_str_type name;
00125 int new_str_idx;
00126 opnd_type opnd;
00127 int prog_unit_has_id_line;
00128 int tmp_idx;
00129 int type_idx;
00130
00131
00132 TRACE (Func_Entry, "finish_cdir_id", NULL);
00133
00134 CREATE_ID(name, sb_name[What_Blk], sb_len[What_Blk]);
00135
00136 prog_unit_has_id_line = srch_stor_blk_tbl(name.string,
00137 sb_len[What_Blk],
00138 curr_scp_idx);
00139
00140 if (prog_unit_has_id_line != NULL_IDX) {
00141
00142
00143
00144
00145 line = curr_glb_line;
00146 column = 0;
00147 tmp_idx = gen_compiler_tmp(line, column, Shared, TRUE);
00148 ATD_STOR_BLK_IDX(tmp_idx) = prog_unit_has_id_line;
00149 ATD_TMP_SEMANTICS_DONE(tmp_idx) = TRUE;
00150 ATD_OFFSET_ASSIGNED(tmp_idx) = TRUE;
00151
00152 # if defined(_DEBUG)
00153
00154
00155
00156 if (SB_LEN_FLD(ATD_STOR_BLK_IDX(tmp_idx)) != CN_Tbl_Idx) {
00157 PRINTMSG(line, 1201, Internal, column,
00158 SB_NAME_PTR(ATD_STOR_BLK_IDX(tmp_idx)));
00159 }
00160 # endif
00161
00162 length.idx = SB_LEN_IDX(ATD_STOR_BLK_IDX(tmp_idx));
00163 length.fld = SB_LEN_FLD(ATD_STOR_BLK_IDX(tmp_idx));
00164 ATD_OFFSET_IDX(tmp_idx) = length.idx;
00165 ATD_OFFSET_FLD(tmp_idx) = length.fld;
00166 aligned_length.idx = CN_INTEGER_CHAR_BIT_IDX;
00167 aligned_length.fld = CN_Tbl_Idx;
00168
00169 if (!size_offset_binary_calc(&length, &aligned_length, Plus_Opr,
00170 &aligned_length)) {
00171 AT_DCL_ERR(tmp_idx) = TRUE;
00172 }
00173
00174 align_bit_length(&aligned_length, TARGET_BITS_PER_WORD);
00175
00176 if (!size_offset_binary_calc(&aligned_length,&length,Minus_Opr,&length)) {
00177 AT_DCL_ERR(tmp_idx) = TRUE;
00178 }
00179
00180 if (aligned_length.fld == NO_Tbl_Idx) {
00181 aligned_length.fld = CN_Tbl_Idx;
00182 aligned_length.idx = ntr_const_tbl(aligned_length.type_idx,
00183 FALSE,
00184 aligned_length.constant);
00185 }
00186
00187 SB_LEN_FLD(ATD_STOR_BLK_IDX(tmp_idx)) = aligned_length.fld;
00188 SB_LEN_IDX(ATD_STOR_BLK_IDX(tmp_idx)) = aligned_length.idx;
00189
00190
00191
00192
00193 aligned_length.fld = CN_Tbl_Idx;
00194 aligned_length.idx = CN_INTEGER_CHAR_BIT_IDX;
00195
00196 if (!size_offset_binary_calc(&length, &aligned_length, Div_Opr, &length)){
00197 AT_DCL_ERR(tmp_idx) = TRUE;
00198 }
00199
00200 if (length.fld == NO_Tbl_Idx) {
00201 length.fld = CN_Tbl_Idx;
00202 length.idx = ntr_const_tbl(length.type_idx,
00203 FALSE,
00204 length.constant);
00205 }
00206
00207 OPND_FLD(opnd) = AT_Tbl_Idx;
00208 OPND_IDX(opnd) = tmp_idx;
00209 OPND_LINE_NUM(opnd) = line;
00210 OPND_COL_NUM(opnd) = column;
00211
00212 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00213 TYP_TYPE(TYP_WORK_IDX) = Character;
00214 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
00215 TYP_DESC(TYP_WORK_IDX) = Default_Typed;
00216 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
00217 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
00218 TYP_IDX(TYP_WORK_IDX) = length.idx;
00219 type_idx = ntr_type_tbl();
00220
00221
00222
00223
00224
00225 new_str_idx = ntr_const_tbl(type_idx, TRUE, NULL);
00226
00227 ATD_TYPE_IDX(tmp_idx) = CN_TYPE_IDX(new_str_idx);
00228
00229 gen_whole_substring(&opnd, 0);
00230
00231
00232
00233 NTR_IR_TBL(init_idx);
00234 IR_OPR(init_idx) = Init_Opr;
00235 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
00236 IR_OPR(init_idx) = Null_Opr;
00237 # endif
00238
00239
00240
00241 IR_TYPE_IDX(init_idx) = ATD_TYPE_IDX(tmp_idx);
00242 IR_LINE_NUM(init_idx) = line;
00243 IR_COL_NUM(init_idx) = column;
00244 IR_LINE_NUM_R(init_idx) = line;
00245 IR_COL_NUM_R(init_idx) = column;
00246 COPY_OPND(IR_OPND_L(init_idx), opnd);
00247
00248 NTR_IR_LIST_TBL(list_idx);
00249 IR_FLD_R(init_idx) = IL_Tbl_Idx;
00250 IR_IDX_R(init_idx) = list_idx;
00251 IR_LIST_CNT_R(init_idx) = 3;
00252 IL_IDX(IR_IDX_R(init_idx))= new_str_idx;
00253
00254 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
00255 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
00256 IL_FLD(list_idx) = CN_Tbl_Idx;
00257 IL_IDX(list_idx) = new_str_idx;
00258 IL_LINE_NUM(list_idx) = line;
00259 IL_COL_NUM(list_idx) = column;
00260
00261 list_idx = IL_NEXT_LIST_IDX(list_idx);
00262
00263 IL_FLD(list_idx) = CN_Tbl_Idx;
00264 IL_IDX(list_idx) = CN_INTEGER_ONE_IDX;
00265 IL_LINE_NUM(list_idx) = line;
00266 IL_COL_NUM(list_idx) = column;
00267
00268 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
00269 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
00270 list_idx = IL_NEXT_LIST_IDX(list_idx);
00271
00272 IL_FLD(list_idx) = CN_Tbl_Idx;
00273 IL_IDX(list_idx) = CN_INTEGER_ZERO_IDX;
00274 IL_LINE_NUM(list_idx) = line;
00275 IL_COL_NUM(list_idx) = column;
00276
00277 gen_sh(Before, Assignment_Stmt, line, column,
00278 FALSE, FALSE, TRUE);
00279 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = init_idx;
00280 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00281
00282 }
00283
00284 TRACE (Func_Exit, "finish_cdir_id", NULL);
00285
00286 }
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 void parse_end_stmt (void)
00306
00307 {
00308 int blk_idx;
00309 int buf_idx;
00310 boolean found_name;
00311 token_values_type keyword;
00312 boolean match_name = TRUE;
00313 boolean msg_issued;
00314 int stmt_num;
00315
00316
00317 TRACE (Func_Entry, "parse_end_stmt", NULL);
00318
00319 end_of_contains = FALSE;
00320
00321 if (LA_CH_VALUE == EOS) {
00322
00323
00324
00325 if (if_stmt_lbl_idx != NULL_IDX) {
00326 NEXT_LA_CH;
00327 goto EXIT;
00328 }
00329
00330 check_for_vestigial_task_blks();
00331
00332 if (CURR_BLK == Contains_Blk) {
00333 end_contains(FALSE);
00334 }
00335
00336 if (stmt_label_idx != NULL_IDX) {
00337 gen_attr_and_IR_for_lbl(FALSE);
00338 }
00339
00340 blk_idx = blk_stk_idx;
00341
00342 if (CURR_BLK > Interface_Body_Blk) {
00343
00344
00345
00346
00347
00348
00349
00350 # ifdef _DEBUG
00351 if (blk_stk_idx == NULL_IDX) {
00352 PRINTMSG(stmt_start_line, 160, Internal, stmt_start_col, NULL_IDX);
00353 }
00354 # endif
00355
00356 if (stmt_label_idx == NULL_IDX) {
00357
00358 for (blk_idx = blk_stk_idx;
00359 BLK_TYPE(blk_idx) > Interface_Body_Blk;
00360 blk_idx--);
00361 }
00362 else {
00363
00364
00365
00366
00367 msg_issued = FALSE;
00368 blk_idx = blk_stk_idx;
00369
00370 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
00371
00372 if (stmt_label_idx == BLK_LABEL(blk_idx)) {
00373
00374 if (! msg_issued) {
00375 PRINTMSG(stmt_start_line, 244, Error, stmt_start_col,
00376 stmt_type_str[stmt_type]);
00377 msg_issued = TRUE;
00378 }
00379
00380 if (blk_idx != blk_stk_idx) {
00381 pop_and_err_blk_stk(blk_idx, FALSE);
00382 }
00383
00384 move_blk_to_end(blk_idx);
00385
00386 POP_BLK_STK;
00387 }
00388 --blk_idx;
00389 }
00390 }
00391 blk_idx = blk_match_err(BLK_TYPE(blk_idx), FALSE, FALSE);
00392 }
00393 }
00394 else if (MATCHED_TOKEN_CLASS (Tok_Class_Keyword)) {
00395 keyword = TOKEN_VALUE(token);
00396 buf_idx = TOKEN_BUF_IDX(token);
00397 stmt_num = TOKEN_STMT_NUM(token);
00398
00399 check_for_vestigial_task_blks();
00400
00401 if (keyword == Tok_Kwd_File) {
00402 stmt_type = Endfile_Stmt;
00403 SH_STMT_TYPE(curr_stmt_sh_idx) = Endfile_Stmt;
00404
00405 if (stmt_label_idx != NULL_IDX) {
00406 gen_attr_and_IR_for_lbl(FALSE);
00407 }
00408
00409 parse_endfile_stmt();
00410 goto EXIT;
00411 }
00412
00413
00414
00415 if (if_stmt_lbl_idx != NULL_IDX) {
00416 parse_err_flush(Find_EOS, NULL);
00417 NEXT_LA_CH;
00418 goto EXIT;
00419 }
00420
00421 if (keyword == Tok_Kwd_Block &&
00422 !matched_specific_token(Tok_Kwd_Data, Tok_Class_Keyword)) {
00423 reset_lex(TOKEN_BUF_IDX(token), TOKEN_STMT_NUM(token));
00424 keyword = Tok_Id;
00425 }
00426
00427 #ifdef KEY
00428
00429
00430
00431
00432
00433
00434 int blk_name = BLK_NAME(blk_stk_idx);
00435 if (AT_OBJ_CLASS(blk_name) == Interface)
00436 {
00437 found_name = (LA_CH_VALUE != EOS) && parse_generic_spec();
00438 }
00439 else
00440 #endif
00441
00442 found_name = MATCHED_TOKEN_CLASS(Tok_Class_Id);
00443
00444 if (CURR_BLK == Contains_Blk &&
00445 (keyword == Tok_Kwd_Module || keyword == Tok_Kwd_Program ||
00446 keyword == Tok_Kwd_Function || keyword == Tok_Kwd_Subroutine ||
00447 keyword == Tok_Kwd_Block)) {
00448
00449
00450
00451
00452 end_contains(FALSE);
00453 }
00454
00455 if (found_name) {
00456 match_name = (CURR_BLK_NAME != NULL_IDX) ?
00457 (compare_names(TOKEN_ID(token).words,
00458 TOKEN_LEN(token),
00459 AT_OBJ_NAME_LONG(CURR_BLK_NAME),
00460 AT_NAME_LEN(CURR_BLK_NAME)) == 0) :
00461 FALSE;
00462 }
00463
00464 if (stmt_label_idx != NULL_IDX && keyword != Tok_Kwd_Type) {
00465 gen_attr_and_IR_for_lbl(FALSE);
00466 }
00467
00468 blk_idx = blk_stk_idx;
00469
00470 switch (keyword) {
00471
00472 case Tok_Kwd_Block:
00473 stmt_type = End_Blockdata_Stmt;
00474 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Blockdata_Stmt;
00475 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
00476
00477
00478
00479
00480 issue_deferred_msgs();
00481
00482
00483 if (CURR_BLK != Blockdata_Blk || !match_name) {
00484 blk_idx = blk_match_err(Blockdata_Blk, found_name, FALSE);
00485
00486 if (CURR_BLK != Blockdata_Blk) {
00487 SCP_IN_ERR(curr_scp_idx) = TRUE;
00488 }
00489 }
00490
00491 break;
00492
00493
00494 case Tok_Kwd_Module:
00495 stmt_type = End_Module_Stmt;
00496 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Module_Stmt;
00497 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
00498
00499
00500
00501
00502 issue_deferred_msgs();
00503
00504
00505 if (CURR_BLK != Module_Blk || !match_name) {
00506 blk_idx = blk_match_err(Module_Blk, found_name, FALSE);
00507
00508 if (CURR_BLK != Module_Blk) {
00509 SCP_IN_ERR(curr_scp_idx) = TRUE;
00510 }
00511 }
00512
00513 break;
00514
00515
00516 case Tok_Kwd_Program:
00517 stmt_type = End_Program_Stmt;
00518 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Program_Stmt;
00519
00520 if (stmt_label_idx != NULL_IDX) {
00521 end_labeled_do();
00522 blk_idx = blk_stk_idx;
00523 }
00524
00525
00526
00527
00528 issue_deferred_msgs();
00529
00530
00531 if (CURR_BLK != Program_Blk || !match_name) {
00532 blk_idx = blk_match_err(Program_Blk, found_name, FALSE);
00533
00534 if (CURR_BLK != Program_Blk) {
00535 SCP_IN_ERR(curr_scp_idx) = TRUE;
00536 }
00537 }
00538
00539 break;
00540
00541
00542 case Tok_Kwd_Subroutine:
00543 stmt_type = End_Subroutine_Stmt;
00544 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Subroutine_Stmt;
00545
00546 if (stmt_label_idx != NULL_IDX) {
00547 end_labeled_do();
00548 blk_idx = blk_stk_idx;
00549 }
00550
00551
00552
00553
00554 issue_deferred_msgs();
00555
00556
00557 if (STMT_CANT_BE_IN_BLK(End_Subroutine_Stmt, CURR_BLK) ||
00558 !match_name || ATP_PGM_UNIT(CURR_BLK_NAME) != Subroutine) {
00559 blk_idx = blk_match_err(Subroutine_Blk, found_name, FALSE);
00560 SCP_IN_ERR(curr_scp_idx) = TRUE;
00561 }
00562
00563 break;
00564
00565
00566 case Tok_Kwd_Function:
00567 stmt_type = End_Function_Stmt;
00568 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Function_Stmt;
00569
00570 if (stmt_label_idx != NULL_IDX) {
00571 end_labeled_do();
00572 blk_idx = blk_stk_idx;
00573 }
00574
00575
00576
00577
00578 issue_deferred_msgs();
00579
00580
00581 if (STMT_CANT_BE_IN_BLK(End_Function_Stmt, CURR_BLK) ||
00582 !match_name || ATP_PGM_UNIT(CURR_BLK_NAME) != Function) {
00583 blk_idx = blk_match_err(Function_Blk, found_name, FALSE);
00584 SCP_IN_ERR(curr_scp_idx) = TRUE;
00585 }
00586
00587 break;
00588
00589
00590 case Tok_Kwd_Interface:
00591
00592 stmt_type = End_Interface_Stmt;
00593 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Interface_Stmt;
00594
00595 if (CURR_BLK != Interface_Blk || !match_name) {
00596 blk_idx = blk_match_err(Interface_Blk, found_name, FALSE);
00597 }
00598
00599 if (blk_idx != NULL_IDX) {
00600 curr_stmt_category = Declaration_Stmt_Cat;
00601 }
00602
00603 break;
00604
00605 #ifdef KEY
00606 case Tok_Kwd_Enum:
00607
00608 stmt_type = End_Enum_Stmt;
00609 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Enum_Stmt;
00610
00611 if (CURR_BLK != Enum_Blk || !match_name) {
00612 blk_idx = blk_match_err(Enum_Blk, found_name, FALSE);
00613 }
00614
00615 if (blk_idx != NULL_IDX) {
00616 curr_stmt_category = Declaration_Stmt_Cat;
00617 }
00618
00619 break;
00620 #endif
00621
00622
00623 case Tok_Kwd_Type:
00624
00625 stmt_type = End_Type_Stmt;
00626 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Type_Stmt;
00627
00628 if (CURR_BLK != Derived_Type_Blk || !match_name) {
00629 blk_idx = blk_match_err(Derived_Type_Blk, found_name, FALSE);
00630 }
00631
00632 if (blk_idx != NULL_IDX) {
00633 curr_stmt_category = Declaration_Stmt_Cat;
00634 }
00635
00636 break;
00637
00638
00639 case Tok_Kwd_If:
00640 stmt_type = End_If_Stmt;
00641 SH_STMT_TYPE(curr_stmt_sh_idx) = End_If_Stmt;
00642
00643
00644
00645
00646
00647
00648 if (CURR_BLK_NAME != NULL_IDX && ! found_name) {
00649 match_name = FALSE;
00650 }
00651
00652 if (STMT_CANT_BE_IN_BLK(End_If_Stmt, CURR_BLK) || ! match_name) {
00653 blk_idx = blk_match_err(If_Blk, found_name, TRUE);
00654 }
00655
00656 if ((cif_flags & XREF_RECS) && found_name && match_name) {
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677 cif_usage_rec(CURR_BLK_NAME,
00678 AT_Tbl_Idx,
00679 TOKEN_LINE(token),
00680 TOKEN_COLUMN(token),
00681 CIF_Construct_Name_Reference);
00682 }
00683
00684 break;
00685
00686
00687 case Tok_Kwd_Do:
00688 stmt_type = End_Do_Stmt;
00689 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Do_Stmt;
00690
00691
00692
00693
00694
00695
00696 if (CURR_BLK_NAME != NULL_IDX && ! found_name) {
00697 match_name = FALSE;
00698 }
00699
00700 if (STMT_CANT_BE_IN_BLK(End_Do_Stmt, CURR_BLK) || !match_name) {
00701 blk_idx = blk_match_err(Do_Blk, found_name, TRUE);
00702 }
00703
00704 if ((cif_flags & XREF_RECS) && found_name && match_name) {
00705
00706
00707
00708
00709 cif_usage_rec(CURR_BLK_NAME,
00710 AT_Tbl_Idx,
00711 TOKEN_LINE(token),
00712 TOKEN_COLUMN(token),
00713 CIF_Construct_Name_Reference);
00714 }
00715
00716 break;
00717
00718
00719 case Tok_Kwd_Select:
00720 stmt_type = End_Select_Stmt;
00721 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Select_Stmt;
00722
00723
00724
00725
00726
00727
00728 if (CURR_BLK_NAME != NULL_IDX && ! found_name) {
00729 match_name = FALSE;
00730 }
00731
00732 if (STMT_CANT_BE_IN_BLK(End_Select_Stmt, CURR_BLK) || !match_name) {
00733 blk_idx = blk_match_err(Select_Blk, found_name, TRUE);
00734 }
00735
00736
00737 if ((cif_flags & XREF_RECS) && found_name && match_name) {
00738
00739
00740
00741
00742 cif_usage_rec(CURR_BLK_NAME,
00743 AT_Tbl_Idx,
00744 TOKEN_LINE(token),
00745 TOKEN_COLUMN(token),
00746 CIF_Construct_Name_Reference);
00747 }
00748
00749 break;
00750
00751 case Tok_Kwd_Forall:
00752
00753 stmt_type = End_Forall_Stmt;
00754 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Forall_Stmt;
00755
00756
00757
00758
00759
00760 if (CURR_BLK_NAME != NULL_IDX && ! found_name) {
00761 match_name = FALSE;
00762 }
00763
00764 if (STMT_CANT_BE_IN_BLK(End_Forall_Stmt, CURR_BLK) || !match_name){
00765 blk_idx = blk_match_err(Forall_Blk, found_name, TRUE);
00766 }
00767
00768 break;
00769
00770 case Tok_Kwd_Where:
00771
00772 stmt_type = End_Where_Stmt;
00773 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Where_Stmt;
00774
00775
00776
00777
00778
00779 if (CURR_BLK_NAME != NULL_IDX && ! found_name) {
00780 match_name = FALSE;
00781 }
00782
00783 if (STMT_CANT_BE_IN_BLK(End_Where_Stmt, CURR_BLK) || !match_name) {
00784 blk_idx = blk_match_err(Where_Then_Blk, found_name, TRUE);
00785 }
00786
00787 break;
00788
00789
00790 default:
00791 reset_lex(buf_idx, stmt_num);
00792 MATCHED_TOKEN_CLASS(Tok_Class_Id);
00793
00794
00795
00796
00797
00798
00799
00800
00801 if (CURR_BLK == Contains_Blk) {
00802 end_contains(FALSE);
00803 }
00804
00805 PRINTMSG(TOKEN_LINE(token), 186, Error, TOKEN_COLUMN(token),
00806 (CURR_BLK == Select_Blk) ? "SELECT" :
00807 blk_desc_str(blk_stk_idx),
00808 TOKEN_STR(token));
00809
00810
00811
00812 CURR_BLK_ERR = TRUE;
00813 SH_ERR_FLG(curr_stmt_sh_idx) = TRUE;
00814 blk_idx = NULL_IDX;
00815 parse_err_flush(Find_EOS, NULL);
00816 break;
00817
00818 }
00819
00820 if (LA_CH_VALUE != EOS) {
00821 parse_err_flush(Find_EOS, EOS_STR);
00822 }
00823
00824 }
00825 else {
00826 PRINTMSG(LA_CH_LINE, 769, Error, LA_CH_COLUMN,
00827 (CURR_BLK == Select_Blk) ? "SELECT" : blk_desc_str(blk_stk_idx),
00828 LA_CH_VALUE);
00829
00830 parse_err_flush(Find_EOS, NULL);
00831
00832
00833
00834 if (if_stmt_lbl_idx == NULL_IDX) {
00835 CURR_BLK_ERR = TRUE;
00836 }
00837
00838 blk_idx = NULL_IDX;
00839 }
00840
00841
00842 if (blk_idx != NULL_IDX) {
00843
00844
00845
00846 if ( (BLK_TYPE(blk_idx) >= Blockdata_Blk) &&
00847 (BLK_TYPE(blk_idx) <= Subroutine_Blk) ) {
00848 finish_cdir_id();
00849 }
00850
00851 (*end_blocks[BLK_TYPE(blk_idx)]) (FALSE);
00852 }
00853
00854
00855
00856
00857 if (LA_CH_VALUE == EOS && stmt_line_idx > 1) {
00858 PRINTMSG(LA_CH_LINE, 1640, Ansi, LA_CH_COLUMN);
00859 }
00860
00861
00862
00863
00864
00865
00866 cif_end_unit_line = LA_CH_LINE;
00867 cif_end_unit_column = LA_CH_COLUMN - 1;
00868
00869 NEXT_LA_CH;
00870
00871 if (EOPU_encountered && LA_CH_CLASS != Ch_Class_EOF) {
00872 cif_pgm_unit_start_line =
00873 (LA_CH_LINE == cif_end_unit_line) ? cif_end_unit_line :
00874 cif_end_unit_line + 1;
00875 }
00876
00877 EXIT:
00878
00879 TRACE (Func_Exit, "parse_end_stmt", NULL);
00880
00881 return;
00882
00883 }
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904 static void end_program_unit(boolean err_call)
00905
00906 {
00907 int ir_idx;
00908 int glb_idx;
00909 int rtn_idx;
00910 int act_file_line;
00911
00912
00913 TRACE (Func_Entry, "end_program_unit", NULL);
00914
00915
00916 do_cmic_blk_checks();
00917
00918 if (glb_tbl_idx[End_Attr_Idx] == NULL_IDX) {
00919 glb_tbl_idx[End_Attr_Idx] = create_lib_entry_attr(END_LIB_ENTRY,
00920 END_NAME_LEN,
00921 TOKEN_LINE(token),
00922 TOKEN_COLUMN(token));
00923 ATP_NOSIDE_EFFECTS(glb_tbl_idx[End_Attr_Idx]) = TRUE;
00924 }
00925
00926 ADD_ATTR_TO_LOCAL_LIST(glb_tbl_idx[End_Attr_Idx]);
00927
00928 NTR_IR_TBL(ir_idx);
00929 IR_OPR(ir_idx) = Call_Opr;
00930 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
00931 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00932 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00933
00934 GLOBAL_LINE_TO_FILE_LINE(TOKEN_LINE(token), glb_idx, act_file_line);
00935 GL_SOURCE_LINES(global_line_tbl_idx) = act_file_line;
00936 set_related_gl_source_lines(global_line_tbl_idx);
00937
00938 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
00939 IR_IDX_L(ir_idx) = glb_tbl_idx[End_Attr_Idx];
00940 IR_COL_NUM_L(ir_idx) = IR_COL_NUM(ir_idx);
00941 IR_LINE_NUM_L(ir_idx) = IR_LINE_NUM(ir_idx);
00942
00943 if (err_call) {
00944 gen_sh(Before, End_Program_Stmt, stmt_start_line, stmt_start_col,
00945 TRUE, FALSE, FALSE);
00946
00947 SCP_LAST_SH_IDX(curr_scp_idx) = SH_PREV_IDX(curr_stmt_sh_idx);
00948 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = ir_idx;
00949 SCP_IN_ERR(curr_scp_idx) = TRUE;
00950 }
00951 else {
00952 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
00953 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
00954
00955 NTR_IR_TBL(rtn_idx);
00956 IR_TYPE_IDX(rtn_idx) = TYPELESS_DEFAULT_TYPE;
00957 IR_OPR(rtn_idx) = Return_Opr;
00958 IR_LINE_NUM(rtn_idx) = IR_LINE_NUM(ir_idx);
00959 IR_COL_NUM(rtn_idx) = IR_COL_NUM(ir_idx);
00960 gen_sh(After,
00961 Return_Stmt,
00962 IR_LINE_NUM(ir_idx),
00963 IR_COL_NUM(ir_idx),
00964 FALSE,
00965 TRUE,
00966 TRUE);
00967 SH_IR_IDX(curr_stmt_sh_idx) = rtn_idx;
00968 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
00969
00970 if (stmt_label_idx != NULL_IDX && !err_call) {
00971 ATL_CLASS(stmt_label_idx) = Lbl_User;
00972 ATL_DEBUG_CLASS(stmt_label_idx) = Ldbg_User_Lbl;
00973 ATL_EXECUTABLE(stmt_label_idx) = TRUE;
00974
00975 if (!AT_DEFINED(stmt_label_idx) &&
00976 ATL_FWD_REF_IDX(stmt_label_idx) != NULL_IDX) {
00977 resolve_fwd_lbl_refs();
00978 }
00979
00980 stmt_label_idx = NULL_IDX;
00981 }
00982
00983 if (cmd_line_flags.debug_lvl == Debug_Lvl_0) {
00984
00985 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
00986 }
00987 else if (cmd_line_flags.debug_lvl == Debug_Lvl_1) {
00988 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Start_Epilogue, NULL_IDX);
00989 }
00990 }
00991
00992 EOPU_encountered = TRUE;
00993 curr_stmt_category = Init_Stmt_Cat;
00994
00995 if (cif_flags & MISC_RECS) {
00996 cif_stmt_type_rec(TRUE, CIF_End_Program_Stmt, statement_number);
00997 }
00998
00999 if (cif_flags & BASIC_RECS) {
01000 cif_end_scope_rec();
01001 }
01002
01003 if (err_call && ! clearing_blk_stk) {
01004
01005
01006
01007 if (cif_flags & BASIC_RECS) {
01008 cif_send_attr(SCP_ATTR_IDX(curr_scp_idx), NULL_IDX);
01009 }
01010 cif_end_unit_rec(AT_OBJ_NAME_PTR(SCP_ATTR_IDX(curr_scp_idx)));
01011 }
01012
01013 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01014
01015 POP_BLK_STK;
01016 PRINT_SCP_TBL;
01017 PRINT_EQV_TBL;
01018
01019 TRACE (Func_Exit, "end_program_unit", NULL);
01020
01021 return;
01022
01023 }
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046 static void end_function(boolean err_call)
01047 {
01048 int idx;
01049 int ir_idx;
01050 int glb_idx;
01051 int act_file_line;
01052
01053
01054 TRACE (Func_Entry, "end_function", NULL);
01055
01056 do_cmic_blk_checks();
01057
01058 NTR_IR_TBL(ir_idx);
01059
01060 IR_OPR(ir_idx) = Return_Opr;
01061 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
01062 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
01063 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
01064
01065 GLOBAL_LINE_TO_FILE_LINE(TOKEN_LINE(token), glb_idx, act_file_line);
01066 GL_SOURCE_LINES(global_line_tbl_idx) = act_file_line;
01067 set_related_gl_source_lines(global_line_tbl_idx);
01068
01069 if (err_call) {
01070 gen_sh(Before, End_Function_Stmt, stmt_start_line, stmt_start_col,
01071 TRUE, FALSE, FALSE);
01072
01073 SCP_LAST_SH_IDX(curr_scp_idx) = SH_PREV_IDX(curr_stmt_sh_idx);
01074 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = ir_idx;
01075 SCP_IN_ERR(curr_scp_idx) = TRUE;
01076 }
01077 else {
01078 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
01079 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01080 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Function_Stmt;
01081
01082 if (stmt_label_idx != NULL_IDX) {
01083 ATL_CLASS(stmt_label_idx) = Lbl_User;
01084 ATL_DEBUG_CLASS(stmt_label_idx) = Ldbg_User_Lbl;
01085 ATL_EXECUTABLE(stmt_label_idx) = TRUE;
01086
01087 if (!AT_DEFINED(stmt_label_idx) &&
01088 ATL_FWD_REF_IDX(stmt_label_idx) != NULL_IDX) {
01089 resolve_fwd_lbl_refs();
01090 }
01091
01092 stmt_label_idx = NULL_IDX;
01093 }
01094
01095 if (cmd_line_flags.debug_lvl == Debug_Lvl_0) {
01096 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
01097 }
01098 else if (cmd_line_flags.debug_lvl == Debug_Lvl_1) {
01099 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Start_Epilogue, NULL_IDX);
01100 }
01101 }
01102
01103 EOPU_encountered = TRUE;
01104 curr_stmt_category = Init_Stmt_Cat;
01105
01106
01107
01108
01109 if (cif_flags & MISC_RECS) {
01110 cif_stmt_type_rec(TRUE, CIF_End_Function_Stmt, statement_number);
01111 }
01112
01113 if (cif_flags & BASIC_RECS) {
01114 cif_end_scope_rec();
01115 }
01116
01117 if (err_call && ! clearing_blk_stk) {
01118
01119
01120
01121 if (cif_flags & BASIC_RECS) {
01122 cif_send_attr(SCP_ATTR_IDX(curr_scp_idx), NULL_IDX);
01123 }
01124 cif_end_unit_rec(AT_OBJ_NAME_PTR(SCP_ATTR_IDX(curr_scp_idx)));
01125
01126 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01127 idx = SCP_ENTRY_IDX(curr_scp_idx);
01128
01129 while (idx != NULL_IDX) {
01130
01131 if (cif_flags & BASIC_RECS) {
01132 cif_send_attr(AL_ATTR_IDX(idx), NULL_IDX);
01133 }
01134 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = FALSE;
01135 idx = AL_NEXT_IDX(idx);
01136 }
01137 }
01138 else {
01139
01140 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01141 idx = SCP_ENTRY_IDX(curr_scp_idx);
01142
01143 while (idx != NULL_IDX) {
01144 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = FALSE;
01145 idx = AL_NEXT_IDX(idx);
01146 }
01147 }
01148
01149 POP_BLK_STK;
01150 PRINT_SCP_TBL;
01151 PRINT_EQV_TBL;
01152
01153 TRACE (Func_Exit, "end_function", NULL);
01154
01155 return;
01156
01157 }
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180 static void end_subroutine(boolean err_call)
01181
01182 {
01183 int idx;
01184 int ir_idx;
01185 int glb_idx;
01186 int act_file_line;
01187
01188
01189 TRACE (Func_Entry, "end_subroutine", NULL);
01190
01191 do_cmic_blk_checks();
01192
01193 NTR_IR_TBL(ir_idx);
01194
01195 IR_OPR(ir_idx) = Return_Opr;
01196 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
01197 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
01198 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
01199
01200 GLOBAL_LINE_TO_FILE_LINE(TOKEN_LINE(token), glb_idx, act_file_line);
01201 GL_SOURCE_LINES(global_line_tbl_idx) = act_file_line;
01202 set_related_gl_source_lines(global_line_tbl_idx);
01203
01204 if (ATP_HAS_ALT_RETURN(SCP_ATTR_IDX(curr_scp_idx))) {
01205
01206 IR_FLD_L(ir_idx) = CN_Tbl_Idx;
01207 IR_IDX_L(ir_idx) = CN_INTEGER_ZERO_IDX;
01208 IR_LINE_NUM_L(ir_idx) = TOKEN_LINE(token);
01209 IR_COL_NUM_L(ir_idx) = TOKEN_COLUMN(token);
01210 }
01211
01212 if (err_call) {
01213 gen_sh(Before, End_Subroutine_Stmt, stmt_start_line, stmt_start_col,
01214 TRUE, FALSE, FALSE);
01215
01216 SCP_LAST_SH_IDX(curr_scp_idx) = SH_PREV_IDX(curr_stmt_sh_idx);
01217 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = ir_idx;
01218 SCP_IN_ERR(curr_scp_idx) = TRUE;
01219 }
01220 else {
01221 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
01222 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01223
01224 if (stmt_label_idx != NULL_IDX) {
01225 ATL_CLASS(stmt_label_idx) = Lbl_User;
01226 ATL_DEBUG_CLASS(stmt_label_idx) = Ldbg_User_Lbl;
01227 ATL_EXECUTABLE(stmt_label_idx) = TRUE;
01228
01229 if (!AT_DEFINED(stmt_label_idx) &&
01230 ATL_FWD_REF_IDX(stmt_label_idx) != NULL_IDX) {
01231 resolve_fwd_lbl_refs();
01232 }
01233
01234 end_labeled_do();
01235 stmt_label_idx = NULL_IDX;
01236 }
01237
01238 if (cmd_line_flags.debug_lvl == Debug_Lvl_0) {
01239 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
01240 }
01241 else if (cmd_line_flags.debug_lvl == Debug_Lvl_1) {
01242 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Start_Epilogue, NULL_IDX);
01243 }
01244 }
01245
01246 EOPU_encountered = TRUE;
01247 curr_stmt_category = Init_Stmt_Cat;
01248
01249
01250
01251
01252 if (cif_flags & MISC_RECS) {
01253 cif_stmt_type_rec(TRUE, CIF_End_Subroutine_Stmt, statement_number);
01254 }
01255
01256 if (cif_flags & BASIC_RECS) {
01257 cif_end_scope_rec();
01258 }
01259
01260 if (err_call && ! clearing_blk_stk) {
01261
01262
01263
01264 if (cif_flags & BASIC_RECS) {
01265 cif_send_attr(SCP_ATTR_IDX(curr_scp_idx), NULL_IDX);
01266 }
01267 cif_end_unit_rec(AT_OBJ_NAME_PTR(SCP_ATTR_IDX(curr_scp_idx)));
01268
01269 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01270 idx = SCP_ENTRY_IDX(curr_scp_idx);
01271
01272 while (idx != NULL_IDX) {
01273
01274 if (cif_flags & BASIC_RECS) {
01275 cif_send_attr(AL_ATTR_IDX(idx), NULL_IDX);
01276 }
01277 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = FALSE;
01278 idx = AL_NEXT_IDX(idx);
01279 }
01280 }
01281 else {
01282 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01283 idx = SCP_ENTRY_IDX(curr_scp_idx);
01284
01285 while (idx != NULL_IDX) {
01286 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = FALSE;
01287 idx = AL_NEXT_IDX(idx);
01288 }
01289 }
01290
01291 POP_BLK_STK;
01292 PRINT_SCP_TBL;
01293 PRINT_EQV_TBL;
01294
01295 TRACE (Func_Exit, "end_subroutine", NULL);
01296
01297 return;
01298
01299 }
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320 static void end_module(boolean err_call)
01321 {
01322
01323 int act_file_line;
01324 int glb_idx;
01325
01326
01327 TRACE (Func_Entry, "end_module", NULL);
01328
01329 GLOBAL_LINE_TO_FILE_LINE(stmt_start_line, glb_idx, act_file_line);
01330 GL_SOURCE_LINES(global_line_tbl_idx) = act_file_line;
01331 set_related_gl_source_lines(global_line_tbl_idx);
01332
01333 if (err_call) {
01334 gen_sh(Before, End_Module_Stmt, stmt_start_line, stmt_start_col,
01335 TRUE, FALSE, FALSE);
01336 SCP_LAST_SH_IDX(curr_scp_idx) = SH_PREV_IDX(curr_stmt_sh_idx);
01337 SCP_IN_ERR(curr_scp_idx) = TRUE;
01338 }
01339 else {
01340 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01341
01342 if (stmt_label_idx != NULL_IDX && !err_call) {
01343 ATL_CLASS(stmt_label_idx) = Lbl_User;
01344 ATL_DEBUG_CLASS(stmt_label_idx) = Ldbg_User_Lbl;
01345 ATL_EXECUTABLE(stmt_label_idx) = TRUE;
01346
01347 if (!AT_DEFINED(stmt_label_idx) &&
01348 ATL_FWD_REF_IDX(stmt_label_idx) != NULL_IDX) {
01349 resolve_fwd_lbl_refs();
01350 }
01351 stmt_label_idx = NULL_IDX;
01352 }
01353 }
01354
01355 EOPU_encountered = TRUE;
01356 curr_stmt_category = Init_Stmt_Cat;
01357
01358 if (cif_flags & MISC_RECS) {
01359 cif_stmt_type_rec(TRUE, CIF_End_Module_Stmt, statement_number);
01360 }
01361
01362 if (cif_flags & BASIC_RECS) {
01363 cif_end_scope_rec();
01364 }
01365
01366 if (err_call && ! clearing_blk_stk) {
01367
01368
01369
01370 if (cif_flags & BASIC_RECS) {
01371 cif_send_attr(SCP_ATTR_IDX(curr_scp_idx), NULL_IDX);
01372 }
01373 cif_end_unit_rec(AT_OBJ_NAME_PTR(SCP_ATTR_IDX(curr_scp_idx)));
01374 }
01375
01376 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01377
01378 POP_BLK_STK;
01379 PRINT_SCP_TBL;
01380 PRINT_EQV_TBL;
01381
01382 TRACE (Func_Exit, "end_module", NULL);
01383
01384 return;
01385
01386 }
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399
01400
01401
01402
01403
01404
01405
01406
01407 static void end_blockdata(boolean err_call)
01408 {
01409
01410 int glb_idx;
01411 int act_file_line;
01412
01413 TRACE (Func_Entry, "end_blockdata", NULL);
01414
01415 GLOBAL_LINE_TO_FILE_LINE(stmt_start_line, glb_idx, act_file_line);
01416 GL_SOURCE_LINES(global_line_tbl_idx) = act_file_line;
01417 set_related_gl_source_lines(global_line_tbl_idx);
01418
01419 if (err_call) {
01420 gen_sh(Before, End_Blockdata_Stmt, stmt_start_line, stmt_start_col,
01421 TRUE, FALSE, FALSE);
01422 SCP_LAST_SH_IDX(curr_scp_idx) = SH_PREV_IDX(curr_stmt_sh_idx);
01423 SCP_IN_ERR(curr_scp_idx) = TRUE;
01424 }
01425 else {
01426 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01427
01428 if (stmt_label_idx != NULL_IDX && !err_call) {
01429 ATL_CLASS(stmt_label_idx) = Lbl_User;
01430 ATL_DEBUG_CLASS(stmt_label_idx) = Ldbg_User_Lbl;
01431 ATL_EXECUTABLE(stmt_label_idx) = TRUE;
01432
01433 if (!AT_DEFINED(stmt_label_idx) &&
01434 ATL_FWD_REF_IDX(stmt_label_idx) != NULL_IDX) {
01435 resolve_fwd_lbl_refs();
01436 }
01437 stmt_label_idx = NULL_IDX;
01438 }
01439 }
01440
01441 EOPU_encountered = TRUE;
01442 curr_stmt_category = Init_Stmt_Cat;
01443 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01444
01445 if (cif_flags & MISC_RECS) {
01446 cif_stmt_type_rec(TRUE, CIF_End_Block_Data_Stmt, statement_number);
01447 }
01448
01449 if (cif_flags & BASIC_RECS) {
01450 cif_end_scope_rec();
01451 }
01452
01453 if (err_call && ! clearing_blk_stk) {
01454
01455
01456
01457 if (cif_flags & BASIC_RECS) {
01458 cif_send_attr(SCP_ATTR_IDX(curr_scp_idx), NULL_IDX);
01459 }
01460 cif_end_unit_rec(AT_OBJ_NAME_PTR(SCP_ATTR_IDX(curr_scp_idx)));
01461 }
01462
01463 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
01464
01465 POP_BLK_STK;
01466 PRINT_SCP_TBL;
01467 PRINT_EQV_TBL;
01468
01469 TRACE (Func_Exit, "end_blockdata", NULL);
01470
01471 return;
01472
01473 }
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494 static void end_internal_proc(boolean err_call)
01495
01496 {
01497 int attr_idx;
01498 int ir_idx;
01499
01500 TRACE (Func_Entry, "end_internal_proc", NULL);
01501
01502 #ifdef KEY
01503 revisit_volatile();
01504 #endif
01505
01506 do_cmic_blk_checks();
01507
01508 NTR_IR_TBL(ir_idx);
01509
01510 IR_OPR(ir_idx) = Return_Opr;
01511 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
01512 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
01513 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
01514 attr_idx = SCP_ATTR_IDX(curr_scp_idx);
01515
01516 if (ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) == Subroutine &&
01517 ATP_HAS_ALT_RETURN(SCP_ATTR_IDX(curr_scp_idx))) {
01518
01519 IR_FLD_L(ir_idx) = CN_Tbl_Idx;
01520 IR_IDX_L(ir_idx) = CN_INTEGER_ZERO_IDX;
01521 IR_LINE_NUM_L(ir_idx) = TOKEN_LINE(token);
01522 IR_COL_NUM_L(ir_idx) = TOKEN_COLUMN(token);
01523 }
01524
01525 if (err_call) {
01526 gen_sh(Before,
01527 stmt_type,
01528 stmt_start_line,
01529 stmt_start_col,
01530 TRUE,
01531 FALSE,
01532 FALSE);
01533
01534 SCP_LAST_SH_IDX(curr_scp_idx) = SH_PREV_IDX(curr_stmt_sh_idx);
01535 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = ir_idx;
01536 SCP_IN_ERR(curr_scp_idx) = TRUE;
01537 }
01538 else {
01539 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
01540 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01541
01542 if (stmt_label_idx != NULL_IDX) {
01543 ATL_CLASS(stmt_label_idx) = Lbl_User;
01544 ATL_DEBUG_CLASS(stmt_label_idx) = Ldbg_User_Lbl;
01545 ATL_EXECUTABLE(stmt_label_idx) = TRUE;
01546
01547 if (!AT_DEFINED(stmt_label_idx) &&
01548 ATL_FWD_REF_IDX(stmt_label_idx) != NULL_IDX) {
01549 resolve_fwd_lbl_refs();
01550 }
01551 stmt_label_idx = NULL_IDX;
01552 }
01553
01554 if (cmd_line_flags.debug_lvl == Debug_Lvl_0) {
01555 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
01556 }
01557 else if (cmd_line_flags.debug_lvl == Debug_Lvl_1) {
01558 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Start_Epilogue, NULL_IDX);
01559 }
01560 }
01561
01562 if (cif_flags & BASIC_RECS) {
01563 cif_end_scope_rec();
01564 }
01565
01566 if (cif_flags & MISC_RECS) {
01567 cif_stmt_type_rec(TRUE, (ATP_PGM_UNIT(attr_idx) == Function) ?
01568 CIF_End_Function_Stmt : CIF_End_Subroutine_Stmt,
01569 statement_number);
01570 }
01571
01572 if (stmt_type == End_Stmt) {
01573 PRINTMSG(stmt_start_line, 86, Error, stmt_start_col,
01574 "internal-procedure",
01575 (ATP_PGM_UNIT(attr_idx) == Function) ? "FUNCTION" :
01576 "SUBROUTINE");
01577 }
01578
01579 curr_stmt_category = Sub_Func_Stmt_Cat;
01580 ATP_SCP_ALIVE(attr_idx) = FALSE;
01581 curr_scp_idx = SCP_PARENT_IDX(curr_scp_idx);
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592 if (SCP_LAST_SH_IDX(curr_scp_idx) == NULL_IDX) {
01593 curr_stmt_sh_idx = ntr_sh_tbl();
01594 SCP_FIRST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01595 need_new_sh = FALSE;
01596 }
01597 else {
01598 curr_stmt_sh_idx = SCP_LAST_SH_IDX(curr_scp_idx);
01599 }
01600
01601 POP_BLK_STK;
01602 PRINT_SCP_TBL;
01603 PRINT_EQV_TBL;
01604
01605 TRACE (Func_Exit, "end_internal_proc", NULL);
01606
01607 return;
01608
01609 }
01610
01611
01612
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630 static void end_module_proc(boolean err_call)
01631
01632 {
01633 int attr_idx;
01634 int idx;
01635 int ir_idx;
01636
01637
01638 TRACE (Func_Entry, "end_module_proc", NULL);
01639
01640 #ifdef KEY
01641 revisit_volatile();
01642 #endif
01643
01644 do_cmic_blk_checks();
01645
01646 NTR_IR_TBL(ir_idx);
01647
01648 IR_OPR(ir_idx) = Return_Opr;
01649 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
01650 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
01651 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
01652 attr_idx = SCP_ATTR_IDX(curr_scp_idx);
01653
01654 if (ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) == Subroutine &&
01655 ATP_HAS_ALT_RETURN(SCP_ATTR_IDX(curr_scp_idx))) {
01656
01657 IR_FLD_L(ir_idx) = CN_Tbl_Idx;
01658 IR_IDX_L(ir_idx) = CN_INTEGER_ZERO_IDX;
01659 IR_LINE_NUM_L(ir_idx) = TOKEN_LINE(token);
01660 IR_COL_NUM_L(ir_idx) = TOKEN_COLUMN(token);
01661 }
01662
01663 if (err_call) {
01664 gen_sh(Before,
01665 stmt_type,
01666 stmt_start_line,
01667 stmt_start_col,
01668 TRUE,
01669 FALSE,
01670 FALSE);
01671
01672 SCP_LAST_SH_IDX(curr_scp_idx) = SH_PREV_IDX(curr_stmt_sh_idx);
01673 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = ir_idx;
01674 SCP_IN_ERR(curr_scp_idx) = TRUE;
01675 }
01676 else {
01677 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
01678 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01679
01680 if (stmt_label_idx != NULL_IDX) {
01681 ATL_CLASS(stmt_label_idx) = Lbl_User;
01682 ATL_DEBUG_CLASS(stmt_label_idx) = Ldbg_User_Lbl;
01683 ATL_EXECUTABLE(stmt_label_idx) = TRUE;
01684
01685 if (!AT_DEFINED(stmt_label_idx) &&
01686 ATL_FWD_REF_IDX(stmt_label_idx) != NULL_IDX) {
01687 resolve_fwd_lbl_refs();
01688 }
01689
01690 stmt_label_idx = NULL_IDX;
01691 }
01692
01693 if (cmd_line_flags.debug_lvl == Debug_Lvl_0) {
01694 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
01695 }
01696 else if (cmd_line_flags.debug_lvl == Debug_Lvl_1) {
01697 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Start_Epilogue, NULL_IDX);
01698 }
01699 }
01700
01701 if (cif_flags & BASIC_RECS) {
01702 cif_end_scope_rec();
01703 }
01704
01705 if (cif_flags & MISC_RECS) {
01706 cif_stmt_type_rec(TRUE, (ATP_PGM_UNIT(CURR_BLK_NAME) == Function) ?
01707 CIF_End_Function_Stmt : CIF_End_Subroutine_Stmt,
01708 statement_number);
01709 }
01710
01711 if (stmt_type == End_Stmt) {
01712 PRINTMSG(stmt_start_line, 86, Error,
01713 stmt_start_col,
01714 "module-procedure",
01715 (ATP_PGM_UNIT(CURR_BLK_NAME) == Function) ? "FUNCTION" :
01716 "SUBROUTINE");
01717 }
01718
01719 ATP_SCP_ALIVE(attr_idx) = FALSE;
01720
01721
01722
01723
01724 idx = SCP_ENTRY_IDX(curr_scp_idx);
01725
01726 while (idx != NULL_IDX) {
01727 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = FALSE;
01728 idx = AL_NEXT_IDX(idx);
01729 }
01730
01731 curr_stmt_category = Sub_Func_Stmt_Cat;
01732 curr_scp_idx = SCP_PARENT_IDX(curr_scp_idx);
01733
01734
01735
01736
01737
01738
01739
01740
01741
01742
01743
01744 if (SCP_LAST_SH_IDX(curr_scp_idx) == NULL_IDX) {
01745 curr_stmt_sh_idx = ntr_sh_tbl();
01746 SCP_FIRST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01747 need_new_sh = FALSE;
01748 }
01749 else {
01750 curr_stmt_sh_idx = SCP_LAST_SH_IDX(curr_scp_idx);
01751 }
01752
01753 POP_BLK_STK;
01754 PRINT_SCP_TBL;
01755 PRINT_EQV_TBL;
01756
01757 TRACE (Func_Exit, "end_module_proc", NULL);
01758
01759 return;
01760
01761 }
01762
01763
01764
01765
01766
01767
01768
01769
01770
01771
01772
01773
01774
01775
01776
01777
01778
01779
01780
01781
01782 static void end_interface_body(boolean err_call)
01783
01784 {
01785 int interface_idx;
01786 int parent_idx;
01787 int save_curr_scp_idx;
01788 int sibling_idx;
01789
01790
01791 TRACE (Func_Entry, "end_interface_body", NULL);
01792
01793 if (cif_flags & BASIC_RECS) {
01794 cif_scope_info_rec();
01795 cif_end_scope_rec();
01796 }
01797
01798 if (cif_flags & MISC_RECS) {
01799 cif_stmt_type_rec(TRUE,
01800 (ATP_PGM_UNIT(CURR_BLK_NAME) == Function) ?
01801 CIF_End_Function_Stmt : CIF_End_Subroutine_Stmt,
01802 statement_number);
01803 }
01804
01805 curr_stmt_sh_idx = SCP_FIRST_SH_IDX(curr_scp_idx);
01806 stmt_start_line = SH_GLB_LINE(curr_stmt_sh_idx);
01807 stmt_start_col = SH_COL_NUM(curr_stmt_sh_idx);
01808 need_new_sh = TRUE;
01809
01810 interface_semantics_pass_driver();
01811
01812 parent_idx = SCP_PARENT_IDX(curr_scp_idx);
01813
01814 free_attr_list(SCP_TMP_FW_IDX2(curr_scp_idx));
01815 free_attr_list(SCP_TMP_FW_IDX(curr_scp_idx));
01816 free_attr_list(SCP_ENTRY_IDX(curr_scp_idx));
01817 free_attr_list(SCP_TMP_LIST(curr_scp_idx));
01818 free_attr_list(SCP_ATTR_LIST(curr_scp_idx));
01819
01820 SCP_ATTR_LIST(curr_scp_idx) = NULL_IDX;
01821 SCP_TMP_FW_IDX2(curr_scp_idx) = NULL_IDX;
01822 SCP_TMP_FW_IDX(curr_scp_idx) = NULL_IDX;
01823 SCP_ENTRY_IDX(curr_scp_idx) = NULL_IDX;
01824 SCP_TMP_LIST(curr_scp_idx) = NULL_IDX;
01825
01826 remove_hidden_name_tbl(curr_scp_idx);
01827
01828 if (!SCP_IN_ERR(curr_scp_idx) &&
01829 BLK_TYPE(blk_stk_idx - 1) == Interface_Blk) {
01830 blk_stk_idx--;
01831 interface_idx = (BLK_NAME(blk_stk_idx) == NULL_IDX) ?
01832 BLK_UNNAMED_INTERFACE(blk_stk_idx) :
01833 BLK_NAME(blk_stk_idx);
01834
01835 if ((ATI_NUM_SPECIFICS(interface_idx) % 8) == 0 &&
01836 !AT_DCL_ERR(interface_idx) && ATI_HAS_NON_MOD_PROC(interface_idx)) {
01837 save_curr_scp_idx = curr_scp_idx;
01838 curr_scp_idx = parent_idx;
01839 collapse_interface_blk(interface_idx);
01840 ATI_HAS_NON_MOD_PROC(interface_idx) = FALSE;
01841 BLK_AT_IDX(blk_stk_idx) = NULL_IDX;
01842 BLK_BD_IDX(blk_stk_idx) = NULL_IDX;
01843 BLK_CN_IDX(blk_stk_idx) = NULL_IDX;
01844 BLK_CP_IDX(blk_stk_idx) = NULL_IDX;
01845 BLK_NP_IDX(blk_stk_idx) = NULL_IDX;
01846 BLK_SB_IDX(blk_stk_idx) = NULL_IDX;
01847 BLK_SN_IDX(blk_stk_idx) = NULL_IDX;
01848 BLK_TYP_IDX(blk_stk_idx) = NULL_IDX;
01849 curr_scp_idx = save_curr_scp_idx;
01850 }
01851 blk_stk_idx++;
01852 }
01853
01854 if (SCP_FIRST_CHILD_IDX(curr_scp_idx) == NULL_IDX) {
01855
01856 if (SCP_SIBLING_IDX(curr_scp_idx) == NULL_IDX) {
01857
01858
01859
01860 loc_name_tbl_idx = SCP_LN_FW_IDX(curr_scp_idx) - 1;
01861 }
01862 scp_tbl_idx = curr_scp_idx - 1;
01863
01864 if (SCP_NUM_CHILDREN(parent_idx) == 1) {
01865 SCP_FIRST_CHILD_IDX(parent_idx) = NULL_IDX;
01866 SCP_LAST_CHILD_IDX(parent_idx) = NULL_IDX;
01867 SCP_NUM_CHILDREN(parent_idx) = 0;
01868 }
01869 else {
01870 sibling_idx = SCP_FIRST_CHILD_IDX(parent_idx);
01871
01872 while (SCP_SIBLING_IDX(sibling_idx) != curr_scp_idx) {
01873 sibling_idx = SCP_SIBLING_IDX(sibling_idx);
01874 }
01875
01876 SCP_SIBLING_IDX(sibling_idx) = NULL_IDX;
01877 SCP_LAST_CHILD_IDX(parent_idx) = sibling_idx;
01878 (SCP_NUM_CHILDREN(parent_idx))--;
01879 }
01880 }
01881 else {
01882
01883
01884
01885
01886 SCP_PARENT_IDX(SCP_FIRST_CHILD_IDX(curr_scp_idx)) = parent_idx;
01887
01888 sibling_idx = SCP_FIRST_CHILD_IDX(curr_scp_idx);
01889
01890 while (SCP_SIBLING_IDX(sibling_idx) != NULL_IDX) {
01891 sibling_idx = SCP_SIBLING_IDX(sibling_idx);
01892 SCP_PARENT_IDX(sibling_idx) = parent_idx;
01893 }
01894
01895 if (SCP_NUM_CHILDREN(parent_idx) == 1) {
01896 SCP_FIRST_CHILD_IDX(parent_idx) = SCP_FIRST_CHILD_IDX(curr_scp_idx);
01897 SCP_LAST_CHILD_IDX(parent_idx) = SCP_LAST_CHILD_IDX(curr_scp_idx);
01898 SCP_NUM_CHILDREN(parent_idx) = SCP_NUM_CHILDREN(curr_scp_idx);
01899 }
01900 else {
01901 sibling_idx = SCP_FIRST_CHILD_IDX(parent_idx);
01902
01903 while (SCP_SIBLING_IDX(sibling_idx) != curr_scp_idx) {
01904 sibling_idx = SCP_SIBLING_IDX(sibling_idx);
01905 }
01906
01907 SCP_SIBLING_IDX(sibling_idx) = SCP_FIRST_CHILD_IDX(curr_scp_idx);
01908 SCP_LAST_CHILD_IDX(parent_idx) = SCP_LAST_CHILD_IDX(curr_scp_idx);
01909 SCP_NUM_CHILDREN(parent_idx) = SCP_NUM_CHILDREN(parent_idx) - 1 +
01910 SCP_NUM_CHILDREN(curr_scp_idx);
01911 }
01912 }
01913
01914 curr_scp_idx = parent_idx;
01915 curr_stmt_category = Sub_Func_Stmt_Cat;
01916
01917
01918
01919
01920
01921
01922
01923
01924
01925 if (SCP_LAST_SH_IDX(curr_scp_idx) == NULL_IDX) {
01926 SCP_FIRST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
01927 SH_PREV_IDX(curr_stmt_sh_idx) = NULL_IDX;
01928 need_new_sh = FALSE;
01929 }
01930 else {
01931 curr_stmt_sh_idx = SCP_LAST_SH_IDX(curr_scp_idx);
01932 need_new_sh = TRUE;
01933 }
01934
01935 POP_BLK_STK;
01936 PRINT_SCP_TBL;
01937 PRINT_EQV_TBL;
01938
01939 TRACE (Func_Exit, "end_interface_body", NULL);
01940
01941 return;
01942
01943 }
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953
01954
01955
01956
01957
01958
01959
01960
01961
01962
01963
01964 static void end_forall_blk(boolean err_call)
01965
01966 {
01967 TRACE (Func_Entry, "end_forall_blk", NULL);
01968
01969 if (cmd_line_flags.debug_lvl <= Debug_Lvl_1 && ! err_call) {
01970
01971
01972
01973 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
01974 }
01975
01976 if (cif_flags & MISC_RECS) {
01977 cif_stmt_type_rec(TRUE, CIF_End_Forall_Stmt, statement_number);
01978 }
01979
01980 SH_PARENT_BLK_IDX(curr_stmt_sh_idx) = CURR_BLK_FIRST_SH_IDX;
01981
01982 IR_FLD_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = SH_Tbl_Idx;
01983 IR_IDX_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = curr_stmt_sh_idx;
01984 IR_LINE_NUM_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) =
01985 SH_GLB_LINE(CURR_BLK_FIRST_SH_IDX);
01986 IR_COL_NUM_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) =
01987 SH_COL_NUM(CURR_BLK_FIRST_SH_IDX);
01988
01989
01990
01991
01992
01993 POP_BLK_STK;
01994
01995 TRACE (Func_Exit, "end_forall_blk", NULL);
01996
01997 return;
01998
01999 }
02000
02001
02002
02003
02004
02005
02006
02007
02008
02009
02010
02011
02012
02013
02014
02015
02016
02017
02018
02019
02020 static void end_where_blk(boolean err_call)
02021
02022 {
02023 int sh_idx;
02024
02025 TRACE (Func_Entry, "end_where_blk", NULL);
02026
02027 if (cmd_line_flags.debug_lvl <= Debug_Lvl_1 && !err_call) {
02028
02029 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
02030 }
02031
02032 if (cif_flags & MISC_RECS) {
02033 cif_stmt_type_rec(TRUE, CIF_End_Where_Stmt, statement_number);
02034 }
02035
02036 if (CURR_BLK == Where_Then_Blk ||
02037 CURR_BLK == Where_Else_Blk ||
02038 CURR_BLK == Where_Else_Mask_Blk) {
02039
02040 SH_PARENT_BLK_IDX(curr_stmt_sh_idx) = CURR_BLK_FIRST_SH_IDX;
02041
02042 sh_idx = SH_PARENT_BLK_IDX(curr_stmt_sh_idx);
02043 while (sh_idx != NULL_IDX &&
02044 SH_STMT_TYPE(sh_idx) != Where_Cstrct_Stmt) {
02045
02046 sh_idx = SH_PARENT_BLK_IDX(sh_idx);
02047 }
02048
02049 if (sh_idx != NULL_IDX) {
02050 IR_FLD_R(SH_IR_IDX(sh_idx)) = SH_Tbl_Idx;
02051 IR_IDX_R(SH_IR_IDX(sh_idx)) = curr_stmt_sh_idx;
02052 }
02053 }
02054
02055 POP_BLK_STK;
02056
02057 TRACE (Func_Exit, "end_where_blk", NULL);
02058
02059 return;
02060
02061 }
02062
02063
02064
02065
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082 static void end_select_blk(boolean err_call)
02083
02084 {
02085 int blk_idx;
02086 int il_idx_1;
02087 int il_idx_2;
02088 int name_idx;
02089 long num_cases_value;
02090 int ir_idx;
02091 int save_curr_stmt_sh_idx;
02092 int sh_idx;
02093
02094
02095 TRACE (Func_Entry, "end_select_blk", NULL);
02096
02097 if (err_call) {
02098 gen_sh(Before, End_Select_Stmt, stmt_start_line, stmt_start_col,
02099 TRUE, FALSE, FALSE);
02100 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
02101 }
02102
02103 if (CURR_BLK == Case_Blk) {
02104 POP_BLK_STK;
02105 }
02106
02107 if (CURR_BLK == Select_Blk) {
02108
02109 if (CURR_BLK_ERR) {
02110 goto EXIT;
02111 }
02112
02113
02114
02115
02116
02117 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
02118
02119 if (SH_LABELED(curr_stmt_sh_idx)) {
02120 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
02121 }
02122
02123 gen_sh(Before, Continue_Stmt, stmt_start_line, stmt_start_col,
02124 FALSE, TRUE, TRUE);
02125
02126
02127 sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
02128 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
02129
02130 if (cmd_line_flags.debug_lvl == Debug_Lvl_0) {
02131 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
02132 }
02133
02134 NTR_IR_TBL(ir_idx);
02135 SH_IR_IDX(sh_idx) = ir_idx;
02136 IR_OPR(ir_idx) = Label_Opr;
02137 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
02138 IR_LINE_NUM(ir_idx) = stmt_start_line;
02139 IR_COL_NUM(ir_idx) = stmt_start_col;
02140 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
02141 IR_COL_NUM_L(ir_idx) = stmt_start_col;
02142 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
02143 IR_IDX_L(ir_idx) = CURR_BLK_LABEL;
02144
02145
02146
02147 AT_DEFINED(CURR_BLK_LABEL) = TRUE;
02148 AT_DEF_LINE(CURR_BLK_LABEL) = stmt_start_line;
02149 ATL_DEF_STMT_IDX(CURR_BLK_LABEL) = sh_idx;
02150
02151 if (cmd_line_flags.debug_lvl == Debug_Lvl_1) {
02152 ATL_DEBUG_CLASS(CURR_BLK_LABEL) = Ldbg_Stmt_Lbl;
02153 }
02154
02155
02156
02157
02158
02159 ir_idx = IR_IDX_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX));
02160
02161 NTR_IR_LIST_TBL(il_idx_1);
02162 IR_FLD_R(ir_idx) = IL_Tbl_Idx;
02163 IR_IDX_R(ir_idx) = il_idx_1;
02164 IL_FLD(il_idx_1) = CN_Tbl_Idx;
02165 num_cases_value = (long) BLK_NUM_CASES(blk_stk_idx);
02166 IL_IDX(il_idx_1) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, num_cases_value);
02167 IL_LINE_NUM(il_idx_1) = stmt_start_line;
02168 IL_COL_NUM(il_idx_1) = stmt_start_col;
02169
02170 NTR_IR_LIST_TBL(il_idx_2);
02171 IL_NEXT_LIST_IDX(il_idx_1) = il_idx_2;
02172 IL_PREV_LIST_IDX(il_idx_2) = il_idx_1;
02173 IL_LINE_NUM(il_idx_2) = stmt_start_line;
02174 IL_COL_NUM(il_idx_2) = stmt_start_col;
02175 IL_FLD(il_idx_2) = AT_Tbl_Idx;
02176 IL_IDX(il_idx_2) = CURR_BLK_LABEL;
02177
02178 if (BLK_CASE_DEFAULT_LBL_FLD(blk_stk_idx) == NO_Tbl_Idx) {
02179 IR_LIST_CNT_R(ir_idx) = 2;
02180 }
02181 else {
02182 IR_LIST_CNT_R(ir_idx) = 3;
02183 il_idx_1 = il_idx_2;
02184
02185 NTR_IR_LIST_TBL(il_idx_2);
02186 IL_NEXT_LIST_IDX(il_idx_1) = il_idx_2;
02187 IL_PREV_LIST_IDX(il_idx_2) = il_idx_1;
02188 COPY_OPND(IL_OPND(il_idx_2), BLK_CASE_DEFAULT_LBL_OPND(blk_stk_idx));
02189 }
02190
02191 }
02192 else {
02193
02194
02195
02196 name_idx = BLK_NAME(blk_stk_idx + 1);
02197
02198 for (blk_idx = blk_stk_idx; blk_idx > 0; --blk_idx) {
02199
02200 if (BLK_TYPE(blk_idx) == Select_Blk &&
02201 BLK_NAME(blk_idx) == name_idx) {
02202 blk_idx = move_blk_to_end(blk_idx);
02203 break;
02204 }
02205 }
02206 }
02207
02208
02209 EXIT:
02210
02211 SH_PARENT_BLK_IDX(curr_stmt_sh_idx) = CURR_BLK_FIRST_SH_IDX;
02212
02213 if (cif_flags & MISC_RECS) {
02214 cif_stmt_type_rec(TRUE, CIF_End_Select_Stmt, statement_number);
02215 }
02216
02217
02218
02219
02220
02221 if (CURR_BLK == Select_Blk) {
02222 POP_BLK_STK;
02223 }
02224
02225
02226 if (err_call) {
02227 curr_stmt_sh_idx = SH_NEXT_IDX(curr_stmt_sh_idx);
02228 }
02229
02230 TRACE (Func_Exit, "end_select_blk", NULL);
02231
02232 return;
02233
02234 }
02235
02236
02237
02238
02239
02240
02241
02242
02243
02244
02245
02246
02247
02248
02249
02250
02251
02252
02253
02254
02255
02256 void end_labeled_do()
02257
02258 {
02259 int blk_idx;
02260 #ifdef KEY
02261 boolean error_flag = FALSE;
02262 #else
02263 boolean error_flag;
02264 #endif
02265 int fake_blk_stk_idx;
02266 int loop_num = 0;
02267 boolean msg_issued;
02268 int save_blk_stk_idx;
02269 int save_sh_err_flg;
02270
02271
02272 TRACE (Func_Entry, "end_labeled_do", NULL);
02273
02274
02275 if (stmt_label_idx == NULL_IDX) {
02276 return;
02277 }
02278
02279
02280
02281 if (stmt_label_idx == CURR_BLK_LABEL) {
02282 blk_idx = blk_stk_idx;
02283 }
02284 else {
02285
02286 if (blk_stk_idx > 1) {
02287 blk_idx = blk_stk_idx - 1;
02288
02289 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02290
02291 if (stmt_label_idx == BLK_LABEL(blk_idx)) {
02292 goto FOUND_DO_BLK;
02293 }
02294 --blk_idx;
02295 }
02296 }
02297
02298 goto EXIT;
02299 }
02300
02301
02302
02303
02304 FOUND_DO_BLK:
02305
02306 if (cmd_line_flags.debug_lvl == Debug_Lvl_0) {
02307 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
02308 }
02309
02310 if (stmt_type != End_Do_Stmt && BLK_NAME(blk_idx) != NULL_IDX) {
02311 PRINTMSG(stmt_start_line, 669, Error, stmt_start_col);
02312 }
02313
02314 switch (stmt_type) {
02315
02316 case Continue_Stmt:
02317 if (BLK_LOOP_NUM(blk_idx) > 1) {
02318 PRINTMSG(stmt_start_line, 241,
02319 #ifdef KEY
02320 Ansi,
02321 #else
02322 Comment,
02323 #endif
02324 stmt_start_col);
02325 }
02326
02327 break;
02328
02329 case End_Do_Stmt:
02330 break;
02331
02332 case Goto_Stmt:
02333 if (IR_OPR(SH_IR_IDX(curr_stmt_sh_idx)) == Br_Uncond_Opr) {
02334 PRINTMSG(stmt_start_line, 242, Error, stmt_start_col);
02335 }
02336 else if (IR_OPR(SH_IR_IDX(curr_stmt_sh_idx)) == Br_Asg_Opr) {
02337 PRINTMSG(stmt_start_line, 243, Error, stmt_start_col);
02338 }
02339 else {
02340 PRINTMSG(stmt_start_line, 241,
02341 #ifdef KEY
02342 Ansi,
02343 #else
02344 Comment,
02345 #endif
02346 stmt_start_col);
02347 }
02348
02349 break;
02350
02351 case Outmoded_If_Stmt:
02352 PRINTMSG(stmt_start_line, 246, Error, stmt_start_col);
02353 break;
02354
02355 case Do_Iterative_Stmt:
02356 case Do_While_Stmt:
02357 case Do_Infinite_Stmt:
02358 case If_Cstrct_Stmt:
02359 case Select_Stmt:
02360 case Where_Cstrct_Stmt:
02361 msg_issued = FALSE;
02362 save_sh_err_flg = SH_ERR_FLG(curr_stmt_sh_idx);
02363
02364 if (stmt_type == If_Cstrct_Stmt) {
02365 blk_idx = blk_stk_idx - 2;
02366 fake_blk_stk_idx = blk_stk_idx - 2;
02367 }
02368 else {
02369 blk_idx = blk_stk_idx - 1;
02370 fake_blk_stk_idx = blk_stk_idx - 1;
02371 }
02372
02373 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02374
02375 if (stmt_label_idx == BLK_LABEL(blk_idx)) {
02376
02377 if (! msg_issued) {
02378 PRINTMSG(stmt_start_line, 244, Error, stmt_start_col,
02379 stmt_type_str[stmt_type]);
02380 msg_issued = TRUE;
02381 }
02382
02383 if (blk_idx != fake_blk_stk_idx) {
02384 save_blk_stk_idx = blk_stk_idx;
02385 blk_stk_idx = fake_blk_stk_idx;
02386 error_flag = pop_and_err_blk_stk(blk_idx, FALSE);
02387 blk_stk_idx = save_blk_stk_idx;
02388 }
02389
02390 move_blk_to_end(blk_idx);
02391
02392 if (msg_issued || error_flag) {
02393 SH_ERR_FLG(CURR_BLK_FIRST_SH_IDX) = TRUE;
02394 }
02395 POP_BLK_STK;
02396
02397 if (CURR_BLK == Doall_Blk) {
02398 POP_BLK_STK;
02399 cdir_switches.doall_region = FALSE;
02400 CLEAR_DIRECTIVE_STATE(Doall_Region);
02401 }
02402 else if (CURR_BLK == SGI_Parallel_Do_Blk) {
02403 POP_BLK_STK;
02404 CLEAR_DIRECTIVE_STATE(Parallel_Do_Region);
02405 }
02406 else if (CURR_BLK == SGI_Doacross_Blk) {
02407 POP_BLK_STK;
02408 CLEAR_DIRECTIVE_STATE(Doacross_Region);
02409 }
02410
02411 --fake_blk_stk_idx;
02412 }
02413
02414 --blk_idx;
02415 }
02416
02417 SH_ERR_FLG(curr_stmt_sh_idx) = save_sh_err_flg;
02418 goto EXIT;
02419
02420 case End_Stmt:
02421 case End_Function_Stmt:
02422 case End_Program_Stmt:
02423 case End_Subroutine_Stmt:
02424 msg_issued = FALSE;
02425 blk_idx = blk_stk_idx;
02426
02427 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02428
02429 if (stmt_label_idx == BLK_LABEL(blk_idx)) {
02430 PRINTMSG(stmt_start_line, 244, Error, stmt_start_col,
02431 stmt_type_str[stmt_type]);
02432 msg_issued = TRUE;
02433 break;
02434 }
02435
02436 --blk_idx;
02437 }
02438
02439 if (msg_issued) {
02440 break;
02441 }
02442 else {
02443 goto EXIT;
02444 }
02445
02446 case Arith_If_Stmt:
02447 case Cycle_Stmt:
02448 case Exit_Stmt:
02449 case Return_Stmt:
02450 case Stop_Stmt:
02451 PRINTMSG(stmt_start_line, 244, Error, stmt_start_col,
02452 stmt_type_str[stmt_type]);
02453 break;
02454
02455 case End_If_Stmt:
02456 case End_Select_Stmt:
02457 case End_Where_Stmt:
02458 case Case_Stmt:
02459 case Else_Stmt:
02460 case Else_If_Stmt:
02461 case Else_Where_Stmt:
02462 PRINTMSG(stmt_start_line, 244, Error, stmt_start_col,
02463 stmt_type_str[stmt_type]);
02464
02465 blk_idx = blk_stk_idx;
02466
02467 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02468
02469 if (stmt_label_idx == BLK_LABEL(blk_idx)) {
02470
02471 if (blk_idx != blk_stk_idx) {
02472 move_blk_to_end(blk_idx);
02473 }
02474
02475 SH_ERR_FLG(CURR_BLK_FIRST_SH_IDX) = TRUE;
02476 POP_BLK_STK;
02477
02478 if (CURR_BLK == Doall_Blk) {
02479 POP_BLK_STK;
02480 cdir_switches.doall_region = FALSE;
02481 CLEAR_DIRECTIVE_STATE(Doall_Region);
02482 }
02483 else if (CURR_BLK == SGI_Parallel_Do_Blk) {
02484 POP_BLK_STK;
02485 CLEAR_DIRECTIVE_STATE(Parallel_Do_Region);
02486 }
02487 else if (CURR_BLK == SGI_Doacross_Blk) {
02488 POP_BLK_STK;
02489 CLEAR_DIRECTIVE_STATE(Doacross_Region);
02490 }
02491 }
02492
02493 --blk_idx;
02494 }
02495
02496 goto EXIT;
02497
02498 default:
02499 if (ATL_EXECUTABLE(stmt_label_idx)) {
02500 PRINTMSG(stmt_start_line, 241,
02501 #ifdef KEY
02502 Ansi,
02503 #else
02504 Comment,
02505 #endif
02506 stmt_start_col);
02507 }
02508 else {
02509 PRINTMSG(stmt_start_line, 544, Error, stmt_start_col);
02510 }
02511 }
02512
02513
02514
02515 blk_idx = blk_stk_idx;
02516
02517 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02518
02519 if (BLK_TYPE(blk_idx) == Do_Parallel_Blk ||
02520 BLK_TYPE(blk_idx) == SGI_Pdo_Blk ||
02521 BLK_TYPE(blk_idx) == Open_Mp_Do_Blk ||
02522 BLK_TYPE(blk_idx) == Open_Mp_Parallel_Do_Blk) {
02523
02524 if (BLK_TYPE(blk_idx) == Do_Parallel_Blk) {
02525 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
02526 }
02527 else if (BLK_TYPE(blk_idx) == SGI_Pdo_Blk) {
02528 CLEAR_DIRECTIVE_STATE(Pdo_Region);
02529 }
02530 else if (BLK_TYPE(blk_idx) == Open_Mp_Do_Blk) {
02531 CLEAR_DIRECTIVE_STATE(Open_Mp_Do_Region);
02532 }
02533 else if (BLK_TYPE(blk_idx) == Open_Mp_Parallel_Do_Blk) {
02534 CLEAR_DIRECTIVE_STATE(Open_Mp_Parallel_Do_Region);
02535 }
02536
02537 move_blk_to_end(blk_idx);
02538 POP_BLK_STK;
02539 blk_idx--;
02540 continue;
02541 }
02542
02543 if (stmt_label_idx == BLK_LABEL(blk_idx)) {
02544 break;
02545 }
02546 --blk_idx;
02547 }
02548
02549
02550
02551 blk_idx = blk_stk_idx;
02552
02553 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02554
02555 if (stmt_label_idx == BLK_LABEL(blk_idx)) {
02556
02557 if (blk_idx != blk_stk_idx) {
02558 error_flag = pop_and_err_blk_stk(blk_idx, FALSE);
02559 move_blk_to_end(blk_idx);
02560
02561 if (error_flag) {
02562 SH_ERR_FLG(CURR_BLK_FIRST_SH_IDX) = TRUE;
02563 }
02564 }
02565
02566 if (! SH_ERR_FLG(curr_stmt_sh_idx) &&
02567 ! SH_ERR_FLG(CURR_BLK_FIRST_SH_IDX)) {
02568 loop_end_processing();
02569 loop_num = BLK_LOOP_NUM(blk_idx);
02570 }
02571
02572 POP_BLK_STK;
02573
02574 if (CURR_BLK == Doall_Blk) {
02575 POP_BLK_STK;
02576 cdir_switches.doall_region = FALSE;
02577 CLEAR_DIRECTIVE_STATE(Doall_Region);
02578 }
02579 else if (CURR_BLK == SGI_Parallel_Do_Blk) {
02580 POP_BLK_STK;
02581 CLEAR_DIRECTIVE_STATE(Parallel_Do_Region);
02582 }
02583 else if (CURR_BLK == SGI_Doacross_Blk) {
02584 POP_BLK_STK;
02585 CLEAR_DIRECTIVE_STATE(Doacross_Region);
02586 }
02587 }
02588 else if (loop_num > 1 &&
02589 end_task_do_blk ()) {
02590 POP_BLK_STK;
02591 }
02592
02593 --blk_idx;
02594 }
02595
02596 EXIT:
02597
02598 (void) end_task_do_blk();
02599
02600 TRACE (Func_Exit, "end_labeled_do", NULL);
02601
02602 return;
02603
02604 }
02605
02606
02607
02608
02609
02610
02611
02612
02613
02614
02615
02616
02617
02618
02619
02620
02621
02622 static boolean end_task_do_blk(void)
02623
02624 {
02625 int ir_idx;
02626 boolean left_on_stk = FALSE;
02627
02628 TRACE (Func_Entry, "end_task_do_blk", NULL);
02629
02630 if (CURR_BLK == Do_Parallel_Blk &&
02631 BLK_ENDDO_PARALLEL_SH_IDX(blk_stk_idx) == NULL_IDX) {
02632
02633 left_on_stk = TRUE;
02634
02635
02636 need_new_sh = TRUE;
02637
02638 gen_sh(After, End_Do_Parallel_Stmt, stmt_start_line, stmt_start_col,
02639 FALSE, FALSE, TRUE);
02640
02641 NTR_IR_TBL(ir_idx);
02642 IR_OPR(ir_idx) = Enddo_Cmic_Opr;
02643
02644
02645
02646 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
02647 IR_LINE_NUM(ir_idx) = stmt_start_line;
02648 IR_COL_NUM(ir_idx) = stmt_start_col;
02649
02650 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
02651
02652 BLK_ENDDO_PARALLEL_SH_IDX(blk_stk_idx) = curr_stmt_sh_idx;
02653 }
02654 else if ((CURR_BLK == SGI_Pdo_Blk ||
02655 CURR_BLK == Open_Mp_Do_Blk ||
02656 CURR_BLK == Open_Mp_Parallel_Do_Blk) &&
02657 BLK_ENDPDO_SH_IDX(blk_stk_idx) == NULL_IDX) {
02658
02659
02660
02661 need_new_sh = TRUE;
02662
02663
02664 NTR_IR_TBL(ir_idx);
02665 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
02666 IR_LINE_NUM(ir_idx) = stmt_start_line;
02667 IR_COL_NUM(ir_idx) = stmt_start_col;
02668
02669 IR_LINE_NUM_R(ir_idx) = stmt_start_line;
02670 IR_COL_NUM_R(ir_idx) = stmt_start_col;
02671 IR_FLD_R(ir_idx) = SH_Tbl_Idx;
02672 IR_IDX_R(ir_idx) = CURR_BLK_FIRST_SH_IDX;
02673
02674 switch (CURR_BLK) {
02675 case SGI_Pdo_Blk:
02676 IR_OPR(ir_idx) = End_Pdo_Par_Opr;
02677 gen_sh(After, SGI_End_Pdo_Stmt, stmt_start_line, stmt_start_col,
02678 FALSE, FALSE, TRUE);
02679 CLEAR_DIRECTIVE_STATE(Pdo_Region);
02680 POP_BLK_STK;
02681 break;
02682
02683 case Open_Mp_Do_Blk:
02684 IR_OPR(ir_idx) = Enddo_Open_Mp_Opr;
02685 gen_sh(After, Open_MP_End_Do_Stmt, stmt_start_line, stmt_start_col,
02686 FALSE, FALSE, TRUE);
02687 CLEAR_DIRECTIVE_STATE(Open_Mp_Do_Region);
02688 POP_BLK_STK;
02689 break;
02690
02691 case Open_Mp_Parallel_Do_Blk:
02692 IR_OPR(ir_idx) = Endparalleldo_Open_Mp_Opr;
02693 gen_sh(After, Open_MP_End_Do_Stmt, stmt_start_line, stmt_start_col,
02694 FALSE, FALSE, TRUE);
02695 CLEAR_DIRECTIVE_STATE(Open_Mp_Parallel_Do_Region);
02696 POP_BLK_STK;
02697 break;
02698 }
02699
02700 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
02701 }
02702
02703
02704 TRACE (Func_Exit, "end_task_do_blk", NULL);
02705
02706 return(left_on_stk);
02707
02708 }
02709
02710
02711
02712
02713
02714
02715
02716
02717
02718
02719
02720
02721
02722
02723
02724
02725
02726
02727
02728
02729 static void end_do_blk(boolean err_call)
02730
02731 {
02732 int blk_idx;
02733 boolean loop_end_ir_gend = FALSE;
02734 boolean msg_issued;
02735 boolean no_err = TRUE;
02736 int unlabeled_do_idx;
02737
02738
02739 TRACE (Func_Entry, "end_do_blk", NULL);
02740
02741
02742
02743
02744
02745 if (err_call) {
02746 POP_BLK_STK;
02747 if (CURR_BLK == Doall_Blk) {
02748 POP_BLK_STK;
02749 cdir_switches.doall_region = FALSE;
02750 CLEAR_DIRECTIVE_STATE(Doall_Region);
02751 }
02752 else if (CURR_BLK == SGI_Parallel_Do_Blk) {
02753 POP_BLK_STK;
02754 CLEAR_DIRECTIVE_STATE(Parallel_Do_Region);
02755 }
02756 else if (CURR_BLK == SGI_Doacross_Blk) {
02757 POP_BLK_STK;
02758 CLEAR_DIRECTIVE_STATE(Doacross_Region);
02759 }
02760
02761 goto EXIT;
02762 }
02763
02764
02765
02766 blk_idx = blk_stk_idx;
02767
02768 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02769
02770 if (BLK_TYPE(blk_idx) == Do_Parallel_Blk ||
02771 BLK_TYPE(blk_idx) == SGI_Pdo_Blk ||
02772 BLK_TYPE(blk_idx) == Open_Mp_Do_Blk ||
02773 BLK_TYPE(blk_idx) == Open_Mp_Parallel_Do_Blk) {
02774
02775 if (BLK_TYPE(blk_idx) == Do_Parallel_Blk) {
02776 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
02777 }
02778 else if (BLK_TYPE(blk_idx) == SGI_Pdo_Blk) {
02779 CLEAR_DIRECTIVE_STATE(Pdo_Region);
02780 }
02781 else if (BLK_TYPE(blk_idx) == Open_Mp_Do_Blk) {
02782 CLEAR_DIRECTIVE_STATE(Open_Mp_Do_Region);
02783 }
02784 else if (BLK_TYPE(blk_idx) == Open_Mp_Parallel_Do_Blk) {
02785 CLEAR_DIRECTIVE_STATE(Open_Mp_Parallel_Do_Region);
02786 }
02787
02788 move_blk_to_end(blk_idx);
02789 POP_BLK_STK;
02790 blk_idx--;
02791 continue;
02792 }
02793 else if (BLK_TYPE(blk_idx) == Do_Blk) {
02794 break;
02795 }
02796
02797 --blk_idx;
02798 }
02799
02800
02801 if (cmd_line_flags.debug_lvl == Debug_Lvl_0) {
02802 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
02803 }
02804
02805 if (cif_flags & MISC_RECS) {
02806 cif_stmt_type_rec(TRUE, CIF_End_Do_Stmt, statement_number);
02807 }
02808
02809 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
02810
02811 if (stmt_label_idx == NULL_IDX) {
02812 blk_idx = blk_stk_idx;
02813
02814
02815
02816
02817 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02818
02819 if (BLK_TYPE(blk_idx) == Do_Blk && BLK_LABEL(blk_idx) == NULL_IDX) {
02820
02821 if (blk_idx == blk_stk_idx) {
02822
02823 if (! SH_ERR_FLG(CURR_BLK_FIRST_SH_IDX)) {
02824 loop_end_processing();
02825 loop_end_ir_gend = TRUE;
02826 }
02827
02828 }
02829 else {
02830 pop_and_err_blk_stk(blk_idx, FALSE);
02831 move_blk_to_end(blk_idx);
02832 }
02833
02834 POP_BLK_STK;
02835
02836 if (CURR_BLK == Doall_Blk) {
02837 POP_BLK_STK;
02838 cdir_switches.doall_region = FALSE;
02839 CLEAR_DIRECTIVE_STATE(Doall_Region);
02840 }
02841 else if (CURR_BLK == SGI_Parallel_Do_Blk) {
02842 POP_BLK_STK;
02843 CLEAR_DIRECTIVE_STATE(Parallel_Do_Region);
02844 }
02845 else if (CURR_BLK == SGI_Doacross_Blk) {
02846 POP_BLK_STK;
02847 CLEAR_DIRECTIVE_STATE(Doacross_Region);
02848 }
02849
02850 goto EXIT;
02851 }
02852
02853 --blk_idx;
02854 }
02855
02856 PRINTMSG(stmt_start_line, 289, Error, stmt_start_col, "END DO", "DO");
02857 }
02858 else {
02859 unlabeled_do_idx = NULL_IDX;
02860 blk_idx = blk_stk_idx;
02861 msg_issued = FALSE;
02862
02863 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
02864
02865 if (BLK_TYPE(blk_idx) == Do_Blk) {
02866
02867 if (BLK_LABEL(blk_idx) != NULL_IDX) {
02868
02869 if (BLK_LABEL(blk_idx) == stmt_label_idx) {
02870
02871 if (blk_idx == blk_stk_idx) {
02872
02873 if (BLK_LOOP_NUM(blk_stk_idx) > 1) {
02874
02875 if (! msg_issued) {
02876 PRINTMSG(stmt_start_line, 735, Ansi, stmt_start_col);
02877 msg_issued = TRUE;
02878 }
02879 }
02880
02881 if (! SH_ERR_FLG(CURR_BLK_FIRST_SH_IDX)) {
02882 loop_end_processing();
02883 loop_end_ir_gend = TRUE;
02884 }
02885 else {
02886 no_err = FALSE;
02887 }
02888 }
02889 else {
02890 pop_and_err_blk_stk(blk_idx, FALSE);
02891 move_blk_to_end(blk_idx);
02892 no_err = FALSE;
02893 }
02894
02895 POP_BLK_STK;
02896
02897 if (CURR_BLK == Doall_Blk) {
02898 POP_BLK_STK;
02899 cdir_switches.doall_region = FALSE;
02900 CLEAR_DIRECTIVE_STATE(Doall_Region);
02901 }
02902 else if (CURR_BLK == SGI_Parallel_Do_Blk) {
02903 POP_BLK_STK;
02904 CLEAR_DIRECTIVE_STATE(Parallel_Do_Region);
02905 }
02906 else if (CURR_BLK == SGI_Doacross_Blk) {
02907 POP_BLK_STK;
02908 CLEAR_DIRECTIVE_STATE(Doacross_Region);
02909 }
02910 }
02911 }
02912 else if (unlabeled_do_idx == NULL_IDX) {
02913 unlabeled_do_idx = blk_idx;
02914 }
02915 }
02916
02917 --blk_idx;
02918 }
02919
02920
02921
02922
02923
02924
02925
02926
02927 if (! loop_end_ir_gend && no_err) {
02928
02929 if (unlabeled_do_idx == NULL_IDX) {
02930 PRINTMSG(stmt_start_line, 289, Error, stmt_start_col,
02931 "END DO", "DO");
02932 }
02933 else {
02934
02935 if (unlabeled_do_idx == blk_stk_idx) {
02936
02937 if (! SH_ERR_FLG(CURR_BLK_FIRST_SH_IDX)) {
02938 loop_end_processing();
02939 }
02940 }
02941 else {
02942 pop_and_err_blk_stk(blk_idx, FALSE);
02943 move_blk_to_end(blk_idx);
02944 }
02945
02946 POP_BLK_STK;
02947
02948 if (CURR_BLK == Doall_Blk) {
02949 POP_BLK_STK;
02950 cdir_switches.doall_region = FALSE;
02951 CLEAR_DIRECTIVE_STATE(Doall_Region);
02952 }
02953 else if (CURR_BLK == SGI_Parallel_Do_Blk) {
02954 POP_BLK_STK;
02955 CLEAR_DIRECTIVE_STATE(Parallel_Do_Region);
02956 }
02957 else if (CURR_BLK == SGI_Doacross_Blk) {
02958 POP_BLK_STK;
02959 CLEAR_DIRECTIVE_STATE(Doacross_Region);
02960 }
02961 }
02962 }
02963 }
02964
02965
02966 EXIT:
02967
02968 (void) end_task_do_blk();
02969
02970 TRACE (Func_Exit, "end_do_blk", NULL);
02971
02972 return;
02973
02974 }
02975
02976
02977
02978
02979
02980
02981
02982
02983
02984
02985
02986
02987
02988
02989
02990
02991
02992
02993
02994
02995 static void end_if_blk(boolean err_call)
02996
02997 {
02998 int blk_idx;
02999 boolean error;
03000 int name_idx;
03001
03002 # ifdef _HIGH_LEVEL_IF_FORM
03003 # ifdef KEY
03004 int curr_sh = 0;
03005 # else
03006 int curr_sh;
03007 # endif
03008 int ir_idx;
03009 # endif
03010
03011 # if 0
03012 int sh_idx;
03013 # endif
03014
03015
03016 TRACE (Func_Entry, "end_if_blk", NULL);
03017
03018 if (err_call) {
03019 gen_sh(Before, End_If_Stmt, stmt_start_line, stmt_start_col,
03020 TRUE, FALSE, FALSE);
03021 curr_stmt_sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
03022 }
03023 else {
03024
03025 #ifdef _HIGH_LEVEL_IF_FORM
03026
03027 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
03028 curr_sh = curr_stmt_sh_idx;
03029
03030 NTR_IR_TBL(ir_idx);
03031 IR_OPR(ir_idx) = Endif_Opr;
03032 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
03033 IR_LINE_NUM(ir_idx) = stmt_start_line;
03034 IR_COL_NUM(ir_idx) = stmt_start_col;
03035
03036 SH_IR_IDX(curr_sh) = ir_idx;
03037 #endif
03038
03039 if (cmd_line_flags.debug_lvl <= Debug_Lvl_1) {
03040 gen_debug_lbl_stmt(curr_stmt_sh_idx, Ldbg_Stmt_Lbl, NULL_IDX);
03041 }
03042 }
03043
03044 error = err_call || CURR_BLK_ERR || SH_ERR_FLG(CURR_BLK_FIRST_SH_IDX);
03045
03046 if (cif_flags & MISC_RECS) {
03047 cif_stmt_type_rec(TRUE, CIF_End_If_Stmt, statement_number);
03048 }
03049
03050
03051 #if 0
03052
03053
03054
03055 if (CURR_BLK == If_Else_If_Blk && !error) {
03056 gen_sh(Before, Continue_Stmt, stmt_start_line, stmt_start_col,
03057 FALSE, TRUE, TRUE);
03058
03059 sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
03060 NTR_IR_TBL(ir_idx);
03061 SH_IR_IDX(sh_idx) = ir_idx;
03062 IR_OPR(ir_idx) = Label_Opr;
03063 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
03064 IR_LINE_NUM(ir_idx) = stmt_start_line;
03065 IR_COL_NUM(ir_idx) = stmt_start_col;
03066 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03067 IR_IDX_L(ir_idx) = CURR_BLK_LABEL;
03068 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03069 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03070
03071 AT_DEFINED(CURR_BLK_LABEL) = TRUE;
03072 AT_DEF_LINE(CURR_BLK_LABEL) = stmt_start_line;
03073 ATL_DEF_STMT_IDX(CURR_BLK_LABEL) = sh_idx;
03074 AT_REFERENCED(CURR_BLK_LABEL) = Referenced;
03075 }
03076 #endif
03077
03078
03079 if (CURR_BLK == If_Else_If_Blk || CURR_BLK == If_Else_Blk) {
03080 SH_PARENT_BLK_IDX(curr_stmt_sh_idx) = CURR_BLK_FIRST_SH_IDX;
03081 }
03082
03083 POP_BLK_STK;
03084
03085 if (CURR_BLK != If_Blk) {
03086
03087
03088
03089 name_idx = BLK_NAME(blk_stk_idx + 1);
03090
03091 for (blk_idx = blk_stk_idx; blk_idx > 0; --blk_idx) {
03092
03093 if (BLK_TYPE(blk_idx) == If_Blk && BLK_NAME(blk_idx) == name_idx) {
03094 blk_idx = move_blk_to_end(blk_idx);
03095 break;
03096 }
03097 }
03098 }
03099
03100
03101
03102
03103
03104 SH_ERR_FLG(curr_stmt_sh_idx) = error;
03105
03106
03107 #if 0
03108
03109
03110 if (! error) {
03111 gen_sh(Before, Continue_Stmt, stmt_start_line, stmt_start_col,
03112 FALSE, TRUE, TRUE);
03113
03114 sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
03115 NTR_IR_TBL(ir_idx);
03116 SH_IR_IDX(sh_idx) = ir_idx;
03117 IR_OPR(ir_idx) = Label_Opr;
03118 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
03119 IR_LINE_NUM(ir_idx) = stmt_start_line;
03120 IR_COL_NUM(ir_idx) = stmt_start_col;
03121 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03122 IR_IDX_L(ir_idx) = CURR_BLK_LABEL;
03123 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03124 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03125
03126 AT_DEFINED(CURR_BLK_LABEL) = TRUE;
03127 AT_DEF_LINE(CURR_BLK_LABEL) = stmt_start_line;
03128 ATL_DEF_STMT_IDX(CURR_BLK_LABEL) = sh_idx;
03129 AT_REFERENCED(CURR_BLK_LABEL) = Referenced;
03130 }
03131 #endif
03132
03133
03134
03135
03136 if (CURR_BLK == If_Blk) {
03137
03138 if (SH_PARENT_BLK_IDX(curr_stmt_sh_idx) == NULL_IDX) {
03139 SH_PARENT_BLK_IDX(curr_stmt_sh_idx) = CURR_BLK_FIRST_SH_IDX;
03140 }
03141
03142 #ifdef _HIGH_LEVEL_IF_FORM
03143 if (! error) {
03144
03145
03146
03147 # if defined(_DEBUG)
03148 if (IR_OPR(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) != Br_True_Opr) {
03149 PRINTMSG(stmt_start_line, 626, Internal, stmt_start_col,
03150 "Br_True_Opr", "end_if_blk");
03151 }
03152 # endif
03153
03154 IR_FLD_R(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = SH_Tbl_Idx;
03155 IR_IDX_R(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = curr_sh;
03156
03157
03158 IR_FLD_L(SH_IR_IDX(curr_sh)) = SH_Tbl_Idx;
03159 IR_IDX_L(SH_IR_IDX(curr_sh)) = CURR_BLK_FIRST_SH_IDX;
03160 }
03161 # endif
03162 POP_BLK_STK;
03163 }
03164
03165
03166 TRACE (Func_Exit, "end_if_blk", NULL);
03167
03168 return;
03169
03170 }
03171
03172
03173
03174
03175
03176
03177
03178
03179
03180
03181
03182
03183
03184
03185
03186
03187
03188
03189
03190
03191 static void end_interface_blk(boolean err_call)
03192
03193 {
03194 int attr_idx;
03195 boolean found;
03196 int interface_idx;
03197 int sn_idx;
03198
03199
03200 TRACE (Func_Entry, "end_interface_blk", NULL);
03201
03202
03203
03204
03205
03206
03207
03208
03209
03210
03211 if (CURR_BLK_NAME != NULL_IDX &&
03212 ATI_PROC_IDX(CURR_BLK_NAME) != NULL_IDX &&
03213 !AT_DCL_ERR(ATI_PROC_IDX(CURR_BLK_NAME)) && !err_call) {
03214 attr_idx = ATI_PROC_IDX(CURR_BLK_NAME);
03215 found = FALSE;
03216 sn_idx = ATI_FIRST_SPECIFIC_IDX(CURR_BLK_NAME);
03217
03218 while (sn_idx != NULL_IDX) {
03219
03220 if (attr_idx == SN_ATTR_IDX(sn_idx)) {
03221 found = TRUE;
03222 break;
03223 }
03224
03225 sn_idx = SN_SIBLING_LINK(sn_idx);
03226 }
03227
03228 if (!found) {
03229 AT_DCL_ERR(attr_idx) = TRUE;
03230 AT_DCL_ERR(CURR_BLK_NAME) = TRUE;
03231 PRINTMSG(AT_DEF_LINE(attr_idx), 713, Error, AT_DEF_COLUMN(attr_idx),
03232 AT_OBJ_NAME_PTR(attr_idx),
03233 AT_OBJ_NAME_PTR(attr_idx));
03234 }
03235 }
03236
03237 if (!SCP_IN_ERR(curr_scp_idx)) {
03238 interface_idx = (BLK_NAME(blk_stk_idx) == NULL_IDX) ?
03239 BLK_UNNAMED_INTERFACE(blk_stk_idx):BLK_NAME(blk_stk_idx);
03240
03241 if (!AT_DCL_ERR(interface_idx) && ATI_HAS_NON_MOD_PROC(interface_idx) &&
03242 BLK_AT_IDX(blk_stk_idx) != NULL_IDX) {
03243 collapse_interface_blk(interface_idx);
03244 ATI_HAS_NON_MOD_PROC(interface_idx) = FALSE;
03245 }
03246 }
03247
03248 if (cif_flags & BASIC_RECS) {
03249 cif_end_scope_rec();
03250 }
03251
03252 if (cif_flags & MISC_RECS) {
03253 cif_stmt_type_rec(TRUE, CIF_End_Interface_Stmt, statement_number);
03254 }
03255
03256 POP_BLK_STK;
03257
03258 TRACE (Func_Exit, "end_interface_blk", NULL);
03259
03260 return;
03261
03262 }
03263
03264
03265 #ifdef KEY
03266
03267
03268
03269
03270
03271
03272
03273
03274
03275
03276
03277
03278
03279
03280
03281
03282
03283
03284 static void end_enum_blk(boolean err_call)
03285
03286 {
03287 int attr_idx;
03288 boolean found;
03289 int enum_idx;
03290 int sn_idx;
03291
03292
03293 TRACE (Func_Entry, "end_enum_blk", NULL);
03294
03295 if (BLK_ENUM_EMPTY(blk_stk_idx) && !(BLK_ERR(blk_stk_idx) || err_call)) {
03296 PRINTMSG(stmt_start_line, 197, Error, stmt_start_col, "ENUMERATOR",
03297 "END ENUM");
03298 }
03299
03300 POP_BLK_STK;
03301
03302 TRACE (Func_Exit, "end_enum_blk", NULL);
03303
03304 }
03305
03306 #endif
03307
03308
03309
03310
03311
03312
03313
03314
03315
03316
03317
03318
03319
03320
03321
03322
03323
03324
03325 static void end_contains(boolean err_call)
03326
03327 {
03328 TRACE (Func_Entry, "end_contains", NULL);
03329
03330 POP_BLK_STK;
03331
03332
03333
03334
03335
03336
03337
03338
03339 if (SCP_FIRST_CHILD_IDX(curr_scp_idx) == NULL_IDX &&
03340 !SCP_IN_ERR(curr_scp_idx)) {
03341 PRINTMSG(stmt_start_line, 387, Error, stmt_start_col);
03342 }
03343
03344 end_of_contains = TRUE;
03345
03346 TRACE (Func_Exit, "end_contains", NULL);
03347
03348 return;
03349
03350 }
03351
03352
03353
03354
03355
03356
03357
03358
03359
03360
03361
03362
03363
03364
03365
03366
03367
03368
03369
03370
03371 static void end_type_blk(boolean err_call)
03372
03373 {
03374 boolean aligned;
03375 size_offset_type bit_len;
03376
03377 # if defined(_TARGET_DOUBLE_ALIGN)
03378 int i;
03379 int sn_idx;
03380 # endif
03381
03382
03383 TRACE (Func_Entry, "end_type_blk", NULL);
03384
03385 if (err_call) {
03386
03387
03388 }
03389 else if (ATT_NUM_CPNTS(CURR_BLK_NAME) == 0) {
03390 PRINTMSG(CURR_BLK_DEF_LINE, 290, Error, CURR_BLK_DEF_COLUMN,
03391 AT_OBJ_NAME_PTR(CURR_BLK_NAME));
03392 }
03393 else {
03394
03395 # ifdef _DEBUG
03396 if (!ATT_CHAR_CPNT(CURR_BLK_NAME) &
03397 !ATT_NUMERIC_CPNT(CURR_BLK_NAME) &
03398 #ifdef KEY
03399 !ATT_ALLOCATABLE_CPNT(CURR_BLK_NAME) &
03400 #endif
03401 !ATT_POINTER_CPNT(CURR_BLK_NAME)) {
03402 PRINTMSG(stmt_start_line, 193, Internal, stmt_start_col,
03403 FALSE,
03404 #ifdef KEY
03405 "ATT_CHAR_CPNT, ATT_NUMERIC_CPNT, ATT_POINTER_CPNT",
03406 #else
03407 "ATT_CHAR_CPNT, ATT_NUMERIC_CPNT, ATT_POINTER_CPNT,"
03408 " ATT_ALLOCATABLE_CPNT",
03409 #endif
03410 CURR_BLK_NAME);
03411 }
03412 # endif
03413
03414 ATT_CHAR_SEQ(CURR_BLK_NAME) = !ATT_NUMERIC_CPNT(CURR_BLK_NAME) &&
03415 #ifdef KEY
03416 !ATT_ALLOCATABLE_CPNT(CURR_BLK_NAME) &&
03417 #endif
03418 !ATT_POINTER_CPNT(CURR_BLK_NAME);
03419
03420 ATT_DCL_NUMERIC_SEQ(CURR_BLK_NAME) = !ATT_POINTER_CPNT(CURR_BLK_NAME) &&
03421 #ifdef KEY
03422 !ATT_ALLOCATABLE_CPNT(CURR_BLK_NAME) &&
03423 #endif
03424 !ATT_CHAR_CPNT(CURR_BLK_NAME) &&
03425 ATT_SEQUENCE_SET(CURR_BLK_NAME);
03426
03427 # if defined(_TARGET_DOUBLE_ALIGN)
03428
03429 if (!cmd_line_flags.dalign &&
03430 ATT_DCL_NUMERIC_SEQ(CURR_BLK_NAME) &&
03431 ATT_DALIGN_ME(CURR_BLK_NAME)) {
03432
03433
03434
03435
03436
03437
03438 ATT_DALIGN_ME(CURR_BLK_NAME) = FALSE;
03439 ATT_STRUCT_BIT_LEN_FLD(CURR_BLK_NAME) = CN_Tbl_Idx;
03440 ATT_STRUCT_BIT_LEN_IDX(CURR_BLK_NAME) = CN_INTEGER_ZERO_IDX;
03441 sn_idx = ATT_FIRST_CPNT_IDX(CURR_BLK_NAME);
03442
03443 for (i = 0; i < ATT_NUM_CPNTS(CURR_BLK_NAME); i++) {
03444 ATD_CPNT_OFFSET_IDX(SN_ATTR_IDX(sn_idx)) = CN_INTEGER_ZERO_IDX;
03445 ATD_OFFSET_FLD(SN_ATTR_IDX(sn_idx)) = CN_Tbl_Idx;
03446 assign_offset(SN_ATTR_IDX(sn_idx));
03447 sn_idx = SN_SIBLING_LINK(sn_idx);
03448 }
03449 }
03450 # endif
03451
03452 if (ATT_NUMERIC_CPNT(CURR_BLK_NAME) || ATT_POINTER_CPNT(CURR_BLK_NAME)
03453 #ifdef KEY
03454 || ATT_ALLOCATABLE_CPNT(CURR_BLK_NAME)
03455 #endif
03456 ) {
03457 bit_len.fld = ATT_STRUCT_BIT_LEN_FLD(CURR_BLK_NAME);
03458 bit_len.idx = ATT_STRUCT_BIT_LEN_IDX(CURR_BLK_NAME);
03459 aligned = FALSE;
03460
03461 # if defined(_TARGET_PACK_HALF_WORD_TYPES)
03462
03463 # ifdef _WHIRL_HOST64_TARGET64
03464 {
03465
03466
03467
03468
03469
03470
03471 int i;
03472 int sn_idx;
03473 boolean use_align_32 = TRUE;
03474
03475 sn_idx = ATT_FIRST_CPNT_IDX(CURR_BLK_NAME);
03476
03477 for (i = 0; i < ATT_NUM_CPNTS(CURR_BLK_NAME); i++) {
03478 if (ATD_ALIGNMENT(SN_ATTR_IDX(sn_idx)) > Align_32) {
03479 use_align_32 = FALSE;
03480 break;
03481 }
03482 sn_idx = SN_SIBLING_LINK(sn_idx);
03483 }
03484
03485 if (use_align_32)
03486 ATT_ALIGNMENT(CURR_BLK_NAME) = Align_32;
03487 }
03488 # endif
03489
03490 if (!aligned && ATT_ALIGNMENT(CURR_BLK_NAME) == Align_32) {
03491
03492
03493
03494
03495 align_bit_length(&bit_len, TARGET_BITS_PER_WORD/2);
03496 aligned = TRUE;
03497 }
03498 # endif
03499
03500 if (!aligned) {
03501
03502 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
03503
03504 switch(ATT_ALIGNMENT(CURR_BLK_NAME)) {
03505 case Align_Bit:
03506 break;
03507
03508
03509
03510
03511 case Align_8:
03512 case Align_16:
03513 align_bit_length(&bit_len, TARGET_BITS_PER_WORD);
03514 break;
03515
03516 case Align_32:
03517 align_bit_length(&bit_len, 32);
03518 break;
03519
03520 case Align_64:
03521 align_bit_length(&bit_len, 64);
03522 break;
03523
03524 case Align_Double:
03525 case Align_128:
03526 align_bit_length(&bit_len, 128);
03527 break;
03528 }
03529 # else
03530 align_bit_length(&bit_len, TARGET_BITS_PER_WORD);
03531 # endif
03532 }
03533
03534 if (bit_len.fld == NO_Tbl_Idx) {
03535 ATT_STRUCT_BIT_LEN_FLD(CURR_BLK_NAME) = CN_Tbl_Idx;
03536 ATT_STRUCT_BIT_LEN_IDX(CURR_BLK_NAME) = ntr_const_tbl(
03537 bit_len.type_idx,
03538 FALSE,
03539 bit_len.constant);
03540 }
03541 else {
03542 ATT_STRUCT_BIT_LEN_FLD(CURR_BLK_NAME) = bit_len.fld;
03543 ATT_STRUCT_BIT_LEN_IDX(CURR_BLK_NAME) = bit_len.idx;
03544 }
03545 }
03546
03547 # if defined(_TARGET_DOUBLE_ALIGN)
03548
03549 if (ATT_DALIGN_ME(CURR_BLK_NAME)) {
03550
03551
03552
03553
03554
03555 bit_len.fld = ATT_STRUCT_BIT_LEN_FLD(CURR_BLK_NAME);
03556 bit_len.idx = ATT_STRUCT_BIT_LEN_IDX(CURR_BLK_NAME);
03557
03558 align_bit_length(&bit_len, (TARGET_BITS_PER_WORD * 2));
03559
03560 if (bit_len.fld == NO_Tbl_Idx) {
03561 ATT_STRUCT_BIT_LEN_FLD(CURR_BLK_NAME) = CN_Tbl_Idx;
03562 ATT_STRUCT_BIT_LEN_IDX(CURR_BLK_NAME) = ntr_const_tbl(
03563 bit_len.type_idx,
03564 FALSE,
03565 bit_len.constant);
03566 }
03567 else {
03568 ATT_STRUCT_BIT_LEN_FLD(CURR_BLK_NAME) = bit_len.fld;
03569 ATT_STRUCT_BIT_LEN_IDX(CURR_BLK_NAME) = bit_len.idx;
03570 }
03571 }
03572 # endif
03573
03574 }
03575
03576
03577
03578
03579
03580
03581
03582
03583 if (cif_flags & MISC_RECS) {
03584 cif_stmt_type_rec(TRUE, CIF_End_Type_Stmt, statement_number);
03585 }
03586
03587 POP_BLK_STK;
03588
03589 TRACE (Func_Exit, "end_type_blk", NULL);
03590
03591 return;
03592
03593 }
03594
03595
03596
03597
03598
03599
03600
03601
03602
03603
03604
03605
03606
03607
03608
03609
03610
03611
03612
03613 static void loop_end_processing()
03614
03615 {
03616 int attr_idx;
03617 int ir_idx;
03618 int save_curr_stmt_sh_idx;
03619 int sh_idx;
03620
03621 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX)) || defined(_TARGET_OS_DARWIN)
03622 int blk_idx;
03623 # endif
03624
03625
03626 TRACE (Func_Entry, "loop_end_processing", NULL);
03627
03628
03629 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX)) || defined(_TARGET_OS_DARWIN)
03630
03631
03632
03633
03634
03635
03636
03637
03638
03639 if (BLK_BLOCKABLE_NUM_LCVS(blk_stk_idx) == 1) {
03640
03641 for (blk_idx = blk_stk_idx; blk_idx > 1; --blk_idx) {
03642
03643 if (BLK_BLOCKABLE_DIR_SH_IDX(blk_idx) != NULL_IDX) {
03644 BLK_BLOCKABLE_NEST_OK(blk_idx) = TRUE;
03645 break;
03646 }
03647 }
03648 }
03649 else if (BLK_BLOCKABLE_NUM_LCVS(blk_stk_idx) > 1) {
03650
03651 for (blk_idx = blk_stk_idx; blk_idx > 1; --blk_idx) {
03652
03653 if (BLK_BLOCKABLE_DIR_SH_IDX(blk_idx) != NULL_IDX) {
03654 break;
03655 }
03656 }
03657
03658 if (! BLK_BLOCKABLE_NEST_OK(blk_idx)) {
03659 PRINTMSG(stmt_start_line, 1389, Error, 0);
03660
03661 for (blk_idx = blk_stk_idx; blk_idx > 1; --blk_idx) {
03662 BLK_BLOCKABLE_NUM_LCVS(blk_idx) = 0;
03663
03664 if (BLK_BLOCKABLE_DIR_SH_IDX(blk_idx) != NULL_IDX) {
03665 SH_ERR_FLG(BLK_BLOCKABLE_DIR_SH_IDX(blk_idx)) = TRUE;
03666 BLK_BLOCKABLE_DIR_SH_IDX(blk_idx) = NULL_IDX;
03667 break;
03668 }
03669 }
03670 }
03671 }
03672
03673 # endif
03674
03675
03676
03677
03678
03679
03680
03681
03682
03683
03684
03685
03686
03687
03688
03689
03690
03691
03692
03693
03694
03695 if (cif_flags & MISC_RECS) {
03696 save_curr_stmt_sh_idx = 0;
03697
03698 if (SH_COMPILER_GEN(curr_stmt_sh_idx)) {
03699
03700
03701
03702
03703
03704
03705
03706
03707
03708 sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
03709
03710 while (! SH_LABELED(sh_idx)) {
03711 sh_idx = SH_PREV_IDX(sh_idx);
03712 }
03713
03714 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
03715 curr_stmt_sh_idx = sh_idx;
03716 }
03717
03718 if (SH_LABELED(curr_stmt_sh_idx) && stmt_type != End_Do_Stmt) {
03719 gen_sh(Before, Statement_Num_Stmt, stmt_end_line, stmt_end_col,
03720 FALSE, FALSE, TRUE);
03721 SH_PARENT_BLK_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) =
03722 statement_number - 1;
03723 }
03724 else {
03725 gen_sh(Before, Statement_Num_Stmt, LA_CH_LINE, LA_CH_COLUMN - 1,
03726 FALSE, FALSE, TRUE);
03727 SH_PARENT_BLK_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = statement_number;
03728 }
03729
03730 if (save_curr_stmt_sh_idx != 0) {
03731 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
03732 }
03733 }
03734
03735
03736
03737
03738
03739
03740
03741
03742
03743
03744 if (BLK_CYCLE_STMT(blk_stk_idx)) {
03745 attr_idx = gen_loop_lbl_name(blk_stk_idx, Cycle_Lbl);
03746
03747 gen_sh(After, Continue_Stmt, stmt_start_line, stmt_start_col,
03748 FALSE, TRUE, TRUE);
03749
03750 NTR_IR_TBL(ir_idx);
03751 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
03752 IR_OPR(ir_idx) = Label_Opr;
03753 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
03754 IR_LINE_NUM(ir_idx) = stmt_start_line;
03755 IR_COL_NUM(ir_idx) = stmt_start_col;
03756 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03757 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03758 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03759 IR_IDX_L(ir_idx) = attr_idx;
03760
03761 AT_DEFINED(attr_idx) = TRUE;
03762 AT_DEF_LINE(attr_idx) = stmt_start_line;
03763 AT_REFERENCED(attr_idx) = Referenced;
03764 ATL_DEF_STMT_IDX(attr_idx) = curr_stmt_sh_idx;
03765 ATL_CYCLE_LBL(attr_idx) = TRUE;
03766 }
03767
03768
03769 # ifdef _HIGH_LEVEL_DO_LOOP_FORM
03770
03771 gen_sh(After, Continue_Stmt, stmt_start_line, stmt_start_col,
03772 FALSE,
03773 FALSE,
03774 TRUE);
03775
03776 NTR_IR_TBL(ir_idx);
03777 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
03778 SH_LOOP_END(curr_stmt_sh_idx) = TRUE;
03779 IR_OPR(ir_idx) = Loop_End_Opr;
03780 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
03781 IR_LINE_NUM(ir_idx) = stmt_start_line;
03782 IR_COL_NUM(ir_idx) = stmt_start_col;
03783
03784 SH_LOOP_END(curr_stmt_sh_idx) = TRUE;
03785 SH_PARENT_BLK_IDX(curr_stmt_sh_idx) = CURR_BLK_FIRST_SH_IDX;
03786
03787 IR_FLD_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = SH_Tbl_Idx;
03788 IR_IDX_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = curr_stmt_sh_idx;
03789
03790
03791 # endif
03792
03793
03794 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
03795
03796
03797
03798
03799
03800 if (BLK_INTERCHANGE_NUM_LCVS(blk_stk_idx) > 1 ||
03801 BLK_DIR_NEST_CHECK_NUM_LCVS(blk_stk_idx) > 1) {
03802 check_loop_bottom_nesting();
03803 }
03804
03805 # endif
03806
03807
03808
03809
03810
03811
03812
03813
03814
03815
03816 if (BLK_EXIT_STMT(blk_stk_idx)) {
03817 attr_idx = gen_loop_lbl_name(blk_stk_idx, Exit_Lbl);
03818
03819 gen_sh(After, Continue_Stmt, stmt_start_line, stmt_start_col,
03820 FALSE, TRUE, TRUE);
03821
03822 #ifndef _HIGH_LEVEL_DO_LOOP_FORM
03823
03824
03825
03826
03827 SH_LOOP_END(curr_stmt_sh_idx) = TRUE;
03828 SH_PARENT_BLK_IDX(curr_stmt_sh_idx) = CURR_BLK_FIRST_SH_IDX;
03829
03830 IR_FLD_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = SH_Tbl_Idx;
03831 IR_IDX_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = curr_stmt_sh_idx;
03832
03833 #endif
03834
03835 NTR_IR_TBL(ir_idx);
03836 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
03837 IR_OPR(ir_idx) = Label_Opr;
03838 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
03839 IR_LINE_NUM(ir_idx) = stmt_start_line;
03840 IR_COL_NUM(ir_idx) = stmt_start_col;
03841 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03842 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03843 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03844 IR_IDX_L(ir_idx) = attr_idx;
03845
03846 AT_DEFINED(attr_idx) = TRUE;
03847 AT_DEF_LINE(attr_idx) = stmt_start_line;
03848 AT_REFERENCED(attr_idx) = Referenced;
03849 ATL_DEF_STMT_IDX(attr_idx) = curr_stmt_sh_idx;
03850 }
03851
03852
03853
03854
03855
03856
03857
03858
03859
03860 # ifndef _HIGH_LEVEL_DO_LOOP_FORM
03861
03862 gen_sh(After, Continue_Stmt, stmt_start_line, stmt_start_col,
03863 FALSE,
03864 TRUE,
03865 TRUE);
03866
03867 if (BLK_DO_TYPE(blk_stk_idx) != Infinite_Loop) {
03868 NTR_IR_TBL(ir_idx);
03869 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
03870 IR_OPR(ir_idx) = Label_Opr;
03871 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
03872 IR_LINE_NUM(ir_idx) = stmt_start_line;
03873 IR_COL_NUM(ir_idx) = stmt_start_col;
03874 IR_LINE_NUM_L(ir_idx) = stmt_start_line;
03875 IR_COL_NUM_L(ir_idx) = stmt_start_col;
03876 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
03877 IR_IDX_L(ir_idx) = BLK_SKIP_LBL_IDX(blk_stk_idx);
03878 AT_DEFINED(BLK_SKIP_LBL_IDX(blk_stk_idx)) = TRUE;
03879 AT_DEF_LINE(BLK_SKIP_LBL_IDX(blk_stk_idx)) = stmt_start_line;
03880 AT_REFERENCED(BLK_SKIP_LBL_IDX(blk_stk_idx)) = Referenced;
03881 ATL_DEF_STMT_IDX(BLK_SKIP_LBL_IDX(blk_stk_idx)) = curr_stmt_sh_idx;
03882 }
03883
03884 if (! BLK_EXIT_STMT(blk_stk_idx)) {
03885 SH_LOOP_END(curr_stmt_sh_idx) = TRUE;
03886 SH_PARENT_BLK_IDX(curr_stmt_sh_idx) = CURR_BLK_FIRST_SH_IDX;
03887
03888 IR_FLD_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = SH_Tbl_Idx;
03889 IR_IDX_L(SH_IR_IDX(CURR_BLK_FIRST_SH_IDX)) = curr_stmt_sh_idx;
03890 }
03891
03892 # endif
03893
03894
03895 TRACE (Func_Exit, "loop_end_processing", NULL);
03896
03897 return;
03898
03899 }
03900
03901
03902
03903
03904
03905
03906
03907
03908
03909
03910
03911
03912
03913
03914
03915
03916
03917
03918
03919
03920
03921 static void end_internal_err(boolean err_call)
03922
03923 {
03924 TRACE (Func_Entry, "end_internal_err", NULL);
03925
03926 PRINTMSG(stmt_start_line, 160, Internal, stmt_start_col);
03927
03928 TRACE (Func_Exit, "end_internal_err", NULL);
03929
03930 return;
03931
03932 }
03933
03934
03935
03936
03937
03938
03939
03940
03941
03942
03943
03944
03945
03946
03947
03948
03949
03950
03951 static char *blk_desc_str(int blk_idx)
03952 {
03953 #ifdef KEY
03954 char *blk_stmt_str = 0;
03955 #else
03956 char *blk_stmt_str;
03957 #endif
03958 int idx;
03959
03960 TRACE (Func_Entry, "blk_desc_str", NULL);
03961
03962
03963
03964
03965 switch (BLK_TYPE(blk_idx)) {
03966
03967 case Unknown_Blk:
03968 PRINTMSG(stmt_start_line, 160, Internal, stmt_start_col);
03969 break;
03970
03971 case Blockdata_Blk:
03972 blk_stmt_str = "BLOCKDATA";
03973 break;
03974
03975 case Module_Blk:
03976 blk_stmt_str = "MODULE";
03977 break;
03978
03979 case Program_Blk:
03980 blk_stmt_str = "PROGRAM";
03981 break;
03982
03983 case Function_Blk:
03984 blk_stmt_str = "FUNCTION";
03985 break;
03986
03987 case Subroutine_Blk:
03988 blk_stmt_str = "SUBROUTINE";
03989 break;
03990
03991 case Internal_Blk:
03992 case Module_Proc_Blk:
03993 case Interface_Body_Blk:
03994 blk_stmt_str = (ATP_PGM_UNIT(BLK_NAME(blk_idx)) == Function) ?
03995 "FUNCTION" : "SUBROUTINE";
03996 break;
03997
03998 case Do_Blk:
03999 blk_stmt_str = "DO";
04000 break;
04001
04002 case Forall_Blk:
04003 blk_stmt_str = "FORALL";
04004 break;
04005
04006 case If_Blk:
04007 case If_Then_Blk:
04008 case If_Else_If_Blk:
04009 case If_Else_Blk:
04010 blk_stmt_str = "IF";
04011 break;
04012
04013 case Select_Blk:
04014 case Case_Blk:
04015 blk_stmt_str = "SELECT CASE";
04016 break;
04017
04018 case Where_Then_Blk:
04019 case Where_Else_Blk:
04020 case Where_Else_Mask_Blk:
04021 blk_stmt_str = "WHERE";
04022 break;
04023
04024 case Parallel_Blk:
04025 blk_stmt_str = "PARALLEL";
04026 break;
04027
04028 case Doall_Blk:
04029 blk_stmt_str = "DOALL";
04030 break;
04031
04032 case Do_Parallel_Blk:
04033 blk_stmt_str = "DO PARALLEL";
04034 break;
04035
04036 case Guard_Blk:
04037 blk_stmt_str = "GUARD";
04038 break;
04039
04040 case Parallel_Case_Blk:
04041 blk_stmt_str = "CASE";
04042 break;
04043
04044 case Wait_Blk:
04045 blk_stmt_str = "WAIT";
04046 break;
04047
04048 case SGI_Doacross_Blk:
04049 blk_stmt_str = "DOACROSS";
04050 break;
04051
04052 case SGI_Psection_Blk:
04053 blk_stmt_str = "PSECTION";
04054 break;
04055
04056 case SGI_Section_Blk:
04057 blk_stmt_str = "SECTION";
04058 break;
04059
04060 case SGI_Pdo_Blk:
04061 blk_stmt_str = "PDO";
04062 break;
04063
04064 case SGI_Parallel_Do_Blk:
04065 blk_stmt_str = "PARALLEL DO";
04066 break;
04067
04068 case SGI_Parallel_Blk:
04069 blk_stmt_str = "PARALLEL";
04070 break;
04071
04072 case SGI_Critical_Section_Blk:
04073 blk_stmt_str = "CRITICAL SECTION";
04074 break;
04075
04076 case SGI_Single_Process_Blk:
04077 blk_stmt_str = "SINGLE PROCESS";
04078 break;
04079
04080 case SGI_Region_Blk:
04081 blk_stmt_str = "REGION";
04082 break;
04083
04084 case Open_Mp_Parallel_Blk:
04085 blk_stmt_str = "!$OMP PARALLEL";
04086 break;
04087
04088 case Open_Mp_Do_Blk:
04089 blk_stmt_str = "!$OMP DO";
04090 break;
04091
04092 case Open_Mp_Parallel_Sections_Blk:
04093 blk_stmt_str = "!$OMP PARALLEL SECTIONS";
04094 break;
04095
04096 case Open_Mp_Sections_Blk:
04097 blk_stmt_str = "!$OMP SECTIONS";
04098 break;
04099
04100 case Open_Mp_Section_Blk:
04101 blk_stmt_str = "!$OMP SECTION";
04102 break;
04103
04104 case Open_Mp_Single_Blk:
04105 blk_stmt_str = "!$OMP SINGLE";
04106 break;
04107
04108 case Open_Mp_Parallel_Do_Blk:
04109 blk_stmt_str = "!$OMP PARALLEL DO";
04110 break;
04111
04112 case Open_Mp_Master_Blk:
04113 blk_stmt_str = "!$OMP MASTER";
04114 break;
04115
04116 case Open_Mp_Critical_Blk:
04117 blk_stmt_str = "!$OMP CRITICAL";
04118 break;
04119
04120 case Open_Mp_Ordered_Blk:
04121 blk_stmt_str = "!$OMP ORDERED";
04122 break;
04123
04124 case Contains_Blk:
04125 for (idx = blk_idx;
04126 idx > NULL_IDX && (BLK_TYPE(idx) > Blockdata_Blk);
04127 idx--);
04128
04129
04130
04131 blk_stmt_str = blk_desc_str(idx);
04132 break;
04133
04134 case Interface_Blk:
04135 blk_stmt_str = "INTERFACE";
04136 break;
04137
04138 #ifdef KEY
04139 case Enum_Blk:
04140 blk_stmt_str = "ENUM";
04141 break;
04142 #endif
04143
04144 case Derived_Type_Blk:
04145 blk_stmt_str = "TYPE";
04146 break;
04147
04148 }
04149
04150 TRACE (Func_Exit, "blk_desc_str", NULL);
04151 return(blk_stmt_str);
04152
04153 }
04154
04155
04156
04157
04158
04159
04160
04161
04162
04163
04164
04165
04166
04167
04168
04169
04170
04171
04172 int blk_match_err(blk_cntxt_type blk_type,
04173 boolean has_name,
04174 boolean all_match)
04175
04176 {
04177 int blk_idx;
04178 boolean name_err = FALSE;
04179 pgm_unit_type pgm_type;
04180
04181
04182 TRACE (Func_Entry, "blk_match_err", NULL);
04183
04184 if (stmt_type == End_Subroutine_Stmt || stmt_type == End_Function_Stmt) {
04185
04186
04187
04188
04189 pgm_type = (stmt_type == End_Function_Stmt) ? Function : Subroutine;
04190
04191
04192
04193
04194 name_err = (STMT_LEGAL_IN_BLK(stmt_type, CURR_BLK) &&
04195 ATP_PGM_UNIT(CURR_BLK_NAME) == pgm_type);
04196
04197 for (blk_idx = blk_stk_idx; blk_idx > NULL_IDX; blk_idx--) {
04198
04199 if (STMT_LEGAL_IN_BLK(stmt_type, BLK_TYPE(blk_idx)) &&
04200 ATP_PGM_UNIT(BLK_NAME(blk_idx)) == pgm_type) {
04201
04202 if (!has_name ||
04203 (compare_names(TOKEN_ID(token).words,
04204 TOKEN_LEN(token),
04205 AT_OBJ_NAME_LONG(BLK_NAME(blk_idx)),
04206 AT_NAME_LEN(BLK_NAME(blk_idx))) == 0)) {
04207 break;
04208 }
04209 }
04210 }
04211 }
04212 else {
04213 name_err = STMT_LEGAL_IN_BLK(stmt_type, CURR_BLK);
04214
04215 for (blk_idx = blk_stk_idx; blk_idx > NULL_IDX; blk_idx--) {
04216
04217 if (STMT_LEGAL_IN_BLK(stmt_type, BLK_TYPE(blk_idx))) {
04218
04219 if (stmt_type == Else_If_Stmt || stmt_type == Else_Stmt ||
04220 stmt_type == Case_Stmt) {
04221 name_err = FALSE;
04222
04223 if (has_name) {
04224
04225 if (BLK_NAME(blk_idx) == NULL_IDX) {
04226 PRINTMSG(TOKEN_LINE(token), 285, Error,
04227 TOKEN_COLUMN(token),
04228 blk_desc_str(blk_idx),
04229 stmt_type_str[stmt_type]);
04230 }
04231 else if (compare_names(TOKEN_ID(token).words,
04232 TOKEN_LEN(token),
04233 AT_OBJ_NAME_LONG(BLK_NAME(blk_idx)),
04234 AT_NAME_LEN(BLK_NAME(blk_idx))) != 0) {
04235 PRINTMSG(TOKEN_LINE(token), 284, Error,
04236 TOKEN_COLUMN(token),
04237 blk_desc_str(blk_idx),
04238 AT_OBJ_NAME_PTR(BLK_NAME(blk_idx)),
04239 stmt_type_str[stmt_type]);
04240 }
04241 }
04242
04243 break;
04244 }
04245 else {
04246
04247 if (!has_name) {
04248
04249
04250
04251
04252
04253 if (!all_match || BLK_NAME(blk_idx) == NULL_IDX) {
04254 break;
04255 }
04256 }
04257 else if (BLK_NAME(blk_idx) != NULL_IDX &&
04258 (compare_names(TOKEN_ID(token).words,
04259 TOKEN_LEN(token),
04260 AT_OBJ_NAME_LONG(BLK_NAME(blk_idx)),
04261 AT_NAME_LEN(BLK_NAME(blk_idx))) == 0)) {
04262 break;
04263 }
04264 }
04265 }
04266 }
04267 }
04268
04269 if (blk_idx == NULL_IDX && name_err) {
04270
04271
04272
04273
04274
04275
04276
04277
04278
04279
04280
04281 switch (stmt_type) {
04282 case End_If_Stmt:
04283 case End_Do_Stmt:
04284 case End_Select_Stmt:
04285 case Else_If_Stmt:
04286 case Else_Stmt:
04287 case Then_Stmt:
04288 case Case_Stmt:
04289 case End_Forall_Stmt:
04290 case Else_Where_Stmt:
04291 case Else_Where_Mask_Stmt:
04292 case End_Where_Stmt:
04293 if (CURR_BLK_NAME == NULL_IDX) {
04294 PRINTMSG(TOKEN_LINE(token), 285, Error, TOKEN_COLUMN(token),
04295 blk_desc_str(blk_stk_idx), stmt_type_str[stmt_type]);
04296 }
04297 else {
04298 PRINTMSG((has_name) ? TOKEN_LINE(token) : stmt_start_line,
04299 284, Error,
04300 (has_name) ? TOKEN_COLUMN(token) : stmt_start_col,
04301 blk_desc_str(blk_stk_idx),
04302 AT_OBJ_NAME_PTR(CURR_BLK_NAME),
04303 stmt_type_str[stmt_type]);
04304 }
04305 break;
04306
04307 case End_Blockdata_Stmt:
04308 case End_Program_Stmt:
04309 if (CURR_BLK_NAME == NULL_IDX) {
04310
04311 if (stmt_type == End_Blockdata_Stmt) {
04312 PRINTMSG(TOKEN_LINE(token), 158, Error,
04313 TOKEN_COLUMN(token));
04314 }
04315 else {
04316 PRINTMSG(TOKEN_LINE(token), 40, Error,
04317 TOKEN_COLUMN(token));
04318 }
04319
04320
04321
04322
04323
04324
04325
04326
04327
04328
04329
04330
04331
04332
04333
04334
04335
04336
04337
04338
04339
04340
04341 cif_pgm_unit_error_recovery = TRUE;
04342
04343 break;
04344 }
04345
04346
04347
04348 case End_Module_Stmt:
04349 case End_Function_Stmt:
04350 case End_Subroutine_Stmt:
04351 case End_Interface_Stmt:
04352 case End_Type_Stmt:
04353 PRINTMSG(TOKEN_LINE(token), 283, Error, TOKEN_COLUMN(token),
04354 stmt_type_str[stmt_type],
04355 blk_desc_str(blk_stk_idx),
04356 AT_OBJ_NAME_PTR(CURR_BLK_NAME));
04357 break;
04358
04359 #ifdef KEY
04360 case End_Enum_Stmt:
04361 PRINTMSG(TOKEN_LINE(token), 197, Error, TOKEN_COLUMN(token),
04362 EOS_STR, TOKEN_STR(token));
04363 break;
04364 #endif
04365 # ifdef _DEBUG
04366 default:
04367 PRINTMSG(stmt_start_line, 179, Internal,
04368 stmt_start_col, "blk_match_err");
04369 break;
04370 # endif
04371 }
04372 SH_ERR_FLG(curr_stmt_sh_idx) = TRUE;
04373 blk_idx = blk_stk_idx;
04374 }
04375 else if ((stmt_type == Else_Stmt && CURR_BLK == If_Else_Blk) ||
04376 (stmt_type == Else_Where_Stmt && CURR_BLK == Where_Else_Blk) ) {
04377
04378
04379
04380
04381 PRINTMSG(stmt_start_line, 43, Error, stmt_start_col,
04382 stmt_type_str[stmt_type], blk_desc_str(blk_stk_idx));
04383 }
04384 else if (stmt_type == Else_If_Stmt && CURR_BLK == If_Else_Blk) {
04385
04386
04387
04388 PRINTMSG(stmt_start_line, 1158, Error, stmt_start_col);
04389 }
04390 else if (stmt_type == Else_Where_Mask_Stmt && CURR_BLK == Where_Else_Blk) {
04391
04392
04393
04394 PRINTMSG(stmt_start_line, 1609, Error, stmt_start_col);
04395 }
04396 else if (blk_idx == NULL_IDX) {
04397
04398
04399
04400
04401 PUSH_BLK_STK(blk_type);
04402 PRINTMSG(stmt_start_line, 289, Error, stmt_start_col,
04403 stmt_type_str[stmt_type], blk_desc_str(blk_stk_idx));
04404 POP_BLK_STK;
04405
04406 SH_ERR_FLG(curr_stmt_sh_idx) = TRUE;
04407 }
04408 else {
04409
04410 pop_and_err_blk_stk(blk_idx, (BLK_TYPE(blk_idx) <= Interface_Body_Blk));
04411
04412 if (BLK_TYPE(blk_idx) > Interface_Body_Blk &&
04413 BLK_TYPE(blk_idx) != Select_Blk) {
04414 blk_idx = move_blk_to_end(blk_idx);
04415 }
04416 }
04417
04418 TRACE (Func_Exit, "blk_match_err", NULL);
04419
04420 return(blk_idx);
04421
04422 }
04423
04424
04425
04426
04427
04428
04429
04430
04431
04432
04433
04434
04435
04436
04437
04438
04439
04440
04441
04442
04443
04444
04445
04446 boolean pop_and_err_blk_stk(int match_idx,
04447 boolean pop_the_blks)
04448
04449 {
04450 int blk_idx;
04451 int blk_line_idx;
04452 boolean issued_error = FALSE;
04453 boolean save_sh_err_flg;
04454 int sh_idx;
04455
04456
04457 TRACE (Func_Entry, "pop_and_err_blk_stk", NULL);
04458
04459 blk_idx = blk_stk_idx;
04460
04461 while (blk_idx > match_idx) {
04462
04463 if (BLK_TYPE(blk_idx) == Do_Parallel_Blk ||
04464 BLK_TYPE(blk_idx) == SGI_Pdo_Blk ||
04465 BLK_TYPE(blk_idx) == Open_Mp_Do_Blk ||
04466 BLK_TYPE(blk_idx) == Open_Mp_Parallel_Do_Blk) {
04467
04468 if (BLK_TYPE(blk_idx) == Do_Parallel_Blk) {
04469 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
04470 }
04471 else if (BLK_TYPE(blk_idx) == SGI_Pdo_Blk) {
04472 CLEAR_DIRECTIVE_STATE(Pdo_Region);
04473 }
04474 else if (BLK_TYPE(blk_idx) == Open_Mp_Do_Blk) {
04475 CLEAR_DIRECTIVE_STATE(Open_Mp_Do_Region);
04476 }
04477 else if (BLK_TYPE(blk_idx) == Open_Mp_Parallel_Do_Blk) {
04478 CLEAR_DIRECTIVE_STATE(Open_Mp_Parallel_Do_Region);
04479 }
04480
04481 move_blk_to_end(blk_idx);
04482 POP_BLK_STK;
04483 blk_idx--;
04484 continue;
04485 }
04486
04487
04488
04489
04490 if (!BLK_ERR(blk_idx) &&
04491 BLK_TYPE(blk_idx) != Contains_Blk) {
04492
04493 if (BLK_TYPE(blk_idx) != Program_Blk) {
04494
04495 save_sh_err_flg = SH_ERR_FLG(curr_stmt_sh_idx);
04496
04497
04498
04499 if (BLK_TYPE(blk_idx) == Do_Blk) {
04500
04501 if (stmt_label_idx == NULL_IDX ||
04502 stmt_label_idx != BLK_LABEL(blk_idx)) {
04503 PRINTMSG(BLK_DEF_LINE(blk_idx), 288, Error,
04504 BLK_DEF_COLUMN(blk_idx));
04505 issued_error = TRUE;
04506 SH_ERR_FLG(BLK_FIRST_SH_IDX(blk_idx)) = TRUE;
04507 }
04508 }
04509 else if (BLK_TYPE(blk_idx) == Parallel_Blk) {
04510 PRINTMSG(BLK_DEF_LINE(blk_idx), 1217, Error,
04511 BLK_DEF_COLUMN(blk_idx),
04512 "END PARALLEL","PARALLEL");
04513 issued_error = TRUE;
04514 SH_ERR_FLG(BLK_FIRST_SH_IDX(blk_idx)) = TRUE;
04515 }
04516 else if (BLK_TYPE(blk_idx) == Guard_Blk) {
04517 PRINTMSG(BLK_DEF_LINE(blk_idx), 1217, Error,
04518 BLK_DEF_COLUMN(blk_idx),
04519 "END GUARD","GUARD");
04520 issued_error = TRUE;
04521 SH_ERR_FLG(BLK_FIRST_SH_IDX(blk_idx)) = TRUE;
04522 }
04523 else if (BLK_TYPE(blk_idx) == Parallel_Case_Blk) {
04524 PRINTMSG(BLK_DEF_LINE(blk_idx), 1217, Error,
04525 BLK_DEF_COLUMN(blk_idx),
04526 "END CASE","CASE");
04527 issued_error = TRUE;
04528 SH_ERR_FLG(BLK_FIRST_SH_IDX(blk_idx)) = TRUE;
04529 }
04530 else if (BLK_TYPE(blk_idx) == Wait_Blk) {
04531 PRINTMSG(BLK_DEF_LINE(blk_idx), 1217, Error,
04532 BLK_DEF_COLUMN(blk_idx),
04533 "SEND","WAIT");
04534 issued_error = TRUE;
04535 SH_ERR_FLG(BLK_FIRST_SH_IDX(blk_idx)) = TRUE;
04536 }
04537 else {
04538 blk_line_idx = blk_idx;
04539
04540 if (BLK_TYPE(blk_idx) == Case_Blk) {
04541 for (; BLK_TYPE(blk_line_idx) != Select_Blk; blk_line_idx--);
04542 }
04543 else if (BLK_TYPE(blk_idx) == If_Then_Blk ||
04544 BLK_TYPE(blk_idx) == If_Else_If_Blk ||
04545 BLK_TYPE(blk_idx) == If_Else_Blk) {
04546 do {
04547
04548 if (BLK_TYPE(blk_line_idx) == If_Then_Blk ||
04549 BLK_TYPE(blk_line_idx) == If_Else_If_Blk ||
04550 BLK_TYPE(blk_line_idx) == If_Else_Blk) {
04551 BLK_ERR(blk_line_idx) = TRUE;
04552 SH_ERR_FLG(BLK_FIRST_SH_IDX(blk_line_idx)) = TRUE;
04553 }
04554 blk_line_idx--;
04555 } while (BLK_TYPE(blk_line_idx) != If_Blk);
04556 }
04557
04558 if (!BLK_ERR(blk_line_idx)) {
04559 PRINTMSG(BLK_DEF_LINE(blk_line_idx), 291, Error,
04560 BLK_DEF_COLUMN(blk_line_idx),
04561 blk_desc_str(blk_idx));
04562 issued_error = TRUE;
04563 BLK_ERR(blk_line_idx) = TRUE;
04564 SH_ERR_FLG(BLK_FIRST_SH_IDX(blk_line_idx)) = TRUE;
04565 }
04566 }
04567
04568 SH_ERR_FLG(curr_stmt_sh_idx) = save_sh_err_flg;
04569
04570 }
04571 else {
04572
04573 if (SCP_ATTR_IDX(curr_scp_idx) == glb_tbl_idx[Main_Attr_Idx]) {
04574
04575
04576
04577
04578
04579 if (!AT_DCL_ERR(glb_tbl_idx[Main_Attr_Idx]) &&
04580 !SCP_IN_ERR(curr_scp_idx)) {
04581 PRINTMSG(BLK_DEF_LINE(blk_idx), 293, Error,
04582 BLK_DEF_COLUMN(blk_idx));
04583 issued_error = TRUE;
04584 }
04585 }
04586 else {
04587 PRINTMSG(BLK_DEF_LINE(blk_idx), 955, Error,
04588 BLK_DEF_COLUMN(blk_idx),
04589 AT_OBJ_NAME_PTR(CURR_BLK_NAME));
04590 issued_error = TRUE;
04591 }
04592
04593 if (need_new_sh) {
04594 sh_idx = curr_stmt_sh_idx;
04595 curr_stmt_sh_idx = ntr_sh_tbl();
04596 SH_NEXT_IDX(sh_idx) = curr_stmt_sh_idx;
04597 SH_PREV_IDX(curr_stmt_sh_idx) = sh_idx;
04598 }
04599
04600 SH_GLB_LINE(curr_stmt_sh_idx) = stmt_start_line;
04601 SH_COL_NUM(curr_stmt_sh_idx) = stmt_start_col;
04602 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Stmt;
04603 }
04604 }
04605
04606 BLK_ERR(blk_idx) = TRUE;
04607
04608 if (pop_the_blks) {
04609
04610 if (BLK_TYPE(blk_idx) == Case_Blk ||
04611 BLK_TYPE(blk_idx) == If_Then_Blk ||
04612 BLK_TYPE(blk_idx) == If_Else_If_Blk ||
04613 BLK_TYPE(blk_idx) == If_Else_Blk) {
04614 (*end_blocks[BLK_TYPE(blk_idx)]) (TRUE);
04615 blk_idx--;
04616 }
04617 else {
04618 (*end_blocks[BLK_TYPE(blk_idx)]) (TRUE);
04619 }
04620 }
04621
04622
04623
04624
04625
04626 else if (BLK_TYPE(blk_idx) == Where_Else_Blk &&
04627 (stmt_type == Else_Where_Stmt ||
04628 stmt_type == Else_Where_Mask_Stmt)) {
04629 move_blk_to_end(blk_idx);
04630 POP_BLK_STK;
04631 }
04632 else if (BLK_TYPE(blk_idx) == If_Else_Blk &&
04633 (stmt_type == Else_Stmt || stmt_type == Else_If_Stmt)) {
04634 move_blk_to_end(blk_idx);
04635 POP_BLK_STK;
04636 }
04637
04638 blk_idx--;
04639 }
04640
04641 TRACE (Func_Exit, "pop_and_err_blk_stk", NULL);
04642
04643 return(issued_error);
04644
04645 }
04646
04647
04648
04649
04650
04651
04652
04653
04654
04655
04656
04657
04658
04659
04660
04661
04662
04663
04664
04665 int move_blk_to_end(int blk_idx)
04666
04667 {
04668 int new_idx;
04669
04670 TRACE (Func_Entry, "move_blk_to_end", NULL);
04671
04672 if (blk_idx != blk_stk_idx) {
04673
04674 PUSH_BLK_STK(BLK_TYPE(blk_idx));
04675 blk_stk[blk_stk_idx] = blk_stk[blk_idx];
04676
04677 if (BLK_TYPE(blk_idx) == Do_Blk &&
04678 BLK_TYPE(blk_idx - 1) == Doall_Blk) {
04679
04680 for (new_idx = blk_idx - 1; new_idx < blk_stk_idx - 1; new_idx++) {
04681 blk_stk[new_idx] = blk_stk[new_idx + 2];
04682 }
04683
04684 POP_BLK_STK;
04685 POP_BLK_STK;
04686 cdir_switches.doall_region = FALSE;
04687 }
04688 else {
04689 for (new_idx = blk_idx; new_idx < blk_stk_idx; new_idx++) {
04690 blk_stk[new_idx] = blk_stk[new_idx + 1];
04691 }
04692
04693 POP_BLK_STK;
04694 }
04695 }
04696
04697 TRACE (Func_Exit, "move_blk_to_end", NULL);
04698
04699 return(blk_stk_idx);
04700
04701 }
04702
04703
04704
04705
04706
04707
04708
04709
04710
04711
04712
04713
04714
04715
04716
04717
04718
04719 void end_parallel_blk(boolean err_call)
04720
04721 {
04722
04723 TRACE (Func_Entry, "end_parallel_blk", NULL);
04724
04725 if (CURR_BLK == Do_Parallel_Blk) {
04726
04727 POP_BLK_STK;
04728 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
04729 }
04730
04731 if (CURR_BLK == SGI_Pdo_Blk) {
04732
04733 POP_BLK_STK;
04734 CLEAR_DIRECTIVE_STATE(Pdo_Region);
04735 }
04736
04737 if (! err_call) {
04738
04739 if (cdir_switches.dopar_sh_idx != NULL_IDX) {
04740 PRINTMSG(SH_GLB_LINE(cdir_switches.dopar_sh_idx), 1219, Error,
04741 SH_COL_NUM(cdir_switches.dopar_sh_idx),
04742 "DO PARALLEL");
04743 cdir_switches.dopar_sh_idx = NULL_IDX;
04744 }
04745
04746 if (STMT_CANT_BE_IN_BLK(End_Parallel_Stmt, CURR_BLK)) {
04747 blk_match_err(Parallel_Blk, FALSE, FALSE);
04748 }
04749
04750 if (CURR_BLK == Parallel_Blk) {
04751 POP_BLK_STK;
04752 }
04753 }
04754 else {
04755 POP_BLK_STK;
04756 }
04757
04758 TRACE (Func_Exit, "end_parallel_blk", NULL);
04759
04760 return;
04761
04762 }
04763
04764
04765
04766
04767
04768
04769
04770
04771
04772
04773
04774
04775
04776
04777
04778
04779
04780 void end_doall_blk(boolean err_call)
04781
04782 {
04783
04784 TRACE (Func_Entry, "end_doall_blk", NULL);
04785
04786 POP_BLK_STK;
04787
04788 TRACE (Func_Exit, "end_doall_blk", NULL);
04789
04790 return;
04791
04792 }
04793
04794
04795
04796
04797
04798
04799
04800
04801
04802
04803
04804
04805
04806
04807
04808
04809
04810 void end_wait_blk(boolean err_call)
04811
04812 {
04813
04814 TRACE (Func_Entry, "end_wait_blk", NULL);
04815
04816
04817
04818
04819 POP_BLK_STK;
04820
04821 TRACE (Func_Exit, "end_wait_blk", NULL);
04822
04823 return;
04824
04825 }
04826
04827
04828
04829
04830
04831
04832
04833
04834
04835
04836
04837
04838
04839
04840
04841
04842
04843 void end_do_parallel_blk(boolean err_call)
04844
04845 {
04846 int sh_idx;
04847
04848
04849 TRACE (Func_Entry, "end_do_parallel_blk", NULL);
04850
04851 if (! err_call) {
04852
04853 if (STMT_CANT_BE_IN_BLK(End_Do_Parallel_Stmt, CURR_BLK)) {
04854
04855 if (cdir_switches.dopar_sh_idx != NULL_IDX) {
04856 PRINTMSG(SH_GLB_LINE(cdir_switches.dopar_sh_idx), 1219, Error,
04857 SH_COL_NUM(cdir_switches.dopar_sh_idx),
04858 "DO PARALLEL");
04859 cdir_switches.dopar_sh_idx = NULL_IDX;
04860 }
04861 else {
04862 blk_match_err(Do_Parallel_Blk, FALSE, FALSE);
04863 }
04864 }
04865
04866 if (CURR_BLK == Do_Parallel_Blk) {
04867
04868
04869
04870
04871 if (BLK_ENDDO_PARALLEL_SH_IDX(blk_stk_idx) != NULL_IDX) {
04872 sh_idx = BLK_ENDDO_PARALLEL_SH_IDX(blk_stk_idx);
04873 SH_PREV_IDX(SH_NEXT_IDX(sh_idx)) = SH_PREV_IDX(sh_idx);
04874 SH_NEXT_IDX(SH_PREV_IDX(sh_idx)) = SH_NEXT_IDX(sh_idx);
04875
04876 FREE_IR_NODE(SH_IR_IDX(sh_idx));
04877 FREE_SH_NODE(sh_idx);
04878 }
04879
04880 POP_BLK_STK;
04881 }
04882 }
04883 else {
04884 POP_BLK_STK;
04885 }
04886
04887 TRACE (Func_Exit, "end_do_parallel_blk", NULL);
04888
04889 return;
04890
04891 }
04892
04893
04894
04895
04896
04897
04898
04899
04900
04901
04902
04903
04904
04905
04906
04907
04908
04909 void end_pdo_blk(boolean err_call)
04910
04911 {
04912 int sh_idx;
04913
04914
04915 TRACE (Func_Entry, "end_pdo_blk", NULL);
04916
04917 if (! err_call) {
04918
04919 if (STMT_CANT_BE_IN_BLK(SGI_End_Pdo_Stmt, CURR_BLK)) {
04920
04921 if (cdir_switches.pdo_sh_idx != NULL_IDX) {
04922 PRINTMSG(SH_GLB_LINE(cdir_switches.pdo_sh_idx), 1219, Error,
04923 SH_COL_NUM(cdir_switches.pdo_sh_idx),
04924 "PDO");
04925 cdir_switches.pdo_sh_idx = NULL_IDX;
04926 }
04927 else {
04928 blk_match_err(SGI_Pdo_Blk, FALSE, FALSE);
04929 }
04930 }
04931
04932 if (CURR_BLK == SGI_Pdo_Blk) {
04933
04934
04935
04936 if (BLK_ENDPDO_SH_IDX(blk_stk_idx) != NULL_IDX) {
04937 sh_idx = BLK_ENDPDO_SH_IDX(blk_stk_idx);
04938 SH_PREV_IDX(SH_NEXT_IDX(sh_idx)) = SH_PREV_IDX(sh_idx);
04939 SH_NEXT_IDX(SH_PREV_IDX(sh_idx)) = SH_NEXT_IDX(sh_idx);
04940
04941 FREE_IR_NODE(SH_IR_IDX(sh_idx));
04942 FREE_SH_NODE(sh_idx);
04943 }
04944
04945 IR_LINE_NUM_R(SH_IR_IDX(curr_stmt_sh_idx)) = stmt_start_line;
04946 IR_COL_NUM_R(SH_IR_IDX(curr_stmt_sh_idx)) = stmt_start_col;
04947 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
04948 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
04949
04950 POP_BLK_STK;
04951 }
04952 }
04953 else {
04954 POP_BLK_STK;
04955 }
04956
04957 TRACE (Func_Exit, "end_pdo_blk", NULL);
04958
04959 return;
04960
04961 }
04962
04963
04964
04965
04966
04967
04968
04969
04970
04971
04972
04973
04974
04975
04976
04977
04978
04979 void end_guard_blk(boolean err_call)
04980
04981 {
04982 TRACE (Func_Entry, "end_guard_blk", NULL);
04983
04984 if (CURR_BLK == Do_Parallel_Blk) {
04985
04986 POP_BLK_STK;
04987 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
04988 }
04989
04990 if (CURR_BLK == SGI_Pdo_Blk) {
04991
04992 POP_BLK_STK;
04993 CLEAR_DIRECTIVE_STATE(Pdo_Region);
04994 }
04995
04996 if (! err_call) {
04997
04998 if (STMT_CANT_BE_IN_BLK(End_Guard_Stmt, CURR_BLK)) {
04999 blk_match_err(Guard_Blk, FALSE, FALSE);
05000 }
05001
05002 if (CURR_BLK == Guard_Blk) {
05003 POP_BLK_STK;
05004 }
05005 }
05006 else {
05007 POP_BLK_STK;
05008 }
05009
05010 TRACE (Func_Exit, "end_guard_blk", NULL);
05011
05012 return;
05013
05014 }
05015
05016
05017
05018
05019
05020
05021
05022
05023
05024
05025
05026
05027
05028
05029
05030
05031
05032 void end_parallel_case_blk(boolean err_call)
05033
05034 {
05035 TRACE (Func_Entry, "end_parallel_case_blk", NULL);
05036
05037 if (CURR_BLK == Do_Parallel_Blk) {
05038
05039 POP_BLK_STK;
05040 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
05041 }
05042
05043 if (CURR_BLK == SGI_Pdo_Blk) {
05044
05045 POP_BLK_STK;
05046 CLEAR_DIRECTIVE_STATE(Pdo_Region);
05047 }
05048
05049 if (! err_call) {
05050
05051 if (STMT_CANT_BE_IN_BLK(stmt_type, CURR_BLK)) {
05052 blk_match_err(Parallel_Case_Blk, FALSE, FALSE);
05053 }
05054
05055 if (CURR_BLK == Parallel_Case_Blk) {
05056 POP_BLK_STK;
05057 }
05058 }
05059 else {
05060 POP_BLK_STK;
05061 }
05062
05063 TRACE (Func_Exit, "end_parallel_case_blk", NULL);
05064
05065 return;
05066
05067 }
05068
05069
05070
05071
05072
05073
05074
05075
05076
05077
05078
05079
05080
05081
05082
05083
05084
05085 void end_SGI_parallel_blk(boolean err_call)
05086
05087 {
05088 TRACE (Func_Entry, "end_SGI_parallel_blk", NULL);
05089
05090 while (blk_stk_idx > 0 &&
05091 (CURR_BLK == Do_Parallel_Blk ||
05092 CURR_BLK == SGI_Pdo_Blk ||
05093 CURR_BLK == SGI_Psection_Blk ||
05094 CURR_BLK == SGI_Section_Blk ||
05095 CURR_BLK == SGI_Single_Process_Blk ||
05096 CURR_BLK == SGI_Critical_Section_Blk)) {
05097
05098 switch (CURR_BLK) {
05099 case Do_Parallel_Blk:
05100 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
05101 break;
05102
05103 case SGI_Pdo_Blk:
05104 CLEAR_DIRECTIVE_STATE(Pdo_Region);
05105 break;
05106
05107 case SGI_Psection_Blk:
05108 CLEAR_DIRECTIVE_STATE(Parallel_Section_Region);
05109 break;
05110
05111 case SGI_Section_Blk:
05112 CLEAR_DIRECTIVE_STATE(Parallel_Section_Region);
05113 break;
05114
05115 case SGI_Single_Process_Blk:
05116 CLEAR_DIRECTIVE_STATE(Single_Process_Region);
05117 break;
05118
05119 case SGI_Critical_Section_Blk:
05120 CLEAR_DIRECTIVE_STATE(Critical_Section_Region);
05121 break;
05122 }
05123
05124
05125 POP_BLK_STK;
05126 }
05127
05128 if (! err_call) {
05129
05130 if (cdir_switches.pdo_sh_idx != NULL_IDX) {
05131 PRINTMSG(SH_GLB_LINE(cdir_switches.pdo_sh_idx), 1219, Error,
05132 SH_COL_NUM(cdir_switches.pdo_sh_idx),
05133 "PDO");
05134 cdir_switches.pdo_sh_idx = NULL_IDX;
05135 }
05136
05137 if (STMT_CANT_BE_IN_BLK(SGI_End_Parallel_Stmt, CURR_BLK)) {
05138 blk_match_err(SGI_Parallel_Blk, FALSE, FALSE);
05139 }
05140
05141 if (CURR_BLK == SGI_Parallel_Blk) {
05142
05143 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05144 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05145
05146 POP_BLK_STK;
05147 }
05148 }
05149 else {
05150 POP_BLK_STK;
05151 }
05152
05153 TRACE (Func_Exit, "end_SGI_parallel_blk", NULL);
05154
05155 return;
05156
05157 }
05158
05159
05160
05161
05162
05163
05164
05165
05166
05167
05168
05169
05170
05171
05172
05173
05174
05175 void end_doacross_blk(boolean err_call)
05176
05177 {
05178
05179 TRACE (Func_Entry, "end_doacross_blk", NULL);
05180
05181 POP_BLK_STK;
05182
05183 TRACE (Func_Exit, "end_doacross_blk", NULL);
05184
05185 return;
05186
05187 }
05188
05189
05190
05191
05192
05193
05194
05195
05196
05197
05198
05199
05200
05201
05202
05203
05204
05205 void end_critical_section_blk(boolean err_call)
05206
05207 {
05208 TRACE (Func_Entry, "end_critical_section_blk", NULL);
05209
05210 if (CURR_BLK == Do_Parallel_Blk) {
05211
05212 POP_BLK_STK;
05213 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
05214 }
05215
05216 if (CURR_BLK == SGI_Pdo_Blk) {
05217
05218 POP_BLK_STK;
05219 CLEAR_DIRECTIVE_STATE(Pdo_Region);
05220 }
05221
05222 if (! err_call) {
05223
05224 if (STMT_CANT_BE_IN_BLK(SGI_End_Critical_Section_Stmt, CURR_BLK)) {
05225 blk_match_err(SGI_Critical_Section_Blk, FALSE, FALSE);
05226 }
05227
05228 if (CURR_BLK == SGI_Critical_Section_Blk) {
05229 POP_BLK_STK;
05230 }
05231 }
05232 else {
05233 POP_BLK_STK;
05234 }
05235
05236 TRACE (Func_Exit, "end_critical_section_blk", NULL);
05237
05238 return;
05239
05240 }
05241
05242
05243
05244
05245
05246
05247
05248
05249
05250
05251
05252
05253
05254
05255
05256
05257
05258 void end_psection_blk(boolean err_call)
05259
05260 {
05261 TRACE (Func_Entry, "end_psection_blk", NULL);
05262
05263 if (CURR_BLK == Do_Parallel_Blk) {
05264
05265 POP_BLK_STK;
05266 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
05267 }
05268
05269 if (CURR_BLK == SGI_Pdo_Blk) {
05270
05271 POP_BLK_STK;
05272 CLEAR_DIRECTIVE_STATE(Pdo_Region);
05273 }
05274
05275 if (! err_call) {
05276
05277 if (STMT_CANT_BE_IN_BLK(SGI_End_Psection_Stmt, CURR_BLK)) {
05278 blk_match_err(SGI_Section_Blk, FALSE, FALSE);
05279 }
05280
05281 if (CURR_BLK == SGI_Section_Blk) {
05282 POP_BLK_STK;
05283 }
05284 }
05285 else {
05286 POP_BLK_STK;
05287 }
05288
05289 if (CURR_BLK == SGI_Psection_Blk) {
05290
05291 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05292 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05293
05294 POP_BLK_STK;
05295 }
05296
05297 TRACE (Func_Exit, "end_psection_blk", NULL);
05298
05299 return;
05300
05301 }
05302
05303
05304
05305
05306
05307
05308
05309
05310
05311
05312
05313
05314
05315
05316
05317
05318
05319 void end_single_process_blk(boolean err_call)
05320
05321 {
05322 TRACE (Func_Entry, "end_single_process_blk", NULL);
05323
05324 if (CURR_BLK == Do_Parallel_Blk) {
05325
05326 POP_BLK_STK;
05327 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
05328 }
05329
05330 if (CURR_BLK == SGI_Pdo_Blk) {
05331
05332 POP_BLK_STK;
05333 CLEAR_DIRECTIVE_STATE(Pdo_Region);
05334 }
05335
05336 if (! err_call) {
05337
05338 if (STMT_CANT_BE_IN_BLK(SGI_End_Single_Process_Stmt, CURR_BLK)) {
05339 blk_match_err(SGI_Single_Process_Blk, FALSE, FALSE);
05340 }
05341
05342 if (CURR_BLK == SGI_Single_Process_Blk) {
05343
05344 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05345 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05346
05347 POP_BLK_STK;
05348 }
05349 }
05350 else {
05351 POP_BLK_STK;
05352 }
05353
05354 TRACE (Func_Exit, "end_single_process_blk", NULL);
05355
05356 return;
05357
05358 }
05359
05360
05361
05362
05363
05364
05365
05366
05367
05368
05369
05370
05371
05372
05373
05374
05375
05376 void end_region_blk(boolean err_call)
05377
05378 {
05379 TRACE (Func_Entry, "end_region_blk", NULL);
05380
05381 if (CURR_BLK == Do_Parallel_Blk) {
05382
05383 POP_BLK_STK;
05384 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
05385 }
05386
05387 if (CURR_BLK == SGI_Pdo_Blk) {
05388
05389 POP_BLK_STK;
05390 CLEAR_DIRECTIVE_STATE(Pdo_Region);
05391 }
05392
05393 if (! err_call) {
05394
05395 if (STMT_CANT_BE_IN_BLK(SGI_Region_End_Stmt, CURR_BLK)) {
05396 blk_match_err(SGI_Region_Blk, FALSE, FALSE);
05397 }
05398
05399 if (CURR_BLK == SGI_Region_Blk) {
05400 POP_BLK_STK;
05401 }
05402 }
05403 else {
05404 POP_BLK_STK;
05405 }
05406
05407 TRACE (Func_Exit, "end_region_blk", NULL);
05408
05409 return;
05410
05411 }
05412
05413
05414
05415
05416
05417
05418
05419
05420
05421
05422
05423
05424
05425
05426
05427
05428
05429 void end_open_mp_parallel_blk(boolean err_call)
05430
05431 {
05432 TRACE (Func_Entry, "end_open_mp_parallel_blk", NULL);
05433
05434 if (CURR_BLK == Open_Mp_Do_Blk) {
05435
05436 POP_BLK_STK;
05437 CLEAR_DIRECTIVE_STATE(Open_Mp_Do_Region);
05438 }
05439
05440 if (CURR_BLK == Open_Mp_Parallel_Do_Blk) {
05441
05442 POP_BLK_STK;
05443 CLEAR_DIRECTIVE_STATE(Open_Mp_Parallel_Do_Region);
05444 }
05445
05446
05447 if (! err_call) {
05448
05449 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Parallel_Stmt, CURR_BLK)) {
05450 blk_match_err(Open_Mp_Parallel_Blk, FALSE, FALSE);
05451 }
05452
05453 if (CURR_BLK == Open_Mp_Parallel_Blk) {
05454
05455 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05456 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05457
05458 POP_BLK_STK;
05459 }
05460 }
05461 else {
05462 POP_BLK_STK;
05463 }
05464
05465 TRACE (Func_Exit, "end_open_mp_parallel_blk", NULL);
05466
05467 return;
05468
05469 }
05470
05471
05472
05473
05474
05475
05476
05477
05478
05479
05480
05481
05482
05483
05484
05485
05486
05487 void end_open_mp_do_blk(boolean err_call)
05488
05489 {
05490 int sh_idx;
05491
05492
05493 TRACE (Func_Entry, "end_open_mp_do_blk", NULL);
05494
05495 if (! err_call) {
05496
05497 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Do_Stmt, CURR_BLK)) {
05498 blk_match_err(Open_Mp_Do_Blk, FALSE, FALSE);
05499 }
05500
05501 if (CURR_BLK == Open_Mp_Do_Blk) {
05502
05503
05504
05505 if (BLK_ENDPDO_SH_IDX(blk_stk_idx) != NULL_IDX) {
05506 sh_idx = BLK_ENDPDO_SH_IDX(blk_stk_idx);
05507 SH_PREV_IDX(SH_NEXT_IDX(sh_idx)) = SH_PREV_IDX(sh_idx);
05508 SH_NEXT_IDX(SH_PREV_IDX(sh_idx)) = SH_NEXT_IDX(sh_idx);
05509
05510 FREE_IR_NODE(SH_IR_IDX(sh_idx));
05511 FREE_SH_NODE(sh_idx);
05512 }
05513
05514 IR_LINE_NUM_R(SH_IR_IDX(curr_stmt_sh_idx)) = stmt_start_line;
05515 IR_COL_NUM_R(SH_IR_IDX(curr_stmt_sh_idx)) = stmt_start_col;
05516 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05517 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05518
05519 POP_BLK_STK;
05520 }
05521 }
05522 else {
05523 POP_BLK_STK;
05524 }
05525
05526 TRACE (Func_Exit, "end_open_mp_do_blk", NULL);
05527
05528 return;
05529
05530 }
05531
05532
05533
05534
05535
05536
05537
05538
05539
05540
05541
05542
05543
05544
05545
05546
05547
05548 void end_open_mp_parallel_sections_blk(boolean err_call)
05549
05550 {
05551 TRACE (Func_Entry, "end_open_mp_parallel_sections_blk", NULL);
05552
05553 if (! err_call) {
05554
05555 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Parallel_Sections_Stmt, CURR_BLK)) {
05556 blk_match_err(Open_Mp_Parallel_Sections_Blk, FALSE, FALSE);
05557 }
05558
05559 if (CURR_BLK == Open_Mp_Parallel_Sections_Blk) {
05560
05561 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05562 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05563
05564 POP_BLK_STK;
05565 }
05566 }
05567 else {
05568 POP_BLK_STK;
05569 }
05570
05571 TRACE (Func_Exit, "end_open_mp_parallel_sections_blk", NULL);
05572
05573 return;
05574
05575 }
05576
05577
05578
05579
05580
05581
05582
05583
05584
05585
05586
05587
05588
05589
05590
05591
05592
05593 void end_open_mp_sections_blk(boolean err_call)
05594
05595 {
05596 TRACE (Func_Entry, "end_open_mp_sections_blk", NULL);
05597
05598 if (! err_call) {
05599
05600 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Sections_Stmt, CURR_BLK)) {
05601 blk_match_err(Open_Mp_Sections_Blk, FALSE, FALSE);
05602 }
05603
05604 if (CURR_BLK == Open_Mp_Sections_Blk) {
05605
05606 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05607 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05608
05609 POP_BLK_STK;
05610 }
05611 }
05612 else {
05613 POP_BLK_STK;
05614 }
05615
05616 TRACE (Func_Exit, "end_open_mp_sections_blk", NULL);
05617
05618 return;
05619
05620 }
05621
05622
05623
05624
05625
05626
05627
05628
05629
05630
05631
05632
05633
05634
05635
05636
05637
05638 void end_open_mp_section_blk(boolean err_call)
05639
05640 {
05641 TRACE (Func_Entry, "end_open_mp_section_blk", NULL);
05642
05643 if (! err_call) {
05644
05645 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Section_Stmt, CURR_BLK)) {
05646 blk_match_err(Open_Mp_Section_Blk, FALSE, FALSE);
05647 }
05648
05649 if (CURR_BLK == Open_Mp_Section_Blk) {
05650 POP_BLK_STK;
05651 }
05652 }
05653 else {
05654 POP_BLK_STK;
05655 }
05656
05657 TRACE (Func_Exit, "end_open_mp_section_blk", NULL);
05658
05659 return;
05660
05661 }
05662
05663
05664
05665
05666
05667
05668
05669
05670
05671
05672
05673
05674
05675
05676
05677
05678
05679 void end_open_mp_single_blk(boolean err_call)
05680
05681 {
05682 TRACE (Func_Entry, "end_open_mp_single_blk", NULL);
05683
05684 if (! err_call) {
05685
05686 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Single_Stmt, CURR_BLK)) {
05687 blk_match_err(Open_Mp_Single_Blk, FALSE, FALSE);
05688 }
05689
05690 if (CURR_BLK == Open_Mp_Single_Blk) {
05691
05692 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05693 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05694
05695 POP_BLK_STK;
05696 }
05697 }
05698 else {
05699 POP_BLK_STK;
05700 }
05701
05702 TRACE (Func_Exit, "end_open_mp_single_blk", NULL);
05703
05704 return;
05705
05706 }
05707
05708
05709
05710
05711
05712
05713
05714
05715
05716
05717
05718
05719
05720
05721
05722
05723
05724 void end_open_mp_parallel_do_blk(boolean err_call)
05725
05726 {
05727 int sh_idx;
05728
05729
05730 TRACE (Func_Entry, "end_open_mp_parallel_do_blk", NULL);
05731
05732 if (! err_call) {
05733
05734 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Parallel_Do_Stmt, CURR_BLK)) {
05735 blk_match_err(Open_Mp_Parallel_Do_Blk, FALSE, FALSE);
05736 }
05737
05738 if (CURR_BLK == Open_Mp_Parallel_Do_Blk) {
05739
05740
05741
05742 if (BLK_ENDPDO_SH_IDX(blk_stk_idx) != NULL_IDX) {
05743 sh_idx = BLK_ENDPDO_SH_IDX(blk_stk_idx);
05744 SH_PREV_IDX(SH_NEXT_IDX(sh_idx)) = SH_PREV_IDX(sh_idx);
05745 SH_NEXT_IDX(SH_PREV_IDX(sh_idx)) = SH_NEXT_IDX(sh_idx);
05746
05747 FREE_IR_NODE(SH_IR_IDX(sh_idx));
05748 FREE_SH_NODE(sh_idx);
05749 }
05750
05751 IR_LINE_NUM_R(SH_IR_IDX(curr_stmt_sh_idx)) = stmt_start_line;
05752 IR_COL_NUM_R(SH_IR_IDX(curr_stmt_sh_idx)) = stmt_start_col;
05753 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05754 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05755
05756 POP_BLK_STK;
05757 }
05758 }
05759 else {
05760 POP_BLK_STK;
05761 }
05762
05763 TRACE (Func_Exit, "end_open_mp_parallel_do_blk", NULL);
05764
05765 return;
05766 }
05767
05768
05769
05770
05771
05772
05773
05774
05775
05776
05777
05778
05779
05780
05781
05782
05783
05784 void end_open_mp_master_blk(boolean err_call)
05785
05786 {
05787 TRACE (Func_Entry, "end_open_mp_master_blk", NULL);
05788
05789 if (! err_call) {
05790
05791 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Master_Stmt, CURR_BLK)) {
05792 blk_match_err(Open_Mp_Master_Blk, FALSE, FALSE);
05793 }
05794
05795 if (CURR_BLK == Open_Mp_Master_Blk) {
05796 POP_BLK_STK;
05797 }
05798 }
05799 else {
05800 POP_BLK_STK;
05801 }
05802
05803 TRACE (Func_Exit, "end_open_mp_master_blk", NULL);
05804
05805 return;
05806
05807 }
05808
05809
05810
05811
05812
05813
05814
05815
05816
05817
05818
05819
05820
05821
05822
05823
05824
05825 void end_open_mp_critical_blk(boolean err_call)
05826
05827 {
05828 TRACE (Func_Entry, "end_open_mp_critical_blk", NULL);
05829
05830 if (! err_call) {
05831
05832 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Critical_Stmt, CURR_BLK)) {
05833 blk_match_err(Open_Mp_Critical_Blk, FALSE, FALSE);
05834 }
05835
05836 if (CURR_BLK == Open_Mp_Critical_Blk) {
05837 POP_BLK_STK;
05838 }
05839 }
05840 else {
05841 POP_BLK_STK;
05842 }
05843
05844 TRACE (Func_Exit, "end_open_mp_critical_blk", NULL);
05845
05846 return;
05847
05848 }
05849
05850
05851
05852
05853
05854
05855
05856
05857
05858
05859
05860
05861
05862
05863
05864
05865
05866 void end_open_mp_ordered_blk(boolean err_call)
05867
05868 {
05869 TRACE (Func_Entry, "end_open_mp_ordered_blk", NULL);
05870
05871 if (! err_call) {
05872
05873 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Ordered_Stmt, CURR_BLK)) {
05874 blk_match_err(Open_Mp_Ordered_Blk, FALSE, FALSE);
05875 }
05876
05877 if (CURR_BLK == Open_Mp_Ordered_Blk) {
05878 POP_BLK_STK;
05879 }
05880 }
05881 else {
05882 POP_BLK_STK;
05883 }
05884
05885 TRACE (Func_Exit, "end_open_mp_ordered_blk", NULL);
05886
05887 return;
05888
05889 }
05890
05891
05892
05893
05894
05895
05896
05897
05898
05899
05900
05901
05902
05903
05904
05905
05906
05907 void end_open_mp_parallel_workshare_blk(boolean err_call)
05908
05909 {
05910 TRACE (Func_Entry, "end_open_mp_parallel_workshare_blk", NULL);
05911
05912 if (! err_call) {
05913 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Parallel_Workshare_Stmt, CURR_BLK)) {
05914 blk_match_err(Open_Mp_Parallel_Workshare_Blk, FALSE, FALSE);
05915 }
05916
05917 if (CURR_BLK == Open_Mp_Parallel_Workshare_Blk) {
05918 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05919 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05920
05921 POP_BLK_STK;
05922 }
05923 }
05924 else{
05925 POP_BLK_STK;
05926 }
05927
05928 TRACE(Func_Exit, "end_open_mp_parallel_workshare_blk", NULL);
05929
05930 return;
05931 }
05932
05933
05934
05935
05936
05937
05938
05939
05940
05941
05942
05943
05944
05945
05946
05947
05948
05949 void end_open_mp_workshare_blk(boolean err_call)
05950
05951 {
05952 TRACE (Func_Entry, "end_open_mp_workshare_blk", NULL);
05953
05954 if (! err_call) {
05955 if (STMT_CANT_BE_IN_BLK(Open_MP_End_Workshare_Stmt, CURR_BLK)) {
05956 blk_match_err(Open_Mp_Workshare_Blk, FALSE, FALSE);
05957 }
05958
05959 if (CURR_BLK == Open_Mp_Workshare_Blk) {
05960 IR_FLD_R(SH_IR_IDX(curr_stmt_sh_idx)) = SH_Tbl_Idx;
05961 IR_IDX_R(SH_IR_IDX(curr_stmt_sh_idx)) = CURR_BLK_FIRST_SH_IDX;
05962
05963 POP_BLK_STK;
05964 }
05965 }
05966 else{
05967 POP_BLK_STK;
05968 }
05969
05970 TRACE(Func_Exit, "end_open_mp_workshare_blk", NULL);
05971
05972 return;
05973 }
05974
05975
05976
05977
05978
05979
05980
05981
05982
05983
05984
05985
05986
05987
05988
05989
05990
05991
05992
05993 boolean remove_do_parallel_blk(boolean cannot_nest,
05994 char *str,
05995 int line,
05996 int col)
05997
05998
05999 {
06000 int blk_idx;
06001 boolean err = FALSE;
06002
06003 TRACE (Func_Entry, "remove_do_parallel_blk", NULL);
06004
06005 blk_idx = blk_stk_idx;
06006
06007 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
06008
06009 if (BLK_TYPE(blk_idx) == Do_Parallel_Blk) {
06010 if (blk_idx < blk_stk_idx &&
06011 BLK_TYPE(blk_idx + 1) == Do_Blk &&
06012 BLK_DEF_LINE(blk_idx) == BLK_DEF_LINE(blk_idx + 1)) {
06013
06014
06015 if (cannot_nest) {
06016 PRINTMSG(line, 1289, Error, col, str);
06017 err = TRUE;
06018 }
06019 else {
06020
06021 }
06022 }
06023 else {
06024
06025
06026
06027 move_blk_to_end(blk_idx);
06028 CLEAR_DIRECTIVE_STATE(Do_Parallel_Region);
06029 POP_BLK_STK;
06030 }
06031 }
06032
06033 blk_idx--;
06034 }
06035
06036 TRACE (Func_Exit, "remove_do_parallel_blk", NULL);
06037
06038 return(err);
06039
06040 }
06041
06042
06043
06044
06045
06046
06047
06048
06049
06050
06051
06052
06053
06054
06055
06056
06057
06058
06059
06060 boolean remove_pdo_blk(boolean cannot_nest,
06061 char *str,
06062 int line,
06063 int col)
06064
06065
06066 {
06067 int blk_idx;
06068 boolean err = FALSE;
06069
06070 TRACE (Func_Entry, "remove_pdo_blk", NULL);
06071
06072 blk_idx = blk_stk_idx;
06073
06074 while (BLK_TYPE(blk_idx) > Module_Proc_Blk) {
06075
06076 if (BLK_TYPE(blk_idx) == SGI_Pdo_Blk) {
06077 if (blk_idx < blk_stk_idx &&
06078 BLK_TYPE(blk_idx + 1) == Do_Blk &&
06079 BLK_DEF_LINE(blk_idx) == BLK_DEF_LINE(blk_idx + 1)) {
06080
06081
06082 if (cannot_nest) {
06083
06084 PRINTMSG(line, 1289, Error, col, str);
06085 err = TRUE;
06086 }
06087 else {
06088
06089 }
06090 }
06091 else {
06092
06093
06094
06095 move_blk_to_end(blk_idx);
06096 CLEAR_DIRECTIVE_STATE(Pdo_Region);
06097 POP_BLK_STK;
06098 }
06099 }
06100
06101 blk_idx--;
06102 }
06103
06104 TRACE (Func_Exit, "remove_pdo_blk", NULL);
06105
06106 return(err);
06107
06108 }
06109
06110
06111 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
06112
06113
06114
06115
06116
06117
06118
06119
06120
06121
06122
06123
06124
06125
06126
06127
06128
06129
06130
06131
06132
06133
06134 static void check_loop_bottom_nesting(void)
06135
06136 {
06137 int blk_idx;
06138 boolean perfectly_nested = FALSE;
06139 int sh_idx;
06140 char str[80];
06141
06142
06143 TRACE (Func_Entry, "check_loop_bottom_nesting", NULL);
06144
06145
06146
06147
06148
06149
06150
06151
06152
06153
06154
06155
06156
06157
06158
06159
06160
06161
06162
06163
06164
06165
06166
06167
06168
06169
06170
06171
06172
06173
06174
06175
06176
06177
06178
06179
06180
06181
06182
06183
06184
06185
06186
06187 sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
06188
06189 while (SH_COMPILER_GEN(sh_idx) ||
06190 SH_STMT_TYPE(sh_idx) == End_Do_Stmt ||
06191 (stmt_label_idx != NULL_IDX &&
06192 (SH_LABELED(sh_idx) || SH_STMT_TYPE(sh_idx) == Label_Def))) {
06193
06194 if (SH_LOOP_END(sh_idx)) {
06195 perfectly_nested = TRUE;
06196 break;
06197 }
06198 else {
06199 sh_idx = SH_PREV_IDX(sh_idx);
06200 }
06201 }
06202
06203 if (! perfectly_nested) {
06204
06205 if (SH_LOOP_END(sh_idx)) {
06206 perfectly_nested = TRUE;
06207 }
06208 }
06209
06210
06211
06212
06213
06214
06215
06216
06217
06218
06219 if (! perfectly_nested) {
06220
06221 if (BLK_HAS_NESTED_LOOP(blk_stk_idx)) {
06222 sh_idx = SH_PREV_IDX(curr_stmt_sh_idx);
06223
06224 while (SH_COMPILER_GEN(sh_idx) ||
06225 SH_STMT_TYPE(sh_idx) == End_Do_Stmt ||
06226 SH_STMT_TYPE(sh_idx) == Label_Def) {
06227 sh_idx = SH_PREV_IDX(sh_idx);
06228 }
06229
06230 }
06231
06232 strcpy(str, "DO");
06233
06234 for (blk_idx = blk_stk_idx; blk_idx > 1; --blk_idx) {
06235
06236 if (BLK_TYPE(blk_idx) == Do_Blk) {
06237
06238 if (BLK_DIR_NEST_CHECK_SH_IDX(blk_idx) != NULL_IDX) {
06239
06240 switch (IR_OPR(SH_IR_IDX(BLK_DIR_NEST_CHECK_SH_IDX(blk_idx)))) {
06241
06242 case Pdo_Par_Opr:
06243 strcpy(str, "PDO");
06244 break;
06245
06246 case Parallel_Do_Par_Opr:
06247 strcpy(str, "PARALLEL DO");
06248 break;
06249
06250 case Doacross_Dollar_Opr:
06251 strcpy(str, "DOACROSS");
06252 break;
06253
06254 default:
06255 strcpy(str, "DO");
06256 break;
06257 }
06258
06259 break;
06260 }
06261 else if (BLK_INTERCHANGE_DIR_SH_IDX(blk_idx) != NULL_IDX) {
06262 strcpy(str,"INTERCHANGE");
06263 break;
06264 }
06265 }
06266 }
06267
06268 PRINTMSG(SH_GLB_LINE(sh_idx), 1380, Error, SH_COL_NUM(sh_idx),
06269 str);
06270
06271 for (blk_idx = blk_stk_idx; blk_idx > 1; --blk_idx) {
06272
06273 if (BLK_TYPE(blk_idx) == Do_Blk) {
06274 BLK_INTERCHANGE_NUM_LCVS(blk_idx) = 0;
06275 BLK_DIR_NEST_CHECK_NUM_LCVS(blk_idx) = 0;
06276 BLK_HAS_NESTED_LOOP(blk_idx) = FALSE;
06277
06278 if (BLK_DIR_NEST_CHECK_SH_IDX(blk_idx) != NULL_IDX) {
06279 SH_ERR_FLG(BLK_DIR_NEST_CHECK_SH_IDX(blk_idx)) = TRUE;
06280 BLK_DIR_NEST_CHECK_SH_IDX(blk_idx) = NULL_IDX;
06281 }
06282
06283 if (BLK_INTERCHANGE_DIR_SH_IDX(blk_idx) != NULL_IDX) {
06284 SH_ERR_FLG(BLK_INTERCHANGE_DIR_SH_IDX(blk_idx)) = TRUE;
06285 BLK_INTERCHANGE_DIR_SH_IDX(blk_idx) = NULL_IDX;
06286 break;
06287 }
06288 }
06289 }
06290 }
06291
06292 TRACE (Func_Exit, "loop_bottom_is_perfectly_nested", NULL);
06293
06294 return;
06295
06296 }
06297
06298 # endif
06299
06300 # if defined(_EXPRESSION_EVAL)
06301
06302
06303
06304
06305
06306
06307
06308
06309
06310
06311
06312
06313
06314
06315
06316
06317
06318 void expression_eval_end (void)
06319 {
06320
06321 TRACE (Func_Entry, "expression_eval_end", NULL);
06322
06323 end_of_contains = FALSE;
06324 stmt_type = End_Program_Stmt;
06325 SH_STMT_TYPE(curr_stmt_sh_idx) = End_Program_Stmt;
06326
06327 if (stmt_label_idx != NULL_IDX) {
06328 end_labeled_do();
06329 }
06330
06331
06332
06333 issue_deferred_msgs();
06334
06335 if (CURR_BLK != Program_Blk) {
06336 SCP_IN_ERR(curr_scp_idx) = TRUE;
06337 }
06338
06339 end_program_unit(FALSE);
06340
06341
06342
06343
06344 cif_end_unit_line = LA_CH_LINE;
06345 cif_end_unit_column = LA_CH_COLUMN - 1;
06346
06347 TRACE (Func_Exit, "expression_eval_end", NULL);
06348
06349 return;
06350
06351 }
06352
06353 # endif