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/s_driver.c 5.13 10/26/99 13:48:21\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 "s_globals.m"
00061 # include "debug.m"
00062
00063 # include "globals.h"
00064 # include "tokens.h"
00065 # include "sytb.h"
00066 # include "s_globals.h"
00067 # include "s_driver.h"
00068
00069
00070
00071
00072
00073
00074 static void attr_link_resolution(void);
00075 static void check_and_allocate_common_storage(int);
00076 static boolean compare_global_args(int, int, int, int, int);
00077 static boolean compare_global_array(int, int, int);
00078 static boolean compare_global_derived_type(int, int, int);
00079 static boolean compare_global_type_rank(int, int, int, int, boolean);
00080 #ifdef KEY
00081 static void decl_semantics_driver(boolean ieee_save);
00082 #else
00083 static void decl_semantics_driver(void);
00084 #endif
00085 static void free_stmt_tmp_tbl(void);
00086 static void final_attr_semantics(int);
00087 static void final_decl_semantics(void);
00088 static void final_equivalence_semantics(void);
00089 static void find_host_associated_attrs_in_il(int);
00090 static void find_host_associated_attrs_in_ir(int);
00091 static void init_call_structs(void);
00092 static void pgm_unit_semantics(void);
00093 static void reset_stmt_tmp_tbl(void);
00094 static void storage_blk_resolution(void);
00095
00096 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
00097 static void gen_user_code_start_opr(void);
00098 static void insert_global_sh(void);
00099 # endif
00100
00101 # ifdef _SEPARATE_FUNCTION_RETURNS
00102 static void check_multiple_entry_func(void);
00103 # endif
00104
00105
00106
00107
00108
00109
00110 static int symbolic_constant_array_list;
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 void semantics_pass_driver (void)
00135
00136 {
00137 int save_curr_scp_idx;
00138
00139
00140 TRACE (Func_Entry, "semantics_pass_driver", NULL);
00141
00142
00143
00144 init_call_structs();
00145
00146 reset_stmt_tmp_tbl();
00147
00148
00149
00150 init_directive(2);
00151
00152 save_curr_scp_idx = curr_scp_idx;
00153 pgm_unit_start_line = SH_GLB_LINE(SCP_FIRST_SH_IDX(curr_scp_idx));
00154
00155 #ifdef KEY
00156 decl_semantics_driver(FALSE);
00157 #else
00158 decl_semantics_driver();
00159 #endif
00160
00161 curr_scp_idx = save_curr_scp_idx;
00162
00163 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
00164 if (insert_global_directives &&
00165 global_stmt_sh_idx != NULL_IDX) {
00166
00167 insert_global_sh();
00168 }
00169 # endif
00170 pgm_unit_semantics();
00171
00172 curr_scp_idx = save_curr_scp_idx;
00173
00174 PRINT_EQV_TBL;
00175
00176 TBL_FREE(equiv_tbl);
00177
00178
00179
00180 if (arg_list != NULL) {
00181 MEM_FREE(arg_list);
00182 arg_list = NULL;
00183 arg_list_size = 0;
00184 }
00185
00186 if (arg_info_list != NULL) {
00187 MEM_FREE(arg_info_list);
00188 arg_info_list = NULL;
00189 arg_info_list_size = 0;
00190 }
00191
00192
00193
00194 if (dt_cmp_tbl != NULL) {
00195 MEM_FREE(dt_cmp_tbl);
00196 dt_cmp_tbl = NULL;
00197 }
00198
00199 TRACE (Func_Exit, "semantics_pass_driver", NULL);
00200
00201 return;
00202
00203 }
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 static void pgm_unit_semantics (void)
00236
00237 {
00238 #ifdef KEY
00239 boolean actual_arg = FALSE;
00240 boolean func_defined = FALSE;
00241 boolean func_ptr_defined = FALSE;
00242 #else
00243 boolean actual_arg;
00244 boolean func_defined;
00245 boolean func_ptr_defined;
00246 #endif
00247 int idx;
00248 boolean inline_it;
00249 boolean is_function;
00250 int pgm_attr_idx;
00251 int save_curr_scp_idx;
00252 int sh_idx;
00253
00254
00255 TRACE (Func_Entry, "pgm_unit_semantics", NULL);
00256
00257 PROCESS_SIBLING:
00258
00259 TRACE (PU_Start, NULL, "Semantics");
00260
00261 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = TRUE;
00262 idx = SCP_ENTRY_IDX(curr_scp_idx);
00263
00264 while (idx) {
00265 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = TRUE;
00266 idx = AL_NEXT_IDX(idx);
00267 }
00268
00269 if (! SCP_IN_ERR(curr_scp_idx) ) {
00270
00271
00272
00273 free_stmt_tmp_tbl();
00274
00275 curr_stmt_sh_idx = SCP_FIRST_SH_IDX(curr_scp_idx);
00276 comp_phase = Pass2_Semantics;
00277
00278 while (curr_stmt_sh_idx != NULL_IDX) {
00279
00280 if (SH_STMT_TYPE(curr_stmt_sh_idx) == Statement_Num_Stmt) {
00281
00282
00283
00284
00285
00286
00287
00288 stmt_end_line = SH_GLB_LINE(curr_stmt_sh_idx);
00289 stmt_end_col = SH_COL_NUM(curr_stmt_sh_idx);
00290 statement_number = SH_PARENT_BLK_IDX(curr_stmt_sh_idx);
00291 sh_idx = curr_stmt_sh_idx;
00292 SH_PREV_IDX(SH_NEXT_IDX(sh_idx)) = SH_PREV_IDX(sh_idx);
00293 SH_NEXT_IDX(SH_PREV_IDX(sh_idx)) = SH_NEXT_IDX(sh_idx);
00294 curr_stmt_sh_idx = SH_NEXT_IDX(sh_idx);
00295 FREE_SH_NODE(sh_idx);
00296 continue;
00297 }
00298
00299 TRACE_NEW_STMT ("Semantics");
00300
00301 sh_idx = curr_stmt_sh_idx;
00302
00303 if (!SH_ERR_FLG(curr_stmt_sh_idx) &&
00304 !SH_P2_SKIP_ME(curr_stmt_sh_idx)) {
00305 stmt_type = SH_STMT_TYPE(curr_stmt_sh_idx);
00306 stmt_start_line = SH_GLB_LINE(curr_stmt_sh_idx);
00307 stmt_start_col = SH_COL_NUM(curr_stmt_sh_idx);
00308
00309 (*stmt_semantics[SH_STMT_TYPE(curr_stmt_sh_idx)])();
00310 }
00311 else if (SH_STMT_TYPE(curr_stmt_sh_idx) == End_Where_Stmt) {
00312
00313
00314
00315
00316 stmt_type = SH_STMT_TYPE(curr_stmt_sh_idx);
00317 stmt_start_line = SH_GLB_LINE(curr_stmt_sh_idx);
00318 stmt_start_col = SH_COL_NUM(curr_stmt_sh_idx);
00319
00320 (*stmt_semantics[SH_STMT_TYPE(curr_stmt_sh_idx)])();
00321 }
00322
00323
00324
00325 arg_info_list_base = NULL_IDX;
00326 arg_info_list_top = NULL_IDX;
00327
00328 if (SH_DOALL_LOOP_END(sh_idx)) {
00329 doall_end_semantics();
00330 }
00331
00332 if (SH_LOOP_END(sh_idx)) {
00333 gen_loop_end_ir();
00334 }
00335
00336 curr_stmt_sh_idx = SH_NEXT_IDX(curr_stmt_sh_idx);
00337 }
00338
00339 final_decl_semantics();
00340
00341 PRINT_DBG_SYTB;
00342 PRINT_DBG_STMT;
00343 }
00344 else if (cif_flags & BASIC_RECS) {
00345
00346
00347
00348
00349
00350
00351 cif_send_sytb();
00352 }
00353
00354 if (SCP_FIRST_CHILD_IDX(curr_scp_idx) != NULL_IDX) {
00355 save_curr_scp_idx = curr_scp_idx;
00356 curr_scp_idx = SCP_FIRST_CHILD_IDX(curr_scp_idx);
00357 pgm_unit_semantics();
00358 curr_scp_idx = save_curr_scp_idx;
00359 }
00360
00361
00362
00363
00364
00365 pgm_attr_idx = SCP_ATTR_IDX(curr_scp_idx);
00366 ATP_SCP_ALIVE(pgm_attr_idx) = FALSE;
00367 is_function = FALSE;
00368
00369 if (ATP_PGM_UNIT(pgm_attr_idx) == Function &&
00370 ! AT_DCL_ERR(pgm_attr_idx) &&
00371 ! SCP_IN_ERR(curr_scp_idx)) {
00372
00373 is_function = TRUE;
00374 #ifdef KEY
00375
00376
00377
00378
00379
00380 int typ_idx_tmp = NULL_IDX;
00381 func_defined = AT_DEFINED(pgm_attr_idx) ||
00382 (Derived_Type == AT_OBJ_CLASS(
00383 typ_idx_tmp = TYP_IDX(ATD_TYPE_IDX(ATP_RSLT_IDX(pgm_attr_idx)))) &&
00384 ATT_DEFAULT_INITIALIZED(typ_idx_tmp));
00385 #else
00386 func_defined = AT_DEFINED(pgm_attr_idx);
00387 #endif
00388 actual_arg = AT_ACTUAL_ARG(pgm_attr_idx) ||
00389 AT_ACTUAL_ARG(ATP_RSLT_IDX(pgm_attr_idx));
00390 func_ptr_defined = ATD_PTR_ASSIGNED(ATP_RSLT_IDX(pgm_attr_idx));
00391 }
00392
00393 idx = SCP_ENTRY_IDX(curr_scp_idx);
00394
00395 inline_it = (opt_flags.inline_lvl > Inline_Lvl_0) ||
00396 ATP_MAY_INLINE(pgm_attr_idx);
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407 while (idx) {
00408
00409 if (is_function) {
00410 func_defined |= AT_DEFINED(AL_ATTR_IDX(idx));
00411 actual_arg |= AT_ACTUAL_ARG(AL_ATTR_IDX(idx)) ||
00412 AT_ACTUAL_ARG(ATP_RSLT_IDX(AL_ATTR_IDX(idx)));
00413 func_ptr_defined |=ATD_PTR_ASSIGNED(ATP_RSLT_IDX(AL_ATTR_IDX(idx)));
00414 }
00415
00416 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = FALSE;
00417 ATP_FIRST_SH_IDX(AL_ATTR_IDX(idx)) = (inline_it) ?
00418 SCP_FIRST_SH_IDX(curr_scp_idx) : NULL_IDX;
00419 idx = AL_NEXT_IDX(idx);
00420
00421 }
00422
00423 if (is_function && !actual_arg) {
00424
00425 if (!func_defined) {
00426 PRINTMSG(AT_DEF_LINE(ATP_RSLT_IDX(pgm_attr_idx)), 287, Warning,
00427 AT_DEF_COLUMN(ATP_RSLT_IDX(pgm_attr_idx)),
00428 AT_OBJ_NAME_PTR(ATP_RSLT_IDX(pgm_attr_idx)));
00429 }
00430 else if (ATD_POINTER(ATP_RSLT_IDX(pgm_attr_idx)) && !func_ptr_defined){
00431 PRINTMSG(AT_DEF_LINE(ATP_RSLT_IDX(pgm_attr_idx)), 918, Warning,
00432 AT_DEF_COLUMN(ATP_RSLT_IDX(pgm_attr_idx)),
00433 AT_OBJ_NAME_PTR(ATP_RSLT_IDX(pgm_attr_idx)));
00434 }
00435 }
00436
00437 if (ATP_PGM_UNIT(pgm_attr_idx) != Module) {
00438 ATP_FIRST_SH_IDX(pgm_attr_idx) = inline_it?SCP_FIRST_SH_IDX(curr_scp_idx):
00439 NULL_IDX;
00440 }
00441
00442 if (SCP_SIBLING_IDX(curr_scp_idx) != NULL_IDX) {
00443 curr_scp_idx = SCP_SIBLING_IDX(curr_scp_idx);
00444 goto PROCESS_SIBLING;
00445 }
00446
00447 TRACE (Func_Exit, "pgm_unit_semantics", NULL);
00448
00449 return;
00450
00451 }
00452
00453 #ifdef KEY
00454
00455
00456
00457
00458
00459
00460
00461 static boolean
00462 scp_or_parent_uses_ieee(int scp_idx) {
00463 for (int s = scp_idx; s; s = SCP_PARENT_IDX(s)) {
00464 if (SCP_USES_IEEE(s)) {
00465 int attr_idx = SCP_ATTR_IDX(scp_idx);
00466 pgm_unit_type put = ATP_PGM_UNIT(attr_idx);
00467
00468
00469
00470
00471
00472 if (Pgm_Unit == AT_OBJ_CLASS(attr_idx) &&
00473 (Function == put || Program == put || Subroutine == put)) {
00474 return TRUE;
00475 }
00476 }
00477 }
00478 return FALSE;
00479 }
00480 #endif
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501 #ifdef KEY
00502 static void decl_semantics_driver(boolean ieee_save)
00503 #else
00504 static void decl_semantics_driver(void)
00505 #endif
00506
00507 {
00508 int idx;
00509 int save_curr_scp_idx;
00510
00511 TRACE (Func_Entry, "decl_semantics_driver", NULL);
00512
00513 PROCESS_SIBLING:
00514
00515 comp_phase = Decl_Semantics;
00516 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = TRUE;
00517 idx = SCP_ENTRY_IDX(curr_scp_idx);
00518
00519 while (idx) {
00520 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = TRUE;
00521 idx = AL_NEXT_IDX(idx);
00522 }
00523
00524 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
00525 gen_user_code_start_opr();
00526 # endif
00527
00528 if (! SCP_IN_ERR(curr_scp_idx) ) {
00529 attr_link_resolution();
00530 curr_stmt_sh_idx = SCP_FIRST_SH_IDX(curr_scp_idx);
00531 stmt_start_line = SH_GLB_LINE(curr_stmt_sh_idx);
00532 stmt_start_col = SH_COL_NUM(curr_stmt_sh_idx);
00533 need_new_sh = TRUE;
00534
00535 decl_semantics();
00536 #ifdef KEY
00537 if (ieee_save || scp_or_parent_uses_ieee(curr_scp_idx)) {
00538 ieee_save = TRUE;
00539 gen_ieee_save_and_restore(curr_scp_idx, stmt_start_line,
00540 stmt_start_col);
00541 }
00542 #endif
00543
00544 if (cif_flags & BASIC_RECS) {
00545 cif_scope_info_rec();
00546 }
00547
00548 # ifdef _SEPARATE_FUNCTION_RETURNS
00549 if (ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) == Function &&
00550 SCP_ALT_ENTRY_CNT(curr_scp_idx) != 0 &&
00551 !ATD_IM_A_DOPE(ATP_RSLT_IDX(SCP_ATTR_IDX(curr_scp_idx))) &&
00552 ATD_ARRAY_IDX(ATP_RSLT_IDX(SCP_ATTR_IDX(curr_scp_idx))) == NULL_IDX &&
00553 TYP_TYPE(ATD_TYPE_IDX(ATP_RSLT_IDX(SCP_ATTR_IDX(curr_scp_idx))))
00554 != Structure &&
00555 TYP_TYPE(ATD_TYPE_IDX(ATP_RSLT_IDX(SCP_ATTR_IDX(curr_scp_idx))))
00556 != Character) {
00557
00558 check_multiple_entry_func();
00559 }
00560 # endif
00561
00562 }
00563
00564 if (SCP_FIRST_CHILD_IDX(curr_scp_idx) != NULL_IDX) {
00565 save_curr_scp_idx = curr_scp_idx;
00566 curr_scp_idx = SCP_FIRST_CHILD_IDX(curr_scp_idx);
00567 #ifdef KEY
00568 decl_semantics_driver(ieee_save);
00569 #else
00570 decl_semantics_driver();
00571 #endif
00572 curr_scp_idx = save_curr_scp_idx;
00573 }
00574
00575 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
00576
00577 idx = SCP_ENTRY_IDX(curr_scp_idx);
00578
00579 while (idx) {
00580
00581 ATP_SCP_ALIVE(AL_ATTR_IDX(idx)) = FALSE;
00582 idx = AL_NEXT_IDX(idx);
00583 }
00584
00585 if (SCP_SIBLING_IDX(curr_scp_idx) != NULL_IDX) {
00586 curr_scp_idx = SCP_SIBLING_IDX(curr_scp_idx);
00587 goto PROCESS_SIBLING;
00588 }
00589
00590
00591 TRACE (Func_Exit, "decl_semantics_driver", NULL);
00592
00593 return;
00594
00595 }
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615 void illegal_stmt_type (void)
00616
00617 {
00618
00619 TRACE (Func_Entry, "illegal_stmt_type", NULL);
00620
00621 PRINTMSG(SH_GLB_LINE(curr_stmt_sh_idx), 263, Internal, 0);
00622
00623 TRACE (Func_Exit, "illegal_stmt_type", NULL);
00624
00625 return;
00626
00627 }
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648 void no_semantics_routine (void)
00649
00650 {
00651
00652 TRACE (Func_Entry, "no_semantics_routine", NULL);
00653
00654 PRINTMSG(SH_GLB_LINE(curr_stmt_sh_idx), 278, Internal, 0,
00655 stmt_type_str[stmt_type]);
00656
00657 TRACE (Func_Exit, "no_semantics_routine", NULL);
00658
00659 return;
00660
00661 }
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681 static void attr_link_resolution(void)
00682 {
00683 int attr_idx;
00684 int host_idx;
00685 int host_name_idx;
00686 int local_attr_idx;
00687 int local_name_idx;
00688 int name_idx;
00689 int rslt_idx;
00690 int save_curr_scp_idx;
00691 boolean save_host_dcl_err;
00692 int sn_idx;
00693 int ultimate_idx;
00694 int ultimate_scp_idx;
00695
00696
00697 TRACE (Func_Entry, "attr_link_resolution", NULL);
00698
00699
00700
00701
00702
00703 for (name_idx = SCP_LN_FW_IDX(curr_scp_idx) + 1;
00704 name_idx < SCP_LN_LW_IDX(curr_scp_idx); name_idx++) {
00705
00706 # ifdef _DEBUG
00707 if (name_idx < 0 || name_idx > loc_name_tbl_idx) {
00708 PRINTMSG(stmt_start_line, 34, Internal, stmt_start_col);
00709 }
00710 # endif
00711
00712 attr_idx = LN_ATTR_IDX(name_idx);
00713
00714 # ifdef _DEBUG
00715 if (attr_idx <= 0 || attr_idx > attr_tbl_idx) {
00716 PRINTMSG(stmt_start_line, 34, Internal, stmt_start_col);
00717 }
00718
00719 if (LN_NAME_IDX(name_idx) != AT_NAME_IDX(attr_idx)) {
00720 PRINTMSG(AT_DEF_LINE(attr_idx), 516, Internal,
00721 AT_DEF_COLUMN(attr_idx),
00722 AT_OBJ_NAME_PTR(attr_idx),
00723 name_idx,
00724 attr_idx);
00725 }
00726 # endif
00727
00728 if (AT_REFERENCED(attr_idx) != Not_Referenced) {
00729 AT_REFERENCED(attr_idx) = Referenced;
00730 }
00731
00732 if (ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) == Module &&
00733 !AT_ACCESS_SET(attr_idx)) {
00734
00735
00736
00737 AT_PRIVATE(attr_idx) = AT_PRIVATE(SCP_ATTR_IDX(curr_scp_idx));
00738 }
00739 #ifdef KEY
00740 if (LN_DEF_LOC(name_idx) ||
00741 (AT_OBJ_CLASS(attr_idx) == Interface &&
00742 strncasecmp(AT_OBJ_NAME_PTR(attr_idx), "omp_",4)==0)) {
00743 #else
00744 if (LN_DEF_LOC(name_idx)) {
00745 #endif
00746 continue;
00747 }
00748
00749 host_idx = srch_host_sym_tbl(&name_pool[LN_NAME_IDX(name_idx)].name_char,
00750 LN_NAME_LEN(name_idx),
00751 &host_name_idx,
00752 FALSE);
00753
00754 if (host_idx == NULL_IDX) {
00755 AT_ATTR_LINK(attr_idx) = NULL_IDX;
00756 continue;
00757 }
00758 else if (IS_STMT_ENTITY(host_idx)) {
00759
00760
00761
00762 AT_ATTR_LINK(attr_idx) = NULL_IDX;
00763 continue;
00764 }
00765
00766 if (AT_OBJ_CLASS(attr_idx) == Derived_Type) {
00767
00768
00769
00770 if ((AT_OBJ_CLASS(host_idx) != Derived_Type &&
00771 !AT_DCL_ERR(attr_idx)) ||
00772 AT_NOT_VISIBLE(attr_idx)) {
00773 save_host_dcl_err = AT_DCL_ERR(host_idx);
00774 fnd_semantic_err(Obj_Use_Derived_Type,
00775 AT_DEF_LINE(attr_idx),
00776 AT_DEF_COLUMN(attr_idx),
00777 host_idx,
00778 TRUE);
00779 AT_DCL_ERR(attr_idx) = TRUE;
00780 AT_DCL_ERR(host_idx) = save_host_dcl_err;
00781 host_idx = NULL_IDX;
00782 }
00783 else if (AT_OBJ_CLASS(host_idx) == Derived_Type) {
00784 AT_HOST_ASSOCIATED(attr_idx) = TRUE;
00785 AT_HOST_ASSOCIATED(host_idx) = TRUE;
00786 ATT_SCP_IDX(attr_idx) = ATT_SCP_IDX(host_idx);
00787 }
00788 }
00789 else if (AT_OBJ_CLASS(attr_idx) == Pgm_Unit) {
00790 ultimate_idx = host_idx;
00791
00792 while (AT_ATTR_LINK(ultimate_idx)) {
00793 ultimate_idx = AT_ATTR_LINK(ultimate_idx);
00794 }
00795
00796
00797
00798 save_curr_scp_idx = curr_scp_idx;
00799 ultimate_scp_idx = curr_scp_idx;
00800
00801 while (1) {
00802 curr_scp_idx = SCP_PARENT_IDX(curr_scp_idx);
00803
00804 if (curr_scp_idx == 0) {
00805 ultimate_scp_idx = NULL_IDX;
00806 break;
00807 }
00808
00809 local_attr_idx = srch_sym_tbl(AT_OBJ_NAME_PTR(ultimate_idx),
00810 AT_NAME_LEN(ultimate_idx),
00811 &local_name_idx);
00812
00813 if (local_attr_idx == ultimate_idx) {
00814 ultimate_scp_idx = curr_scp_idx;
00815 break;
00816 }
00817 }
00818
00819 curr_scp_idx = save_curr_scp_idx;
00820 ATP_SCP_IDX(attr_idx) = ultimate_scp_idx;
00821
00822
00823
00824 if (AT_OBJ_CLASS(ultimate_idx) == Data_Obj &&
00825 ! AT_USE_ASSOCIATED(ultimate_idx)) {
00826
00827 if (!fnd_semantic_err((ATP_PGM_UNIT(attr_idx) == Subroutine ?
00828 Obj_Use_Extern_Subr :
00829 Obj_Use_Extern_Func),
00830 AT_DEF_LINE(ultimate_idx),
00831 AT_DEF_COLUMN(ultimate_idx),
00832 ultimate_idx,
00833 FALSE)) {
00834
00835 if (ATP_PGM_UNIT(attr_idx) == Function &&
00836 ATD_CLASS(ultimate_idx) != Dummy_Argument &&
00837 TYP_TYPE(ATD_TYPE_IDX(ultimate_idx)) == Character &&
00838 TYP_CHAR_CLASS(ATD_TYPE_IDX(ultimate_idx)) ==
00839 Assumed_Size_Char) {
00840
00841
00842
00843
00844
00845 }
00846 else {
00847 chg_data_obj_to_pgm_unit(ultimate_idx, (pgm_unit_type)
00848 ATP_PGM_UNIT(attr_idx),
00849 Extern_Proc);
00850 ATP_SCP_IDX(ultimate_idx) = ultimate_scp_idx;
00851
00852 if (ATP_PGM_UNIT(ultimate_idx) == Function) {
00853 rslt_idx = ATP_RSLT_IDX(ultimate_idx);
00854
00855 if (ATD_ARRAY_IDX(rslt_idx) != NULL_IDX ||
00856 ATD_IM_A_DOPE(rslt_idx) ||
00857 TYP_TYPE(ATD_TYPE_IDX(rslt_idx)) == Structure ||
00858 TYP_TYPE(ATD_TYPE_IDX(rslt_idx)) == Character) {
00859
00860 ATP_EXTRA_DARG(ultimate_idx) = TRUE;
00861
00862 if (ATP_EXPL_ITRFC(ultimate_idx)) {
00863 ATD_STOR_BLK_IDX(rslt_idx) =
00864 SCP_SB_DARG_IDX(ATP_SCP_IDX(ultimate_idx));
00865
00866
00867
00868 if (ATP_FIRST_IDX(ultimate_idx) == NULL_IDX) {
00869 NTR_SN_TBL(sn_idx);
00870 }
00871 else {
00872 sn_idx = ATP_FIRST_IDX(ultimate_idx) - 1;
00873 }
00874 ATP_FIRST_IDX(ultimate_idx) = sn_idx;
00875 ATP_NUM_DARGS(ultimate_idx) += 1;
00876 SN_NAME_LEN(sn_idx) = AT_NAME_LEN(rslt_idx);
00877 SN_NAME_IDX(sn_idx) = AT_NAME_IDX(rslt_idx);
00878 SN_ATTR_IDX(sn_idx) = rslt_idx;
00879 SN_LINE_NUM(sn_idx) = AT_DEF_LINE(rslt_idx);
00880 SN_COLUMN_NUM(sn_idx) = AT_DEF_COLUMN(rslt_idx);
00881 }
00882 }
00883 }
00884 }
00885 }
00886 }
00887 }
00888
00889 if (attr_idx == host_idx) {
00890 PRINTMSG(AT_DEF_LINE(attr_idx), 72, Internal, AT_DEF_COLUMN(attr_idx),
00891 AT_OBJ_NAME_PTR(attr_idx), attr_idx);
00892 }
00893
00894 AT_ATTR_LINK(attr_idx) = host_idx;
00895
00896 host_associated_attr_semantics(attr_idx, FALSE);
00897 }
00898
00899 TRACE (Func_Exit, "attr_link_resolution", NULL);
00900
00901 return;
00902
00903 }
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932 void host_associated_attr_semantics(int attr_idx,
00933 boolean add_to_attr_list)
00934
00935 {
00936 int bd_idx;
00937 boolean defined;
00938 int dim;
00939 int eq_idx;
00940 int first_eq;
00941 int group_idx;
00942 int il_idx;
00943 int local_attr_idx;
00944 int local_sb_idx;
00945 id_str_type name;
00946 int name_idx;
00947 char *name_ptr;
00948 int new_attr_idx;
00949 int new_host_assoc = FALSE;
00950 int new_scp;
00951 int new_sn_idx;
00952 int referenced;
00953 int sb_idx;
00954 int sn_idx;
00955 int type_idx;
00956
00957
00958 TRACE (Func_Entry, "host_associated_attr_semantics", NULL);
00959
00960
00961
00962
00963
00964
00965 referenced = AT_REFERENCED(attr_idx);
00966 defined = AT_DEFINED(attr_idx);
00967 local_attr_idx = attr_idx;
00968
00969 while (AT_ATTR_LINK(attr_idx) != NULL_IDX) {
00970 attr_idx = AT_ATTR_LINK(attr_idx);
00971 }
00972
00973 switch (AT_OBJ_CLASS(attr_idx)) {
00974 case Data_Obj:
00975
00976 if (ATD_CLASS(attr_idx) == Constant) {
00977
00978
00979
00980
00981
00982
00983 if (ATD_FLD(attr_idx) == AT_Tbl_Idx) {
00984 host_associated_attr_semantics(ATD_CONST_IDX(attr_idx), TRUE);
00985
00986 if (referenced) {
00987 AT_REFERENCED(ATD_CONST_IDX(attr_idx)) = Referenced;
00988 }
00989 }
00990 break;
00991 }
00992
00993 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
00994 if (ATD_IM_A_DOPE(attr_idx) &&
00995 ATD_CLASS(attr_idx) == Dummy_Argument &&
00996 ATD_ARRAY_IDX(attr_idx) &&
00997 BD_ARRAY_CLASS(ATD_ARRAY_IDX(attr_idx)) == Assumed_Shape &&
00998 ATD_SF_ARG_IDX(attr_idx) != NULL_IDX) {
00999
01000 host_associated_attr_semantics(ATD_SF_ARG_IDX(attr_idx), TRUE);
01001
01002 if (referenced) {
01003 AT_REFERENCED(ATD_SF_ARG_IDX(attr_idx)) = Referenced;
01004 }
01005 }
01006 # endif
01007
01008 sb_idx = ATD_STOR_BLK_IDX(attr_idx);
01009
01010 if (sb_idx == NULL_IDX || SB_SCP_IDX(sb_idx) == curr_scp_idx) {
01011 break;
01012 }
01013
01014
01015
01016
01017
01018
01019
01020 if (ATD_CLASS(attr_idx) == Function_Result &&
01021 !ATP_SCP_ALIVE(ATD_FUNC_IDX(attr_idx))) {
01022 break;
01023 }
01024
01025 switch (SB_BLK_TYPE(sb_idx)) {
01026 case Common:
01027 case Task_Common:
01028 case Threadprivate:
01029
01030
01031
01032
01033
01034 local_sb_idx = srch_stor_blk_tbl(SB_NAME_PTR(sb_idx),
01035 SB_NAME_LEN(sb_idx),
01036 curr_scp_idx);
01037 if (local_sb_idx != NULL_IDX &&
01038 SB_HOST_ASSOCIATED(local_sb_idx) &&
01039 SB_ORIG_SCP_IDX(sb_idx) == SB_ORIG_SCP_IDX(local_sb_idx) &&
01040 SB_ORIG_SCP_IDX(sb_idx) != NULL_IDX) {
01041
01042
01043
01044 }
01045 else {
01046 TBL_REALLOC_CK(stor_blk_tbl, 1);
01047 stor_blk_tbl[stor_blk_tbl_idx] = stor_blk_tbl[sb_idx];
01048 SB_ORIG_SCP_IDX(stor_blk_tbl_idx) = SB_SCP_IDX(sb_idx);
01049 SB_SCP_IDX(stor_blk_tbl_idx) = curr_scp_idx;
01050 SB_HOST_ASSOCIATED(stor_blk_tbl_idx) = TRUE;
01051 SB_COMMON_NEEDS_OFFSET(stor_blk_tbl_idx) = FALSE;
01052
01053 if (local_sb_idx != NULL_IDX) {
01054 SB_HIDDEN(stor_blk_tbl_idx) = TRUE;
01055 SB_MERGED_BLK_IDX(stor_blk_tbl_idx) = local_sb_idx;
01056
01057 if (!SB_USE_ASSOCIATED(local_sb_idx) ||
01058 !SB_USE_ASSOCIATED(sb_idx) ||
01059 SB_HAS_RENAMES(local_sb_idx) ||
01060 SB_HAS_RENAMES(sb_idx) ||
01061 (compare_names(AT_OBJ_NAME_LONG(SB_MODULE_IDX(local_sb_idx)),
01062 AT_NAME_LEN(SB_MODULE_IDX(local_sb_idx)),
01063 AT_OBJ_NAME_LONG(SB_MODULE_IDX(sb_idx)),
01064 AT_NAME_LEN(SB_MODULE_IDX(sb_idx))) != 0)) {
01065 SB_DEF_MULT_SCPS(stor_blk_tbl_idx) = TRUE;
01066 SB_DEF_MULT_SCPS(sb_idx) = TRUE;
01067 }
01068 }
01069 else if (SB_MODULE(stor_blk_tbl_idx)) {
01070
01071 if (SB_USE_ASSOCIATED(stor_blk_tbl_idx)) {
01072 ADD_ATTR_TO_LOCAL_LIST(SB_MODULE_IDX(stor_blk_tbl_idx));
01073 }
01074 }
01075 local_sb_idx = stor_blk_tbl_idx;
01076 }
01077 break;
01078
01079 case Static:
01080 case Static_Local:
01081 case Static_Named:
01082 if (SB_BLK_TYPE(sb_idx) == Static) {
01083
01084 if (referenced) {
01085 AT_REFERENCED(attr_idx) = Referenced;
01086 AT_REF_IN_CHILD(attr_idx) = TRUE;
01087 }
01088 }
01089
01090
01091
01092
01093 if (!SB_USE_ASSOCIATED(sb_idx) &&
01094 (SB_BLK_TYPE(sb_idx) == Static_Local ||
01095 SB_BLK_TYPE(sb_idx) == Static_Named)) {
01096 new_scp = SB_SCP_IDX(sb_idx);
01097
01098 if (SB_BLK_TYPE(sb_idx) == Static_Named) {
01099
01100 if (SCP_SB_HOSTED_DATA_IDX(new_scp) == NULL_IDX) {
01101 sb_idx = ntr_stor_blk_tbl(
01102 SB_NAME_PTR(SCP_SB_STATIC_INIT_IDX(curr_scp_idx)),
01103 SB_NAME_LEN(SCP_SB_STATIC_INIT_IDX(curr_scp_idx)),
01104 AT_DEF_LINE(attr_idx),
01105 AT_DEF_COLUMN(attr_idx),
01106 Static);
01107
01108 name_ptr = SB_NAME_PTR(sb_idx);
01109 name_ptr[1] = 'H';
01110 name_ptr[2] = 'O';
01111 name_ptr[3] = 'S';
01112 name_ptr[4] = 'T';
01113
01114 SB_SCP_IDX(sb_idx) = SB_SCP_IDX(ATD_STOR_BLK_IDX(attr_idx));
01115 SB_ORIG_SCP_IDX(sb_idx) =
01116 SB_ORIG_SCP_IDX(ATD_STOR_BLK_IDX(attr_idx));
01117 SB_HOSTED_STATIC(sb_idx) = TRUE;
01118 SCP_SB_HOSTED_DATA_IDX(new_scp) = sb_idx;
01119 local_sb_idx = NULL_IDX;
01120 }
01121 else {
01122 sb_idx = SCP_SB_HOSTED_DATA_IDX(new_scp);
01123 local_sb_idx = srch_stor_blk_tbl(SB_NAME_PTR(sb_idx),
01124 SB_NAME_LEN(sb_idx),
01125 curr_scp_idx);
01126 }
01127 }
01128 else if (SCP_SB_HOSTED_STATIC_IDX(new_scp) == NULL_IDX) {
01129 sb_idx = ntr_stor_blk_tbl(
01130 SB_NAME_PTR(SCP_SB_STATIC_IDX(curr_scp_idx)),
01131 SB_NAME_LEN(SCP_SB_STATIC_IDX(curr_scp_idx)),
01132 AT_DEF_LINE(attr_idx),
01133 AT_DEF_COLUMN(attr_idx),
01134 Static);
01135
01136 name_ptr = SB_NAME_PTR(sb_idx);
01137 name_ptr[1] = 'H';
01138 name_ptr[2] = 'O';
01139 name_ptr[3] = 'S';
01140 name_ptr[4] = 'T';
01141
01142 SB_SCP_IDX(sb_idx) = SB_SCP_IDX(ATD_STOR_BLK_IDX(attr_idx));
01143 SB_ORIG_SCP_IDX(sb_idx) =
01144 SB_ORIG_SCP_IDX(ATD_STOR_BLK_IDX(attr_idx));
01145 SB_HOSTED_STATIC(sb_idx) = TRUE;
01146 SCP_SB_HOSTED_STATIC_IDX(new_scp)= sb_idx;
01147 local_sb_idx = NULL_IDX;
01148 }
01149 else {
01150 sb_idx = SCP_SB_HOSTED_STATIC_IDX(new_scp);
01151 local_sb_idx = srch_stor_blk_tbl(SB_NAME_PTR(sb_idx),
01152 SB_NAME_LEN(sb_idx),
01153 curr_scp_idx);
01154 }
01155
01156 ATD_STOR_BLK_IDX(attr_idx) = sb_idx;
01157
01158
01159
01160
01161
01162 if (ATD_EQUIV(attr_idx)) {
01163 group_idx = SCP_FIRST_EQUIV_GRP(new_scp);
01164
01165 while (group_idx != NULL_IDX) {
01166 eq_idx = group_idx;
01167 first_eq = eq_idx;
01168 group_idx = EQ_NEXT_EQUIV_GRP(group_idx);
01169
01170 while (eq_idx != NULL_IDX) {
01171
01172 if (EQ_ATTR_IDX(eq_idx) == attr_idx) {
01173 eq_idx = first_eq;
01174 group_idx = NULL_IDX;
01175
01176 while (eq_idx != NULL_IDX) {
01177 host_associated_attr_semantics(EQ_ATTR_IDX(eq_idx),
01178 FALSE);
01179 eq_idx = EQ_NEXT_EQUIV_OBJ(eq_idx);
01180 }
01181 }
01182 else {
01183 eq_idx = EQ_NEXT_EQUIV_OBJ(eq_idx);
01184 }
01185 }
01186 }
01187 }
01188 }
01189 else {
01190 local_sb_idx = srch_stor_blk_tbl(SB_NAME_PTR(sb_idx),
01191 SB_NAME_LEN(sb_idx),
01192 curr_scp_idx);
01193 }
01194
01195 if (local_sb_idx != NULL_IDX &&
01196 SB_HOST_ASSOCIATED(local_sb_idx) &&
01197 SB_ORIG_SCP_IDX(sb_idx) == SB_ORIG_SCP_IDX(local_sb_idx) &&
01198 SB_ORIG_SCP_IDX(sb_idx) != NULL_IDX) {
01199
01200
01201
01202 }
01203 else {
01204 TBL_REALLOC_CK(stor_blk_tbl, 1);
01205 stor_blk_tbl[stor_blk_tbl_idx] = stor_blk_tbl[sb_idx];
01206 SB_ORIG_SCP_IDX(stor_blk_tbl_idx) = SB_SCP_IDX(sb_idx);
01207 SB_SCP_IDX(stor_blk_tbl_idx) = curr_scp_idx;
01208 SB_HOST_ASSOCIATED(stor_blk_tbl_idx) = TRUE;
01209 SB_COMMON_NEEDS_OFFSET(stor_blk_tbl_idx) = FALSE;
01210
01211 if (local_sb_idx != NULL_IDX) {
01212 SB_HIDDEN(stor_blk_tbl_idx) = TRUE;
01213 SB_MERGED_BLK_IDX(stor_blk_tbl_idx) = local_sb_idx;
01214
01215 if (!SB_USE_ASSOCIATED(local_sb_idx) ||
01216 !SB_USE_ASSOCIATED(sb_idx) ||
01217 SB_HAS_RENAMES(local_sb_idx) ||
01218 SB_HAS_RENAMES(sb_idx) ||
01219 (compare_names(AT_OBJ_NAME_LONG(SB_MODULE_IDX(local_sb_idx)),
01220 AT_NAME_LEN(SB_MODULE_IDX(local_sb_idx)),
01221 AT_OBJ_NAME_LONG(SB_MODULE_IDX(sb_idx)),
01222 AT_NAME_LEN(SB_MODULE_IDX(sb_idx))) != 0)) {
01223 SB_DEF_MULT_SCPS(stor_blk_tbl_idx) = TRUE;
01224 SB_DEF_MULT_SCPS(sb_idx) = TRUE;
01225 }
01226 }
01227 else if (SB_MODULE(stor_blk_tbl_idx)) {
01228
01229 if (SB_USE_ASSOCIATED(stor_blk_tbl_idx)) {
01230 ADD_ATTR_TO_LOCAL_LIST(SB_MODULE_IDX(stor_blk_tbl_idx));
01231 }
01232 }
01233 local_sb_idx = stor_blk_tbl_idx;
01234 }
01235 break;
01236
01237 case Stack:
01238
01239 if (!AT_HOST_ASSOCIATED(local_attr_idx)) {
01240 AT_HOST_ASSOCIATED(attr_idx) = TRUE;
01241 AT_HOST_ASSOCIATED(local_attr_idx) = TRUE;
01242 new_host_assoc = TRUE;
01243 new_scp = SB_SCP_IDX(sb_idx);
01244
01245 if (SCP_SB_HOSTED_STACK_IDX(new_scp) == NULL_IDX) {
01246 CREATE_ID(name, sb_name[Stack_Host_Blk], sb_len[Stack_Host_Blk]);
01247 sb_idx = ntr_stor_blk_tbl(name.string,
01248 sb_len[Stack_Host_Blk],
01249 AT_DEF_LINE(attr_idx),
01250 AT_DEF_COLUMN(attr_idx),
01251 Stack);
01252 SB_SCP_IDX(sb_idx) = new_scp;
01253 SB_HOSTED_STACK(sb_idx) = TRUE;
01254 SCP_SB_HOSTED_STACK_IDX(new_scp) = sb_idx;
01255 }
01256 ATD_STOR_BLK_IDX(attr_idx) = SCP_SB_HOSTED_STACK_IDX(new_scp);
01257 }
01258
01259
01260
01261
01262 if (defined && ATD_CLASS(attr_idx) != Compiler_Tmp) {
01263 AT_DEFINED(attr_idx) = TRUE;
01264 AT_DEF_IN_CHILD(attr_idx) = TRUE;
01265 }
01266
01267 if (referenced) {
01268 AT_REFERENCED(attr_idx) = Referenced;
01269 AT_REF_IN_CHILD(attr_idx) = TRUE;
01270 }
01271
01272 break;
01273
01274 case Equivalenced:
01275
01276 if (!AT_HOST_ASSOCIATED(local_attr_idx)) {
01277 new_host_assoc = TRUE;
01278 AT_HOST_ASSOCIATED(attr_idx) = TRUE;
01279 AT_HOST_ASSOCIATED(local_attr_idx) = TRUE;
01280 }
01281
01282 AT_DEFINED(attr_idx) = AT_DEFINED(attr_idx) | defined;
01283 AT_DEF_IN_CHILD(attr_idx) = AT_DEF_IN_CHILD(attr_idx) | defined;
01284 SB_HOSTED_STACK(sb_idx) = TRUE;
01285
01286 if (referenced) {
01287 AT_REFERENCED(attr_idx) = Referenced;
01288 AT_REF_IN_CHILD(attr_idx) = TRUE;
01289 }
01290
01291 break;
01292
01293 case Formal:
01294
01295 if (!AT_HOST_ASSOCIATED(local_attr_idx)) {
01296 new_host_assoc = TRUE;
01297 AT_HOST_ASSOCIATED(attr_idx) = TRUE;
01298 AT_HOST_ASSOCIATED(local_attr_idx) = TRUE;
01299 }
01300
01301 AT_DEFINED(attr_idx) = AT_DEFINED(attr_idx) | defined;
01302 AT_DEF_IN_CHILD(attr_idx) = AT_DEF_IN_CHILD(attr_idx) | defined;
01303
01304 if (referenced) {
01305 AT_REFERENCED(attr_idx) = Referenced;
01306 AT_REF_IN_CHILD(attr_idx) = TRUE;
01307 }
01308 break;
01309
01310 case Based:
01311
01312 if (ATD_AUTOMATIC(attr_idx)) {
01313 host_associated_attr_semantics(ATD_AUTO_BASE_IDX(attr_idx), TRUE);
01314 }
01315 else {
01316 host_associated_attr_semantics(ATD_PTR_IDX(attr_idx), TRUE);
01317 }
01318
01319 if (!AT_HOST_ASSOCIATED(local_attr_idx)) {
01320 new_host_assoc = TRUE;
01321 AT_HOST_ASSOCIATED(attr_idx) = TRUE;
01322 AT_HOST_ASSOCIATED(local_attr_idx) = TRUE;
01323 }
01324
01325 AT_DEFINED(attr_idx) = AT_DEFINED(attr_idx) | defined;
01326 AT_DEF_IN_CHILD(attr_idx) = AT_DEF_IN_CHILD(attr_idx) | defined;
01327
01328 if (referenced) {
01329 AT_REFERENCED(attr_idx) = Referenced;
01330 AT_REF_IN_CHILD(attr_idx) = TRUE;
01331 }
01332
01333
01334
01335
01336 ATD_STOR_BLK_IDX(local_attr_idx) = SCP_SB_BASED_IDX(curr_scp_idx);
01337 break;
01338
01339 default:
01340
01341 if (!AT_HOST_ASSOCIATED(local_attr_idx)) {
01342 new_host_assoc = TRUE;
01343 AT_HOST_ASSOCIATED(attr_idx) = TRUE;
01344 AT_HOST_ASSOCIATED(local_attr_idx) = TRUE;
01345 }
01346 AT_DEFINED(attr_idx) = AT_DEFINED(attr_idx) | defined;
01347 AT_DEF_IN_CHILD(attr_idx) = AT_DEF_IN_CHILD(attr_idx) | defined;
01348
01349 if (referenced) {
01350 AT_REFERENCED(attr_idx) = Referenced;
01351 AT_REF_IN_CHILD(attr_idx) = TRUE;
01352 }
01353 break;
01354 }
01355
01356 if (new_host_assoc) {
01357
01358 if (ATD_CLASS(attr_idx) == Variable &&
01359 ATD_FLD(attr_idx) != NO_Tbl_Idx) {
01360
01361
01362
01363
01364 if (ATD_FLD(attr_idx) == AT_Tbl_Idx) {
01365 host_associated_attr_semantics(ATD_VARIABLE_TMP_IDX(attr_idx),
01366 TRUE);
01367 }
01368 else if (ATD_FLD(attr_idx) == IL_Tbl_Idx) {
01369
01370
01371
01372 il_idx = ATD_VARIABLE_TMP_IDX(attr_idx);
01373
01374 while (il_idx != NULL_IDX) {
01375 host_associated_attr_semantics(IL_IDX(il_idx), TRUE);
01376 il_idx = IL_NEXT_LIST_IDX(il_idx);
01377 }
01378 }
01379 }
01380
01381 type_idx = ATD_TYPE_IDX(attr_idx);
01382
01383 if (TYP_TYPE(type_idx) == Character &&
01384 TYP_FLD(type_idx) == AT_Tbl_Idx) {
01385 host_associated_attr_semantics(TYP_IDX(type_idx), TRUE);
01386 }
01387
01388 bd_idx = ATD_ARRAY_IDX(attr_idx);
01389
01390 if (bd_idx != NULL_IDX &&
01391 BD_ARRAY_CLASS(bd_idx) != Deferred_Shape &&
01392 BD_ARRAY_SIZE(bd_idx) != Constant_Size) {
01393
01394 for (dim = 1; dim <= BD_RANK(bd_idx); dim++) {
01395
01396 if (BD_LB_FLD(bd_idx, dim) == AT_Tbl_Idx) {
01397 host_associated_attr_semantics(BD_LB_IDX(bd_idx, dim), TRUE);
01398 }
01399
01400 if (BD_UB_FLD(bd_idx, dim) == AT_Tbl_Idx) {
01401 host_associated_attr_semantics(BD_UB_IDX(bd_idx, dim), TRUE);
01402 }
01403
01404 if (BD_XT_FLD(bd_idx, dim) == AT_Tbl_Idx) {
01405 host_associated_attr_semantics(BD_XT_IDX(bd_idx, dim), TRUE);
01406 }
01407
01408 if (BD_SM_FLD(bd_idx, dim) == AT_Tbl_Idx) {
01409 host_associated_attr_semantics(BD_SM_IDX(bd_idx, dim), TRUE);
01410 }
01411 }
01412
01413 if (BD_LEN_FLD(bd_idx) == AT_Tbl_Idx) {
01414 host_associated_attr_semantics(BD_LEN_IDX(bd_idx), TRUE);
01415 }
01416 }
01417 }
01418 break;
01419
01420 case Pgm_Unit:
01421
01422
01423
01424
01425
01426 AT_DEFINED(attr_idx) = AT_DEFINED(attr_idx) | defined;
01427 AT_DEF_IN_CHILD(attr_idx) = AT_DEF_IN_CHILD(attr_idx) | defined;
01428
01429 if (referenced) {
01430 AT_REFERENCED(attr_idx) = Referenced;
01431 AT_REF_IN_CHILD(attr_idx) = TRUE;
01432 }
01433
01434 if (ATP_PGM_UNIT(attr_idx) == Function &&
01435 ATP_SCP_ALIVE(attr_idx) && !ATP_RSLT_NAME(attr_idx)) {
01436 host_associated_attr_semantics(ATP_RSLT_IDX(attr_idx), FALSE);
01437 }
01438 break;
01439
01440 case Namelist_Grp:
01441
01442 COPY_ATTR_NTRY(local_attr_idx, attr_idx);
01443
01444
01445
01446
01447
01448
01449 AT_ATTR_LINK(local_attr_idx) = NULL_IDX;
01450 AT_REFERENCED(local_attr_idx) = referenced;
01451 AT_DEFINED(local_attr_idx) = defined;
01452 AT_HOST_ASSOCIATED(local_attr_idx) = TRUE;
01453
01454 if (ATN_NAMELIST_DESC(attr_idx) != NULL_IDX) {
01455 host_associated_attr_semantics(ATN_NAMELIST_DESC(attr_idx), TRUE);
01456 }
01457
01458 sn_idx = ATN_FIRST_NAMELIST_IDX(attr_idx);
01459 new_sn_idx = NULL_IDX;
01460
01461 while (sn_idx != NULL_IDX) {
01462
01463 if (new_sn_idx == NULL_IDX) {
01464 NTR_SN_TBL(new_sn_idx);
01465 ATN_FIRST_NAMELIST_IDX(local_attr_idx) = new_sn_idx;
01466 }
01467 else {
01468 NTR_SN_TBL(name_idx);
01469 SN_SIBLING_LINK(new_sn_idx) = name_idx;
01470 new_sn_idx = name_idx;
01471 }
01472
01473 sec_name_tbl[new_sn_idx] = sec_name_tbl[sn_idx];
01474
01475 local_attr_idx = srch_sym_tbl(AT_OBJ_NAME_PTR(SN_ATTR_IDX(sn_idx)),
01476 AT_NAME_LEN(SN_ATTR_IDX(sn_idx)),
01477 &name_idx);
01478
01479 if (local_attr_idx != NULL_IDX &&
01480 AT_ATTR_LINK(local_attr_idx) != NULL_IDX) {
01481
01482 new_attr_idx = AT_ATTR_LINK(local_attr_idx);
01483
01484 while (AT_ATTR_LINK(new_attr_idx) != NULL_IDX) {
01485 new_attr_idx = AT_ATTR_LINK(new_attr_idx);
01486 }
01487
01488 if (new_attr_idx != SN_ATTR_IDX(sn_idx)) {
01489
01490
01491
01492
01493
01494 NTR_ATTR_TBL(local_attr_idx);
01495 AT_ATTR_LINK(local_attr_idx) = SN_ATTR_IDX(sn_idx);
01496 host_associated_attr_semantics(SN_ATTR_IDX(sn_idx), FALSE);
01497 }
01498 }
01499 else {
01500
01501
01502
01503
01504 NTR_ATTR_TBL(local_attr_idx);
01505 AT_ATTR_LINK(local_attr_idx) = SN_ATTR_IDX(sn_idx);
01506 host_associated_attr_semantics(SN_ATTR_IDX(sn_idx), FALSE);
01507 }
01508
01509 SN_ATTR_IDX(new_sn_idx) = local_attr_idx;
01510 sn_idx = SN_SIBLING_LINK(sn_idx);
01511 }
01512
01513 break;
01514
01515 case Interface:
01516
01517
01518
01519
01520
01521
01522 break;
01523
01524 case Stmt_Func:
01525
01526
01527
01528
01529 switch (ATS_SF_FLD(attr_idx)) {
01530 case AT_Tbl_Idx:
01531 host_associated_attr_semantics(ATS_SF_IDX(attr_idx), TRUE);
01532 break;
01533
01534 case IR_Tbl_Idx:
01535 find_host_associated_attrs_in_ir(ATS_SF_IDX(attr_idx));
01536 break;
01537
01538 case IL_Tbl_Idx:
01539 find_host_associated_attrs_in_il(ATS_SF_IDX(attr_idx));
01540 break;
01541 }
01542 break;
01543 }
01544
01545 if (add_to_attr_list) {
01546 ADD_ATTR_TO_LOCAL_LIST(local_attr_idx);
01547 }
01548
01549 TRACE (Func_Exit, "host_associated_attr_semantics", NULL);
01550
01551 return;
01552
01553 }
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570 static void find_host_associated_attrs_in_ir(int ir_idx)
01571
01572 {
01573
01574 TRACE (Func_Entry, "find_host_associated_attrs_in_ir", NULL);
01575
01576 switch (IR_FLD_L(ir_idx)) {
01577 case AT_Tbl_Idx:
01578 host_associated_attr_semantics(IR_IDX_L(ir_idx), TRUE);
01579 break;
01580
01581 case IR_Tbl_Idx:
01582 find_host_associated_attrs_in_ir(IR_IDX_L(ir_idx));
01583 break;
01584
01585 case IL_Tbl_Idx:
01586 find_host_associated_attrs_in_il(IR_IDX_L(ir_idx));
01587 break;
01588
01589 case CN_Tbl_Idx:
01590 case NO_Tbl_Idx:
01591 case SH_Tbl_Idx:
01592 break;
01593 }
01594
01595 switch (IR_FLD_R(ir_idx)) {
01596 case AT_Tbl_Idx:
01597 host_associated_attr_semantics(IR_IDX_R(ir_idx), TRUE);
01598 break;
01599
01600 case IR_Tbl_Idx:
01601 find_host_associated_attrs_in_ir(IR_IDX_R(ir_idx));
01602 break;
01603
01604 case IL_Tbl_Idx:
01605 find_host_associated_attrs_in_il(IR_IDX_R(ir_idx));
01606 break;
01607
01608 case CN_Tbl_Idx:
01609 case NO_Tbl_Idx:
01610 case SH_Tbl_Idx:
01611 break;
01612 }
01613
01614 TRACE (Func_Exit, "find_host_associated_attrs_in_ir", NULL);
01615
01616 return;
01617
01618 }
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635 static void find_host_associated_attrs_in_il(int list_idx)
01636
01637 {
01638 TRACE (Func_Entry, "find_host_associated_attrs_in_il", NULL);
01639
01640 while (list_idx != NULL_IDX) {
01641
01642 switch (IL_FLD(list_idx)) {
01643 case AT_Tbl_Idx:
01644 host_associated_attr_semantics(IL_IDX(list_idx), TRUE);
01645 break;
01646
01647 case IR_Tbl_Idx:
01648 find_host_associated_attrs_in_ir(IL_IDX(list_idx));
01649 break;
01650
01651 case IL_Tbl_Idx:
01652 find_host_associated_attrs_in_il(IL_IDX(list_idx));
01653 break;
01654
01655 case NO_Tbl_Idx:
01656 case SH_Tbl_Idx:
01657 case CN_Tbl_Idx:
01658 break;
01659 }
01660 list_idx = IL_NEXT_LIST_IDX(list_idx);
01661 }
01662
01663 TRACE (Func_Exit, "find_host_associated_attrs_in_il", NULL);
01664
01665 return;
01666
01667 }
01668
01669
01670
01671
01672
01673
01674
01675
01676
01677
01678
01679
01680
01681
01682
01683
01684
01685
01686 static void init_call_structs(void)
01687
01688 {
01689 int i;
01690
01691 TRACE (Func_Entry, "init_call_structs", NULL);
01692
01693 init_exp_desc.type_idx = TYPELESS_DEFAULT_TYPE;
01694 init_exp_desc.rank = 0;
01695 init_exp_desc.cif_id = 0;
01696 init_exp_desc.type = Typeless;
01697 init_exp_desc.linear_type = Err_Res;
01698 init_exp_desc.kind0seen = FALSE;
01699 init_exp_desc.kind0D0seen = FALSE;
01700 init_exp_desc.percent_val_arg = FALSE;
01701 init_exp_desc.constant = FALSE;
01702 init_exp_desc.foldable = FALSE;
01703 init_exp_desc.will_fold_later = FALSE;
01704 init_exp_desc.pointer = FALSE;
01705 init_exp_desc.target = FALSE;
01706 init_exp_desc.vector_subscript = FALSE;
01707 init_exp_desc.reference = FALSE;
01708 init_exp_desc.constructor = FALSE;
01709 init_exp_desc.component = FALSE;
01710 init_exp_desc.section = FALSE;
01711 init_exp_desc.label = FALSE;
01712 init_exp_desc.array_elt = FALSE;
01713 init_exp_desc.assumed_shape = FALSE;
01714 init_exp_desc.assumed_size = FALSE;
01715 init_exp_desc.allocatable = FALSE;
01716 init_exp_desc.dope_vector = FALSE;
01717 init_exp_desc.tmp_reference = FALSE;
01718 init_exp_desc.has_constructor = FALSE;
01719 init_exp_desc.optional_darg = FALSE;
01720 init_exp_desc.pe_dim_ref = FALSE;
01721 init_exp_desc.contig_array = FALSE;
01722 init_exp_desc.shape_known = FALSE;
01723 init_exp_desc.tree_has_ranf = FALSE;
01724 init_exp_desc.has_symbolic = FALSE;
01725 init_exp_desc.dist_reshape_ref = FALSE;
01726 init_exp_desc.constructor_size_level = Unknown_Expr_Size;
01727
01728 init_exp_desc.char_len = null_opnd;
01729
01730 for (i = 0; i < 7; i++) {
01731 init_exp_desc.shape[i] = null_opnd;
01732 }
01733
01734 init_arg_info.ed = init_exp_desc;
01735
01736 init_arg_info.kwd = NULL_IDX;
01737 init_arg_info.line = 0;
01738 init_arg_info.col = 0;
01739 init_arg_info.association = 0;
01740 init_arg_info.arg_opnd = null_opnd;
01741 init_arg_info.pgm_unit = FALSE;
01742 init_arg_info.maybe_modified = TRUE;
01743
01744 TRACE (Func_Exit, "init_call_structs", NULL);
01745
01746 return;
01747
01748 }
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765
01766 void label_def_stmt_semantics(void)
01767
01768 {
01769 int label_idx;
01770
01771 TRACE (Func_Entry, "label_def_stmt_semantics", NULL);
01772
01773 label_idx = IR_IDX_L(SH_IR_IDX(curr_stmt_sh_idx));
01774
01775 if (ATL_CLASS(label_idx) == Lbl_User &&
01776 AT_REFERENCED(label_idx) == Referenced && cdir_switches.align) {
01777
01778 ATL_ALIGN(label_idx) = TRUE;
01779 cdir_switches.align = FALSE;
01780 }
01781
01782 if (! cdir_switches.vector) {
01783 ATL_NOVECTOR(label_idx) = TRUE;
01784 }
01785
01786 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
01787 if (cdir_switches.notask_region) {
01788 ATL_NOTASK(label_idx) = TRUE;
01789 }
01790 # else
01791 if (! cdir_switches.task) {
01792 ATL_NOTASK(label_idx) = TRUE;
01793 }
01794 # endif
01795
01796 if (! cdir_switches.vsearch) {
01797 ATL_NOVSEARCH(label_idx) = TRUE;
01798 }
01799
01800 if (cdir_switches.bl) {
01801 ATL_BL(label_idx) = TRUE;
01802 }
01803
01804 if (! cdir_switches.recurrence) {
01805 ATL_NORECURRENCE(label_idx) = TRUE;
01806 }
01807
01808 if (cdir_switches.pattern) {
01809 ATL_PATTERN(label_idx) = TRUE;
01810 }
01811
01812 TRACE (Func_Exit, "label_def_stmt_semantics", NULL);
01813
01814 return;
01815
01816 }
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833
01834
01835
01836
01837
01838
01839
01840 static void final_decl_semantics(void)
01841
01842 {
01843 int al_idx;
01844 int attr_idx;
01845 int name_idx;
01846 int symbolic_constant = NULL_IDX;
01847
01848
01849 # if defined(_ASSIGN_OFFSETS_TO_HOSTED_STACK)
01850 size_offset_type length;
01851 int list_idx;
01852 size_offset_type result;
01853 int sb_idx;
01854 # endif
01855
01856
01857 TRACE (Func_Entry, "final_decl_semantics", NULL);
01858
01859
01860
01861
01862
01863
01864
01865
01866 symbolic_constant_array_list = NULL_IDX;
01867
01868
01869
01870
01871
01872 if (SCP_ASSIGN_LBL_CHAIN(curr_scp_idx) != NULL_IDX) {
01873 ATL_ASG_LBL_CHAIN_START(SCP_ASSIGN_LBL_CHAIN(curr_scp_idx)) = TRUE;
01874 }
01875
01876
01877
01878 if (num_prog_unit_errors == 0) {
01879 final_equivalence_semantics();
01880 }
01881
01882 storage_blk_resolution();
01883
01884 for (name_idx = SCP_LN_FW_IDX(curr_scp_idx) + 1;
01885 name_idx < SCP_LN_LW_IDX(curr_scp_idx); name_idx++) {
01886
01887 attr_idx = LN_ATTR_IDX(name_idx);
01888
01889 if (!AT_DCL_ERR(attr_idx)) {
01890
01891 if (AT_OBJ_CLASS(attr_idx) == Data_Obj &&
01892 ATD_SYMBOLIC_CONSTANT(attr_idx) &&
01893 (ATD_CLASS(attr_idx) == Constant ||
01894 ATD_CLASS(attr_idx) == Variable)) {
01895 symbolic_constant = attr_idx;
01896 }
01897 else {
01898 final_attr_semantics(attr_idx);
01899 }
01900 }
01901 }
01902
01903
01904 if (symbolic_constant != NULL_IDX &&
01905 (ATD_CLASS(symbolic_constant) == Constant ||
01906 AT_REFERENCED(symbolic_constant) == Not_Referenced)) {
01907
01908
01909
01910
01911 srch_sym_tbl(AT_OBJ_NAME_PTR(symbolic_constant),
01912 AT_NAME_LEN(symbolic_constant),
01913 &name_idx);
01914
01915 remove_ln_ntry(name_idx);
01916 }
01917
01918 al_idx = SCP_ATTR_LIST(curr_scp_idx);
01919
01920 while (al_idx != NULL_IDX) {
01921
01922 if (!AT_DCL_ERR(AL_ATTR_IDX(al_idx))) {
01923 final_attr_semantics(AL_ATTR_IDX(al_idx));
01924 }
01925
01926 al_idx = AL_NEXT_IDX(al_idx);
01927 }
01928
01929 al_idx = symbolic_constant_array_list;
01930
01931 while (al_idx != NULL_IDX) {
01932 assign_offset(AL_ATTR_IDX(al_idx));
01933 al_idx = AL_NEXT_IDX(al_idx);
01934 }
01935
01936 # if defined(_ASSIGN_OFFSETS_TO_HOSTED_STACK)
01937
01938 if (SCP_SB_HOSTED_STACK_IDX(curr_scp_idx) != NULL_IDX) {
01939
01940
01941
01942
01943
01944
01945
01946
01947 sb_idx = SCP_SB_HOSTED_STACK_IDX(curr_scp_idx);
01948
01949
01950
01951 if (SB_LEN_FLD(sb_idx) == AT_Tbl_Idx ||
01952 fold_relationals(SB_LEN_IDX(sb_idx), CN_INTEGER_ZERO_IDX, Ne_Opr)) {
01953
01954 result.idx = SB_LEN_IDX(sb_idx);
01955 result.fld = SB_LEN_FLD(sb_idx);
01956
01957 align_bit_length(&result, TARGET_BITS_PER_WORD);
01958
01959 if (result.fld == NO_Tbl_Idx) {
01960 result.fld = CN_Tbl_Idx;
01961 result.idx = ntr_const_tbl(result.type_idx,
01962 FALSE,
01963 result.constant);
01964 }
01965
01966 SB_LEN_FLD(sb_idx) = result.fld;
01967 SB_LEN_IDX(sb_idx) = result.idx;
01968 attr_idx = gen_compiler_tmp(SB_DEF_LINE(sb_idx),
01969 SB_DEF_COLUMN(sb_idx),
01970 Priv, TRUE);
01971
01972 ATD_TYPE_IDX(attr_idx) = TYPELESS_DEFAULT_TYPE;
01973 ATD_STOR_BLK_IDX(attr_idx) = sb_idx;
01974 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
01975 AT_REFERENCED(attr_idx) = Referenced;
01976 AT_REF_IN_CHILD(attr_idx) = TRUE;
01977 NTR_ATTR_LIST_TBL(list_idx);
01978 AL_ATTR_IDX(list_idx) = attr_idx;
01979 SB_LAST_ATTR_LIST(sb_idx) = list_idx;
01980
01981
01982
01983
01984 length.fld = CN_Tbl_Idx;
01985 length.idx = CN_INTEGER_BITS_PER_WORD_IDX;
01986
01987 if (!size_offset_binary_calc(&result, &length, Minus_Opr, &result)) {
01988 AT_DCL_ERR(attr_idx) = TRUE;
01989 }
01990
01991 if (result.fld == NO_Tbl_Idx) {
01992 ATD_OFFSET_FLD(attr_idx) = CN_Tbl_Idx;
01993 ATD_OFFSET_IDX(attr_idx) = ntr_const_tbl(result.type_idx,
01994 FALSE,
01995 result.constant);
01996 }
01997 else {
01998 ATD_OFFSET_FLD(attr_idx) = result.fld;
01999 ATD_OFFSET_IDX(attr_idx) = result.idx;
02000 }
02001 }
02002 }
02003 # endif
02004
02005
02006
02007
02008
02009 if (cif_flags & BASIC_RECS) {
02010 cif_send_sytb();
02011 }
02012
02013 TRACE (Func_Exit, "final_decl_semantics", NULL);
02014
02015 return;
02016
02017 }
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034 static void final_attr_semantics(int attr_idx)
02035
02036 {
02037 int al_idx;
02038 int darg_idx;
02039 int i;
02040 int il_idx;
02041 int local_attr_idx;
02042 int rslt_idx;
02043 int sb_idx;
02044 int sn_idx;
02045
02046 int type_idx;
02047
02048 # if defined(_ASSIGN_OFFSETS_TO_HOSTED_STACK)
02049 static int tmp_scp_idx = NULL_IDX;
02050 # endif
02051
02052 # if defined(_TMP_GIVES_COMMON_LENGTH)
02053 size_offset_type length;
02054 size_offset_type result;
02055 size_offset_type size;
02056 size_offset_type zero;
02057 # endif
02058
02059 TRACE (Func_Entry, "final_attr_semantics", NULL);
02060
02061 if (AT_ATTR_LINK(attr_idx) == NULL_IDX || AT_IGNORE_ATTR_LINK(attr_idx)) {
02062
02063 switch (AT_OBJ_CLASS(attr_idx)) {
02064 case Data_Obj:
02065
02066 if (ATD_EQUIV_LIST(attr_idx) != NULL_IDX) {
02067 free_attr_list(ATD_EQUIV_LIST(attr_idx));
02068 ATD_EQUIV_LIST(attr_idx) = NULL_IDX;
02069 }
02070
02071 if (ATD_NO_ENTRY_LIST(attr_idx) != NULL_IDX) {
02072 free_attr_list(ATD_NO_ENTRY_LIST(attr_idx));
02073 ATD_NO_ENTRY_LIST(attr_idx) = NULL_IDX;
02074 }
02075
02076 switch (ATD_CLASS(attr_idx)) {
02077 case Constant:
02078
02079 # ifdef _DEBUG
02080 if (ATD_FLD(attr_idx) == NO_Tbl_Idx) {
02081 PRINTMSG(AT_DEF_LINE(attr_idx), 893, Internal,
02082 AT_DEF_COLUMN(attr_idx),
02083 "ATD_CONST_IDX",
02084 "ATD_FLD",
02085 "attr_tbl",
02086 attr_idx);
02087 }
02088 # endif
02089
02090
02091
02092
02093
02094
02095 if (ATD_FLD(attr_idx) == AT_Tbl_Idx &&
02096 AT_REFERENCED(attr_idx) != Not_Referenced) {
02097 AT_REFERENCED(ATD_CONST_IDX(attr_idx)) = Referenced;
02098 }
02099
02100 attr_idx = NULL_IDX;
02101 break;
02102
02103 case Struct_Component:
02104 attr_idx = NULL_IDX;
02105 break;
02106
02107 case Function_Result:
02108 attr_idx = NULL_IDX;
02109 break;
02110
02111 case Compiler_Tmp:
02112 # ifdef _DEBUG
02113 if (ATD_FLD(attr_idx) == NO_Tbl_Idx &&
02114 ATD_TMP_IDX(attr_idx) != NULL_IDX) {
02115 PRINTMSG(AT_DEF_LINE(attr_idx), 893, Internal,
02116 AT_DEF_COLUMN(attr_idx),
02117 "ATD_TMP_IDX",
02118 "ATD_FLD",
02119 "attr_tbl",
02120 attr_idx);
02121 }
02122
02123 # endif
02124 if (ATD_TMP_INIT_NOT_DONE(attr_idx) &&
02125 ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) == Module) {
02126
02127
02128
02129
02130
02131 insert_init_stmt_for_tmp(attr_idx);
02132 }
02133
02134 sb_idx = ATD_STOR_BLK_IDX(attr_idx);
02135
02136 # if defined(_TMP_GIVES_COMMON_LENGTH)
02137
02138 if (AT_REFERENCED(attr_idx) == Not_Referenced &&
02139 !ATD_OFFSET_ASSIGNED(attr_idx) &&
02140 sb_idx != NULL_IDX &&
02141 (SB_USE_ASSOCIATED(sb_idx) || SB_HOST_ASSOCIATED(sb_idx)) ) {
02142
02143
02144
02145
02146 if (SB_LEN_FLD(sb_idx) == CN_Tbl_Idx &&
02147 fold_relationals(SB_LEN_IDX(sb_idx),
02148 CN_INTEGER_ZERO_IDX, Ne_Opr)) {
02149 size.fld = CN_Tbl_Idx;
02150 size.idx = CN_INTEGER_BITS_PER_WORD_IDX;
02151 length.fld = SB_LEN_FLD(sb_idx);
02152 length.idx = SB_LEN_IDX(sb_idx);
02153
02154 size_offset_binary_calc(&length, &size, Mod_Opr, &size);
02155
02156
02157
02158 zero.fld = CN_Tbl_Idx;
02159 zero.idx = CN_INTEGER_ZERO_IDX;
02160
02161 size_offset_logical_calc(&size, &zero, Eq_Opr, &result);
02162
02163 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
02164 size.idx = CN_INTEGER_BITS_PER_WORD_IDX;
02165 size.fld = CN_Tbl_Idx;
02166 }
02167
02168 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
02169 TYP_TYPE(TYP_WORK_IDX) = Typeless;
02170 TYP_BIT_LEN(TYP_WORK_IDX) = (size.fld == CN_Tbl_Idx) ?
02171 CN_INT_TO_C(size.idx) : F_INT_TO_C(size.constant,
02172 TYP_LINEAR(size.type_idx));
02173 ATD_TYPE_IDX(attr_idx) = ntr_type_tbl();
02174
02175 if (!size_offset_binary_calc(&length,
02176 &size,
02177 Minus_Opr,
02178 &result)) {
02179 AT_DCL_ERR(attr_idx) = TRUE;
02180 }
02181
02182 if (result.fld == NO_Tbl_Idx) {
02183 ATD_OFFSET_FLD(attr_idx) = CN_Tbl_Idx;
02184 ATD_OFFSET_IDX(attr_idx) = ntr_const_tbl(result.type_idx,
02185 FALSE,
02186 result.constant);
02187 }
02188 else {
02189 ATD_OFFSET_FLD(attr_idx) = result.fld;
02190 ATD_OFFSET_IDX(attr_idx) = result.idx;
02191 }
02192
02193 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
02194 AT_REFERENCED(attr_idx) = Referenced;
02195 }
02196
02197 # ifdef _DEBUG
02198 if (ATD_OFFSET_ASSIGNED(attr_idx) &&
02199 ATD_OFFSET_FLD(attr_idx) == CN_Tbl_Idx &&
02200 fold_relationals(ATD_OFFSET_IDX(attr_idx),
02201 CN_INTEGER_ZERO_IDX,
02202 Lt_Opr)) {
02203 PRINTMSG(AT_DEF_LINE(attr_idx), 1004, Internal,
02204 AT_DEF_COLUMN(attr_idx),
02205 AT_OBJ_NAME_PTR(attr_idx),
02206 attr_idx);
02207 }
02208 # endif
02209
02210
02211
02212 if (ATD_DEFINING_ATTR_IDX(attr_idx) == NULL_IDX &&
02213 ATD_FLD(attr_idx) == IR_Tbl_Idx &&
02214 IR_FLD_R(ATD_TMP_IDX(attr_idx)) == AT_Tbl_Idx &&
02215 AT_OBJ_CLASS(IR_IDX_R(ATD_TMP_IDX(attr_idx))) == Data_Obj &&
02216 ATD_CLASS(IR_IDX_R(ATD_TMP_IDX(attr_idx))) == Compiler_Tmp) {
02217 ATD_DEFINING_ATTR_IDX(attr_idx) =
02218 ATD_DEFINING_ATTR_IDX(IR_IDX_R(ATD_TMP_IDX(attr_idx)));
02219 }
02220
02221 attr_idx = NULL_IDX;
02222 }
02223 # endif
02224 break;
02225
02226 case Variable:
02227
02228 if (ATD_SYMBOLIC_CONSTANT(attr_idx) &&
02229 AT_REFERENCED(attr_idx) == Referenced) {
02230 PRINTMSG(AT_DEF_LINE(attr_idx), 1229, Ansi,
02231 AT_DEF_COLUMN(attr_idx),
02232 AT_OBJ_NAME_PTR(attr_idx));
02233 }
02234
02235 if (ATD_FLD(attr_idx) != NO_Tbl_Idx) {
02236
02237
02238
02239 if (ATD_FLD(attr_idx) == AT_Tbl_Idx) {
02240 final_attr_semantics(ATD_VARIABLE_TMP_IDX(attr_idx));
02241 }
02242 else if (ATD_FLD(attr_idx) == IL_Tbl_Idx) {
02243
02244
02245
02246 il_idx = ATD_VARIABLE_TMP_IDX(attr_idx);
02247
02248 while (il_idx != NULL_IDX) {
02249 final_attr_semantics(IL_IDX(il_idx));
02250 il_idx = IL_NEXT_LIST_IDX(il_idx);
02251 }
02252 }
02253 }
02254
02255
02256
02257 default:
02258 sb_idx = ATD_STOR_BLK_IDX(attr_idx);
02259
02260 if (sb_idx != NULL_IDX) {
02261 type_idx = ATD_TYPE_IDX(attr_idx);
02262
02263 if (SB_VOLATILE(sb_idx)) {
02264 ATD_VOLATILE(attr_idx) = TRUE;
02265 }
02266
02267 if (ATD_EQUIV_IN_BNDS_EXPR(attr_idx) &&
02268 !AT_HOST_ASSOCIATED(attr_idx) &&
02269 !AT_USE_ASSOCIATED(attr_idx) &&
02270 !SB_IS_COMMON(sb_idx) &&
02271 !ATD_SYMBOLIC_CONSTANT(attr_idx)) {
02272
02273
02274
02275
02276 if (SCP_FIRST_EQUIV_GRP(curr_scp_idx) == NULL_IDX ||
02277 num_prog_unit_errors == 0) {
02278 PRINTMSG(AT_DEF_LINE(attr_idx), 521, Error,
02279 AT_DEF_COLUMN(attr_idx),
02280 AT_OBJ_NAME_PTR(attr_idx));
02281 }
02282 }
02283
02284 if (SB_AUXILIARY(sb_idx)) {
02285
02286 if (AT_NAMELIST_OBJ(attr_idx) && SB_IS_COMMON(sb_idx)) {
02287 PRINTMSG(AT_DEF_LINE(attr_idx), 663, Error,
02288 AT_DEF_COLUMN(attr_idx),
02289 AT_OBJ_NAME_PTR(attr_idx),
02290 SB_NAME_PTR(sb_idx));
02291 }
02292
02293 if (!ATD_AUXILIARY(attr_idx) &&
02294 SB_BLK_TYPE(sb_idx) != Formal) {
02295
02296
02297
02298 if (TYP_TYPE(type_idx) == Character) {
02299 PRINTMSG(AT_DEF_LINE(attr_idx), 535, Error,
02300 AT_DEF_COLUMN(attr_idx),
02301 AT_OBJ_NAME_PTR(attr_idx));
02302 AT_DCL_ERR(attr_idx) = TRUE;
02303 }
02304 else if (TYP_TYPE(type_idx) == Structure &&
02305 (ATT_POINTER_CPNT(TYP_IDX(type_idx)) ||
02306 #ifdef KEY
02307 ATT_ALLOCATABLE_CPNT(TYP_IDX(type_idx)) ||
02308 #endif
02309 ATT_CHAR_CPNT(TYP_IDX(type_idx)))) {
02310 PRINTMSG(AT_DEF_LINE(attr_idx), 536, Error,
02311 AT_DEF_COLUMN(attr_idx),
02312 AT_OBJ_NAME_PTR(attr_idx),
02313 AT_OBJ_NAME_PTR(TYP_IDX(type_idx)));
02314 AT_DCL_ERR(attr_idx) = TRUE;
02315 }
02316 else if (ATD_TARGET(attr_idx) ||
02317 ATD_DATA_INIT(attr_idx) ||
02318 ATD_POINTER(attr_idx) ||
02319 TYP_TYPE(type_idx) == CRI_Ptr) {
02320 fnd_semantic_err(Obj_Auxiliary,
02321 AT_DEF_LINE(attr_idx),
02322 AT_DEF_COLUMN(attr_idx),
02323 attr_idx,
02324 TRUE);
02325 }
02326 else {
02327 ATD_AUXILIARY(attr_idx) = TRUE;
02328 }
02329 }
02330 }
02331 }
02332 break;
02333 }
02334
02335 break;
02336
02337 case Pgm_Unit:
02338
02339 if (attr_idx != SCP_ATTR_IDX(curr_scp_idx) &&
02340 ATP_IN_INTERFACE_BLK(attr_idx) &&
02341 !AT_HOST_ASSOCIATED(attr_idx) &&
02342 !AT_USE_ASSOCIATED(attr_idx)) {
02343
02344 attr_idx = NULL_IDX;
02345 break;
02346 }
02347
02348 switch (ATP_PGM_UNIT(attr_idx)) {
02349 case Function:
02350 case Pgm_Unknown:
02351 case Subroutine:
02352
02353 if (ATP_GLOBAL_ATTR_IDX(attr_idx) == NULL_IDX &&
02354 ATP_EXPL_ITRFC(attr_idx) &&
02355 !AT_COMPILER_GEND(attr_idx) &&
02356 !ATP_NAME_IN_STONE(attr_idx) &&
02357 (ATP_PROC(attr_idx) == Unknown_Proc ||
02358 ATP_PROC(attr_idx) == Extern_Proc ||
02359 ATP_PROC(attr_idx) == Imported_Proc) &&
02360 !AT_IS_INTRIN(attr_idx) &&
02361 (attr_idx != glb_tbl_idx[Main_Attr_Idx])) {
02362
02363
02364
02365
02366
02367
02368 check_global_pgm_unit(attr_idx);
02369 }
02370
02371 if (ATP_NO_ENTRY_LIST(attr_idx) != NULL_IDX) {
02372 free_attr_list(ATP_NO_ENTRY_LIST(attr_idx));
02373 ATP_NO_ENTRY_LIST(attr_idx) = NULL_IDX;
02374 }
02375
02376 if (ATP_PROC(attr_idx) == Module_Proc) {
02377
02378 if (ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) == Module &&
02379 !AT_PRIVATE(attr_idx) && !AT_DCL_ERR(attr_idx)) {
02380
02381
02382
02383
02384 if (ATP_PGM_UNIT(attr_idx) == Function) {
02385 type_idx = ATD_TYPE_IDX(ATP_RSLT_IDX(attr_idx));
02386
02387 if (TYP_TYPE(type_idx) == Structure &&
02388 AT_PRIVATE(TYP_IDX(type_idx)) &&
02389 !AT_USE_ASSOCIATED(TYP_IDX(type_idx)) ) {
02390
02391
02392
02393
02394
02395 PRINTMSG(AT_DEF_LINE(attr_idx), 684, Error,
02396 AT_DEF_COLUMN(attr_idx),
02397 AT_OBJ_NAME_PTR(attr_idx));
02398 AT_DCL_ERR(attr_idx) = TRUE;
02399 }
02400 }
02401
02402 for (i = (ATP_EXTRA_DARG(attr_idx) ? 1 : 0);
02403 i < ATP_NUM_DARGS(attr_idx); i++) {
02404
02405 darg_idx = SN_ATTR_IDX(ATP_FIRST_IDX(attr_idx) + i);
02406
02407 if (AT_DCL_ERR(darg_idx)) {
02408 continue;
02409 }
02410
02411
02412
02413
02414
02415 if (AT_OBJ_CLASS(darg_idx) == Interface) {
02416 darg_idx = ATI_PROC_IDX(darg_idx);
02417 }
02418
02419 if (darg_idx != NULL_IDX &&
02420 AT_OBJ_CLASS(darg_idx) == Pgm_Unit) {
02421
02422 if (ATP_PGM_UNIT(darg_idx) == Function) {
02423 darg_idx = ATP_RSLT_IDX(darg_idx);
02424 }
02425 else {
02426 darg_idx = NULL_IDX;
02427 }
02428 }
02429
02430 if (darg_idx != NULL_IDX &&
02431 TYP_TYPE(ATD_TYPE_IDX(darg_idx)) == Structure &&
02432 AT_PRIVATE(TYP_IDX(ATD_TYPE_IDX(darg_idx))) &&
02433 !AT_USE_ASSOCIATED(TYP_IDX(ATD_TYPE_IDX(darg_idx))) ) {
02434 PRINTMSG(AT_DEF_LINE(darg_idx), 685, Error,
02435 AT_DEF_COLUMN(darg_idx),
02436 AT_OBJ_NAME_PTR(attr_idx),
02437 AT_OBJ_NAME_PTR(darg_idx));
02438 AT_DCL_ERR(attr_idx) = TRUE;
02439 }
02440 }
02441 }
02442 }
02443
02444 if (!AT_USE_ASSOCIATED(attr_idx)) {
02445
02446 if (ATP_PROC(attr_idx) == Unknown_Proc) {
02447 ATP_PROC(attr_idx) = Extern_Proc;
02448 }
02449
02450 if (ATP_EXT_NAME_IDX(attr_idx) == NULL_IDX) {
02451 # ifdef _DEBUG
02452 PRINTMSG(AT_DEF_LINE(attr_idx), 193, Internal,
02453 AT_DEF_COLUMN(attr_idx),
02454 0, "ATP_EXT_NAME_IDX", attr_idx);
02455 # endif
02456 MAKE_EXTERNAL_NAME(attr_idx,
02457 AT_NAME_IDX(attr_idx),
02458 AT_NAME_LEN(attr_idx));
02459 }
02460
02461 ATP_ALL_INTENT_IN(attr_idx) = TRUE;
02462
02463 sn_idx = (ATP_EXTRA_DARG(attr_idx) && ATP_EXPL_ITRFC(attr_idx)) ?
02464 ATP_FIRST_IDX(attr_idx)+1: ATP_FIRST_IDX(attr_idx);
02465
02466 for (;sn_idx < (ATP_FIRST_IDX(attr_idx)+ATP_NUM_DARGS(attr_idx));
02467 sn_idx++) {
02468
02469 if (AT_OBJ_CLASS(SN_ATTR_IDX(sn_idx)) != Data_Obj ||
02470 ATD_CLASS(SN_ATTR_IDX(sn_idx)) != Dummy_Argument ||
02471 ATD_INTENT(SN_ATTR_IDX(sn_idx)) != Intent_In) {
02472 ATP_ALL_INTENT_IN(attr_idx) = FALSE;
02473 break;
02474 }
02475 }
02476 }
02477
02478 if (ATP_HAS_ALT_RETURN(attr_idx)) {
02479
02480 if (ATP_RSLT_IDX(attr_idx) == NULL_IDX) {
02481
02482
02483
02484
02485 NTR_ATTR_TBL(rslt_idx);
02486 COPY_ATTR_NTRY(rslt_idx, attr_idx);
02487 CLEAR_VARIANT_ATTR_INFO(rslt_idx, Data_Obj);
02488 ATD_CLASS(rslt_idx) = Function_Result;
02489 ATD_TYPE_IDX(rslt_idx) = CG_INTEGER_DEFAULT_TYPE;
02490 ATD_STOR_BLK_IDX(rslt_idx) = SCP_SB_STACK_IDX(curr_scp_idx);
02491 ATP_RSLT_IDX(attr_idx) = rslt_idx;
02492 }
02493 attr_idx = NULL_IDX;
02494 }
02495 else {
02496 attr_idx = ATP_RSLT_IDX(attr_idx);
02497 }
02498 break;
02499
02500 case Blockdata:
02501 case Program:
02502
02503 if (ATP_NO_ENTRY_LIST(attr_idx) != NULL_IDX) {
02504 free_attr_list(ATP_NO_ENTRY_LIST(attr_idx));
02505 ATP_NO_ENTRY_LIST(attr_idx) = NULL_IDX;
02506 }
02507
02508
02509
02510 case Module:
02511
02512 if (ATP_GLOBAL_ATTR_IDX(attr_idx) == NULL_IDX &&
02513 !AT_COMPILER_GEND(attr_idx) &&
02514 (attr_idx != glb_tbl_idx[Main_Attr_Idx]) &&
02515 (ATP_PGM_UNIT(attr_idx) != Module ||
02516 ATP_MODULE_STR_IDX(attr_idx) == NULL_IDX)) {
02517
02518
02519
02520
02521
02522
02523 check_global_pgm_unit(attr_idx);
02524 }
02525
02526 if (ATP_EXT_NAME_IDX(attr_idx) == NULL_IDX) {
02527 MAKE_EXTERNAL_NAME(attr_idx,
02528 AT_NAME_IDX(attr_idx),
02529 AT_NAME_LEN(attr_idx));
02530 }
02531 attr_idx = NULL_IDX;
02532 break;
02533
02534 }
02535 break;
02536
02537 case Interface:
02538
02539 attr_idx = ATI_PROC_IDX(attr_idx);
02540
02541 if (attr_idx != NULL_IDX) {
02542
02543
02544
02545
02546
02547 if (ATP_PROC(attr_idx) == Module_Proc &&
02548 ATP_PGM_UNIT(SCP_ATTR_IDX(curr_scp_idx)) == Module &&
02549 !AT_USE_ASSOCIATED(attr_idx)) {
02550 attr_idx = NULL_IDX;
02551 }
02552 else {
02553 attr_idx = ATP_RSLT_IDX(attr_idx);
02554 }
02555 }
02556 break;
02557
02558 case Stmt_Func:
02559
02560 if (!ATS_SF_SEMANTICS_DONE(attr_idx)) {
02561 stmt_func_semantics(attr_idx);
02562 }
02563 attr_idx = NULL_IDX;
02564 break;
02565
02566 default:
02567 attr_idx = NULL_IDX;
02568 break;
02569 }
02570
02571 if (attr_idx == NULL_IDX) {
02572 goto EXIT;
02573 }
02574
02575 if (!ATD_OFFSET_ASSIGNED(attr_idx)) {
02576
02577 # ifdef _DEBUG
02578 if (ATD_CLASS(attr_idx) == Compiler_Tmp &&
02579 ATD_STOR_BLK_IDX(attr_idx) == NULL_IDX &&
02580 !ATD_SYMBOLIC_CONSTANT(attr_idx)) {
02581 PRINTMSG(AT_DEF_LINE(attr_idx), 836, Internal,
02582 AT_DEF_COLUMN(attr_idx),
02583 AT_OBJ_NAME_PTR(attr_idx));
02584 }
02585 # endif
02586
02587 if (ATD_STOR_BLK_IDX(attr_idx) == NULL_IDX) {
02588 assign_storage_blk(attr_idx);
02589 }
02590
02591 switch (SB_BLK_TYPE(ATD_STOR_BLK_IDX(attr_idx))) {
02592
02593 case Static:
02594 case Static_Local:
02595 case Static_Named:
02596
02597 if (ATD_ARRAY_IDX(attr_idx) != NULL_IDX &&
02598 BD_ARRAY_SIZE(ATD_ARRAY_IDX(attr_idx))==Symbolic_Constant_Size){
02599 NTR_ATTR_LIST_TBL(al_idx);
02600 AL_ATTR_IDX(al_idx) = attr_idx;
02601 AL_NEXT_IDX(al_idx) = symbolic_constant_array_list;
02602 symbolic_constant_array_list = al_idx;
02603 }
02604 else {
02605 assign_offset(attr_idx);
02606 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
02607 }
02608 break;
02609
02610 case Stack:
02611
02612 if (SB_HOSTED_STACK(ATD_STOR_BLK_IDX(attr_idx))) {
02613
02614 if (ATD_ARRAY_IDX(attr_idx) != NULL_IDX &&
02615 BD_ARRAY_SIZE(ATD_ARRAY_IDX(attr_idx)) ==
02616 Symbolic_Constant_Size) {
02617 NTR_ATTR_LIST_TBL(al_idx);
02618 AL_ATTR_IDX(al_idx) = attr_idx;
02619 AL_NEXT_IDX(al_idx) = symbolic_constant_array_list;
02620 symbolic_constant_array_list = al_idx;
02621 }
02622 else {
02623
02624 # if defined(_ASSIGN_OFFSETS_TO_HOSTED_STACK)
02625 assign_offset(attr_idx);
02626 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
02627 # else
02628
02629
02630 stor_bit_size_of(attr_idx, TRUE, FALSE);
02631 # endif
02632 }
02633 }
02634 else if (!AT_DCL_ERR(attr_idx)) {
02635
02636
02637
02638 stor_bit_size_of(attr_idx, TRUE, FALSE);
02639 }
02640 break;
02641
02642 case Equivalenced:
02643 break;
02644
02645 case Task_Common:
02646 case Threadprivate:
02647
02648 if (ATD_CLASS(attr_idx) == Compiler_Tmp &&
02649 ATD_DATA_INIT(attr_idx) &&
02650 ATD_FLD(attr_idx) == AT_Tbl_Idx) {
02651 ATD_OFFSET_FLD(attr_idx) = ATD_OFFSET_FLD(ATD_TMP_IDX(attr_idx));
02652 ATD_OFFSET_IDX(attr_idx) = ATD_OFFSET_IDX(ATD_TMP_IDX(attr_idx));
02653 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
02654 }
02655 else {
02656 if (! ATD_OFFSET_ASSIGNED(attr_idx)) {
02657 assign_offset(attr_idx);
02658 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
02659 }
02660 }
02661
02662 break;
02663
02664 case Based:
02665 case Formal:
02666 case Common:
02667
02668 if (ATD_CLASS(attr_idx) == Compiler_Tmp &&
02669 ATD_DATA_INIT(attr_idx) &&
02670 ATD_FLD(attr_idx) == AT_Tbl_Idx) {
02671 ATD_OFFSET_FLD(attr_idx) = ATD_OFFSET_FLD(ATD_TMP_IDX(attr_idx));
02672 ATD_OFFSET_IDX(attr_idx) = ATD_OFFSET_IDX(ATD_TMP_IDX(attr_idx));
02673 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
02674 }
02675 break;
02676
02677 default:
02678 break;
02679 }
02680 }
02681
02682 sb_idx = ATD_STOR_BLK_IDX(attr_idx);
02683
02684 if (SB_MERGED_BLK_IDX(sb_idx) != NULL_IDX) {
02685 sb_idx = SB_MERGED_BLK_IDX(sb_idx);
02686 ATD_STOR_BLK_IDX(attr_idx) = sb_idx;
02687 }
02688
02689 if (SB_DEF_MULT_SCPS(sb_idx) || SB_HAS_RENAMES(sb_idx)) {
02690 ATD_EQUIV(attr_idx) = TRUE;
02691 }
02692
02693 # if defined(_ASSIGN_OFFSETS_TO_HOSTED_STACK)
02694
02695 if (SB_HOSTED_STACK(sb_idx) &&
02696 SB_SCP_IDX(sb_idx) != curr_scp_idx &&
02697 tmp_scp_idx != curr_scp_idx) {
02698
02699
02700
02701
02702
02703
02704
02705
02706
02707
02708
02709
02710
02711
02712
02713 if (SB_LAST_ATTR_LIST(sb_idx) != NULL_IDX) {
02714 ADD_ATTR_TO_LOCAL_LIST(AL_ATTR_IDX(SB_LAST_ATTR_LIST(sb_idx)));
02715 tmp_scp_idx = curr_scp_idx;
02716 }
02717 }
02718 # endif
02719
02720 # ifdef _DEBUG
02721 if ((ATD_CLASS(attr_idx) == Variable ||
02722 ATD_CLASS(attr_idx) == Function_Result ||
02723 ATD_CLASS(attr_idx) == Compiler_Tmp) &&
02724 ATD_OFFSET_ASSIGNED(attr_idx) &&
02725 ATD_OFFSET_FLD(attr_idx) == CN_Tbl_Idx &&
02726 fold_relationals(ATD_OFFSET_IDX(attr_idx),
02727 CN_INTEGER_ZERO_IDX,
02728 Lt_Opr)) {
02729 PRINTMSG(AT_DEF_LINE(attr_idx), 1004, Internal,
02730 AT_DEF_COLUMN(attr_idx),
02731 AT_OBJ_NAME_PTR(attr_idx),
02732 attr_idx);
02733 }
02734 # endif
02735 }
02736 else {
02737 local_attr_idx = attr_idx;
02738
02739 while (AT_ATTR_LINK(attr_idx) != NULL_IDX &&
02740 ! AT_IGNORE_ATTR_LINK(attr_idx)) {
02741 attr_idx = AT_ATTR_LINK(attr_idx);
02742 }
02743
02744 # if defined(_F_MINUS_MINUS)
02745
02746 if (AT_OBJ_CLASS(attr_idx) == Data_Obj &&
02747 ATD_PE_ARRAY_IDX(attr_idx) &&
02748 (ATP_PURE(SCP_ATTR_IDX(curr_scp_idx)) ||
02749 ATP_ELEMENTAL(SCP_ATTR_IDX(curr_scp_idx)))) {
02750 PRINTMSG(AT_DEF_LINE(local_attr_idx), 1580, Error,
02751 AT_DEF_COLUMN(local_attr_idx),
02752 AT_OBJ_NAME_PTR(SCP_ATTR_IDX(curr_scp_idx)),
02753 AT_OBJ_NAME_PTR(attr_idx));
02754 }
02755 # endif
02756
02757 if (AT_OBJ_CLASS(attr_idx) == Data_Obj &&
02758 ATD_STOR_BLK_IDX(attr_idx) != NULL_IDX) {
02759 sb_idx = ATD_STOR_BLK_IDX(attr_idx);
02760
02761 # if defined(_ASSIGN_OFFSETS_TO_HOSTED_STACK)
02762
02763 if (SB_HOSTED_STACK(sb_idx) &&
02764 SB_SCP_IDX(sb_idx) != curr_scp_idx &&
02765 tmp_scp_idx != curr_scp_idx) {
02766
02767
02768
02769
02770
02771
02772
02773
02774
02775
02776
02777
02778
02779
02780
02781
02782
02783
02784 if (SB_LAST_ATTR_LIST(sb_idx) != NULL_IDX) {
02785 ADD_ATTR_TO_LOCAL_LIST(AL_ATTR_IDX(SB_LAST_ATTR_LIST(sb_idx)));
02786 tmp_scp_idx = curr_scp_idx;
02787 }
02788 }
02789 # endif
02790
02791 if (ATD_AUXILIARY(attr_idx) || SB_AUXILIARY(sb_idx)) {
02792 PRINTMSG(AT_DEF_LINE(attr_idx), 607, Error,
02793 AT_DEF_COLUMN(attr_idx),
02794 AT_OBJ_NAME_PTR(attr_idx));
02795 AT_DCL_ERR(attr_idx) = TRUE;
02796 AT_DCL_ERR(local_attr_idx) = TRUE;
02797 }
02798
02799 # ifdef _DEBUG
02800
02801
02802
02803
02804 if (SB_BLK_TYPE(sb_idx) == Stack &&
02805 SCP_SB_HOSTED_STACK_IDX(SB_SCP_IDX(sb_idx)) != sb_idx) {
02806 PRINTMSG(AT_DEF_LINE(attr_idx), 850, Internal,
02807 AT_DEF_COLUMN(attr_idx),
02808 AT_OBJ_NAME_PTR(attr_idx));
02809 }
02810 # endif
02811 }
02812 }
02813
02814 EXIT:
02815
02816 TRACE (Func_Exit, "final_attr_semantics", NULL);
02817
02818 return;
02819
02820 }
02821
02822
02823
02824
02825
02826
02827
02828
02829
02830
02831
02832
02833
02834
02835
02836
02837 static void check_and_allocate_common_storage(int sb_idx)
02838
02839 {
02840 size_offset_type adjust_by;
02841 int attr_idx;
02842 boolean equived;
02843 int group;
02844 int item;
02845 size_offset_type largest_len;
02846 size_offset_type left;
02847 size_offset_type logical_result;
02848 int name_idx;
02849 size_offset_type new_len;
02850 int next_attr_idx;
02851 size_offset_type result;
02852 size_offset_type save_offset;
02853
02854 # if !defined(_TARGET_DOUBLE_ALIGN)
02855 size_offset_type right;
02856 # else
02857 boolean equal_zero;
02858 boolean save_dalign_opt;
02859 # endif
02860
02861 # if !defined(_ERROR_DUPLICATE_GLOBALS)
02862 boolean issue_message;
02863 # endif
02864
02865
02866 TRACE (Func_Entry, "check_and_allocate_common_storage", NULL);
02867
02868 # if defined(_ERROR_DUPLICATE_GLOBALS)
02869
02870 attr_idx = srch_sym_tbl(SB_NAME_PTR(sb_idx),
02871 SB_NAME_LEN(sb_idx),
02872 &name_idx);
02873
02874 if (attr_idx == NULL_IDX) {
02875 attr_idx = srch_host_sym_tbl(SB_NAME_PTR(sb_idx),
02876 SB_NAME_LEN(sb_idx),
02877 &name_idx,
02878 FALSE);
02879 }
02880
02881 if (attr_idx != NULL_IDX) {
02882
02883 switch (AT_OBJ_CLASS(attr_idx)) {
02884 case Data_Obj:
02885
02886 if (ATD_CLASS(attr_idx) == Constant) {
02887
02888 if (SB_USE_ASSOCIATED(sb_idx)) {
02889 PRINTMSG(AT_DEF_LINE(attr_idx), 1033, Ansi,
02890 AT_DEF_COLUMN(attr_idx),
02891 SB_NAME_PTR(sb_idx));
02892 }
02893 else if (SB_HOST_ASSOCIATED(sb_idx)) {
02894 PRINTMSG(AT_DEF_LINE(attr_idx), 1032, Ansi,
02895 AT_DEF_COLUMN(attr_idx),
02896 SB_NAME_PTR(sb_idx));
02897 }
02898 else {
02899 PRINTMSG(AT_DEF_LINE(attr_idx), 547, Ansi,
02900 AT_DEF_COLUMN(attr_idx),
02901 SB_NAME_PTR(sb_idx));
02902 }
02903 }
02904 break;
02905
02906 case Pgm_Unit:
02907
02908 if (ATP_PROC(attr_idx) == Intrin_Proc &&
02909 AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref) {
02910
02911 if (SB_USE_ASSOCIATED(sb_idx)) {
02912 PRINTMSG(AT_DEF_LINE(attr_idx), 1031, Error,
02913 AT_DEF_COLUMN(attr_idx),
02914 SB_NAME_PTR(sb_idx));
02915 }
02916 else if (SB_HOST_ASSOCIATED(sb_idx)) {
02917 PRINTMSG(AT_DEF_LINE(attr_idx), 1030, Error,
02918 AT_DEF_COLUMN(attr_idx),
02919 SB_NAME_PTR(sb_idx));
02920 }
02921 else {
02922 PRINTMSG(AT_DEF_LINE(attr_idx), 1005, Error,
02923 AT_DEF_COLUMN(attr_idx),
02924 SB_NAME_PTR(sb_idx));
02925 }
02926 }
02927 break;
02928
02929 case Interface:
02930
02931 if (AT_IS_INTRIN(attr_idx) &&
02932 AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref) {
02933
02934 if (SB_USE_ASSOCIATED(sb_idx)) {
02935 PRINTMSG(AT_DEF_LINE(attr_idx), 1031, Error,
02936 AT_DEF_COLUMN(attr_idx),
02937 SB_NAME_PTR(sb_idx));
02938 }
02939 else if (SB_HOST_ASSOCIATED(sb_idx)) {
02940 PRINTMSG(AT_DEF_LINE(attr_idx), 1030, Error,
02941 AT_DEF_COLUMN(attr_idx),
02942 SB_NAME_PTR(sb_idx));
02943 }
02944 else {
02945 PRINTMSG(AT_DEF_LINE(attr_idx), 1005, Error,
02946 AT_DEF_COLUMN(attr_idx),
02947 SB_NAME_PTR(sb_idx));
02948 }
02949 }
02950 break;
02951 }
02952 }
02953
02954 # else
02955
02956 issue_message = GET_MESSAGE_TBL(message_warning_tbl, 1033) ||
02957 GET_MESSAGE_TBL(message_error_tbl, 1033) ||
02958 GET_MESSAGE_TBL(message_warning_tbl, 1032) ||
02959 GET_MESSAGE_TBL(message_error_tbl, 1032) ||
02960 GET_MESSAGE_TBL(message_warning_tbl, 547) ||
02961 GET_MESSAGE_TBL(message_error_tbl, 547) ||
02962 GET_MESSAGE_TBL(message_warning_tbl, 1029) ||
02963 GET_MESSAGE_TBL(message_error_tbl, 1029) ||
02964 GET_MESSAGE_TBL(message_warning_tbl, 1028) ||
02965 GET_MESSAGE_TBL(message_error_tbl, 1028) ||
02966 GET_MESSAGE_TBL(message_warning_tbl, 714) ||
02967 GET_MESSAGE_TBL(message_error_tbl, 714);
02968
02969
02970 if (issue_message || on_off_flags.issue_ansi_messages) {
02971 attr_idx = srch_sym_tbl(SB_NAME_PTR(sb_idx),
02972 SB_NAME_LEN(sb_idx),
02973 &name_idx);
02974
02975 if (attr_idx == NULL_IDX) {
02976 attr_idx = srch_host_sym_tbl(SB_NAME_PTR(sb_idx),
02977 SB_NAME_LEN(sb_idx),
02978 &name_idx,
02979 FALSE);
02980 }
02981
02982 if (attr_idx != NULL_IDX) {
02983
02984 switch (AT_OBJ_CLASS(attr_idx)) {
02985 case Data_Obj:
02986
02987 if (ATD_CLASS(attr_idx) == Constant) {
02988
02989 if (SB_USE_ASSOCIATED(sb_idx)) {
02990 PRINTMSG(AT_DEF_LINE(attr_idx), 1033, Ansi,
02991 AT_DEF_COLUMN(attr_idx),
02992 SB_NAME_PTR(sb_idx));
02993 }
02994 else if (SB_HOST_ASSOCIATED(sb_idx)) {
02995 PRINTMSG(AT_DEF_LINE(attr_idx), 1032, Ansi,
02996 AT_DEF_COLUMN(attr_idx),
02997 SB_NAME_PTR(sb_idx));
02998 }
02999 else {
03000 PRINTMSG(AT_DEF_LINE(attr_idx), 547, Ansi,
03001 AT_DEF_COLUMN(attr_idx),
03002 SB_NAME_PTR(sb_idx));
03003 }
03004 }
03005 break;
03006
03007 case Pgm_Unit:
03008
03009 if (ATP_PROC(attr_idx) == Intrin_Proc &&
03010 AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref) {
03011
03012 if (SB_USE_ASSOCIATED(sb_idx)) {
03013 PRINTMSG(AT_DEF_LINE(attr_idx), 1029, Ansi,
03014 AT_DEF_COLUMN(attr_idx),
03015 SB_NAME_PTR(sb_idx));
03016 }
03017 else if (SB_HOST_ASSOCIATED(sb_idx)) {
03018 PRINTMSG(AT_DEF_LINE(attr_idx), 1028, Ansi,
03019 AT_DEF_COLUMN(attr_idx),
03020 SB_NAME_PTR(sb_idx));
03021 }
03022 else {
03023 PRINTMSG(AT_DEF_LINE(attr_idx), 714, Ansi,
03024 AT_DEF_COLUMN(attr_idx),
03025 SB_NAME_PTR(sb_idx));
03026 }
03027 }
03028 break;
03029
03030 case Interface:
03031
03032 if (AT_IS_INTRIN(attr_idx) &&
03033 AT_REFERENCED(attr_idx) >= Dcl_Bound_Ref) {
03034
03035 if (SB_USE_ASSOCIATED(sb_idx)) {
03036 PRINTMSG(AT_DEF_LINE(attr_idx), 1029, Ansi,
03037 AT_DEF_COLUMN(attr_idx),
03038 SB_NAME_PTR(sb_idx));
03039 }
03040 else if (SB_HOST_ASSOCIATED(sb_idx)) {
03041 PRINTMSG(AT_DEF_LINE(attr_idx), 1028, Ansi,
03042 AT_DEF_COLUMN(attr_idx),
03043 SB_NAME_PTR(sb_idx));
03044 }
03045 else {
03046 PRINTMSG(AT_DEF_LINE(attr_idx), 714, Ansi,
03047 AT_DEF_COLUMN(attr_idx),
03048 SB_NAME_PTR(sb_idx));
03049 }
03050 }
03051 break;
03052 }
03053 }
03054 }
03055 # endif
03056
03057 if (SB_USE_ASSOCIATED(sb_idx) || !SB_COMMON_NEEDS_OFFSET(sb_idx)) {
03058 goto EXIT;
03059 }
03060
03061 if (SB_FIRST_ATTR_IDX(sb_idx) == NULL_IDX && !SB_DCL_ERR(sb_idx)) {
03062
03063 if (SB_SAVED(sb_idx)) {
03064
03065
03066
03067
03068 PRINTMSG(SB_DEF_LINE(sb_idx), 688, Error,
03069 SB_DEF_COLUMN(sb_idx),
03070 SB_NAME_PTR(sb_idx));
03071 SB_DCL_ERR(sb_idx) = TRUE;
03072 }
03073 else if (SB_BLK_TYPE(sb_idx) == Threadprivate) {
03074 PRINTMSG(SB_DEF_LINE(sb_idx), 1502, Error,
03075 SB_DEF_COLUMN(sb_idx),
03076 SB_NAME_PTR(sb_idx),
03077 "THREAD_PRIVATE");
03078 SB_DCL_ERR(sb_idx) = TRUE;
03079 }
03080 else if (SB_CACHE_ALIGN(sb_idx)) {
03081 PRINTMSG(SB_DEF_LINE(sb_idx), 1168, Error,
03082 SB_DEF_COLUMN(sb_idx),
03083 SB_NAME_PTR(sb_idx));
03084 SB_DCL_ERR(sb_idx) = TRUE;
03085 }
03086 else if (SB_SECTION_GP(sb_idx)) {
03087 PRINTMSG(SB_DEF_LINE(sb_idx), 1502, Error,
03088 SB_DEF_COLUMN(sb_idx),
03089 SB_NAME_PTR(sb_idx),
03090 "SECTION_GP");
03091 SB_DCL_ERR(sb_idx) = TRUE;
03092 }
03093 else if (SB_SECTION_NON_GP(sb_idx)) {
03094 PRINTMSG(SB_DEF_LINE(sb_idx), 1502, Error,
03095 SB_DEF_COLUMN(sb_idx),
03096 SB_NAME_PTR(sb_idx),
03097 "SECTION_NON_GP");
03098 SB_DCL_ERR(sb_idx) = TRUE;
03099 }
03100 # if 0
03101 else if (SB_ALIGN_SYMBOL(sb_idx)) {
03102 PRINTMSG(SB_DEF_LINE(sb_idx), 1502, Error,
03103 SB_DEF_COLUMN(sb_idx),
03104 SB_NAME_PTR(sb_idx),
03105 "ALIGN_SYMBOL");
03106 SB_DCL_ERR(sb_idx) = TRUE;
03107 }
03108 else if (SB_FILL_SYMBOL(sb_idx)) {
03109 PRINTMSG(SB_DEF_LINE(sb_idx), 1502, Error,
03110 SB_DEF_COLUMN(sb_idx),
03111 SB_NAME_PTR(sb_idx),
03112 "FILL_SYMBOL");
03113 SB_DCL_ERR(sb_idx) = TRUE;
03114 }
03115 # endif
03116 else if (SB_DCL_COMMON_DIR(sb_idx)) {
03117 SB_DCL_ERR(sb_idx) = TRUE;
03118 PRINTMSG(SB_DEF_LINE(sb_idx), 1128, Error,
03119 SB_DEF_COLUMN(sb_idx),
03120 SB_NAME_PTR(sb_idx));
03121 }
03122 else if (SB_BLK_TYPE(sb_idx) == Task_Common) {
03123 SB_DCL_ERR(sb_idx) = TRUE;
03124 PRINTMSG(SB_DEF_LINE(sb_idx), 690, Error,
03125 SB_DEF_COLUMN(sb_idx),
03126 SB_NAME_PTR(sb_idx));
03127 }
03128 }
03129
03130 if (SB_DCL_COMMON_DIR(sb_idx) && SB_BLK_TYPE(sb_idx) == Task_Common) {
03131 SB_DCL_ERR(sb_idx) = TRUE;
03132 PRINTMSG(SB_DEF_LINE(sb_idx), 1129, Error,
03133 SB_DEF_COLUMN(sb_idx),
03134 SB_NAME_PTR(sb_idx));
03135 }
03136
03137 attr_idx = SB_FIRST_ATTR_IDX(sb_idx);
03138 equived = FALSE;
03139
03140 while (attr_idx != NULL_IDX && !equived) {
03141 equived = equived || ATD_EQUIV(attr_idx);
03142 attr_idx = ATD_NEXT_MEMBER_IDX(attr_idx);
03143 }
03144
03145 if (SB_PAD_BLK(sb_idx) && equived) {
03146 PRINTMSG(SB_DEF_LINE(sb_idx), 1351, Warning,
03147 SB_DEF_COLUMN(sb_idx),
03148 SB_BLANK_COMMON(sb_idx) ?
03149 "" : SB_NAME_PTR(sb_idx));
03150 SB_PAD_BLK(sb_idx)= FALSE;
03151 }
03152
03153 next_attr_idx = SB_FIRST_ATTR_IDX(sb_idx);
03154 largest_len.fld = SB_LEN_FLD(sb_idx);
03155 largest_len.idx = SB_LEN_IDX(sb_idx);
03156
03157 while (next_attr_idx != NULL_IDX) {
03158 attr_idx = next_attr_idx;
03159 next_attr_idx = ATD_NEXT_MEMBER_IDX(attr_idx);
03160
03161 if (AT_DCL_ERR(attr_idx)) {
03162
03163
03164
03165 }
03166 else if (!ATD_EQUIV(attr_idx) || num_prog_unit_errors != 0) {
03167
03168
03169
03170
03171 #ifdef KEY
03172 assign_bind_c_offset(attr_idx,
03173 AT_OBJ_CLASS(attr_idx) == Data_Obj && ATD_IN_COMMON(attr_idx) &&
03174 SB_BIND_ATTR(ATD_STOR_BLK_IDX(attr_idx)));
03175 #else
03176 assign_offset(attr_idx);
03177 #endif
03178 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
03179 ATD_EQUIV(attr_idx) = equived;
03180 }
03181 else {
03182
03183 if (ATD_OFFSET_IDX(attr_idx) == NULL_IDX) {
03184 ATD_OFFSET_IDX(attr_idx) = CN_INTEGER_ZERO_IDX;
03185 ATD_OFFSET_FLD(attr_idx) = CN_Tbl_Idx;
03186 }
03187
03188 save_offset.fld = ATD_OFFSET_FLD(attr_idx);
03189 save_offset.idx = ATD_OFFSET_IDX(attr_idx);
03190
03191 # if defined(_TARGET_DOUBLE_ALIGN)
03192 save_dalign_opt = cmd_line_flags.dalign;
03193 cmd_line_flags.dalign = FALSE;
03194
03195
03196
03197
03198 assign_offset(attr_idx);
03199
03200 cmd_line_flags.dalign = save_dalign_opt;
03201 left.fld = ATD_OFFSET_FLD(attr_idx);
03202 left.idx = ATD_OFFSET_IDX(attr_idx);
03203
03204 if (!size_offset_binary_calc(&left,
03205 &save_offset,
03206 Minus_Opr,
03207 &adjust_by)) {
03208 AT_DCL_ERR(attr_idx) = TRUE;
03209 }
03210
03211 # else
03212 assign_offset(attr_idx);
03213
03214 left.fld = ATD_OFFSET_FLD(attr_idx);
03215 left.idx = ATD_OFFSET_IDX(attr_idx);
03216
03217 if (!size_offset_binary_calc(&left,
03218 &save_offset,
03219 Minus_Opr,
03220 &adjust_by)) {
03221 AT_DCL_ERR(attr_idx) = TRUE;
03222 }
03223
03224 if (ATD_OFFSET_ASSIGNED(attr_idx)) {
03225 right.fld = CN_Tbl_Idx;
03226 right.idx = CN_INTEGER_ZERO_IDX;
03227
03228 size_offset_logical_calc(&adjust_by, &right, Eq_Opr, &result);
03229
03230 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
03231
03232
03233
03234
03235
03236
03237
03238 continue;
03239 }
03240 }
03241 # endif
03242
03243 group = SCP_FIRST_EQUIV_GRP(curr_scp_idx);
03244
03245 while (group != NULL_IDX) {
03246 item = group;
03247
03248 while (item != NULL_IDX) {
03249
03250 # if _DEBUG
03251 if (!ATD_EQUIV(EQ_ATTR_IDX(item)) &&
03252 !AT_DCL_ERR(EQ_ATTR_IDX(item)) &&
03253 ATD_CLASS(EQ_ATTR_IDX(item)) == Variable) {
03254 PRINTMSG(AT_DEF_LINE(EQ_ATTR_IDX(item)),
03255 1019,
03256 Internal,
03257 AT_DEF_COLUMN(EQ_ATTR_IDX(item)),
03258 AT_OBJ_NAME_PTR(EQ_ATTR_IDX(item)));
03259 }
03260 # endif
03261
03262 if (EQ_ATTR_IDX(item) == attr_idx) {
03263 goto FOUND;
03264 }
03265 item = EQ_NEXT_EQUIV_OBJ(item);
03266 }
03267 group = EQ_NEXT_EQUIV_GRP(group);
03268 }
03269
03270 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
03271
03272
03273
03274
03275 continue;
03276
03277 FOUND:
03278
03279 if (ATD_OFFSET_ASSIGNED(attr_idx)) {
03280
03281 if (fold_relationals(ATD_OFFSET_IDX(attr_idx),
03282 save_offset.idx,
03283 Ne_Opr)) {
03284 PRINTMSG(EQ_LINE_NUM(item), 862, Error,
03285 EQ_COLUMN_NUM(item),
03286 AT_OBJ_NAME_PTR(attr_idx));
03287 }
03288 continue;
03289 }
03290
03291 # if defined(_TARGET_DOUBLE_ALIGN)
03292
03293 else {
03294 if (EQ_DALIGN_ME(item)) {
03295 C_TO_F_INT(result.constant, TARGET_BITS_PER_WORD * 2,
03296 CG_INTEGER_DEFAULT_TYPE);
03297 result.fld = NO_Tbl_Idx;
03298 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
03299
03300 if (!size_offset_binary_calc(&adjust_by,
03301 &result,
03302 Mod_Opr,
03303 &result)) {
03304 AT_DCL_ERR(attr_idx) = TRUE;
03305 }
03306
03307 left.fld = CN_Tbl_Idx;
03308 left.idx = CN_INTEGER_ZERO_IDX;
03309
03310 size_offset_logical_calc(&left, &result, Eq_Opr, &result);
03311
03312 equal_zero = THIS_IS_TRUE(result.constant, result.type_idx);
03313
03314 if ((equal_zero && EQ_DALIGN_SHIFT(item)) ||
03315 (!equal_zero && !EQ_DALIGN_SHIFT(item))) {
03316
03317 if (cmd_line_flags.dalign) {
03318
03319
03320
03321
03322
03323
03324
03325
03326
03327
03328 result.fld = CN_Tbl_Idx;
03329 result.idx = CN_INTEGER_BITS_PER_WORD_IDX;
03330
03331 if (!size_offset_binary_calc(&adjust_by,
03332 &result,
03333 Plus_Opr,
03334 &adjust_by)) {
03335 AT_DCL_ERR(attr_idx) = TRUE;
03336 }
03337
03338 left.fld = ATD_OFFSET_FLD(attr_idx);
03339 left.idx = ATD_OFFSET_IDX(attr_idx);
03340
03341 if (!size_offset_binary_calc(&left,
03342 &result,
03343 Plus_Opr,
03344 &result)) {
03345 AT_DCL_ERR(attr_idx) = TRUE;
03346 }
03347
03348 if (result.fld == NO_Tbl_Idx) {
03349 ATD_OFFSET_FLD(attr_idx) = CN_Tbl_Idx;
03350 ATD_OFFSET_IDX(attr_idx) = ntr_const_tbl(
03351 result.type_idx,
03352 FALSE,
03353 result.constant);
03354 }
03355 else {
03356 ATD_OFFSET_FLD(attr_idx) = result.fld;
03357 ATD_OFFSET_IDX(attr_idx) = result.idx;
03358 }
03359
03360 result.fld = CN_Tbl_Idx;
03361 result.idx = CN_INTEGER_BITS_PER_WORD_IDX;
03362 left.fld = SB_LEN_FLD(sb_idx);
03363 left.idx = SB_LEN_IDX(sb_idx);
03364
03365 if (!size_offset_binary_calc(&left,
03366 &result,
03367 Plus_Opr,
03368 &result)) {
03369 AT_DCL_ERR(attr_idx) = TRUE;
03370 }
03371
03372 if (result.fld == NO_Tbl_Idx) {
03373 SB_LEN_FLD(sb_idx) = CN_Tbl_Idx;
03374 SB_LEN_IDX(sb_idx) = ntr_const_tbl(result.type_idx,
03375 FALSE,
03376 result.constant);
03377 }
03378 else {
03379 SB_LEN_FLD(sb_idx) = result.fld;
03380 SB_LEN_IDX(sb_idx) = result.idx;
03381 }
03382
03383 # if ! (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
03384
03385
03386
03387
03388
03389 PRINTMSG(AT_DEF_LINE(attr_idx), 1013, Warning,
03390 AT_DEF_COLUMN(attr_idx),
03391 AT_OBJ_NAME_PTR(attr_idx),
03392 SB_BLANK_COMMON(sb_idx) ?
03393 "" : SB_NAME_PTR(sb_idx));
03394 # endif
03395 }
03396 else {
03397 PRINTMSG(AT_DEF_LINE(attr_idx), 1161, Caution,
03398 AT_DEF_COLUMN(attr_idx),
03399 AT_OBJ_NAME_PTR(attr_idx),
03400 SB_BLANK_COMMON(sb_idx) ?
03401 "" : SB_NAME_PTR(sb_idx));
03402 }
03403 }
03404 }
03405 }
03406 # endif
03407
03408 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
03409 item = group;
03410
03411 while (item != NULL_IDX) {
03412
03413 if (!ATD_OFFSET_ASSIGNED(EQ_ATTR_IDX(item))) {
03414
03415 if (ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) == NULL_IDX) {
03416 ATD_OFFSET_FLD(EQ_ATTR_IDX(item)) = CN_Tbl_Idx;
03417 ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) = ntr_const_tbl(
03418 adjust_by.type_idx,
03419 FALSE,
03420 adjust_by.constant);
03421 }
03422 else {
03423 left.fld = ATD_OFFSET_FLD(EQ_ATTR_IDX(item));
03424 left.idx = ATD_OFFSET_IDX(EQ_ATTR_IDX(item));
03425
03426 if (!size_offset_binary_calc(&left,
03427 &adjust_by,
03428 Plus_Opr,
03429 &result)) {
03430 AT_DCL_ERR(EQ_ATTR_IDX(item)) = TRUE;
03431 }
03432
03433 if (result.fld == NO_Tbl_Idx) {
03434 ATD_OFFSET_FLD(EQ_ATTR_IDX(item)) = CN_Tbl_Idx;
03435 ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) = ntr_const_tbl(
03436 result.type_idx,
03437 FALSE,
03438 result.constant);
03439 }
03440 else {
03441 ATD_OFFSET_FLD(EQ_ATTR_IDX(item)) = result.fld;
03442 ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) = result.idx;
03443 }
03444 }
03445
03446 ATD_OFFSET_ASSIGNED(EQ_ATTR_IDX(item)) = TRUE;
03447
03448 if (fold_relationals(ATD_OFFSET_IDX(EQ_ATTR_IDX(item)),
03449 CN_INTEGER_ZERO_IDX,
03450 Lt_Opr)) {
03451 PRINTMSG(SB_DEF_LINE(sb_idx), 526, Error,
03452 SB_DEF_COLUMN(sb_idx),
03453 SB_BLANK_COMMON(sb_idx) ?
03454 "" : SB_NAME_PTR(sb_idx),
03455 AT_OBJ_NAME_PTR(EQ_ATTR_IDX(item)));
03456 ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) = CN_INTEGER_ZERO_IDX;
03457 ATD_OFFSET_FLD(EQ_ATTR_IDX(item)) = CN_Tbl_Idx;
03458 AT_DCL_ERR(EQ_ATTR_IDX(item)) = TRUE;
03459 }
03460
03461 new_len = stor_bit_size_of(EQ_ATTR_IDX(item), TRUE, FALSE);
03462 left.fld = ATD_OFFSET_FLD(EQ_ATTR_IDX(item));
03463 left.idx = ATD_OFFSET_IDX(EQ_ATTR_IDX(item));
03464
03465 if (!size_offset_binary_calc(&left, &new_len, Plus_Opr,&result)){
03466 AT_DCL_ERR(EQ_ATTR_IDX(item)) = TRUE;
03467 }
03468
03469 size_offset_logical_calc(&result,
03470 &largest_len,
03471 Gt_Opr,
03472 &logical_result);
03473
03474 if (THIS_IS_TRUE(logical_result.constant,
03475 logical_result.type_idx)) {
03476 largest_len = result;
03477 }
03478 }
03479 else if (!ATD_IN_COMMON(EQ_ATTR_IDX(item))) {
03480 left.fld = EQ_OFFSET_FLD(item);
03481 left.idx = EQ_OFFSET_IDX(item);
03482
03483 if (!size_offset_binary_calc(&left,&adjust_by,Plus_Opr,&result)){
03484 AT_DCL_ERR(EQ_ATTR_IDX(item)) = TRUE;
03485 }
03486
03487 left.fld = ATD_OFFSET_FLD(EQ_ATTR_IDX(item));
03488 left.idx = ATD_OFFSET_IDX(EQ_ATTR_IDX(item));
03489
03490 size_offset_logical_calc(&left, &result, Ne_Opr,&logical_result);
03491
03492 if (THIS_IS_TRUE(logical_result.constant,
03493 logical_result.type_idx)) {
03494 PRINTMSG(EQ_LINE_NUM(item), 862, Error,
03495 EQ_COLUMN_NUM(item),
03496 AT_OBJ_NAME_PTR(EQ_ATTR_IDX(item)));
03497 }
03498 }
03499 item = EQ_NEXT_EQUIV_OBJ(item);
03500 }
03501 }
03502 }
03503 left.fld = SB_LEN_FLD(sb_idx);
03504 left.idx = SB_LEN_IDX(sb_idx);
03505
03506 size_offset_logical_calc(&largest_len, &left, Gt_Opr, &logical_result);
03507
03508 if (!THIS_IS_TRUE(logical_result.constant,
03509 logical_result.type_idx)) {
03510 largest_len.idx = SB_LEN_IDX(sb_idx);
03511 largest_len.fld = SB_LEN_FLD(sb_idx);
03512 }
03513
03514 align_bit_length(&largest_len, TARGET_BITS_PER_WORD);
03515
03516 if (largest_len.fld == NO_Tbl_Idx) {
03517 largest_len.fld = CN_Tbl_Idx;
03518 largest_len.idx = ntr_const_tbl(largest_len.type_idx,
03519 FALSE,
03520 largest_len.constant);
03521 }
03522
03523 SB_LEN_FLD(sb_idx) = largest_len.fld;
03524 SB_LEN_IDX(sb_idx) = largest_len.idx;
03525
03526 SB_COMMON_NEEDS_OFFSET(sb_idx) = FALSE;
03527
03528 if (cmd_line_flags.taskcommon && !SB_DCL_COMMON_DIR(sb_idx)) {
03529
03530
03531
03532 SB_BLK_TYPE(sb_idx) = Task_Common;
03533 SB_RUNTIME_INIT(sb_idx) = FALSE;
03534 }
03535
03536 EXIT:
03537
03538 TRACE (Func_Exit, "check_and_allocate_common_storage", NULL);
03539
03540 return;
03541
03542 }
03543
03544
03545
03546
03547
03548
03549
03550
03551
03552
03553
03554
03555
03556
03557
03558
03559 static void storage_blk_resolution()
03560 {
03561 int attr_idx;
03562 int ga_idx;
03563 int gac_idx;
03564 int ga_pgm_idx;
03565 int host_sb_idx;
03566 msg_severities_type msg_level;
03567 int name_idx;
03568 size_offset_type result;
03569 boolean same_common_block;
03570 int same_sb_idx;
03571 int sb_idx;
03572
03573 # if !defined(_SEPARATE_NONCOMMON_EQUIV_GROUPS)
03574 int group;
03575 int item;
03576 id_str_type name;
03577 int new_sb_idx;
03578 int np_idx;
03579 size_offset_type offset;
03580 # endif
03581
03582 # if defined(_TARGET_DOUBLE_ALIGN)
03583 size_offset_type left;
03584 # endif
03585
03586
03587 TRACE (Func_Entry, "storage_blk_resolution", NULL);
03588
03589
03590
03591 for (sb_idx = 1; sb_idx <= stor_blk_tbl_idx; sb_idx++) {
03592
03593 if (SB_SCP_IDX(sb_idx) != curr_scp_idx) {
03594 continue;
03595 }
03596
03597 if (SB_IS_COMMON(sb_idx)) {
03598 SB_PAD_BLK(sb_idx) = cmd_line_flags.pad;
03599
03600 if (cmd_line_flags.pad_amount != 0) {
03601 SB_PAD_AMOUNT(sb_idx) = cmd_line_flags.pad_amount;
03602 SB_PAD_AMOUNT_SET(sb_idx) = TRUE;
03603 }
03604
03605 check_and_allocate_common_storage(sb_idx);
03606
03607 if (!SB_HIDDEN(sb_idx) && !SB_HOST_ASSOCIATED(sb_idx)) {
03608
03609 if (srch_global_name_tbl(SB_NAME_PTR(sb_idx),
03610 SB_NAME_LEN(sb_idx),
03611 &name_idx)) {
03612
03613 gac_idx = GN_ATTR_IDX(name_idx);
03614
03615 if (GA_OBJ_CLASS(gac_idx) != Common_Block) {
03616
03617
03618
03619
03620
03621 ga_pgm_idx = gac_idx;
03622 gac_idx = ntr_common_in_global_attr_tbl(sb_idx,
03623 name_idx);
03624
03625 GAC_PGM_UNIT_IDX(gac_idx) = ga_pgm_idx;
03626 GN_ATTR_IDX(name_idx) = gac_idx;
03627
03628 # if defined(_ERROR_DUPLICATE_GLOBALS)
03629 msg_level = Error;
03630 # else
03631 msg_level = (GAP_PGM_UNIT(ga_pgm_idx) == Module) ?
03632 Error : Ansi;
03633 # endif
03634 PRINTMSG(SB_DEF_LINE(sb_idx), 1006, msg_level,
03635 SB_DEF_COLUMN(sb_idx),
03636 SB_NAME_PTR(sb_idx),
03637 pgm_unit_str[GAP_PGM_UNIT(ga_pgm_idx)]);
03638 }
03639 else {
03640 same_common_block = !SB_EQUIVALENCED(sb_idx) &&
03641 !GAC_EQUIVALENCED(gac_idx);
03642
03643
03644
03645 if (SB_AUXILIARY(sb_idx) ^ GAC_AUXILIARY(gac_idx)) {
03646 same_common_block = FALSE;
03647 PRINTMSG(SB_DEF_LINE(sb_idx), 1276, Warning,
03648 SB_DEF_COLUMN(sb_idx),
03649 SB_NAME_PTR(sb_idx),
03650 "AUXILIARY");
03651 }
03652
03653 if ((SB_BLK_TYPE(sb_idx) == Task_Common &&
03654 !GAC_TASK_COMMON(gac_idx)) ||
03655 (SB_BLK_TYPE(sb_idx) != Task_Common &&
03656 GAC_TASK_COMMON(gac_idx))) {
03657 same_common_block = FALSE;
03658
03659 PRINTMSG(SB_DEF_LINE(sb_idx), 1276, Warning,
03660 SB_DEF_COLUMN(sb_idx),
03661 SB_NAME_PTR(sb_idx),
03662 "TASK_COMMON");
03663 }
03664
03665 if (SB_ALIGN_SYMBOL(sb_idx) ^ GAC_ALIGN_SYMBOL(gac_idx)) {
03666 same_common_block = FALSE;
03667 char *fal = file_and_line(GA_DEF_LINE(gac_idx));
03668 PRINTMSG(SB_DEF_LINE(sb_idx), 1602, Warning,
03669 SB_DEF_COLUMN(sb_idx),
03670 SB_NAME_PTR(sb_idx),
03671 "ALIGN_SYMBOL", fal);
03672 free(fal);
03673 }
03674
03675 if (SB_FILL_SYMBOL(sb_idx) ^ GAC_FILL_SYMBOL(gac_idx)) {
03676 same_common_block = FALSE;
03677 char *fal = file_and_line(GA_DEF_LINE(gac_idx));
03678 PRINTMSG(SB_DEF_LINE(sb_idx), 1602, Warning,
03679 SB_DEF_COLUMN(sb_idx),
03680 SB_NAME_PTR(sb_idx),
03681 "FILL_SYMBOL", fal);
03682 free(fal);
03683 }
03684
03685 if (SB_SECTION_GP(sb_idx) ^ GAC_SECTION_GP(gac_idx)) {
03686 same_common_block = FALSE;
03687 char *fal = file_and_line(GA_DEF_LINE(gac_idx));
03688 PRINTMSG(SB_DEF_LINE(sb_idx), 1602, Warning,
03689 SB_DEF_COLUMN(sb_idx),
03690 SB_NAME_PTR(sb_idx),
03691 "SECTION_GP", fal);
03692 free(fal);
03693 }
03694 #ifdef KEY
03695 if (SB_BIND_ATTR(sb_idx) ^ GA_BIND_ATTR(gac_idx)) {
03696 same_common_block = FALSE;
03697 char *fal = file_and_line(GA_DEF_LINE(gac_idx));
03698 PRINTMSG(SB_DEF_LINE(sb_idx), 1602, Warning,
03699 SB_DEF_COLUMN(sb_idx),
03700 SB_NAME_PTR(sb_idx),
03701 "BIND", fal);
03702 free(fal);
03703 }
03704 else if (SB_BIND_ATTR(sb_idx)) {
03705 const char *ga_binding_label = GA_BINDING_LABEL(gac_idx);
03706 int ga_binding_label_len = strlen(ga_binding_label);
03707 if (SB_EXT_NAME_LEN(sb_idx) != ga_binding_label_len ||
03708 strncmp(ga_binding_label, SB_EXT_NAME_PTR(sb_idx),
03709 ga_binding_label_len)) {
03710 char *fal = file_and_line(GA_DEF_LINE(gac_idx));
03711 PRINTMSG(SB_DEF_LINE(sb_idx), 1700, Error,
03712 SB_DEF_COLUMN(sb_idx), SB_NAME_PTR(sb_idx),
03713 ga_binding_label, fal);
03714 free(fal);
03715 }
03716 }
03717 #endif
03718
03719 if (SB_SECTION_NON_GP(sb_idx) ^ GAC_SECTION_NON_GP(gac_idx)) {
03720 same_common_block = FALSE;
03721 char *fal = file_and_line(GA_DEF_LINE(gac_idx));
03722 PRINTMSG(SB_DEF_LINE(sb_idx), 1602, Warning,
03723 SB_DEF_COLUMN(sb_idx),
03724 SB_NAME_PTR(sb_idx),
03725 "SECTION_NON_GP", fal);
03726 free(fal);
03727 }
03728
03729 if (SB_CACHE_ALIGN(sb_idx) ^ GAC_CACHE_ALIGN(gac_idx)) {
03730 same_common_block = FALSE;
03731 char *fal = file_and_line(GA_DEF_LINE(gac_idx));
03732 PRINTMSG(SB_DEF_LINE(sb_idx), 1602, Warning,
03733 SB_DEF_COLUMN(sb_idx),
03734 SB_NAME_PTR(sb_idx),
03735 "CACHE_ALIGN", fal);
03736 free(fal);
03737 }
03738
03739
03740
03741
03742 attr_idx = SB_FIRST_ATTR_IDX(sb_idx);
03743 ga_idx = GAC_FIRST_MEMBER_IDX(gac_idx);
03744
03745 while (attr_idx != NULL_IDX && ga_idx != NULL_IDX) {
03746
03747
03748
03749
03750 if (!compare_global_type_rank(ga_idx,
03751 NULL_IDX,
03752 attr_idx,
03753 NULL_IDX,
03754 TRUE)) {
03755 same_common_block = FALSE;
03756 # if 0
03757 PRINTMSG(AT_DEF_LINE(attr_idx), 1603, Caution,
03758 AT_DEF_COLUMN(attr_idx),
03759 SB_NAME_PTR(sb_idx));
03760 # endif
03761 break;
03762 }
03763 attr_idx = ATD_NEXT_MEMBER_IDX(attr_idx);
03764 ga_idx = GAD_NEXT_IDX(ga_idx);
03765 }
03766
03767 if (attr_idx != NULL_IDX || ga_idx != NULL_IDX) {
03768 same_common_block = FALSE;
03769 }
03770
03771 if (!same_common_block) {
03772 GAC_FOUND_DIFFS(gac_idx) = TRUE;
03773 SB_DUPLICATE_COMMON(sb_idx) = FALSE;
03774 }
03775 else if (!GAC_FOUND_DIFFS(gac_idx)) {
03776 SB_DUPLICATE_COMMON(sb_idx) = TRUE;
03777 }
03778 }
03779 }
03780 else {
03781 ntr_global_name_tbl(NULL_IDX, sb_idx, name_idx);
03782 }
03783 }
03784 }
03785 else if (cmd_line_flags.taskcommon) {
03786
03787
03788
03789
03790 if (SB_MODULE(sb_idx) ||
03791 SB_BLK_TYPE(sb_idx) == Static ||
03792 SB_BLK_TYPE(sb_idx) == Static_Named ||
03793 SB_BLK_TYPE(sb_idx) == Static_Local) {
03794 SB_BLK_TYPE(sb_idx) = Task_Common;
03795 }
03796 }
03797 else if (cmd_line_flags.static_threadprivate) {
03798
03799
03800
03801
03802
03803 if (SB_MODULE(sb_idx) ||
03804 SB_BLK_TYPE(sb_idx) == Static ||
03805 SB_BLK_TYPE(sb_idx) == Static_Named ||
03806 SB_BLK_TYPE(sb_idx) == Static_Local) {
03807 SB_BLK_TYPE(sb_idx) = Threadprivate;
03808 }
03809 }
03810
03811
03812 if (SB_BLK_TYPE(sb_idx) == Equivalenced && SB_HOSTED_STACK(sb_idx)) {
03813
03814 # if defined(_DEBUG)
03815
03816 if (SB_LEN_FLD(sb_idx) != CN_Tbl_Idx) {
03817 PRINTMSG(SB_DEF_LINE(sb_idx), 1201, Internal, SB_DEF_COLUMN(sb_idx),
03818 SB_NAME_PTR(sb_idx));
03819 }
03820 # endif
03821
03822 result.fld = SB_LEN_FLD(sb_idx);
03823 result.idx = SB_LEN_IDX(sb_idx);
03824
03825 align_bit_length(&result, TARGET_BITS_PER_WORD);
03826
03827 if (result.fld == NO_Tbl_Idx) {
03828 SB_LEN_FLD(sb_idx) = CN_Tbl_Idx;
03829 SB_LEN_IDX(sb_idx) = ntr_const_tbl(result.type_idx,
03830 FALSE,
03831 result.constant);
03832 }
03833 else {
03834 SB_LEN_FLD(sb_idx) = result.fld;
03835 SB_LEN_IDX(sb_idx) = result.idx;
03836 }
03837
03838 # if !defined(_SEPARATE_NONCOMMON_EQUIV_GROUPS)
03839
03840
03841
03842
03843
03844 if (SCP_SB_HOSTED_STACK_IDX(curr_scp_idx) == NULL_IDX) {
03845 CREATE_ID(name, sb_name[Stack_Host_Blk], sb_len[Stack_Host_Blk]);
03846 NTR_NAME_POOL(&(name.words[0]), sb_len[Stack_Host_Blk], np_idx);
03847 SB_NAME_IDX(sb_idx) = np_idx;
03848 SB_NAME_LEN(sb_idx) = sb_len[Stack_Host_Blk];
03849 SB_BLK_TYPE(sb_idx) = Stack;
03850 SB_RUNTIME_INIT(sb_idx) = TRUE;
03851 SCP_SB_HOSTED_STACK_IDX(curr_scp_idx) = sb_idx;
03852 }
03853 else {
03854
03855
03856 new_sb_idx = SCP_SB_HOSTED_STACK_IDX(curr_scp_idx);
03857
03858 offset.fld = SB_LEN_FLD(new_sb_idx);
03859 offset.idx = SB_LEN_IDX(new_sb_idx);
03860
03861 align_bit_length(&offset, TARGET_BITS_PER_WORD);
03862
03863 group = SCP_FIRST_EQUIV_GRP(curr_scp_idx);
03864
03865 while (ATD_STOR_BLK_IDX(EQ_ATTR_IDX(group)) != sb_idx) {
03866 group = EQ_NEXT_EQUIV_GRP(group);
03867 }
03868 item = group;
03869
03870 # if defined(_TARGET_DOUBLE_ALIGN)
03871
03872 if (EQ_DALIGN_ME(item)) {
03873 C_TO_F_INT(result.constant,
03874 TARGET_BITS_PER_WORD * 2,
03875 CG_INTEGER_DEFAULT_TYPE);
03876 result.fld = NO_Tbl_Idx;
03877 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
03878 left.fld = CN_Tbl_Idx;
03879 left.idx = CN_INTEGER_ZERO_IDX;
03880
03881 size_offset_binary_calc(&offset, &result, Mod_Opr, &result);
03882
03883 size_offset_logical_calc(&result, &left, Ne_Opr, &result);
03884
03885 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
03886
03887
03888
03889 result.idx = CN_INTEGER_BITS_PER_WORD_IDX;
03890 result.fld = CN_Tbl_Idx;
03891
03892
03893
03894
03895 size_offset_binary_calc(&offset,
03896 &result,
03897 EQ_DALIGN_SHIFT(item) ? Minus_Opr :
03898 Plus_Opr,
03899 &offset);
03900 }
03901 }
03902 # endif
03903
03904 while (item != NULL_IDX) {
03905
03906 if (ATD_STOR_BLK_IDX(EQ_ATTR_IDX(item)) == sb_idx) {
03907 ATD_STOR_BLK_IDX(EQ_ATTR_IDX(item)) = new_sb_idx;
03908
03909 result.fld = ATD_OFFSET_FLD(EQ_ATTR_IDX(item));
03910 result.idx = ATD_OFFSET_IDX(EQ_ATTR_IDX(item));
03911
03912 size_offset_binary_calc(&result, &offset, Plus_Opr, &result);
03913
03914 if (result.fld == NO_Tbl_Idx) {
03915 ATD_OFFSET_FLD(EQ_ATTR_IDX(item)) = CN_Tbl_Idx;
03916 ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) = ntr_const_tbl(
03917 result.type_idx,
03918 FALSE,
03919 result.constant);
03920 }
03921 else {
03922 ATD_OFFSET_FLD(EQ_ATTR_IDX(item)) = result.fld;
03923 ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) = result.idx;
03924 }
03925 }
03926 item = EQ_NEXT_EQUIV_OBJ(item);
03927 }
03928
03929 result.fld = SB_LEN_FLD(sb_idx);
03930 result.idx = SB_LEN_IDX(sb_idx);
03931
03932 size_offset_binary_calc(&result, &offset, Plus_Opr, &result);
03933
03934 if (result.fld == NO_Tbl_Idx) {
03935 SB_LEN_FLD(new_sb_idx) = CN_Tbl_Idx;
03936 SB_LEN_IDX(new_sb_idx) = ntr_const_tbl(result.type_idx,
03937 FALSE,
03938 result.constant);
03939 }
03940 else {
03941 SB_LEN_FLD(new_sb_idx) = result.fld;
03942 SB_LEN_IDX(new_sb_idx) = result.idx;
03943 }
03944 }
03945 # endif
03946
03947 continue;
03948 }
03949
03950 if (SB_HIDDEN(sb_idx)) {
03951
03952
03953
03954
03955
03956
03957 same_sb_idx = SB_MERGED_BLK_IDX(sb_idx);
03958
03959 while (SB_MERGED_BLK_IDX(same_sb_idx) != NULL_IDX) {
03960 same_sb_idx = SB_MERGED_BLK_IDX(same_sb_idx);
03961 }
03962
03963 SB_MERGED_BLK_IDX(sb_idx) = same_sb_idx;
03964
03965 if (SB_IS_COMMON(sb_idx)) {
03966
03967 if (SB_COMMON_NEEDS_OFFSET(same_sb_idx)) {
03968 check_and_allocate_common_storage(same_sb_idx);
03969 }
03970
03971 if (SB_HOST_ASSOCIATED(sb_idx)) {
03972
03973
03974
03975
03976
03977
03978
03979 host_sb_idx = srch_stor_blk_tbl(SB_NAME_PTR(sb_idx),
03980 SB_NAME_LEN(sb_idx),
03981 SB_ORIG_SCP_IDX(sb_idx));
03982
03983 SB_LEN_FLD(sb_idx) = SB_LEN_FLD(host_sb_idx);
03984 SB_LEN_IDX(sb_idx) = SB_LEN_IDX(host_sb_idx);
03985 }
03986 }
03987
03988 if (SB_AUXILIARY(sb_idx) != SB_AUXILIARY(same_sb_idx)) {
03989
03990 if (!SB_DCL_ERR(same_sb_idx)) {
03991 PRINTMSG(SB_DEF_LINE(same_sb_idx), 942, Error,
03992 SB_DEF_COLUMN(same_sb_idx),
03993 SB_NAME_PTR(same_sb_idx));
03994 }
03995 SB_DCL_ERR(same_sb_idx) = TRUE;
03996 }
03997 else if (SB_BLK_TYPE(sb_idx) != SB_BLK_TYPE(same_sb_idx)) {
03998
03999 if (!SB_DCL_ERR(same_sb_idx)) {
04000 PRINTMSG(SB_DEF_LINE(same_sb_idx), 941, Error,
04001 SB_DEF_COLUMN(same_sb_idx),
04002 SB_NAME_PTR(same_sb_idx));
04003 }
04004 SB_DCL_ERR(same_sb_idx) = TRUE;
04005 }
04006
04007 if (SB_DEF_MULT_SCPS(sb_idx)) {
04008 SB_DEF_MULT_SCPS(same_sb_idx) = TRUE;
04009 }
04010
04011 if (SB_HAS_RENAMES(sb_idx)) {
04012 SB_HAS_RENAMES(same_sb_idx) = TRUE;
04013 }
04014
04015 if (fold_relationals(SB_LEN_IDX(sb_idx),
04016 SB_LEN_IDX(same_sb_idx),
04017 Gt_Opr)) {
04018 SB_LEN_FLD(same_sb_idx) = SB_LEN_FLD(sb_idx);
04019 SB_LEN_IDX(same_sb_idx) = SB_LEN_IDX(sb_idx);
04020 }
04021 }
04022 else if (SB_USE_ASSOCIATED(sb_idx) || SB_HOST_ASSOCIATED(sb_idx)) {
04023
04024 # if defined(_TMP_GIVES_COMMON_LENGTH)
04025 if (SB_BLK_TYPE(sb_idx) == Static || SB_IS_COMMON(sb_idx))
04026 # else
04027 if (SB_PAD_BLK(sb_idx))
04028 # endif
04029 {
04030 if (SB_LEN_FLD(sb_idx) == AT_Tbl_Idx ||
04031 fold_relationals(CN_INTEGER_ZERO_IDX,
04032 SB_LEN_IDX(sb_idx),
04033 Ne_Opr)) {
04034
04035
04036
04037
04038
04039
04040
04041
04042
04043
04044
04045
04046
04047
04048
04049
04050
04051 attr_idx = gen_compiler_tmp(SB_DEF_LINE(sb_idx),
04052 SB_DEF_COLUMN(sb_idx),
04053 Priv, TRUE);
04054
04055 ATD_TYPE_IDX(attr_idx) = TYPELESS_DEFAULT_TYPE;
04056 AT_REFERENCED(attr_idx) = Not_Referenced;
04057 ATD_STOR_BLK_IDX(attr_idx) = sb_idx;
04058 ADD_ATTR_TO_LOCAL_LIST(attr_idx);
04059 }
04060 }
04061
04062 if (SB_HOST_ASSOCIATED(sb_idx)) {
04063
04064
04065
04066
04067
04068
04069
04070
04071
04072
04073
04074
04075
04076
04077
04078
04079 host_sb_idx = srch_stor_blk_tbl(SB_NAME_PTR(sb_idx),
04080 SB_NAME_LEN(sb_idx),
04081 SB_ORIG_SCP_IDX(sb_idx));
04082
04083 if (fold_relationals(SB_LEN_IDX(host_sb_idx),
04084 SB_LEN_IDX(sb_idx),
04085 Gt_Opr)) {
04086 SB_LEN_FLD(sb_idx) = SB_LEN_FLD(host_sb_idx);
04087 SB_LEN_IDX(sb_idx) = SB_LEN_IDX(host_sb_idx);
04088 }
04089 }
04090 }
04091 else if (SB_PAD_BLK(sb_idx)) {
04092
04093
04094
04095
04096 if (SB_LEN_FLD(sb_idx) == AT_Tbl_Idx ||
04097 fold_relationals(CN_INTEGER_ZERO_IDX,
04098 SB_LEN_IDX(sb_idx),
04099 Ne_Opr)) {
04100
04101
04102
04103
04104
04105
04106
04107
04108
04109
04110
04111
04112
04113
04114 attr_idx = gen_compiler_tmp(SB_DEF_LINE(sb_idx),
04115 SB_DEF_COLUMN(sb_idx),
04116 Priv, TRUE);
04117
04118 ATD_TYPE_IDX(attr_idx) = TYPELESS_DEFAULT_TYPE;
04119 AT_REFERENCED(attr_idx) = Not_Referenced;
04120 ATD_STOR_BLK_IDX(attr_idx) = sb_idx;
04121 ADD_ATTR_TO_LOCAL_LIST(attr_idx);
04122 }
04123 }
04124 }
04125
04126 TRACE (Func_Exit, "storage_blk_resolution", NULL);
04127
04128 return;
04129
04130 }
04131
04132
04133
04134
04135
04136
04137
04138
04139
04140
04141
04142
04143
04144
04145
04146
04147 void interface_semantics_pass_driver (void)
04148
04149 {
04150 int sb_idx;
04151
04152 TRACE (Func_Entry, "interface_semantics_pass_driver", NULL);
04153
04154
04155
04156
04157
04158
04159
04160
04161
04162
04163
04164
04165
04166
04167
04168
04169
04170
04171
04172
04173
04174
04175
04176
04177
04178
04179
04180
04181
04182
04183
04184
04185
04186
04187
04188 decl_semantics();
04189 final_decl_semantics();
04190
04191 PRINT_DBG_SYTB;
04192
04193 for (sb_idx = 1; sb_idx <= stor_blk_tbl_idx; sb_idx++) {
04194
04195 if (SB_SCP_IDX(sb_idx) == curr_scp_idx) {
04196 SB_SCP_IDX(sb_idx) = NULL_IDX;
04197 SB_ORIG_SCP_IDX(sb_idx) = NULL_IDX;
04198 }
04199 }
04200
04201 ATP_SCP_ALIVE(SCP_ATTR_IDX(curr_scp_idx)) = FALSE;
04202
04203 TRACE (Func_Exit, "interface_semantics_pass_driver", NULL);
04204
04205 return;
04206
04207 }
04208
04209
04210
04211
04212
04213
04214
04215
04216
04217
04218
04219
04220
04221
04222
04223
04224
04225 static void free_stmt_tmp_tbl(void)
04226
04227 {
04228
04229 int i;
04230 int k;
04231 int list_idx;
04232 int list2_idx;
04233
04234 TRACE (Func_Entry, "free_stmt_tmp_tbl", NULL);
04235
04236 for (i = 0; i < Num_Linear_Types; i++) {
04237
04238 if (stmt_tmp_tbl[i].scalar_tmps_head < 0) {
04239 continue;
04240 }
04241
04242 if (stmt_tmp_tbl[i].scalar_tmps_head > 0) {
04243 list_idx = stmt_tmp_tbl[i].scalar_tmps_head;
04244
04245 while (list_idx) {
04246 list2_idx = list_idx;
04247 list_idx = IL_NEXT_LIST_IDX(list_idx);
04248 FREE_IR_LIST_NODE(list2_idx);
04249 }
04250 }
04251
04252 stmt_tmp_tbl[i].scalar_tmps_head = NULL_IDX;
04253 stmt_tmp_tbl[i].scalar_tmps_tail = NULL_IDX;
04254
04255 for (k = 0; k < 8; k++) {
04256
04257 if (stmt_tmp_tbl[i].dope_vector_tmps_head[k] > 0) {
04258 list_idx = stmt_tmp_tbl[i].dope_vector_tmps_head[k];
04259
04260 while (list_idx) {
04261 list2_idx = list_idx;
04262 list_idx = IL_NEXT_LIST_IDX(list_idx);
04263 FREE_IR_LIST_NODE(list2_idx);
04264 }
04265 }
04266
04267 stmt_tmp_tbl[i].dope_vector_tmps_head[k] = NULL_IDX;
04268 stmt_tmp_tbl[i].dope_vector_tmps_tail[k] = NULL_IDX;
04269 }
04270 }
04271
04272 TRACE (Func_Exit, "free_stmt_tmp_tbl", NULL);
04273
04274 return;
04275
04276 }
04277
04278
04279
04280
04281
04282
04283
04284
04285
04286
04287
04288
04289
04290
04291
04292
04293
04294 static void reset_stmt_tmp_tbl(void)
04295
04296 {
04297 int i;
04298 int k;
04299
04300
04301 TRACE (Func_Entry, "reset_stmt_tmp_tbl", NULL);
04302
04303 for (i = 0; i < Num_Linear_Types; i++) {
04304 stmt_tmp_tbl[i].scalar_tmps_head = init_stmt_tmp_tbl[i].scalar_tmps_head;
04305 stmt_tmp_tbl[i].scalar_tmps_tail = init_stmt_tmp_tbl[i].scalar_tmps_tail;
04306
04307 for (k = 0; k < 8; k++) {
04308 stmt_tmp_tbl[i].dope_vector_tmps_head[k] =
04309 init_stmt_tmp_tbl[i].dope_vector_tmps_head[k];
04310 stmt_tmp_tbl[i].dope_vector_tmps_tail[k] =
04311 init_stmt_tmp_tbl[i].dope_vector_tmps_tail[k];
04312
04313 }
04314 }
04315
04316 TRACE (Func_Exit, "reset_stmt_tmp_tbl", NULL);
04317
04318 return;
04319
04320 }
04321
04322
04323
04324
04325
04326
04327
04328
04329
04330
04331
04332
04333
04334
04335
04336
04337
04338
04339
04340
04341
04342 int check_global_pgm_unit(int attr_idx)
04343
04344 {
04345 int ga_common_idx;
04346 int ga_pgm_idx;
04347 msg_severities_type msg_level;
04348 int name_idx;
04349 int new_ga_idx;
04350 int ref_ga_idx;
04351
04352
04353 TRACE (Func_Entry, "check_global_pgm_unit", NULL);
04354
04355 if (srch_global_name_tbl(AT_OBJ_NAME_PTR(attr_idx),
04356 AT_NAME_LEN(attr_idx),
04357 &name_idx)) {
04358
04359 if (GA_OBJ_CLASS(GN_ATTR_IDX(name_idx)) == Common_Block) {
04360 ga_common_idx = GN_ATTR_IDX(name_idx);
04361 ga_pgm_idx = GAC_PGM_UNIT_IDX(ga_common_idx);
04362 }
04363 else {
04364 ga_common_idx = NULL_IDX;
04365 ga_pgm_idx = GN_ATTR_IDX(name_idx);
04366 }
04367
04368 if (ga_common_idx != NULL_IDX && ga_pgm_idx == NULL_IDX) {
04369
04370
04371
04372 # if defined(_ERROR_DUPLICATE_GLOBALS)
04373 msg_level = Error;
04374 # else
04375 msg_level = (ATP_PGM_UNIT(attr_idx) == Module) ? Error : Ansi;
04376 # endif
04377 PRINTMSG(AT_DEF_LINE(attr_idx), 1006, msg_level,
04378 AT_DEF_COLUMN(attr_idx),
04379 AT_OBJ_NAME_PTR(attr_idx),
04380 pgm_unit_str[ATP_PGM_UNIT(attr_idx)]);
04381 }
04382
04383 if (ga_pgm_idx == NULL_IDX) {
04384 ga_pgm_idx = ntr_global_attr_tbl(attr_idx, name_idx);
04385
04386
04387
04388 GAC_PGM_UNIT_IDX(ga_common_idx) = ga_pgm_idx;
04389
04390 fill_in_global_attr_ntry(ga_pgm_idx, attr_idx, NULL_IDX);
04391 }
04392 else if (GAP_PGM_UNIT_DEFINED(ga_pgm_idx) &&
04393 GAP_NEXT_PGM_UNIT_IDX(ga_pgm_idx) == NULL_IDX) {
04394
04395
04396
04397
04398 global_name_semantics(ga_pgm_idx,
04399 NULL_IDX,
04400 NULL_IDX,
04401 NULL_IDX,
04402 attr_idx);
04403
04404
04405 }
04406 else if (GA_DEFINED(ga_pgm_idx) &&
04407 !GAP_PGM_UNIT_DEFINED(ga_pgm_idx) &&
04408 GAP_IN_INTERFACE_BLK(ga_pgm_idx)) {
04409
04410
04411
04412
04413 global_name_semantics(ga_pgm_idx,
04414 NULL_IDX,
04415 NULL_IDX,
04416 NULL_IDX,
04417 attr_idx);
04418
04419 if (ATP_EXPL_ITRFC(attr_idx) &&
04420 !SCP_IS_INTERFACE(curr_scp_idx) &&
04421 (attr_idx == SCP_ATTR_IDX(curr_scp_idx) ||
04422 (ATP_SCP_ALIVE(attr_idx) && ATP_ALT_ENTRY(attr_idx)))) {
04423
04424
04425
04426 new_ga_idx = ntr_global_attr_tbl(attr_idx, name_idx);
04427
04428 fill_in_global_attr_ntry(new_ga_idx, attr_idx, NULL_IDX);
04429
04430 if (GA_OBJ_CLASS(GN_ATTR_IDX(name_idx)) == Common_Block) {
04431 GAC_PGM_UNIT_IDX(GN_ATTR_IDX(name_idx)) = new_ga_idx;
04432 }
04433 else {
04434 GN_ATTR_IDX(name_idx) = new_ga_idx;
04435 }
04436 }
04437 }
04438 else if (GA_DEFINED(ga_pgm_idx) &&
04439 !GAP_PGM_UNIT_DEFINED(ga_pgm_idx)) {
04440
04441
04442
04443 new_ga_idx = ntr_global_attr_tbl(attr_idx, name_idx);
04444 fill_in_global_attr_ntry(new_ga_idx, attr_idx, NULL_IDX);
04445
04446 GAP_NEXT_PGM_UNIT_IDX(new_ga_idx) = ga_pgm_idx;
04447
04448 if (GA_OBJ_CLASS(GN_ATTR_IDX(name_idx)) == Common_Block) {
04449 GAC_PGM_UNIT_IDX(GN_ATTR_IDX(name_idx)) = new_ga_idx;
04450 }
04451 else {
04452 GN_ATTR_IDX(name_idx) = new_ga_idx;
04453 }
04454 }
04455 else {
04456
04457
04458
04459
04460
04461
04462 ref_ga_idx = ga_pgm_idx;
04463
04464 while (ref_ga_idx != NULL_IDX) {
04465 global_name_semantics(ref_ga_idx,
04466 NULL_IDX,
04467 NULL_IDX,
04468 NULL_IDX,
04469 attr_idx);
04470
04471
04472 ref_ga_idx = GAP_NEXT_PGM_UNIT_IDX(ref_ga_idx);
04473 }
04474
04475 new_ga_idx = ntr_global_attr_tbl(attr_idx, name_idx);
04476 fill_in_global_attr_ntry(new_ga_idx, attr_idx, NULL_IDX);
04477
04478 if (GA_OBJ_CLASS(GN_ATTR_IDX(name_idx)) == Common_Block) {
04479 GAC_PGM_UNIT_IDX(GN_ATTR_IDX(name_idx)) = new_ga_idx;
04480 }
04481 else {
04482 GN_ATTR_IDX(name_idx) = new_ga_idx;
04483 }
04484 }
04485 }
04486 else {
04487 ntr_global_name_tbl(attr_idx, NULL_IDX, name_idx);
04488 }
04489
04490 TRACE (Func_Exit, "check_global_pgm_unit", NULL);
04491
04492 return(name_idx);
04493
04494 }
04495
04496
04497
04498
04499
04500
04501
04502
04503
04504
04505
04506
04507
04508
04509
04510
04511
04512
04513
04514 # ifdef _SEPARATE_FUNCTION_RETURNS
04515 static void check_multiple_entry_func(void)
04516
04517 {
04518 int al_idx;
04519 int attr_idx;
04520 int branch_idx;
04521 int col;
04522 boolean has_conflict = FALSE;
04523 int i;
04524 int ir_idx;
04525 int label_idx;
04526 int line;
04527 int list_idx;
04528 int prev_type_idx;
04529 int save_curr_stmt_sh_idx;
04530 int tmp_idx;
04531 int type_idx;
04532
04533
04534 TRACE (Func_Entry, "check_multiple_entry_func", NULL);
04535
04536 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
04537 attr_idx = SCP_ATTR_IDX(curr_scp_idx);
04538 prev_type_idx = ATD_TYPE_IDX(ATP_RSLT_IDX(attr_idx));
04539
04540 al_idx = SCP_ENTRY_IDX(curr_scp_idx);
04541
04542 for (i = 0; i < SCP_ALT_ENTRY_CNT(curr_scp_idx); i++) {
04543
04544 attr_idx = AL_ATTR_IDX(al_idx);
04545 type_idx = ATD_TYPE_IDX(ATP_RSLT_IDX(attr_idx));
04546
04547 if (TYP_TYPE(type_idx) != TYP_TYPE(prev_type_idx)) {
04548 has_conflict = TRUE;
04549 break;
04550 }
04551 else if ((TYP_TYPE(type_idx) == Real ||
04552 TYP_TYPE(type_idx) == Complex) &&
04553 TYP_LINEAR(type_idx) != TYP_LINEAR(prev_type_idx)) {
04554
04555 has_conflict = TRUE;
04556 break;
04557 }
04558
04559 al_idx = AL_NEXT_IDX(al_idx);
04560 }
04561
04562 if (has_conflict) {
04563
04564
04565
04566 attr_idx = SCP_ATTR_IDX(curr_scp_idx);
04567 type_idx = ATD_TYPE_IDX(ATP_RSLT_IDX(attr_idx));
04568 line = SH_GLB_LINE(SCP_LAST_SH_IDX(curr_scp_idx));
04569 col = SH_COL_NUM(SCP_LAST_SH_IDX(curr_scp_idx));
04570
04571 set_up_which_entry_tmp();
04572
04573 tmp_idx = SCP_WHICH_ENTRY_TMP(curr_scp_idx);
04574
04575
04576
04577 label_idx = gen_internal_lbl(line);
04578 curr_stmt_sh_idx = SCP_LAST_SH_IDX(curr_scp_idx);
04579 gen_sh(After, Continue_Stmt, line, col, FALSE, TRUE, TRUE);
04580
04581 NTR_IR_TBL(ir_idx);
04582 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
04583 IR_OPR(ir_idx) = Label_Opr;
04584 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
04585 IR_LINE_NUM(ir_idx) = line;
04586 IR_COL_NUM(ir_idx) = col;
04587 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
04588 IR_IDX_L(ir_idx) = label_idx;
04589 IR_COL_NUM_L(ir_idx) = col;
04590 IR_LINE_NUM_L(ir_idx) = line;
04591
04592 AT_DEFINED(label_idx) = TRUE;
04593 ATL_DEF_STMT_IDX(label_idx) = curr_stmt_sh_idx;
04594
04595 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
04596
04597 SCP_RETURN_LABEL(curr_scp_idx) = label_idx;
04598
04599
04600
04601 NTR_IR_TBL(branch_idx);
04602 IR_OPR(branch_idx) = Br_Index_Opr;
04603 IR_TYPE_IDX(branch_idx) = CG_INTEGER_DEFAULT_TYPE;
04604 IR_LINE_NUM(branch_idx) = line;
04605 IR_COL_NUM(branch_idx) = col;
04606 IR_FLD_L(branch_idx) = AT_Tbl_Idx;
04607 IR_IDX_L(branch_idx) = tmp_idx;
04608 IR_LINE_NUM_L(branch_idx) = line;
04609 IR_COL_NUM_L(branch_idx) = col;
04610
04611 gen_sh(After, Goto_Stmt, line, col, FALSE, FALSE, TRUE);
04612 SH_IR_IDX(curr_stmt_sh_idx) = branch_idx;
04613 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
04614
04615 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
04616
04617
04618
04619 NTR_IR_LIST_TBL(list_idx);
04620 IR_FLD_R(branch_idx) = IL_Tbl_Idx;
04621 IR_IDX_R(branch_idx) = list_idx;
04622 IR_LIST_CNT_R(branch_idx) = 1;
04623
04624 label_idx = gen_internal_lbl(line);
04625 curr_stmt_sh_idx = SCP_LAST_SH_IDX(curr_scp_idx);
04626 gen_sh(After, Continue_Stmt, line, col, FALSE, TRUE, TRUE);
04627
04628 NTR_IR_TBL(ir_idx);
04629 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
04630 IR_OPR(ir_idx) = Label_Opr;
04631 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
04632 IR_LINE_NUM(ir_idx) = line;
04633 IR_COL_NUM(ir_idx) = col;
04634 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
04635 IR_IDX_L(ir_idx) = label_idx;
04636 IR_COL_NUM_L(ir_idx) = col;
04637 IR_LINE_NUM_L(ir_idx) = line;
04638
04639 AT_DEFINED(label_idx) = TRUE;
04640 ATL_DEF_STMT_IDX(label_idx) = curr_stmt_sh_idx;
04641
04642 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
04643
04644 IL_FLD(list_idx) = AT_Tbl_Idx;
04645 IL_IDX(list_idx) = label_idx;
04646 IL_LINE_NUM(list_idx) = line;
04647 IL_COL_NUM(list_idx) = col;
04648
04649 NTR_IR_TBL(ir_idx);
04650 IR_OPR(ir_idx) = Return_Opr;
04651 IR_TYPE_IDX(ir_idx) = type_idx;
04652 IR_LINE_NUM(ir_idx) = line;
04653 IR_COL_NUM(ir_idx) = col;
04654
04655 IR_FLD_R(ir_idx) = AT_Tbl_Idx;
04656 IR_IDX_R(ir_idx) = ATP_RSLT_IDX(attr_idx);
04657 IR_LINE_NUM_R(ir_idx) = line;
04658 IR_COL_NUM_R(ir_idx) = col;
04659
04660 gen_sh(After, Return_Stmt, line, col, FALSE, FALSE, TRUE);
04661 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
04662 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
04663
04664 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
04665
04666 al_idx = SCP_ENTRY_IDX(curr_scp_idx);
04667
04668 for (i = 0; i < SCP_ALT_ENTRY_CNT(curr_scp_idx); i++) {
04669
04670 attr_idx = AL_ATTR_IDX(al_idx);
04671 type_idx = ATD_TYPE_IDX(ATP_RSLT_IDX(attr_idx));
04672
04673
04674
04675 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
04676 list_idx = IL_NEXT_LIST_IDX(list_idx);
04677 IR_LIST_CNT_R(branch_idx) += 1;
04678
04679 label_idx = gen_internal_lbl(line);
04680 curr_stmt_sh_idx = SCP_LAST_SH_IDX(curr_scp_idx);
04681 gen_sh(After, Continue_Stmt, line, col, FALSE, TRUE, TRUE);
04682
04683 NTR_IR_TBL(ir_idx);
04684 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
04685 IR_OPR(ir_idx) = Label_Opr;
04686 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
04687 IR_LINE_NUM(ir_idx) = line;
04688 IR_COL_NUM(ir_idx) = col;
04689 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
04690 IR_IDX_L(ir_idx) = label_idx;
04691 IR_COL_NUM_L(ir_idx) = col;
04692 IR_LINE_NUM_L(ir_idx) = line;
04693
04694 AT_DEFINED(label_idx) = TRUE;
04695 ATL_DEF_STMT_IDX(label_idx) = curr_stmt_sh_idx;
04696
04697 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
04698
04699 IL_FLD(list_idx) = AT_Tbl_Idx;
04700 IL_IDX(list_idx) = label_idx;
04701 IL_LINE_NUM(list_idx) = line;
04702 IL_COL_NUM(list_idx) = col;
04703
04704 NTR_IR_TBL(ir_idx);
04705 IR_OPR(ir_idx) = Return_Opr;
04706 IR_TYPE_IDX(ir_idx) = type_idx;;
04707 IR_LINE_NUM(ir_idx) = line;
04708 IR_COL_NUM(ir_idx) = col;
04709
04710 IR_FLD_R(ir_idx) = AT_Tbl_Idx;
04711 IR_IDX_R(ir_idx) = ATP_RSLT_IDX(attr_idx);
04712 IR_LINE_NUM_R(ir_idx) = line;
04713 IR_COL_NUM_R(ir_idx) = col;
04714
04715 gen_sh(After, Return_Stmt, line, col, FALSE, FALSE, TRUE);
04716 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
04717 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
04718
04719 SCP_LAST_SH_IDX(curr_scp_idx) = curr_stmt_sh_idx;
04720
04721 al_idx = AL_NEXT_IDX(al_idx);
04722 }
04723 }
04724
04725
04726 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
04727
04728 TRACE (Func_Exit, "check_multiple_entry_func", NULL);
04729
04730 return;
04731
04732 }
04733 # endif
04734
04735
04736
04737
04738
04739
04740
04741
04742
04743
04744
04745
04746
04747
04748
04749
04750 static void final_equivalence_semantics(void)
04751 {
04752 int attr_idx;
04753 size_offset_type base;
04754 boolean base_is_zero;
04755 int eq_idx;
04756 int group;
04757 int item;
04758 size_offset_type left;
04759 size_offset_type length;
04760 size_offset_type new_len;
04761 size_offset_type new_offset;
04762 boolean new_offset_ne_zero;
04763 size_offset_type result;
04764 int sb_idx;
04765 int type_idx;
04766 size_offset_type zero;
04767 boolean dalign_offset_ok;
04768 boolean dalign_shift_offset;
04769 int t_idx;
04770
04771
04772 TRACE (Func_Entry, "final_equivalence_semantics", NULL);
04773
04774 group = SCP_FIRST_EQUIV_GRP(curr_scp_idx);
04775
04776 while (group != NULL_IDX) {
04777
04778 if (EQ_SEMANTICS_DONE(group)) {
04779 group = EQ_NEXT_EQUIV_GRP(group);
04780 continue;
04781 }
04782 base.fld = CN_Tbl_Idx;
04783 base.idx = CN_INTEGER_ZERO_IDX;
04784 base_is_zero = TRUE;
04785 eq_idx = group;
04786 item = eq_idx;
04787
04788
04789
04790 while (item != NULL_IDX) {
04791
04792 if (EQ_OFFSET_IDX(item) != CN_INTEGER_ZERO_IDX &&
04793 fold_relationals(EQ_OFFSET_IDX(item), base.idx, Lt_Opr)) {
04794 base.idx = EQ_OFFSET_IDX(item);
04795 base.fld = EQ_OFFSET_FLD(item);
04796 base_is_zero = FALSE;
04797 }
04798
04799 item = EQ_NEXT_EQUIV_OBJ(item);
04800 }
04801
04802 type_idx = INTEGER_DEFAULT_TYPE;
04803
04804 if (!base_is_zero) {
04805 result.idx = CN_INTEGER_NEG_ONE_IDX;
04806 result.fld = CN_Tbl_Idx;
04807 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
04808
04809 size_offset_binary_calc(&base, &result, Mult_Opr, &base);
04810 }
04811
04812
04813
04814
04815
04816 sb_idx = ATD_STOR_BLK_IDX(EQ_ATTR_IDX(group));
04817
04818 if (SB_BLK_TYPE(sb_idx) == Static_Local ||
04819 SB_BLK_TYPE(sb_idx) == Static_Named ||
04820 SB_BLK_TYPE(sb_idx) == Static) {
04821
04822 if (SB_LEN_FLD(sb_idx) == AT_Tbl_Idx ||
04823 SB_LEN_IDX(sb_idx) != CN_INTEGER_ZERO_IDX) {
04824
04825 result.idx = SB_LEN_IDX(sb_idx);
04826 result.fld = SB_LEN_FLD(sb_idx);
04827
04828 align_bit_length(&result, TARGET_BITS_PER_WORD);
04829
04830 if (result.fld == NO_Tbl_Idx) {
04831 SB_LEN_FLD(sb_idx) = CN_Tbl_Idx;
04832 SB_LEN_IDX(sb_idx) = ntr_const_tbl(result.type_idx,
04833 FALSE,
04834 result.constant);
04835 }
04836 else {
04837 SB_LEN_FLD(sb_idx) = result.fld;
04838 SB_LEN_IDX(sb_idx) = result.idx;
04839 }
04840
04841 base_is_zero = FALSE;
04842
04843 size_offset_binary_calc(&result, &base, Plus_Opr, &base);
04844 }
04845 }
04846
04847 item = eq_idx;
04848
04849 # if defined(_TARGET_DOUBLE_ALIGN)
04850 dalign_offset_ok = FALSE;
04851 dalign_shift_offset = FALSE;
04852 # endif
04853
04854 while (item != NULL_IDX) {
04855 attr_idx = EQ_ATTR_IDX(item);
04856
04857 if (!base_is_zero) {
04858 result.fld = EQ_OFFSET_FLD(item);
04859 result.idx = EQ_OFFSET_IDX(item);
04860
04861 size_offset_binary_calc(&result, &base, Plus_Opr, &new_offset);
04862
04863 if (new_offset.fld == NO_Tbl_Idx) {
04864 EQ_OFFSET_FLD(item) = CN_Tbl_Idx;
04865 EQ_OFFSET_IDX(item) = ntr_const_tbl(new_offset.type_idx,
04866 FALSE,
04867 new_offset.constant);
04868 }
04869 else {
04870 EQ_OFFSET_FLD(item) = new_offset.fld;
04871 EQ_OFFSET_IDX(item) = new_offset.idx;
04872 }
04873 }
04874
04875 type_idx = ATD_TYPE_IDX(attr_idx);
04876
04877 if (SB_HOSTED_STACK(sb_idx)) {
04878 AT_HOST_ASSOCIATED(attr_idx) = TRUE;
04879 }
04880
04881
04882
04883 if (TYP_TYPE(type_idx) != Character) {
04884
04885 result.fld = CN_Tbl_Idx;
04886 result.idx = CN_INTEGER_BITS_PER_WORD_IDX;
04887 left.fld = EQ_OFFSET_FLD(item);
04888 left.idx = EQ_OFFSET_IDX(item);
04889 zero.fld = CN_Tbl_Idx;
04890 zero.idx = CN_INTEGER_ZERO_IDX;
04891
04892 size_offset_binary_calc(&left, &result, Mod_Opr, &result);
04893
04894 size_offset_logical_calc(&zero, &result, Ne_Opr, &result);
04895
04896 new_offset_ne_zero = THIS_IS_TRUE(result.constant, result.type_idx);
04897
04898 if (TYP_TYPE(type_idx) == Structure) {
04899
04900 if (ATT_NUMERIC_CPNT(TYP_IDX(type_idx)) && new_offset_ne_zero) {
04901
04902 # if defined(_TARGET_PACK_HALF_WORD_TYPES)
04903
04904 t_idx = ATD_TYPE_IDX(SN_ATTR_IDX(
04905 ATT_FIRST_CPNT_IDX(attr_idx)));
04906
04907 if (PACK_HALF_WORD_TEST_CONDITION(t_idx)) {
04908 C_TO_F_INT(result.constant,
04909 TARGET_BITS_PER_WORD/2,
04910 CG_INTEGER_DEFAULT_TYPE);
04911 result.fld = NO_Tbl_Idx;
04912 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
04913 left.fld = EQ_OFFSET_FLD(item);
04914 left.idx = EQ_OFFSET_IDX(item);
04915
04916 size_offset_binary_calc(&left, &result, Mod_Opr, &result);
04917
04918 size_offset_logical_calc(&zero, &result, Ne_Opr, &result);
04919
04920 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
04921 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
04922 EQ_COLUMN_NUM(item),
04923 AT_OBJ_NAME_PTR(attr_idx));
04924 }
04925 }
04926 else {
04927 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
04928 EQ_COLUMN_NUM(item),
04929 AT_OBJ_NAME_PTR(attr_idx));
04930 }
04931
04932 # elif defined(_INTEGER_1_AND_2)
04933
04934 if (on_off_flags.integer_1_and_2) {
04935
04936 t_idx = ATD_TYPE_IDX(SN_ATTR_IDX(
04937 ATT_FIRST_CPNT_IDX(attr_idx)));
04938
04939 if (PACK_8_BIT_TEST_CONDITION(t_idx)) {
04940 C_TO_F_INT(result.constant, 8, CG_INTEGER_DEFAULT_TYPE);
04941 result.fld = NO_Tbl_Idx;
04942 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
04943 left.fld = EQ_OFFSET_FLD(item);
04944 left.idx = EQ_OFFSET_IDX(item);
04945
04946 size_offset_binary_calc(&left,&result,Mod_Opr,&result);
04947
04948 size_offset_logical_calc(&zero,&result,Ne_Opr,&result);
04949
04950 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
04951 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
04952 EQ_COLUMN_NUM(item),
04953 AT_OBJ_NAME_PTR(attr_idx));
04954 }
04955 }
04956 else if (PACK_16_BIT_TEST_CONDITION(t_idx)) {
04957 C_TO_F_INT(result.constant, 16,CG_INTEGER_DEFAULT_TYPE);
04958 result.fld = NO_Tbl_Idx;
04959 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
04960 left.fld = EQ_OFFSET_FLD(item);
04961 left.idx = EQ_OFFSET_IDX(item);
04962
04963 size_offset_binary_calc(&left,&result,Mod_Opr,&result);
04964 size_offset_logical_calc(&zero,&result,Ne_Opr,&result);
04965
04966 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
04967 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
04968 EQ_COLUMN_NUM(item),
04969 AT_OBJ_NAME_PTR(attr_idx));
04970 }
04971 }
04972 else {
04973 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
04974 EQ_COLUMN_NUM(item),
04975 AT_OBJ_NAME_PTR(attr_idx));
04976 }
04977 }
04978 # else
04979 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
04980 EQ_COLUMN_NUM(item),
04981 AT_OBJ_NAME_PTR(attr_idx));
04982 # endif
04983 }
04984 }
04985 else if (new_offset_ne_zero) {
04986
04987 # if defined(_TARGET_PACK_HALF_WORD_TYPES)
04988
04989 if (PACK_HALF_WORD_TEST_CONDITION(type_idx)) {
04990
04991 C_TO_F_INT(result.constant,
04992 TARGET_BITS_PER_WORD/2,
04993 CG_INTEGER_DEFAULT_TYPE);
04994 result.fld = NO_Tbl_Idx;
04995 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
04996 left.fld = EQ_OFFSET_FLD(item);
04997 left.idx = EQ_OFFSET_IDX(item);
04998 zero.fld = CN_Tbl_Idx;
04999 zero.idx = CN_INTEGER_ZERO_IDX;
05000
05001 size_offset_binary_calc(&left, &result, Mod_Opr, &result);
05002
05003 size_offset_logical_calc(&zero, &result, Ne_Opr, &result);
05004
05005 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
05006 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
05007 EQ_COLUMN_NUM(item),
05008 AT_OBJ_NAME_PTR(attr_idx));
05009 }
05010 }
05011 else {
05012 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
05013 EQ_COLUMN_NUM(item),
05014 AT_OBJ_NAME_PTR(attr_idx));
05015 }
05016 # elif defined(_INTEGER_1_AND_2)
05017
05018 if (on_off_flags.integer_1_and_2) {
05019
05020 if (PACK_8_BIT_TEST_CONDITION(type_idx)) {
05021 C_TO_F_INT(result.constant, 8, CG_INTEGER_DEFAULT_TYPE);
05022 result.fld = NO_Tbl_Idx;
05023 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
05024 left.fld = EQ_OFFSET_FLD(item);
05025 left.idx = EQ_OFFSET_IDX(item);
05026 zero.fld = CN_Tbl_Idx;
05027 zero.idx = CN_INTEGER_ZERO_IDX;
05028
05029 size_offset_binary_calc(&left, &result, Mod_Opr, &result);
05030
05031 size_offset_logical_calc(&zero, &result, Ne_Opr, &result);
05032
05033 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
05034 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
05035 EQ_COLUMN_NUM(item),
05036 AT_OBJ_NAME_PTR(attr_idx));
05037 }
05038 }
05039 else if (PACK_16_BIT_TEST_CONDITION(type_idx)) {
05040 C_TO_F_INT(result.constant, 16, CG_INTEGER_DEFAULT_TYPE);
05041 result.fld = NO_Tbl_Idx;
05042 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
05043 left.fld = EQ_OFFSET_FLD(item);
05044 left.idx = EQ_OFFSET_IDX(item);
05045 zero.fld = CN_Tbl_Idx;
05046 zero.idx = CN_INTEGER_ZERO_IDX;
05047
05048 size_offset_binary_calc(&left, &result, Mod_Opr, &result);
05049
05050 size_offset_logical_calc(&zero, &result, Ne_Opr, &result);
05051
05052 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
05053 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
05054 EQ_COLUMN_NUM(item),
05055 AT_OBJ_NAME_PTR(attr_idx));
05056 }
05057 }
05058 else {
05059 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
05060 EQ_COLUMN_NUM(item),
05061 AT_OBJ_NAME_PTR(attr_idx));
05062 }
05063 }
05064 # else
05065 PRINTMSG(EQ_LINE_NUM(item), 527, Error,
05066 EQ_COLUMN_NUM(item),
05067 AT_OBJ_NAME_PTR(attr_idx));
05068 # endif
05069 }
05070 }
05071
05072 # if defined(_TARGET_DOUBLE_ALIGN)
05073
05074 if (EQ_DO_NOT_DALIGN(eq_idx)) {
05075
05076
05077 }
05078 else if (DALIGN_TEST_CONDITION(type_idx)) {
05079 C_TO_F_INT(result.constant,
05080 TARGET_BITS_PER_WORD * 2,
05081 CG_INTEGER_DEFAULT_TYPE);
05082 result.fld = NO_Tbl_Idx;
05083 result.type_idx = CG_INTEGER_DEFAULT_TYPE;
05084 left.fld = EQ_OFFSET_FLD(item);
05085 left.idx = EQ_OFFSET_IDX(item);
05086 zero.fld = CN_Tbl_Idx;
05087 zero.idx = CN_INTEGER_ZERO_IDX;
05088
05089 size_offset_binary_calc(&left, &result, Mod_Opr, &result);
05090
05091 size_offset_logical_calc(&zero, &result, Ne_Opr, &result);
05092
05093 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
05094
05095
05096
05097
05098
05099
05100
05101
05102
05103 if (dalign_offset_ok) {
05104 PRINTMSG(EQ_LINE_NUM(item), 1008,
05105 (cmd_line_flags.dalign) ? Error : Caution,
05106 EQ_COLUMN_NUM(item), AT_OBJ_NAME_PTR(attr_idx));
05107 }
05108 else {
05109 dalign_shift_offset = TRUE;
05110 EQ_DALIGN_ME(eq_idx) = TRUE;
05111 }
05112 }
05113 else if (dalign_shift_offset) {
05114
05115
05116
05117
05118
05119
05120
05121
05122 PRINTMSG(EQ_LINE_NUM(item), 1008,
05123 (cmd_line_flags.dalign) ? Error : Caution,
05124 EQ_COLUMN_NUM(item), AT_OBJ_NAME_PTR(attr_idx));
05125 }
05126 else {
05127 dalign_offset_ok = TRUE;
05128 EQ_DALIGN_ME(eq_idx) = TRUE;
05129 }
05130 }
05131 # endif
05132
05133 ATD_OFFSET_FLD(attr_idx) = EQ_OFFSET_FLD(item);
05134 ATD_OFFSET_IDX(attr_idx) = EQ_OFFSET_IDX(item);
05135
05136 if (!SB_IS_COMMON(sb_idx)) {
05137
05138 if (!ATD_OFFSET_ASSIGNED(attr_idx)) {
05139 ATD_OFFSET_ASSIGNED(attr_idx) = TRUE;
05140
05141 new_len = stor_bit_size_of(attr_idx, TRUE, FALSE);
05142
05143 align_bit_length(&new_len, TARGET_BITS_PER_WORD);
05144
05145 result.fld = ATD_OFFSET_FLD(attr_idx);
05146 result.idx = ATD_OFFSET_IDX(attr_idx);
05147 length.fld = SB_LEN_FLD(sb_idx);
05148 length.idx = SB_LEN_IDX(sb_idx);
05149
05150 size_offset_binary_calc(&result, &new_len, Plus_Opr, &new_len);
05151 size_offset_logical_calc(&new_len, &length, Gt_Opr, &result);
05152
05153 if (THIS_IS_TRUE(result.constant, result.type_idx)) {
05154 SB_LEN_IDX(sb_idx) = ntr_const_tbl(new_len.type_idx,
05155 FALSE,
05156 new_len.constant);
05157 }
05158 }
05159 }
05160 item = EQ_NEXT_EQUIV_OBJ(item);
05161 }
05162
05163
05164 # if defined(_TARGET_DOUBLE_ALIGN)
05165
05166
05167
05168
05169 if (dalign_shift_offset && !dalign_offset_ok) {
05170
05171
05172
05173
05174
05175
05176
05177 EQ_DALIGN_SHIFT(eq_idx) = TRUE;
05178
05179
05180
05181
05182
05183
05184 if (!SB_IS_COMMON(sb_idx)) {
05185 item = eq_idx;
05186
05187 while (item != NULL_IDX) {
05188 EQ_DALIGN_ME(item) = TRUE;
05189 result.fld = CN_Tbl_Idx;
05190 result.idx = CN_INTEGER_BITS_PER_WORD_IDX;
05191 left.fld = EQ_OFFSET_FLD(item);
05192 left.idx = EQ_OFFSET_IDX(item);
05193
05194 if (!size_offset_binary_calc(&left, &result, Plus_Opr, &result)){
05195 AT_DCL_ERR(EQ_ATTR_IDX(item)) = TRUE;
05196 }
05197
05198 if (result.fld == NO_Tbl_Idx) {
05199 ATD_OFFSET_FLD(EQ_ATTR_IDX(item)) = CN_Tbl_Idx;
05200 ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) = ntr_const_tbl(
05201 result.type_idx,
05202 FALSE,
05203 result.constant);
05204 }
05205 else {
05206 ATD_OFFSET_FLD(EQ_ATTR_IDX(item)) = result.fld;
05207 ATD_OFFSET_IDX(EQ_ATTR_IDX(item)) = result.idx;
05208 }
05209 item = EQ_NEXT_EQUIV_OBJ(item);
05210 }
05211
05212 result.fld = CN_Tbl_Idx;
05213 result.idx = CN_INTEGER_BITS_PER_WORD_IDX;
05214 left.fld = SB_LEN_FLD(sb_idx);
05215 left.idx = SB_LEN_IDX(sb_idx);
05216
05217 if (!size_offset_binary_calc(&left, &result, Plus_Opr, &result)) {
05218 AT_DCL_ERR(EQ_ATTR_IDX(item)) = TRUE;
05219 }
05220
05221 if (result.fld == NO_Tbl_Idx) {
05222 SB_LEN_FLD(sb_idx) = CN_Tbl_Idx;
05223 SB_LEN_IDX(sb_idx) = ntr_const_tbl(result.type_idx,
05224 FALSE,
05225 result.constant);
05226 }
05227 else {
05228 SB_LEN_FLD(sb_idx) = result.fld;
05229 SB_LEN_IDX(sb_idx) = result.idx;
05230 }
05231 }
05232 else {
05233 item = eq_idx;
05234
05235 while (item != NULL_IDX) {
05236 EQ_DALIGN_SHIFT(item) = TRUE;
05237 EQ_DALIGN_ME(item) = TRUE;
05238 item = EQ_NEXT_EQUIV_OBJ(item);
05239 }
05240 }
05241 }
05242 else if (dalign_shift_offset || dalign_offset_ok) {
05243 item = eq_idx;
05244
05245 while (item != NULL_IDX) {
05246 EQ_DALIGN_ME(item) = TRUE;
05247 item = EQ_NEXT_EQUIV_OBJ(item);
05248 }
05249 }
05250 # endif
05251
05252 group = EQ_NEXT_EQUIV_GRP(group);
05253 }
05254
05255 TRACE (Func_Exit, "final_equivalence_semantics", NULL);
05256
05257 return;
05258
05259 }
05260
05261
05262
05263
05264
05265
05266
05267
05268
05269
05270
05271
05272
05273
05274
05275
05276
05277
05278
05279 void set_up_which_entry_tmp(void)
05280
05281 {
05282
05283 int al_idx;
05284 int asg_idx;
05285 int attr_idx;
05286 int col;
05287 int i;
05288 int line;
05289 int save_curr_stmt_sh_idx;
05290 long_type the_constant;
05291 int tmp_idx;
05292
05293
05294 TRACE (Func_Entry, "set_up_which_entry_tmp", NULL);
05295
05296 if (SCP_WHICH_ENTRY_TMP(curr_scp_idx) == NULL_IDX) {
05297
05298 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
05299
05300
05301
05302 attr_idx = SCP_ATTR_IDX(curr_scp_idx);
05303 line = SH_GLB_LINE(SCP_LAST_SH_IDX(curr_scp_idx));
05304 col = SH_COL_NUM(SCP_LAST_SH_IDX(curr_scp_idx));
05305
05306
05307
05308 tmp_idx = gen_compiler_tmp(line, col, Priv, TRUE);
05309
05310 SCP_WHICH_ENTRY_TMP(curr_scp_idx) = tmp_idx;
05311
05312 AT_SEMANTICS_DONE(tmp_idx) = TRUE;
05313 ATD_TYPE_IDX(tmp_idx) = CG_INTEGER_DEFAULT_TYPE;
05314 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_STACK_IDX(curr_scp_idx);
05315
05316
05317
05318 the_constant = 1;
05319
05320 NTR_IR_TBL(asg_idx);
05321 IR_OPR(asg_idx) = Asg_Opr;
05322 IR_TYPE_IDX(asg_idx) = CG_INTEGER_DEFAULT_TYPE;
05323 IR_LINE_NUM(asg_idx) = line;
05324 IR_COL_NUM(asg_idx) = col;
05325 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
05326 IR_IDX_L(asg_idx) = tmp_idx;
05327 IR_LINE_NUM_L(asg_idx) = line;
05328 IR_COL_NUM_L(asg_idx) = col;
05329 IR_LINE_NUM_R(asg_idx) = line;
05330 IR_COL_NUM_R(asg_idx) = col;
05331 IR_FLD_R(asg_idx) = CN_Tbl_Idx;
05332 IR_IDX_R(asg_idx) = CN_INTEGER_ONE_IDX;
05333
05334 curr_stmt_sh_idx = SCP_FIRST_SH_IDX(curr_scp_idx);
05335 gen_sh(After, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
05336 SH_IR_IDX(curr_stmt_sh_idx) = asg_idx;
05337 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
05338
05339 al_idx = SCP_ENTRY_IDX(curr_scp_idx);
05340
05341 for (i = 0; i < SCP_ALT_ENTRY_CNT(curr_scp_idx); i++) {
05342
05343 attr_idx = AL_ATTR_IDX(al_idx);
05344
05345 the_constant++;
05346
05347
05348
05349 NTR_IR_TBL(asg_idx);
05350 IR_OPR(asg_idx) = Asg_Opr;
05351 IR_TYPE_IDX(asg_idx) = CG_INTEGER_DEFAULT_TYPE;
05352 IR_LINE_NUM(asg_idx) = line;
05353 IR_COL_NUM(asg_idx) = col;
05354 IR_FLD_L(asg_idx) = AT_Tbl_Idx;
05355 IR_IDX_L(asg_idx) = tmp_idx;
05356 IR_LINE_NUM_L(asg_idx) = line;
05357 IR_COL_NUM_L(asg_idx) = col;
05358 IR_LINE_NUM_R(asg_idx) = line;
05359 IR_COL_NUM_R(asg_idx) = col;
05360 IR_FLD_R(asg_idx) = CN_Tbl_Idx;
05361 IR_IDX_R(asg_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
05362 the_constant);
05363
05364 curr_stmt_sh_idx = ATP_FIRST_SH_IDX(attr_idx);
05365 gen_sh(After, Assignment_Stmt, line, col, FALSE, FALSE, TRUE);
05366 SH_IR_IDX(curr_stmt_sh_idx) = asg_idx;
05367 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
05368
05369 al_idx = AL_NEXT_IDX(al_idx);
05370 }
05371
05372 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
05373 }
05374
05375
05376 TRACE (Func_Exit, "set_up_which_entry_tmp", NULL);
05377
05378 return;
05379
05380 }
05381
05382
05383
05384
05385
05386
05387
05388
05389
05390
05391
05392
05393
05394
05395
05396
05397
05398 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
05399 static void gen_user_code_start_opr(void)
05400
05401 {
05402
05403 int idx;
05404 int ir_idx;
05405 int save_curr_stmt_sh_idx;
05406
05407 TRACE (Func_Entry, "gen_user_code_start_opr", NULL);
05408
05409 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
05410 curr_stmt_sh_idx = SCP_FIRST_SH_IDX(curr_scp_idx);
05411
05412 NTR_IR_TBL(ir_idx);
05413 IR_OPR(ir_idx) = User_Code_Start_Opr;
05414 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
05415 IR_LINE_NUM(ir_idx) = SH_GLB_LINE(curr_stmt_sh_idx);
05416 IR_COL_NUM(ir_idx) = 1;
05417
05418 gen_sh(After, Directive_Stmt, SH_GLB_LINE(curr_stmt_sh_idx), 1,
05419 FALSE, FALSE, TRUE);
05420
05421 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
05422 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
05423
05424 idx = SCP_ENTRY_IDX(curr_scp_idx);
05425
05426 while (idx) {
05427 curr_stmt_sh_idx = ATP_FIRST_SH_IDX(AL_ATTR_IDX(idx));
05428
05429 NTR_IR_TBL(ir_idx);
05430 IR_OPR(ir_idx) = User_Code_Start_Opr;
05431 IR_TYPE_IDX(ir_idx) = TYPELESS_DEFAULT_TYPE;
05432 IR_LINE_NUM(ir_idx) = SH_GLB_LINE(curr_stmt_sh_idx);
05433 IR_COL_NUM(ir_idx) = 1;
05434
05435 gen_sh(After, Directive_Stmt, SH_GLB_LINE(curr_stmt_sh_idx), 1,
05436 FALSE, FALSE, TRUE);
05437
05438 SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE;
05439 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
05440
05441 idx = AL_NEXT_IDX(idx);
05442 }
05443
05444
05445 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
05446
05447 TRACE (Func_Exit, "gen_user_code_start_opr", NULL);
05448
05449 return;
05450
05451 }
05452 # endif
05453
05454
05455
05456
05457
05458
05459
05460
05461
05462
05463
05464
05465
05466
05467
05468
05469
05470 # if (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN))
05471 static void insert_global_sh(void)
05472
05473 {
05474 int gl_sh_idx;
05475 int save_curr_stmt_sh_idx;
05476 int sh_idx;
05477
05478 TRACE (Func_Entry, "insert_global_sh", NULL);
05479
05480 save_curr_stmt_sh_idx = curr_stmt_sh_idx;
05481 curr_stmt_sh_idx = SCP_FIRST_SH_IDX(curr_scp_idx);
05482 gl_sh_idx = global_stmt_sh_idx;
05483
05484 while (gl_sh_idx) {
05485
05486 sh_idx = copy_from_gl_subtree(gl_sh_idx, SH_Tbl_Idx);
05487
05488 SH_NEXT_IDX(sh_idx) = SH_NEXT_IDX(curr_stmt_sh_idx);
05489 if (SH_NEXT_IDX(sh_idx) != NULL_IDX) {
05490 SH_PREV_IDX(SH_NEXT_IDX(sh_idx)) = sh_idx;
05491 }
05492 SH_PREV_IDX(sh_idx) = curr_stmt_sh_idx;
05493 SH_NEXT_IDX(curr_stmt_sh_idx) = sh_idx;
05494 curr_stmt_sh_idx = sh_idx;
05495
05496 gl_sh_idx = GL_SH_NEXT_IDX(gl_sh_idx);
05497 }
05498
05499 curr_stmt_sh_idx = save_curr_stmt_sh_idx;
05500
05501 TRACE (Func_Exit, "insert_global_sh", NULL);
05502
05503 return;
05504
05505 }
05506 # endif
05507
05508 #ifdef KEY
05509
05510
05511
05512
05513
05514
05515
05516
05517
05518
05519 static void
05520 check_bind_attr(int def_ga_idx, int ref_bind_attr,
05521 const char *ref_binding_label, int ref_binding_label_len, int ref_line,
05522 int ref_column, const char *ref_name_ptr, const char *line_name) {
05523 if (GA_BIND_ATTR(def_ga_idx) ^ ref_bind_attr) {
05524 PRINTMSG(ref_line, 1624, Error, ref_column,
05525 ref_name_ptr,
05526 line_name,
05527 "BIND");
05528 }
05529 else if (ref_bind_attr) {
05530 const char *ga_binding_label = GA_BINDING_LABEL(def_ga_idx);
05531 int ga_binding_label_len = strlen(ga_binding_label);
05532 if (ref_binding_label_len != ga_binding_label_len ||
05533 strncmp(ga_binding_label, ref_binding_label, ref_binding_label_len)) {
05534 PRINTMSG(ref_line, 1700, Error, ref_column, ref_name_ptr,
05535 ga_binding_label, line_name);
05536 }
05537 }
05538 }
05539 #endif
05540
05541
05542
05543
05544
05545
05546
05547
05548
05549
05550
05551
05552
05553
05554
05555
05556
05557
05558
05559
05560
05561
05562
05563
05564
05565
05566
05567
05568
05569 void global_name_semantics(int def_ga_idx,
05570 int ref_ga_idx,
05571 int list_idx,
05572 int spec_idx,
05573 int attr_idx)
05574
05575 {
05576 uint act_file_line;
05577 #ifdef KEY
05578 int arg_attr_idx = 0;
05579 #else
05580 int arg_attr_idx;
05581 #endif
05582 int def_arg_idx;
05583 boolean def_defined;
05584 int gl_idx;
05585 int i;
05586 #ifdef KEY
05587 int il_idx = 0;
05588 int info_idx = 0;
05589 #else
05590 int il_idx;
05591 int info_idx;
05592 #endif
05593 char line_name[256];
05594 msg_severities_type msg_level;
05595 int msg_num;
05596 boolean need_expl_itrfc;
05597 #ifdef KEY
05598 int next_il_idx = 0;
05599 #else
05600 int next_il_idx;
05601 #endif
05602 int ref_arg_class;
05603 boolean ref_arg_class_known;
05604 int ref_arg_column;
05605 #ifdef KEY
05606 int ref_arg_idx = 0;
05607 #else
05608 int ref_arg_idx;
05609 #endif
05610 int ref_arg_line;
05611 char *ref_arg_name_ptr;
05612 #ifdef KEY
05613 int ref_array_elt = 0;
05614 #else
05615 int ref_array_elt;
05616 #endif
05617 int ref_column;
05618 boolean ref_defined;
05619 boolean ref_elemental;
05620 #ifdef KEY
05621 boolean ref_bind_attr = 0;
05622 const char * ref_binding_label = 0;
05623 int ref_binding_label_len = 0;
05624 #endif
05625 boolean ref_global_dir;
05626 #ifdef KEY
05627 int ref_hollerith = 0;
05628 #else
05629 int ref_hollerith;
05630 #endif
05631 boolean ref_in_interface;
05632 int ref_line;
05633 #ifdef KEY
05634 int ref_linear_type = 0;
05635 #else
05636 int ref_linear_type;
05637 #endif
05638 char *ref_name_ptr;
05639 boolean ref_nosideeffects;
05640 int ref_num_dargs;
05641 int ref_pgm_unit;
05642 boolean ref_pure;
05643 int ref_rank;
05644 boolean ref_recursive;
05645 int ref_rslt_idx;
05646 #ifdef KEY
05647 int ref_type = 0;
05648 #else
05649 int ref_type;
05650 #endif
05651 boolean ref_vfunction;
05652 boolean same;
05653 int type_idx;
05654
05655
05656 TRACE (Func_Entry, "global_name_semantics", NULL);
05657
05658 need_expl_itrfc = FALSE;
05659 def_defined = GA_DEFINED(def_ga_idx);
05660 line_name[0] = '\0';
05661
05662 GLOBAL_LINE_TO_FILE_LINE(GA_DEF_LINE(def_ga_idx),
05663 gl_idx,
05664 act_file_line);
05665 sprintf(line_name, "%d (%s)", act_file_line, GL_FILE_NAME_PTR(gl_idx));
05666
05667 if (ref_ga_idx != NULL_IDX) {
05668
05669
05670
05671 ref_arg_idx = GAP_FIRST_IDX(ref_ga_idx);
05672 ref_arg_idx--;
05673
05674 ref_rslt_idx = GAP_RSLT_IDX(ref_ga_idx);
05675 ref_pgm_unit = GAP_PGM_UNIT(ref_ga_idx);
05676 ref_num_dargs = GAP_NUM_DARGS(ref_ga_idx);
05677 ref_name_ptr = GA_OBJ_NAME_PTR(ref_ga_idx);
05678 ref_defined = GA_DEFINED(ref_ga_idx);
05679 ref_line = GA_DEF_LINE(ref_ga_idx);
05680 ref_column = GA_DEF_COLUMN(ref_ga_idx);
05681 ref_in_interface = !GAP_PGM_UNIT_DEFINED(ref_ga_idx);
05682 ref_elemental = GAP_ELEMENTAL(ref_ga_idx);
05683 ref_nosideeffects = GAP_NOSIDE_EFFECTS(ref_ga_idx);
05684 ref_pure = GAP_PURE(ref_ga_idx);
05685 ref_recursive = GAP_RECURSIVE(ref_ga_idx);
05686 ref_vfunction = GAP_VFUNCTION(ref_ga_idx);
05687 ref_global_dir = GAP_GLOBAL_DIR(ref_ga_idx);
05688 #ifdef KEY
05689 ref_bind_attr = GA_BIND_ATTR(ref_ga_idx);
05690 ref_binding_label = GA_BINDING_LABEL(ref_ga_idx);
05691 #endif
05692
05693 if (ref_rslt_idx == NULL_IDX) {
05694 ref_rank = 0;
05695 }
05696 else {
05697 ref_linear_type = GT_LINEAR_TYPE(GAD_TYPE_IDX(ref_rslt_idx));
05698 ref_type = GT_TYPE(GAD_TYPE_IDX(ref_rslt_idx));
05699 ref_rank = GAD_RANK(ref_rslt_idx);
05700
05701 if (ref_defined &&
05702 (GAD_POINTER(ref_rslt_idx) || ref_rank != 0 ||
05703 #ifdef KEY
05704 GAD_VOLATILE(ref_rslt_idx) ||
05705 #endif
05706 (ref_type == Character &&
05707 GT_CHAR_CLASS(GAD_TYPE_IDX(ref_rslt_idx)) == Var_Len_Char))) {
05708 need_expl_itrfc = TRUE;
05709 }
05710 }
05711 }
05712 else if (attr_idx != NULL_IDX) {
05713 ref_pgm_unit = ATP_PGM_UNIT(attr_idx);
05714 ref_name_ptr = AT_OBJ_NAME_PTR(attr_idx);
05715 ref_defined = ATP_EXPL_ITRFC(attr_idx);
05716 ref_line = AT_DEF_LINE(attr_idx);
05717 ref_column = AT_DEF_COLUMN(attr_idx);
05718 ref_in_interface = ATP_IN_INTERFACE_BLK(attr_idx);
05719 ref_elemental = ATP_ELEMENTAL(attr_idx);
05720 ref_nosideeffects = ATP_NOSIDE_EFFECTS(attr_idx);
05721 ref_pure = ATP_PURE(attr_idx);
05722 ref_recursive = ATP_RECURSIVE(attr_idx);
05723 ref_vfunction = ATP_VFUNCTION(attr_idx);
05724 ref_global_dir = FALSE;
05725 #ifdef KEY
05726 ref_bind_attr = AT_BIND_ATTR(attr_idx);
05727 ref_binding_label = ATP_EXT_NAME_PTR(attr_idx);
05728 ref_binding_label_len = ATP_EXT_NAME_LEN(attr_idx);
05729 #endif
05730
05731
05732
05733 if (ref_pgm_unit == Module) {
05734 ref_rslt_idx = NULL_IDX;
05735 ref_num_dargs = 0;
05736 ref_arg_idx = NULL_IDX;
05737 ref_rank = 0;
05738 }
05739 else {
05740 ref_rslt_idx = ATP_RSLT_IDX(attr_idx);
05741 ref_num_dargs = ATP_NUM_DARGS(attr_idx);
05742 ref_arg_idx = ATP_FIRST_IDX(attr_idx);
05743
05744
05745
05746
05747 if (ref_defined && ATP_EXTRA_DARG(attr_idx)) {
05748 ref_num_dargs--;
05749 }
05750 else {
05751 ref_arg_idx--;
05752 }
05753
05754 if (ref_rslt_idx == NULL_IDX) {
05755 ref_rank = 0;
05756 ref_linear_type = Err_Res;
05757 ref_type = Integer;
05758 }
05759 else {
05760 ref_linear_type = TYP_LINEAR(ATD_TYPE_IDX(ref_rslt_idx));
05761 ref_type = TYP_TYPE(ATD_TYPE_IDX(ref_rslt_idx));
05762 ref_rank = (ATD_ARRAY_IDX(ref_rslt_idx) != NULL_IDX) ?
05763 BD_RANK(ATD_ARRAY_IDX(ref_rslt_idx)) : 0;
05764
05765 if (ref_defined &&
05766 (ATD_POINTER(ref_rslt_idx) || ref_rank != 0 ||
05767 (ref_type == Character &&
05768 TYP_CHAR_CLASS(ATD_TYPE_IDX(ref_rslt_idx)) == Var_Len_Char))) {
05769 need_expl_itrfc = TRUE;
05770 }
05771 }
05772 }
05773 }
05774 else {
05775 next_il_idx = list_idx;
05776 ref_pgm_unit = ATP_PGM_UNIT(spec_idx);
05777 ref_rslt_idx = ATP_RSLT_IDX(spec_idx);
05778 ref_num_dargs = ATP_NUM_DARGS(spec_idx);
05779 ref_name_ptr = AT_OBJ_NAME_PTR(spec_idx);
05780 ref_defined = ATP_EXPL_ITRFC(spec_idx);
05781 ref_line = stmt_start_line;
05782 ref_column = stmt_start_col;
05783 ref_in_interface = ATP_IN_INTERFACE_BLK(spec_idx);
05784 ref_elemental = ATP_ELEMENTAL(spec_idx);
05785 ref_nosideeffects = ATP_NOSIDE_EFFECTS(spec_idx);
05786 ref_pure = ATP_PURE(spec_idx);
05787 ref_recursive = ATP_RECURSIVE(spec_idx);
05788 ref_vfunction = ATP_VFUNCTION(spec_idx);
05789 ref_global_dir = FALSE;
05790 #ifdef KEY
05791 ref_bind_attr = AT_BIND_ATTR(spec_idx);
05792 ref_binding_label = ATP_EXT_NAME_PTR(spec_idx);
05793 ref_binding_label_len = ATP_EXT_NAME_LEN(spec_idx);
05794 #endif
05795
05796 if (ref_defined && ATP_EXTRA_DARG(spec_idx)) {
05797 ref_num_dargs--;
05798 }
05799
05800 if (ref_rslt_idx == NULL_IDX) {
05801 ref_rank = 0;
05802 }
05803 else {
05804 ref_linear_type = TYP_LINEAR(ATD_TYPE_IDX(ref_rslt_idx));
05805 ref_type = TYP_TYPE(ATD_TYPE_IDX(ref_rslt_idx));
05806 ref_rank = (ATD_ARRAY_IDX(ref_rslt_idx) != NULL_IDX) ?
05807 BD_RANK(ATD_ARRAY_IDX(ref_rslt_idx)) : 0;
05808
05809
05810
05811 if (next_il_idx != NULL_IDX &&
05812 #ifdef KEY
05813 FUNCTION_MUST_BE_SUBROUTINE(spec_idx, ref_rslt_idx)
05814 #else
05815 FUNCTION_MUST_BE_SUBROUTINE(ref_rslt_idx)
05816 #endif
05817 ) {
05818 next_il_idx = IL_NEXT_LIST_IDX(next_il_idx);
05819 }
05820 }
05821 }
05822
05823 #ifdef KEY
05824 check_bind_attr(def_ga_idx, ref_bind_attr, ref_binding_label,
05825 ref_binding_label_len, ref_line, ref_column, ref_name_ptr, line_name);
05826 #endif
05827
05828 if ((GAP_PGM_UNIT(def_ga_idx) != ref_pgm_unit) ||
05829 (GAP_PGM_UNIT_DEFINED(def_ga_idx) && ref_defined && !ref_in_interface)){
05830
05831 if (ref_global_dir || GAP_GLOBAL_DIR(def_ga_idx)) {
05832 goto EXIT;
05833 }
05834
05835
05836
05837
05838
05839 # if defined(_ERROR_DUPLICATE_GLOBALS)
05840 msg_level = Error;
05841 # else
05842 msg_level = (GAP_PGM_UNIT(def_ga_idx) == Module ||
05843 ref_pgm_unit == Module) ? Error : Warning;
05844 # endif
05845 #ifdef KEY
05846
05847
05848
05849
05850
05851
05852
05853
05854
05855
05856
05857
05858
05859
05860
05861
05862
05863
05864 pgm_unit_type def_pgm_unit = GAP_PGM_UNIT(def_ga_idx);
05865 if (def_defined) {
05866 if ((def_pgm_unit == Function) && (ref_pgm_unit == Subroutine)) {
05867 msg_level = Warning;
05868 }
05869 }
05870 else if (ref_defined) {
05871 if ((ref_pgm_unit == Function) && (def_pgm_unit == Subroutine)) {
05872 msg_level = Warning;
05873 }
05874 }
05875 else {
05876 if (def_pgm_unit != ref_pgm_unit) {
05877 msg_level = Warning;
05878 }
05879 }
05880 #endif
05881
05882 if (def_defined) {
05883 msg_num = (ref_defined) ? 1282 : 1293;
05884 }
05885 else {
05886 msg_num = 1620;
05887 }
05888
05889 PRINTMSG(ref_line, msg_num, msg_level, ref_column,
05890 ref_name_ptr,
05891 pgm_unit_str[GAP_PGM_UNIT(def_ga_idx)],
05892 line_name,
05893 pgm_unit_str[ref_pgm_unit]);
05894
05895
05896
05897 goto EXIT;
05898 }
05899
05900 if (!def_defined && !ref_defined) {
05901
05902 if (GAP_VFUNCTION(def_ga_idx) ^ ref_vfunction) {
05903 PRINTMSG(ref_line, 1625, Warning, ref_column,
05904 ref_name_ptr,
05905 line_name,
05906 "VFUNCTION");
05907 }
05908
05909 if (GAP_NOSIDE_EFFECTS(def_ga_idx) ^ ref_nosideeffects) {
05910 PRINTMSG(ref_line, 1625, Warning, ref_column,
05911 ref_name_ptr,
05912 line_name,
05913 "NOSIDE EFFECTS");
05914 }
05915
05916
05917
05918
05919 goto EXIT;
05920 }
05921
05922
05923
05924
05925
05926 if (GAP_RSLT_IDX(def_ga_idx) != NULL_IDX &&
05927 ref_rslt_idx != NULL_IDX &&
05928 GAP_PGM_UNIT(def_ga_idx) == Function) {
05929
05930 if (ref_ga_idx != NULL_IDX) {
05931 same = compare_global_type_rank(GAP_RSLT_IDX(def_ga_idx),
05932 GAP_RSLT_IDX(ref_ga_idx),
05933 NULL_IDX,
05934 NULL_IDX,
05935 FALSE);
05936 }
05937 else if (attr_idx != NULL_IDX) {
05938 same = compare_global_type_rank(GAP_RSLT_IDX(def_ga_idx),
05939 NULL_IDX,
05940 ATP_RSLT_IDX(attr_idx),
05941 NULL_IDX,
05942 FALSE);
05943 }
05944 else {
05945 same = compare_global_type_rank(GAP_RSLT_IDX(def_ga_idx),
05946 NULL_IDX,
05947 ATP_RSLT_IDX(spec_idx),
05948 NULL_IDX,
05949 FALSE);
05950 }
05951
05952 if (!same) {
05953
05954 if (def_defined) {
05955 msg_level = Warning;
05956
05957 # if defined(_ERROR_DUPLICATE_GLOBALS)
05958
05959 if (ref_defined) {
05960 msg_level = Error;
05961 }
05962 # endif
05963 PRINTMSG(ref_line, 1294, msg_level, ref_column,
05964 ref_name_ptr,
05965 line_name,
05966 GA_OBJ_NAME_PTR(GAP_RSLT_IDX(def_ga_idx)));
05967 }
05968 else {
05969 msg_num = (ref_defined) ? 1618 : 1617;
05970 msg_level = (msg_num == 1617) ? Caution : Warning;
05971 PRINTMSG(ref_line, msg_num, msg_level, ref_column,
05972 ref_name_ptr,
05973 line_name);
05974 }
05975 }
05976 }
05977
05978
05979
05980
05981 if (list_idx == NULL_IDX &&
05982 (ref_defined || def_defined) &&
05983 ref_num_dargs != GAP_NUM_DARGS(def_ga_idx)) {
05984 msg_level = Warning;
05985
05986 # if defined(_ERROR_DUPLICATE_GLOBALS)
05987
05988 if (def_defined && ref_defined) {
05989 msg_level = Error;
05990 }
05991 # endif
05992 PRINTMSG(ref_line, 1295, msg_level, ref_column,
05993 ref_name_ptr,
05994 line_name,
05995 GAP_NUM_DARGS(def_ga_idx),
05996 ref_num_dargs);
05997 goto EXIT;
05998 }
05999
06000
06001
06002 if (ref_defined && def_defined) {
06003
06004 if (GAP_ELEMENTAL(def_ga_idx) ^ ref_elemental) {
06005 PRINTMSG(ref_line, 1624, Warning, ref_column,
06006 ref_name_ptr,
06007 line_name,
06008 "ELEMENTAL");
06009 }
06010
06011 #ifdef KEY
06012
06013
06014 if (GA_BIND_ATTR(def_ga_idx)) {
06015 need_expl_itrfc = TRUE;
06016 }
06017 #endif
06018
06019
06020
06021
06022
06023 if (GAP_PURE(def_ga_idx) ^ ref_pure) {
06024
06025 if (GAP_PURE(def_ga_idx) && ref_in_interface ||
06026 ref_pure && GAP_IN_INTERFACE_BLK(def_ga_idx)) {
06027
06028
06029 }
06030 else {
06031 PRINTMSG(ref_line, 1624, Warning, ref_column,
06032 ref_name_ptr,
06033 line_name,
06034 "PURE");
06035 }
06036 }
06037
06038 if (GAP_RECURSIVE(def_ga_idx) ^ ref_recursive) {
06039 PRINTMSG(ref_line, 1624, Warning, ref_column,
06040 ref_name_ptr,
06041 line_name,
06042 "RECURSIVE");
06043 }
06044
06045 }
06046
06047 def_arg_idx = GAP_FIRST_IDX(def_ga_idx);
06048
06049 def_arg_idx--;
06050
06051 for (i = 0; i < GAP_NUM_DARGS(def_ga_idx); i++ ) {
06052 def_arg_idx++;
06053
06054 if (ref_ga_idx != NULL_IDX) {
06055 ref_arg_idx++;
06056 ref_arg_line = GA_DEF_LINE(ref_arg_idx);
06057 ref_arg_column = GA_DEF_COLUMN(ref_arg_idx);
06058 ref_arg_name_ptr = GA_OBJ_NAME_PTR(ref_arg_idx);
06059 ref_arg_class = GA_OBJ_CLASS(ref_arg_idx);
06060 ref_arg_class_known = TRUE;
06061
06062 if (GA_OPTIONAL(ref_arg_idx)) {
06063 need_expl_itrfc = TRUE;
06064 }
06065
06066 if (ref_arg_class == Data_Obj) {
06067 ref_arg_class_known = GAD_CLASS(ref_arg_idx) != Atd_Unknown;
06068 ref_rank = GAD_RANK(ref_arg_idx);
06069 ref_array_elt = GAD_ARRAY_ELEMENT_REF(ref_arg_idx);
06070 ref_linear_type = GT_LINEAR_TYPE(GAD_TYPE_IDX(ref_arg_idx));
06071 ref_type = GT_TYPE(GAD_TYPE_IDX(ref_arg_idx));
06072 ref_hollerith = (GAD_CLASS(ref_ga_idx) == Constant) ?
06073 GAD_HOLLERITH(ref_ga_idx) : Not_Hollerith;
06074
06075 if (GAD_POINTER(ref_arg_idx) || GAD_TARGET(ref_arg_idx) ||
06076 #ifdef KEY
06077 GAD_VOLATILE(ref_arg_idx) ||
06078 #endif
06079 GAD_ASSUMED_SHAPE_ARRAY(ref_arg_idx)) {
06080 need_expl_itrfc = TRUE;
06081 }
06082 }
06083 }
06084 else if (attr_idx != NULL_IDX) {
06085 ref_arg_idx++;
06086 arg_attr_idx = SN_ATTR_IDX(ref_arg_idx);
06087
06088 if (SN_LINE_NUM(ref_arg_idx) != 0) {
06089 ref_arg_line = SN_LINE_NUM(ref_arg_idx);
06090 ref_arg_column = SN_COLUMN_NUM(ref_arg_idx);
06091 }
06092 else {
06093 ref_arg_line = AT_DEF_LINE(arg_attr_idx);
06094 ref_arg_column = AT_DEF_COLUMN(arg_attr_idx);
06095 }
06096 ref_arg_name_ptr = AT_OBJ_NAME_PTR(arg_attr_idx);
06097 ref_arg_class = AT_OBJ_CLASS(arg_attr_idx);
06098 ref_arg_class_known = TRUE;
06099
06100 if (AT_OPTIONAL(arg_attr_idx)) {
06101 need_expl_itrfc = TRUE;
06102 }
06103
06104 if (ref_arg_class == Data_Obj) {
06105 ref_arg_class_known = ATD_CLASS(arg_attr_idx) != Atd_Unknown;
06106 ref_rank = (ATD_ARRAY_IDX(arg_attr_idx) == NULL_IDX) ?
06107 0 : BD_RANK(ATD_ARRAY_IDX(arg_attr_idx));
06108 ref_array_elt = ATD_ARRAY_IDX(arg_attr_idx) == NULL_IDX;
06109 ref_linear_type = TYP_LINEAR(ATD_TYPE_IDX(arg_attr_idx));
06110 ref_type = TYP_TYPE(ATD_TYPE_IDX(arg_attr_idx));
06111 ref_hollerith = (ATD_CLASS(arg_attr_idx) != Constant) ?
06112 Not_Hollerith :
06113 CN_HOLLERITH_TYPE(ATD_CONST_IDX(arg_attr_idx));
06114
06115 if (ATD_POINTER(arg_attr_idx) || ATD_TARGET(arg_attr_idx) ||
06116 #ifdef KEY
06117 ATD_VOLATILE(arg_attr_idx) ||
06118 #endif
06119 (ATD_ARRAY_IDX(arg_attr_idx) != NULL_IDX &&
06120 BD_ARRAY_CLASS(ATD_ARRAY_IDX(arg_attr_idx)) == Assumed_Shape)){
06121 need_expl_itrfc = TRUE;
06122 }
06123 }
06124 }
06125 else {
06126 il_idx = next_il_idx;
06127
06128 if (il_idx == NULL_IDX) {
06129 PRINTMSG(ref_line, 1295, Warning, ref_column,
06130 ref_name_ptr,
06131 line_name,
06132 GAP_NUM_DARGS(def_ga_idx),
06133 i+1);
06134 goto EXIT;
06135 }
06136
06137 info_idx = IL_ARG_DESC_IDX(il_idx);
06138 next_il_idx = IL_NEXT_LIST_IDX(il_idx);
06139 ref_arg_line = arg_info_list[info_idx].line;
06140 ref_arg_column = arg_info_list[info_idx].col;
06141
06142 if (IL_FLD(il_idx) == AT_Tbl_Idx) {
06143 ref_arg_name_ptr = AT_OBJ_NAME_PTR(IL_IDX(il_idx));
06144 ref_arg_class = AT_OBJ_CLASS(IL_IDX(il_idx));
06145
06146 if (ref_arg_class == Data_Obj) {
06147 ref_arg_class_known = ATD_CLASS(IL_IDX(il_idx)) != Atd_Unknown;
06148 }
06149 else {
06150 ref_arg_class_known = TRUE;
06151 }
06152 }
06153
06154
06155 else {
06156 ref_arg_name_ptr = " ";
06157 ref_arg_class = 0;
06158 ref_arg_class_known = arg_info_list[info_idx].pgm_unit;
06159 }
06160
06161 if (!arg_info_list[info_idx].pgm_unit) {
06162 ref_rank = arg_info_list[info_idx].ed.rank;
06163 ref_array_elt = arg_info_list[info_idx].ed.array_elt;
06164 ref_linear_type = arg_info_list[info_idx].ed.linear_type;
06165 ref_type = arg_info_list[info_idx].ed.type;
06166 ref_hollerith = (IL_FLD(list_idx) == CN_Tbl_Idx) ?
06167 CN_HOLLERITH_TYPE(IL_IDX(list_idx)) :
06168 Not_Hollerith;
06169 }
06170 }
06171
06172 if (GA_OBJ_CLASS(def_arg_idx) == Data_Obj) {
06173
06174 if (GA_COMPILER_GEND(def_arg_idx) &&
06175 GAD_CLASS(def_arg_idx) == Dummy_Argument) {
06176
06177 if (ref_defined) {
06178
06179 if (ref_arg_class != Data_Obj) {
06180 PRINTMSG(ref_arg_line, 1296, Warning, ref_arg_column,
06181 ref_name_ptr,
06182 line_name,
06183 i + 1);
06184 continue;
06185 }
06186
06187 if ((attr_idx != NULL_IDX || spec_idx != NULL_IDX) &&
06188 AT_COMPILER_GEND(ref_arg_idx) &&
06189 ATD_CLASS(ref_arg_idx) == Dummy_Argument) {
06190
06191
06192 }
06193 else if (ref_ga_idx != NULL_IDX &&
06194 GA_COMPILER_GEND(ref_arg_idx) &&
06195 GAD_CLASS(ref_arg_idx) == Dummy_Argument) {
06196
06197
06198 }
06199 else {
06200 PRINTMSG(ref_arg_line, 1296, Warning, ref_arg_column,
06201 ref_name_ptr,
06202 line_name,
06203 i + 1);
06204 continue;
06205 }
06206 }
06207 else if (ref_arg_class != Label) {
06208 PRINTMSG(ref_arg_line, 1296, Warning, ref_arg_column,
06209 ref_name_ptr,
06210 line_name);
06211 continue;
06212 }
06213
06214 continue;
06215 }
06216
06217 if (GAD_CLASS(def_arg_idx) != Atd_Unknown &&
06218 ref_arg_class != Data_Obj) {
06219
06220
06221
06222
06223
06224
06225 if (def_defined) {
06226 PRINTMSG(ref_arg_line, 1297, Caution, ref_arg_column,
06227 ref_name_ptr,
06228 line_name,
06229 GA_OBJ_NAME_PTR(def_arg_idx));
06230 }
06231 else {
06232 PRINTMSG(ref_arg_line, 1300, Caution, ref_arg_column,
06233 ref_name_ptr,
06234 line_name,
06235 ref_arg_name_ptr);
06236 }
06237 continue;
06238 }
06239
06240 if (!GAD_IGNORE_TKR(def_arg_idx) && ref_rank != GAD_RANK(def_arg_idx)){
06241
06242
06243
06244 if (ref_rank == 0) {
06245
06246 if ((!def_defined && GAD_ARRAY_ELEMENT_REF(def_arg_idx)) ||
06247 ref_array_elt) {
06248
06249
06250
06251
06252
06253 }
06254 else if (def_defined) {
06255 PRINTMSG(ref_arg_line, 1615, Warning, ref_arg_column,
06256 ref_name_ptr,
06257 line_name,
06258 GA_OBJ_NAME_PTR(def_arg_idx));
06259 continue;
06260 }
06261 else {
06262 PRINTMSG(ref_arg_line, 1619, Caution, ref_arg_column,
06263 ref_name_ptr,
06264 line_name,
06265 i+1);
06266 continue;
06267 }
06268 }
06269 else if (GAD_RANK(def_arg_idx) == 0) {
06270
06271
06272
06273 if ((!def_defined && GAD_ARRAY_ELEMENT_REF(def_arg_idx)) ||
06274 ref_array_elt) {
06275
06276
06277
06278
06279
06280 }
06281 else if (def_defined) {
06282 PRINTMSG(ref_arg_line, 1278, Warning, ref_arg_column,
06283 ref_name_ptr,
06284 line_name,
06285 GA_OBJ_NAME_PTR(def_arg_idx));
06286 }
06287 else {
06288 PRINTMSG(ref_arg_line, 1616, Caution, ref_arg_column,
06289 ref_name_ptr,
06290 line_name,
06291 i+1);
06292 }
06293 continue;
06294 }
06295 }
06296
06297 if (GAD_IGNORE_TKR(def_arg_idx)) {
06298
06299
06300
06301
06302 }
06303 else {
06304 type_idx = GAD_TYPE_IDX(def_arg_idx);
06305 same = TRUE;
06306
06307 if (GT_TYPE(type_idx) == ref_type &&
06308 GT_LINEAR_TYPE(type_idx) == ref_linear_type) {
06309
06310 if (GT_TYPE(type_idx) == Structure) {
06311
06312 if (ref_ga_idx != NULL_IDX) {
06313 same = compare_global_derived_type(
06314 GT_STRUCT_IDX(type_idx),
06315 GT_STRUCT_IDX(GAD_TYPE_IDX(ref_arg_idx)),
06316 NULL_IDX);
06317 }
06318 else if (attr_idx != NULL_IDX) {
06319 same = compare_global_derived_type(
06320 GT_STRUCT_IDX(type_idx),
06321 NULL_IDX,
06322 TYP_IDX(ATD_TYPE_IDX(arg_attr_idx)));
06323 }
06324 else {
06325 same = compare_global_derived_type(
06326 GT_STRUCT_IDX(type_idx),
06327 NULL_IDX,
06328 TYP_IDX(arg_info_list[info_idx].ed.type_idx));
06329 }
06330 }
06331 }
06332 else if (GT_TYPE(type_idx) == Character && ref_type == Character) {
06333 same = TRUE;
06334 }
06335 else if (!ref_defined && !def_defined) {
06336
06337
06338
06339
06340 same = compare_global_args(GT_TYPE(type_idx),
06341 GT_LINEAR_TYPE(type_idx),
06342 ref_type,
06343 ref_linear_type,
06344 ref_hollerith);
06345
06346 if (!same) {
06347
06348
06349
06350
06351
06352 same = compare_global_args(ref_type,
06353 ref_linear_type,
06354 GT_TYPE(type_idx),
06355 GT_LINEAR_TYPE(type_idx),
06356 GAD_CLASS(def_arg_idx) == Constant?
06357 GAD_HOLLERITH(def_arg_idx):
06358 Not_Hollerith);
06359 }
06360 }
06361 else if (ref_defined && def_defined) {
06362
06363
06364
06365 same = FALSE;
06366 }
06367 else {
06368
06369 if (def_defined) {
06370 same = compare_global_args(GT_TYPE(type_idx),
06371 GT_LINEAR_TYPE(type_idx),
06372 ref_type,
06373 ref_linear_type,
06374 ref_hollerith);
06375 }
06376 else {
06377 same = compare_global_args(ref_type,
06378 ref_linear_type,
06379 GT_TYPE(type_idx),
06380 GT_LINEAR_TYPE(type_idx),
06381 GAD_CLASS(def_arg_idx) == Constant?
06382 GAD_HOLLERITH(def_arg_idx):
06383 Not_Hollerith);
06384 }
06385 }
06386
06387 if (!same) {
06388
06389 if (def_defined) {
06390 PRINTMSG(ref_arg_line, 1279, Warning, ref_arg_column,
06391 ref_name_ptr,
06392 line_name,
06393 GA_OBJ_NAME_PTR(def_arg_idx));
06394 }
06395 else {
06396 PRINTMSG(ref_arg_line, 1301, Caution, ref_arg_column,
06397 ref_name_ptr,
06398 line_name,
06399 i+1);
06400 }
06401 }
06402 }
06403 }
06404 else if (GA_OBJ_CLASS(def_arg_idx) == Label) {
06405 }
06406 else if (GA_OBJ_CLASS(def_arg_idx) == Pgm_Unit) {
06407
06408 if (ref_arg_class != Pgm_Unit && ref_arg_class_known) {
06409
06410 if (def_defined) {
06411 PRINTMSG(ref_arg_line, 1660, Caution, ref_arg_column,
06412 ref_name_ptr,
06413 line_name,
06414 GA_OBJ_NAME_PTR(def_arg_idx));
06415 }
06416 else {
06417 PRINTMSG(ref_arg_line, 1661, Caution, ref_arg_column,
06418 ref_name_ptr,
06419 line_name,
06420 ref_arg_name_ptr);
06421 }
06422 continue;
06423 }
06424
06425 if (ref_ga_idx != NULL_IDX) {
06426 ref_pgm_unit = GAP_PGM_UNIT(ref_arg_idx);
06427 }
06428 else if (attr_idx != NULL_IDX) {
06429 ref_pgm_unit = ATP_PGM_UNIT(arg_attr_idx);
06430 }
06431 else if (IL_FLD(il_idx) == AT_Tbl_Idx) {
06432 ref_pgm_unit = ATP_PGM_UNIT(IL_IDX(il_idx));
06433 }
06434 else {
06435 ref_pgm_unit = Pgm_Unknown;
06436 }
06437
06438 if (ref_pgm_unit == Function) {
06439
06440 if (ref_ga_idx != NULL_IDX) {
06441 ref_rslt_idx = GAP_RSLT_IDX(ref_arg_idx);
06442 }
06443 else if (attr_idx != NULL_IDX) {
06444 ref_rslt_idx = ATP_RSLT_IDX(arg_attr_idx);
06445 }
06446 else {
06447 ref_rslt_idx = ATP_RSLT_IDX(IL_IDX(il_idx));
06448 }
06449
06450 if (GAP_PGM_UNIT(def_arg_idx) == Function) {
06451
06452 if (ref_rslt_idx == NULL_IDX ||
06453 GAP_RSLT_IDX(def_arg_idx) == NULL_IDX) {
06454
06455
06456
06457 }
06458 else {
06459
06460 if (ref_ga_idx != NULL_IDX) {
06461 same = compare_global_type_rank(GAP_RSLT_IDX(def_arg_idx),
06462 ref_rslt_idx,
06463 NULL_IDX,
06464 NULL_IDX,
06465 FALSE);
06466 }
06467 else {
06468 same = compare_global_type_rank(GAP_RSLT_IDX(def_arg_idx),
06469 NULL_IDX,
06470 ref_rslt_idx,
06471 NULL_IDX,
06472 FALSE);
06473 }
06474
06475 if (!same) {
06476
06477 if (def_defined) {
06478 PRINTMSG(ref_arg_line, 1298, Warning, ref_arg_column,
06479 ref_name_ptr,
06480 line_name,
06481 GA_OBJ_NAME_PTR(def_arg_idx),
06482 ref_arg_name_ptr);
06483 }
06484 else {
06485 PRINTMSG(ref_arg_line, 1614, Caution, ref_arg_column,
06486 ref_name_ptr,
06487 line_name,
06488 i + 1);
06489 }
06490 }
06491 }
06492 }
06493 else if (GAP_PGM_UNIT(def_arg_idx) != Pgm_Unknown) {
06494 PRINTMSG(ref_arg_line, 1299, Warning, ref_arg_column,
06495 ref_name_ptr,
06496 line_name,
06497 pgm_unit_str[GAP_PGM_UNIT(def_arg_idx)],
06498 GA_OBJ_NAME_PTR(def_arg_idx));
06499 }
06500 }
06501 else if (ref_pgm_unit == Subroutine) {
06502
06503 if (GAP_PGM_UNIT(def_arg_idx) == Subroutine ||
06504 GAP_PGM_UNIT(def_arg_idx) == Pgm_Unknown) {
06505
06506
06507 }
06508 else {
06509 PRINTMSG(ref_arg_line, 1299, Warning, ref_arg_column,
06510 ref_name_ptr,
06511 line_name,
06512 pgm_unit_str[GAP_PGM_UNIT(def_arg_idx)],
06513 GA_OBJ_NAME_PTR(def_arg_idx));
06514 }
06515 }
06516 }
06517 }
06518
06519 if (list_idx != NULL_IDX && next_il_idx != NULL_IDX) {
06520
06521
06522
06523 il_idx = next_il_idx;
06524
06525 while (il_idx != NULL_IDX) {
06526 i++;
06527 il_idx = IL_NEXT_LIST_IDX(il_idx);
06528 }
06529 PRINTMSG(ref_line, 1295, Warning, ref_column,
06530 ref_name_ptr,
06531 line_name,
06532 GAP_NUM_DARGS(def_ga_idx),
06533 i);
06534 }
06535
06536 if (def_defined && ref_defined) {
06537
06538
06539 }
06540 else if (def_defined && GAP_NEEDS_EXPL_ITRFC(def_ga_idx)) {
06541 PRINTMSG(ref_line, 1277, Error, ref_column,
06542 ref_name_ptr,
06543 "defined",
06544 line_name);
06545 }
06546 else if (need_expl_itrfc) {
06547 PRINTMSG(ref_line, 1277, Error, ref_column,
06548 ref_name_ptr,
06549 "referenced",
06550 line_name);
06551 }
06552
06553
06554 EXIT:
06555
06556 TRACE (Func_Exit, "global_name_semantics", NULL);
06557
06558 return;
06559
06560 }
06561
06562
06563
06564
06565
06566
06567
06568
06569
06570
06571
06572
06573
06574
06575
06576
06577
06578
06579 static boolean compare_global_type_rank(int def_ga_idx,
06580 int ref_ga_idx,
06581 int attr_idx,
06582 int il_idx,
06583 boolean full_array_compare)
06584 {
06585 int array_idx;
06586 int gt_idx;
06587 int info_idx;
06588 int ref_linear_type;
06589 int ref_rank;
06590 int ref_type;
06591 int ref_type_idx;
06592 boolean same;
06593
06594
06595 TRACE (Func_Entry, "compare_global_type_rank", NULL);
06596
06597
06598
06599
06600
06601 if (il_idx != NULL_IDX) {
06602 info_idx = IL_ARG_DESC_IDX(il_idx);
06603 ref_type_idx = arg_info_list[info_idx].ed.type_idx;
06604 ref_linear_type = arg_info_list[info_idx].ed.linear_type;
06605 ref_type = arg_info_list[info_idx].ed.type;
06606 ref_rank = arg_info_list[info_idx].ed.rank;
06607 array_idx = NULL_IDX;
06608 }
06609 else if (attr_idx != NULL_IDX) {
06610 array_idx = ATD_ARRAY_IDX(attr_idx);
06611 ref_rank = array_idx != NULL_IDX ? BD_RANK(array_idx) : 0;
06612 ref_type_idx = ATD_TYPE_IDX(attr_idx);
06613 ref_linear_type = TYP_LINEAR(ref_type_idx);
06614 ref_type = TYP_TYPE(ref_type_idx);
06615 }
06616 else {
06617 array_idx = GAD_ARRAY_IDX(ref_ga_idx);
06618 ref_rank = GAD_RANK(ref_ga_idx);
06619 ref_type_idx = GAD_TYPE_IDX(ref_ga_idx);
06620 ref_linear_type = GT_LINEAR_TYPE(ref_type_idx);
06621 ref_type = GT_TYPE(ref_type_idx);
06622 }
06623
06624 same = TRUE;
06625 gt_idx = GAD_TYPE_IDX(def_ga_idx);
06626
06627 if (ref_rank != GAD_RANK(def_ga_idx) || ref_type != GT_TYPE(gt_idx)) {
06628 same = FALSE;
06629 }
06630 else if (ref_type == Structure) {
06631
06632 if (il_idx != NULL_IDX || attr_idx != NULL_IDX) {
06633 same = compare_global_derived_type(GT_STRUCT_IDX(gt_idx),
06634 NULL_IDX,
06635 TYP_IDX(ref_type_idx));
06636 }
06637 else {
06638 same = compare_global_derived_type(GT_STRUCT_IDX(ref_type_idx),
06639 GT_STRUCT_IDX(gt_idx),
06640 NULL_IDX);
06641 }
06642 }
06643 else if (ref_type != Character &&
06644 ref_linear_type != GT_LINEAR_TYPE(gt_idx)) {
06645 same = FALSE;
06646 }
06647
06648 if (same && full_array_compare && array_idx != NULL_IDX) {
06649
06650 if (attr_idx != NULL_IDX) {
06651 same = compare_global_array(GAD_ARRAY_IDX(def_ga_idx),
06652 NULL_IDX,
06653 array_idx);
06654 }
06655 else {
06656 same = compare_global_array(GAD_ARRAY_IDX(def_ga_idx),
06657 array_idx,
06658 NULL_IDX);
06659 }
06660 }
06661
06662 TRACE (Func_Exit, "compare_global_type_rank", NULL);
06663
06664 return(same);
06665
06666 }
06667
06668
06669
06670
06671
06672
06673
06674
06675
06676
06677
06678
06679
06680
06681
06682
06683
06684
06685
06686 static boolean compare_global_derived_type(int ga_idx,
06687 int ga2_idx,
06688 int attr_idx)
06689
06690 {
06691 #ifdef KEY
06692 int cpnt_idx = 0;
06693 #else
06694 int cpnt_idx;
06695 #endif
06696 int ga_cpnt_idx;
06697 int ga_type_idx;
06698 int ga_struct_idx;
06699 int len1;
06700 int len2;
06701 int mod_idx1;
06702 int mod_idx2;
06703 long *name1;
06704 long *name2;
06705 int num_cpnts;
06706 boolean same;
06707 boolean self_ptr;
06708 #ifdef KEY
06709 int sn_idx = 0;
06710 #else
06711 int sn_idx;
06712 #endif
06713 int struct_idx;
06714 long_type *the_constant;
06715 int the_type_idx;
06716 int type_idx;
06717 int type_linear;
06718
06719
06720 TRACE (Func_Entry, "compare_global_derived_type", NULL);
06721
06722 if (attr_idx != NULL_IDX) {
06723
06724 while (AT_ATTR_LINK(attr_idx) != NULL_IDX) {
06725 attr_idx = AT_ATTR_LINK(attr_idx);
06726 }
06727
06728
06729
06730
06731 if (GT_STRUCT_IDX(ATT_GLOBAL_TYPE_IDX(attr_idx)) == ga_idx) {
06732 same = TRUE;
06733 goto DONE;
06734 }
06735
06736 if (AT_USE_ASSOCIATED(attr_idx)) {
06737 name2 = AT_ORIG_NAME_LONG(attr_idx);
06738 len2 = AT_ORIG_NAME_LEN(attr_idx);
06739 mod_idx2 = AT_MODULE_IDX(attr_idx);
06740 }
06741 else {
06742 name2 = AT_OBJ_NAME_LONG(attr_idx);
06743 len2 = AT_NAME_LEN(attr_idx);
06744 mod_idx2 = NULL_IDX;
06745 }
06746 }
06747 else {
06748
06749
06750
06751 if (ga2_idx == ga_idx) {
06752 same = TRUE;
06753 goto DONE;
06754 }
06755 if (GA_USE_ASSOCIATED(ga2_idx)) {
06756 name2 = GA_ORIG_NAME_LONG(ga2_idx);
06757 len2 = GA_ORIG_NAME_LEN(ga2_idx);
06758 mod_idx2 = GA_MODULE_IDX(ga2_idx);
06759 }
06760 else {
06761 name2 = GA_OBJ_NAME_LONG(ga2_idx);
06762 len2 = GA_NAME_LEN(ga2_idx);
06763 mod_idx2 = NULL_IDX;
06764 }
06765 }
06766
06767 if (GA_USE_ASSOCIATED(ga_idx)) {
06768 name1 = GA_ORIG_NAME_LONG(ga_idx);
06769 len1 = GA_ORIG_NAME_LEN(ga_idx);
06770 mod_idx1 = GA_MODULE_IDX(ga_idx);
06771 }
06772 else {
06773 name1 = GA_OBJ_NAME_LONG(ga_idx);
06774 len1 = GA_NAME_LEN(ga_idx);
06775 mod_idx1 = NULL_IDX;
06776 }
06777
06778 if (compare_names(name1, len1, name2, len2) != 0) {
06779 same = FALSE;
06780 goto DONE;
06781 }
06782
06783 if (ga2_idx != NULL_IDX) {
06784
06785 if (mod_idx1 == mod_idx2 && mod_idx1 != NULL_IDX) {
06786 same = TRUE;
06787 goto DONE;
06788 }
06789
06790 same = (!GAT_PRIVATE_CPNT(ga2_idx) && !GAT_PRIVATE_CPNT(ga_idx) &&
06791 GAT_SEQUENCE_SET(ga2_idx) && GAT_SEQUENCE_SET(ga_idx) &&
06792 GAT_NUM_CPNTS(ga2_idx) == GAT_NUM_CPNTS(ga_idx) &&
06793 compare_target_consts(GAT_STRUCT_BIT_LEN(ga2_idx),
06794 GAT_STRUCT_LIN_TYPE(ga2_idx),
06795 GAT_STRUCT_BIT_LEN(ga_idx),
06796 GAT_STRUCT_LIN_TYPE(ga_idx),
06797 Eq_Opr));
06798
06799 cpnt_idx = GAT_FIRST_CPNT_IDX(ga2_idx);
06800 }
06801 else {
06802
06803 if (mod_idx1 != NULL_IDX && mod_idx2 != NULL_IDX) {
06804
06805
06806
06807
06808 if (ATP_GLOBAL_ATTR_IDX(mod_idx2) == mod_idx1) {
06809 same = TRUE;
06810 goto DONE;
06811 }
06812
06813 name1 = GA_OBJ_NAME_LONG(mod_idx1);
06814 len1 = GA_NAME_LEN(mod_idx1);
06815 name2 = AT_OBJ_NAME_LONG(mod_idx2);
06816 len2 = AT_NAME_LEN(mod_idx2);
06817
06818 if (compare_names(name1, len1, name2, len2) == 0) {
06819
06820
06821
06822
06823 ATP_GLOBAL_ATTR_IDX(mod_idx2) = mod_idx1;
06824 same = TRUE;
06825 goto DONE;
06826 }
06827 }
06828
06829 same = (!ATT_PRIVATE_CPNT(attr_idx) && !GAT_PRIVATE_CPNT(ga_idx) &&
06830 ATT_SEQUENCE_SET(attr_idx) && GAT_SEQUENCE_SET(ga_idx) &&
06831 ATT_NUM_CPNTS(attr_idx) == GAT_NUM_CPNTS(ga_idx) &&
06832 compare_target_consts(
06833 &CN_CONST(ATT_STRUCT_BIT_LEN_IDX(attr_idx)),
06834 TYP_LINEAR(CN_TYPE_IDX(ATT_STRUCT_BIT_LEN_IDX(attr_idx))),
06835 GAT_STRUCT_BIT_LEN(ga_idx),
06836 GAT_STRUCT_LIN_TYPE(ga_idx),
06837 Eq_Opr));
06838 sn_idx = ATT_FIRST_CPNT_IDX(attr_idx);
06839 }
06840
06841 if (!same) goto DONE;
06842
06843 ga_cpnt_idx = GAT_FIRST_CPNT_IDX(ga_idx);
06844 num_cpnts = GAT_NUM_CPNTS(ga_idx);
06845
06846 while (num_cpnts > 0) {
06847 ga_type_idx = GAD_TYPE_IDX(ga_cpnt_idx);
06848
06849 if (ga2_idx == NULL_IDX) {
06850 cpnt_idx = SN_ATTR_IDX(sn_idx);
06851 sn_idx = SN_SIBLING_LINK(sn_idx);
06852 type_idx = ATD_TYPE_IDX(cpnt_idx);
06853 type_linear = TYP_LINEAR(type_idx);
06854
06855 same = ATD_POINTER(cpnt_idx) == GAD_POINTER(ga_cpnt_idx) &&
06856 TYP_TYPE(type_idx) == GT_TYPE(ga_type_idx) &&
06857 (compare_names(AT_OBJ_NAME_LONG(cpnt_idx),
06858 AT_NAME_LEN(cpnt_idx),
06859 GA_OBJ_NAME_LONG(ga_cpnt_idx),
06860 GA_NAME_LEN(ga_cpnt_idx)) == 0);
06861
06862 same = same && compare_global_array(GAD_ARRAY_IDX(ga_cpnt_idx),
06863 NULL_IDX,
06864 ATD_ARRAY_IDX(cpnt_idx));
06865 }
06866 else {
06867 type_idx = GAD_TYPE_IDX(cpnt_idx);
06868 type_linear = GT_LINEAR_TYPE(type_idx);
06869
06870 same = GAD_POINTER(cpnt_idx) == GAD_POINTER(ga_cpnt_idx) &&
06871 GT_TYPE(type_idx) == GT_TYPE(ga_type_idx) &&
06872 (compare_names(GA_OBJ_NAME_LONG(cpnt_idx),
06873 GA_NAME_LEN(cpnt_idx),
06874 GA_OBJ_NAME_LONG(ga_cpnt_idx),
06875 GA_NAME_LEN(ga_cpnt_idx)) == 0);
06876
06877 same = same && compare_global_array(GAD_ARRAY_IDX(cpnt_idx),
06878 GAD_ARRAY_IDX(ga_cpnt_idx),
06879 NULL_IDX);
06880 }
06881
06882 if (!same) goto DONE;
06883
06884
06885
06886 if (GT_TYPE(ga_type_idx) == Character) {
06887
06888 if (ga2_idx == NULL_IDX) {
06889 the_constant = &CN_CONST(TYP_IDX(type_idx));
06890 the_type_idx = CN_TYPE_IDX(TYP_IDX(type_idx));
06891 }
06892 else {
06893 the_constant = GT_LENGTH(ga_type_idx);
06894 the_type_idx = GT_LENGTH_LIN_TYPE(ga_type_idx);
06895 }
06896 same = compare_target_consts(the_constant,
06897 the_type_idx,
06898 GT_LENGTH(GAD_TYPE_IDX(ga_cpnt_idx)),
06899 GT_LENGTH_LIN_TYPE(GAD_TYPE_IDX(ga_cpnt_idx)),
06900 Eq_Opr);
06901 }
06902 else if (GT_TYPE(ga_type_idx) == Structure) {
06903
06904 if (ga2_idx == NULL_IDX) {
06905 struct_idx = TYP_IDX(type_idx);
06906 ga_struct_idx = NULL_IDX;
06907 self_ptr = (struct_idx == attr_idx);
06908 }
06909 else {
06910 struct_idx = NULL_IDX;
06911 ga_struct_idx = GT_STRUCT_IDX(type_idx);
06912 self_ptr = (struct_idx == ga2_idx);
06913 }
06914
06915 if (GT_STRUCT_IDX(ga_type_idx) == ga_idx && self_ptr) {
06916
06917
06918
06919 }
06920 else if (( self_ptr && GT_STRUCT_IDX(ga_type_idx) != ga_idx) ||
06921 (!self_ptr && GT_STRUCT_IDX(ga_type_idx) == ga_idx)) {
06922 same = FALSE;
06923 goto DONE;
06924 }
06925 else {
06926 same = compare_global_derived_type(GT_STRUCT_IDX(ga_type_idx),
06927 ga_struct_idx,
06928 struct_idx);
06929 }
06930 }
06931 else {
06932 same = (type_linear == GT_LINEAR_TYPE(ga_type_idx));
06933 }
06934 ga_cpnt_idx++;
06935 num_cpnts--;
06936 }
06937
06938 DONE:
06939
06940 TRACE (Func_Exit, "compare_global_derived_type", NULL);
06941
06942 return(same);
06943
06944 }
06945
06946
06947
06948
06949
06950
06951
06952
06953
06954
06955
06956
06957
06958
06959
06960
06961
06962
06963
06964
06965 static boolean compare_global_array(int gb_idx,
06966 int gb2_idx,
06967 int bd_idx)
06968 {
06969 int dim;
06970 boolean same;
06971
06972
06973 TRACE (Func_Entry, "compare_global_array", NULL);
06974
06975 if (gb2_idx != NULL_IDX) {
06976
06977 if (gb2_idx == gb_idx) {
06978 same = TRUE;
06979 }
06980 else if (gb2_idx == NULL_IDX || gb_idx == NULL_IDX) {
06981 same = FALSE;
06982 }
06983 else {
06984 same = GB_RANK(gb2_idx) == GB_RANK(gb_idx) &&
06985 GB_ARRAY_CLASS(gb2_idx) == GB_ARRAY_CLASS(gb_idx) &&
06986 GB_ARRAY_SIZE(gb2_idx) == GB_ARRAY_SIZE(gb_idx);
06987
06988
06989 if (same && GB_ARRAY_CLASS(gb2_idx) == Explicit_Shape &&
06990 GB_ARRAY_SIZE(gb2_idx) == Constant_Size) {
06991
06992 for (dim = 1; dim <= GB_RANK(gb2_idx); dim++) {
06993 same = compare_target_consts(GB_LOWER_BOUND(gb_idx, dim),
06994 GT_LINEAR_TYPE(GB_LB_TYPE(gb_idx,dim)),
06995 GB_LOWER_BOUND(gb2_idx, dim),
06996 GT_LINEAR_TYPE(GB_LB_TYPE(gb2_idx,dim)),
06997 Eq_Opr) &&
06998 compare_target_consts(GB_UPPER_BOUND(gb_idx, dim),
06999 GT_LINEAR_TYPE(GB_UB_TYPE(gb_idx,dim)),
07000 GB_UPPER_BOUND(gb2_idx, dim),
07001 GT_LINEAR_TYPE(GB_UB_TYPE(gb2_idx,dim)),
07002 Eq_Opr);
07003 if (!same) break;
07004 }
07005 }
07006 }
07007 }
07008
07009
07010
07011 else if (bd_idx == NULL_IDX || gb_idx == NULL_IDX) {
07012 same = (bd_idx == NULL_IDX && gb_idx == NULL_IDX);
07013 }
07014 else if (BD_GLOBAL_IDX(bd_idx) == gb_idx) {
07015 same = TRUE;
07016 }
07017 else {
07018 same = BD_RANK(bd_idx) == GB_RANK(gb_idx) &&
07019 BD_ARRAY_CLASS(bd_idx) == GB_ARRAY_CLASS(gb_idx) &&
07020 BD_ARRAY_SIZE(bd_idx) == GB_ARRAY_SIZE(gb_idx);
07021
07022 if (same && BD_ARRAY_CLASS(bd_idx) == Explicit_Shape &&
07023 BD_ARRAY_SIZE(bd_idx) == Constant_Size) {
07024
07025 for (dim = 1; dim <= BD_RANK(bd_idx); dim++) {
07026 same = compare_target_consts(&CN_CONST(BD_LB_IDX(bd_idx, dim)),
07027 CN_TYPE_IDX(BD_LB_IDX(bd_idx, dim)),
07028 GB_LOWER_BOUND(gb_idx, dim),
07029 GT_LINEAR_TYPE(GB_LB_TYPE(gb_idx,dim)),
07030 Eq_Opr) &&
07031 compare_target_consts(&CN_CONST(BD_UB_IDX(bd_idx, dim)),
07032 CN_TYPE_IDX(BD_UB_IDX(bd_idx, dim)),
07033 GB_UPPER_BOUND(gb_idx, dim),
07034 GT_LINEAR_TYPE(GB_UB_TYPE(gb_idx,dim)),
07035 Eq_Opr);
07036 if (!same) break;
07037 }
07038 }
07039 }
07040
07041 TRACE (Func_Exit, "compare_global_array", NULL);
07042
07043 return(same);
07044
07045 }
07046
07047
07048
07049
07050
07051
07052
07053
07054
07055
07056
07057
07058
07059
07060
07061
07062
07063
07064
07065
07066
07067
07068
07069
07070
07071
07072
07073
07074 static boolean compare_global_args(int def_type,
07075 int def_linear_type,
07076 int ref_type,
07077 int ref_linear_type,
07078 int ref_hollerith)
07079 {
07080 boolean same;
07081
07082 TRACE (Func_Entry, "compare_global_args", NULL);
07083
07084 if (ref_linear_type == Short_Typeless_Const &&
07085 (def_type == Integer ||
07086 def_type == Real ||
07087 def_type == Complex)) {
07088 same = TRUE;
07089 }
07090 else if (ref_type == Typeless &&
07091 (def_type == Integer || def_type == Real) &&
07092 num_host_wds[ref_linear_type] == num_host_wds[def_linear_type]) {
07093 same = TRUE;
07094 }
07095 else if (ref_linear_type == Short_Typeless_Const &&
07096 (ref_hollerith == H_Hollerith ||
07097 ref_hollerith == L_Hollerith) &&
07098 def_type == Character) {
07099 same = TRUE;
07100 }
07101 else if ((ref_type == Integer && def_type == CRI_Ptr) ||
07102 (ref_type == CRI_Ptr && def_type == Integer)) {
07103 same = TRUE;
07104 }
07105 else {
07106 same = FALSE;
07107 }
07108
07109 TRACE (Func_Exit, "compare_global_args", NULL);
07110
07111 return(same);
07112
07113 }