00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 static const char *source_file = __FILE__;
00066
00067 #ifdef _KEEP_RCS_ID
00068 static char *rcs_id = " $Id: cwh_io.cxx 1.6 05/11/10 13:51:51-08:00 scorrell@soapstone.internal.keyresearch.com $ ";
00069 #endif
00070
00071
00072
00073 #include "defs.h"
00074 #include "glob.h"
00075 #include "stab.h"
00076 #include "strtab.h"
00077 #include "errors.h"
00078 #include "config.h"
00079 #include "config_targ.h"
00080 #include "wn.h"
00081 #include "const.h"
00082 #include "wio.h"
00083 #include "ir_reader.h"
00084 #include "wn_util.h"
00085 #include "targ_const.h"
00086 #include "targ_sim.h"
00087
00088
00089
00090 #include "i_cvrt.h"
00091
00092
00093
00094
00095 #include "cwh_defines.h"
00096 #include "cwh_addr.h"
00097 #include "cwh_dope.h"
00098 #include "cwh_stk.h"
00099 #include "cwh_types.h"
00100 #include "cwh_expr.h"
00101 #include "cwh_block.h"
00102 #include "sgi_cmd_line.h"
00103 #include "cwh_preg.h"
00104 #include "cwh_stab.h"
00105 #include "cwh_auxst.h"
00106
00107 #include "cwh_io.i"
00108 #include "cwh_io.h"
00109
00110 #define STACK_PUSH(x) \
00111 if (x != NULL) \
00112 cwh_stk_push(x, WN_item);
00113
00114 #define IoItem_TY(wn) (WN_kid(wn,3))
00115 #ifndef NIL
00116 #define NIL 0
00117 #endif
00118
00119 static INT32 num_list_items_last_processed;
00120
00121 typedef enum {
00122 CILIST_EDFLAG = 0,
00123 CILIST_EEEFLAG = 1,
00124 CILIST_FLFLAG = 2,
00125 CILIST_UNIT = 3,
00126 CILIST_IOSTAT = 4,
00127 CILIST_REC = 5,
00128 CILIST_PARSFMT = 6,
00129 CILIST_FMTSRC = 7,
00130 CILIST_ADVANCE = 8,
00131 CILIST_SIZE = 9,
00132 CILIST_ERR = 10,
00133 CILIST_END = 11,
00134 CILIST_EOR = 12
00135 } CILIST_TABLE_ITEM;
00136
00137 typedef enum {
00138 OPEN_CALLNAME = 0,
00139 OPEN_VERSION = 1,
00140 OPEN_UNIT = 2,
00141 OPEN_IOSTAT = 3,
00142 OPEN_ERRFLAG = 4,
00143 OPEN_FILE = 5,
00144 OPEN_STATUS = 6,
00145 OPEN_ACCESS = 7,
00146 OPEN_FORM = 8,
00147 OPEN_RECL = 9,
00148 OPEN_BLANK = 10,
00149 OPEN_POSITION = 11,
00150 OPEN_ACTION = 12,
00151 OPEN_DELIM = 13,
00152 OPEN_PAD = 14,
00153 OPEN_ERR = 15
00154 } OPEN_TABLE_ITEM;
00155
00156 typedef enum {
00157 CLOSE_CALLNAME = 0,
00158 CLOSE_VERSION = 1,
00159 CLOSE_UNIT = 2,
00160 CLOSE_IOSTAT = 3,
00161 CLOSE_ERRFLAG = 4,
00162 CLOSE_STATUS = 5,
00163 CLOSE_ERR = 6
00164 } CLOSE_TABLE_ITEM;
00165
00166 typedef enum {
00167 INQ_CALLNAME = 0,
00168 INQ_VERSION = 1,
00169 INQ_UNIT = 2,
00170 INQ_FILE = 3,
00171 INQ_IOSTAT = 4,
00172 INQ_ERRFLAG = 5,
00173 INQ_EXIST = 6,
00174 INQ_OPENED = 7,
00175 INQ_NUMBER = 8,
00176 INQ_NAMED = 9,
00177 INQ_NAME = 10,
00178 INQ_ACCESS = 11,
00179 INQ_SEQUENTIAL = 12,
00180 INQ_DIRECT = 13,
00181 INQ_FORM = 14,
00182 INQ_FORMATTED = 15,
00183 INQ_UNFORMATTED = 16,
00184 INQ_RECL =17,
00185 INQ_NEXTREC = 18,
00186 INQ_BLANK = 19,
00187 INQ_POSITION = 20,
00188 INQ_ACTION = 21,
00189 INQ_READ = 22,
00190 INQ_WRITE = 23,
00191 INQ_READWRITE = 24,
00192 INQ_DELIM = 25,
00193 INQ_PAD = 26,
00194 INQ_ERR = 27
00195 } INQ_TABLE_ITEM;
00196
00197 typedef enum {
00198 BIO_CALLNAME = 0,
00199 BIO_VERSION = 1,
00200 BIO_UNIT = 2,
00201 BIO_RECMODE = 3,
00202 BIO_BLOC = 4,
00203 BIO_ELOC = 5,
00204 BIO_TIPTR = 6
00205 } BIO_TABLE_ITEM;
00206
00207
00208
00209
00210 typedef enum {
00211 NODESC_CALLNAME = 0,
00212 NODESC_UNIT = 1,
00213 NODESC_IOSTAT = 2,
00214 NODESC_ERRFLAG = 3,
00215 NODESC_ERR = 4
00216 } NODESC_TABLE_ITEM;
00217
00218 #define WRITE_STMT 0
00219 #define READ_STMT 1
00220 #define NML_MASK 2
00221 #define READ_WRITE_MASK 1
00222 #define NAMELIST_MODE(x) ((x) & NML_MASK)
00223 #define READ_MODE(x) ((x) & READ_WRITE_MASK)
00224 #define WRITE_MODE(x) (!((x) & READ_WRITE_MASK))
00225
00226 static WN * cwh_io_ioitem(int mode, WN *craytype);
00227 static WN * cwh_io_str_ioitem(IOITEM it, int mode, WN *craytype);
00228 static WN * cwh_io_char_ioitem(IOITEM it, WN *len, int mode, WN *craytype);
00229
00230 static INT32 eeeflag;
00231 static MARKED_SET *marked_set;
00232
00233 static TY_IDX
00234 cwh_io_scalar_type(WN *wn) {
00235 TY_IDX ty = NIL;
00236
00237 if (wn) {
00238 ty = cwh_types_WN_TY(wn,FALSE);
00239 ty = cwh_types_array_TY(ty);
00240 ty = cwh_types_scalar_TY(ty);
00241 }
00242 return ty;
00243 }
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270 extern void
00271 fei_control_list(int mode)
00272 {
00273 INT item;
00274 WN *wn_eeeflag = NULL;
00275 WN *wn_unit = NULL;
00276 WN *wn_iostat = NULL;
00277 WN *wn_rec = NULL;
00278 WN *wn_parsfmt = NULL;
00279 WN *wn_fmtsrc = NULL;
00280 WN *wn_advance = NULL;
00281 WN *wn_size = NULL;
00282 WN *wn_flflag = NULL;
00283 WN *wn_edflag = NULL;
00284 WN *wn_end = NULL;
00285 WN *wn_err = NULL;
00286 WN *wn_eor = NULL;
00287 WN *wn1;
00288 WN *wn2;
00289 WN *unit_address = NULL;
00290 WN *ed_unit = NULL;
00291 ST *st;
00292 TY_IDX ts = NIL;
00293 TY_IDX td = NIL;
00294 TY_IDX ty = NIL;
00295 WN *se;
00296 INT32 edflag = 0;
00297
00298 eeeflag = 0;
00299 for (item=CILIST_EOR; item >= CILIST_EDFLAG ; item--) {
00300
00301 switch (item) {
00302
00303 case CILIST_SIZE:
00304 ts = cwh_stk_get_TY();
00305 wn1 = cwh_expr_address(f_NONE);
00306
00307 if (wn1) {
00308 if (ts != NIL) {
00309 ty = cwh_types_array_TY(ts);
00310 ty = cwh_types_scalar_TY(ty);
00311 } else {
00312 ty = cwh_io_scalar_type(wn1);
00313 }
00314 wn_size = WN_CreateIoItem1 ( IOC_SIZE, wn1, ty );
00315 }
00316 break;
00317
00318 case CILIST_ADVANCE:
00319 if (cwh_stk_get_class() == STR_item) {
00320 cwh_stk_pop_STR();
00321 wn2 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00322 wn1 = cwh_expr_address(f_NONE);
00323 wn_advance = WN_CreateIoItem2 (IOC_ADVANCE, wn1, wn2, NIL);
00324 } else {
00325
00326 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00327 }
00328 break;
00329
00330 case CILIST_FMTSRC:
00331 if (target_io_library == IOLIB_MIPS) {
00332 wn1 = cwh_expr_address(f_NONE);
00333 if (wn1 == NULL)
00334 wn_fmtsrc = WN_CreateIoItem0 ( IOF_LIST_DIRECTED, NIL );
00335 else
00336 DevWarn(("Only List directed I/O supported now"));
00337 } else {
00338 switch(cwh_stk_get_class()) {
00339
00340 case STR_item :
00341
00342 cwh_stk_pop_STR();
00343 wn2 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00344 ts = cwh_stk_get_TY();
00345 wn1 = cwh_expr_address(f_NONE);
00346 se = cwh_addr_find_section(wn1, p_RETURN_SECTION);
00347 if (se) {
00348 ty = cwh_types_array_TY(ts);
00349 wn1 = cwh_dope_from_expression(wn1, NULL, wn2, ts, NULL );
00350 ty = cwh_types_scalar_TY(ty);
00351 wn_fmtsrc = WN_CreateIoItem2 (IOF_CR_FMTSRC_DOPE, wn1,
00352 cwh_addr_find_address(se), ty);
00353 } else {
00354 wn_fmtsrc = WN_CreateIoItem2 (IOF_CR_FMTSRC, wn1, wn2, NIL);
00355 }
00356 break ;
00357
00358 case ST_item :
00359 case ST_item_whole_array:
00360
00361 if (NAMELIST_MODE(mode)) {
00362
00363 ST *namelist_group;
00364 ITEM* element;
00365 NLIST *dummy, *nmlist;
00366 INT32 count, i;
00367
00368 element = NULL;
00369 namelist_group = cwh_stk_pop_ST();
00370 wn1 = cwh_addr_address_ST(namelist_group, 0);
00371 dummy = (NLIST *) malloc(sizeof (NLIST)) ;
00372 Nlist_wn(dummy) = wn1;
00373 Nlist_next(dummy) = NULL;
00374 nmlist = dummy;
00375 count = 1;
00376 while ((element = cwh_auxst_next_element(
00377 namelist_group,element,l_NAMELIST)) != NULL ) {
00378 wn1 = cwh_addr_address_ST(I_element(element), 0 );
00379 dummy = (NLIST *) malloc(sizeof (NLIST)) ;
00380 Nlist_wn(dummy) = wn1;
00381 Nlist_next(dummy) = nmlist;
00382 nmlist = dummy;
00383 count++;
00384 }
00385 wn_fmtsrc = WN_CreateIoItemN(IOF_NAMELIST_DIRECTED,
00386 count, NIL);
00387 for(i=0; i<count; i++) {
00388 WN_kid(wn_fmtsrc, i) = Nlist_wn(nmlist);
00389 nmlist = Nlist_next(nmlist);
00390 }
00391 free (dummy);
00392
00393 } else {
00394
00395 st = cwh_stk_pop_ST();
00396 cwh_stk_push(st, ST_item);
00397 ty = ST_type(st);
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410 if (TY_kind(ty) == KIND_ARRAY)
00411 wn1 = cwh_expr_address(f_NONE);
00412 else
00413 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00414 wn_fmtsrc = WN_CreateIoItem1 ( IOF_CR_FMTSRC, wn1, NIL );
00415 }
00416 break;
00417
00418 default:
00419 if (cwh_stk_get_class() == FLD_item) {
00420 td = cwh_stk_get_FLD_TY();
00421 }
00422
00423 wn1 = cwh_expr_address(f_NONE);
00424 se = cwh_addr_find_section(wn1, p_RETURN_SECTION);
00425 if (se) {
00426 if (td != NIL) {
00427 ty = cwh_types_array_TY(td);
00428 ty = cwh_types_scalar_TY(ty);
00429 } else {
00430 ts = cwh_types_WN_TY(se,FALSE);
00431 ts = cwh_types_array_TY(ts);
00432 ty = cwh_types_scalar_TY(ts);
00433 }
00434 wn1 = cwh_dope_from_expression(wn1, NULL, NULL, ty,
00435 NULL);
00436 wn_fmtsrc = WN_CreateIoItem2 (IOF_CR_FMTSRC_DOPE, wn1,
00437 cwh_addr_find_address(se), ty);
00438 } else {
00439 if (wn1 != NULL)
00440 wn_fmtsrc = WN_CreateIoItem1 (IOF_CR_FMTSRC, wn1, NIL);
00441 else
00442 wn_fmtsrc = WN_CreateIoItem0 ( IOF_NONE, NIL );
00443 }
00444 break;
00445
00446 }
00447 }
00448 break;
00449
00450 case CILIST_PARSFMT:
00451
00452 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00453 if (wn1)
00454 wn_parsfmt = WN_CreateIoItem1 ( IOF_CR_PARSFMT, wn1, NIL );
00455 break;
00456
00457 case CILIST_REC:
00458 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00459 if (wn1)
00460 wn_rec = WN_CreateIoItem1 ( IOC_REC, wn1, NIL );
00461 break;
00462
00463 case CILIST_IOSTAT:
00464 #ifdef KEY
00465 ts = (FLD_item == cwh_stk_get_class()) ?
00466 cwh_stk_get_FLD_TY() :
00467 cwh_stk_get_TY();
00468 #else
00469 ts = cwh_stk_get_TY();
00470 #endif
00471 wn1 = cwh_expr_address(f_NONE);
00472 if (wn1) {
00473 if (ts != NIL) {
00474 ty = cwh_types_array_TY(ts);
00475 ty = cwh_types_scalar_TY(ty);
00476 } else {
00477 ty = cwh_io_scalar_type(wn1);
00478 }
00479 wn_iostat = WN_CreateIoItem1 ( IOC_IOSTAT, wn1, ty );
00480 }
00481 break;
00482 case CILIST_END:
00483 case CILIST_ERR:
00484 case CILIST_EOR:
00485
00486
00487 wn1 = cwh_io_cvt_tos_label_to_wn(TRUE);
00488 if (wn1) {
00489 if (item == CILIST_END)
00490 wn_end = WN_CreateIoItem1 ( IOC_END, wn1, NIL );
00491 else if (item == CILIST_ERR)
00492 wn_err = WN_CreateIoItem1 ( IOC_ERR, wn1, NIL );
00493 else if (item == CILIST_EOR)
00494 wn_eor = WN_CreateIoItem1 ( IOC_EOR, wn1, NIL );
00495 }
00496 break;
00497
00498 case CILIST_UNIT:
00499 switch(cwh_stk_get_class()) {
00500 case STR_item:
00501
00502 cwh_stk_pop_STR();
00503 wn2 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00504 ts = cwh_stk_get_TY();
00505 wn1 = cwh_expr_address(f_NONE);
00506 se = cwh_addr_find_section(wn1, p_RETURN_SECTION);
00507 if (se) {
00508 wn1 = cwh_dope_from_expression(wn1, NULL, wn2, ts, NULL);
00509 wn_unit = WN_CreateIoItem2(IOU_DOPE, wn1,
00510 cwh_addr_find_address(se), NIL);
00511 } else {
00512 wn_unit = WN_CreateIoItem2 (IOU_INTERNAL, wn1, wn2, NIL);
00513 }
00514 break ;
00515
00516 default:
00517
00518
00519
00520
00521
00522
00523 cwh_stk_push_top_item_again();
00524 unit_address = cwh_expr_address(f_NONE);
00525
00526 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00527 if (target_io_library == IOLIB_MIPS) {
00528 if (wn1 == NULL) {
00529 wn1 = WN_CreateIntconst ( OPC_I4INTCONST, 6);
00530 wn_unit = WN_CreateIoItem1 ( IOU_DEFAULT, wn1, NIL );
00531 } else {
00532
00533 wn_unit = WN_CreateIoItem1 ( IOU_EXTERNAL, wn1, NIL);
00534 }
00535 } else {
00536 if (wn1 != NULL) {
00537
00538
00539
00540
00541
00542
00543
00544
00545 se = cwh_addr_find_section(wn1, p_RETURN_SECTION);
00546 if (se) {
00547 ts = cwh_types_WN_TY(se,FALSE);
00548 ts = cwh_types_array_TY(ts);
00549 ty = cwh_types_scalar_TY(ts);
00550 wn1 = cwh_dope_from_expression(wn1, NULL, NULL, ty,
00551 NULL);
00552 wn_unit = WN_CreateIoItem2(IOU_DOPE, wn1,
00553 cwh_addr_find_address(se), NIL);
00554 } else {
00555 wn_unit = WN_CreateIoItem1 ( IOU_EXTERNAL, wn1, NIL );
00556 ed_unit = WN_CreateIoItem1 ( IOU_EXTERNAL, unit_address, NIL);
00557 }
00558 } else {
00559 wn_unit = WN_CreateIoItem0 ( IOU_NONE, NIL );
00560 }
00561 }
00562 break;
00563
00564 }
00565 break;
00566
00567 case CILIST_FLFLAG:
00568 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00569 if (target_io_library == IOLIB_CRAY)
00570 wn_flflag = WN_CreateIoItem1 ( IOC_CR_FLFLAG, wn1, NIL);
00571 break;
00572
00573 case CILIST_EEEFLAG:
00574
00575
00576
00577 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00578 eeeflag = WN_const_val(wn1);
00579 if (target_io_library == IOLIB_CRAY)
00580 wn_eeeflag = WN_CreateIoItem1 ( IOC_CR_EEEFLAG, wn1, NIL );
00581 break;
00582
00583 case CILIST_EDFLAG:
00584
00585 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00586 edflag = WN_const_val(wn1);
00587 wn_edflag = WN_CreateIoItem1(IOC_CR_EDFLAG, wn1, NIL);
00588
00589 break;
00590
00591 }
00592 }
00593
00594 if (edflag != 0 && ed_unit) {
00595 wn_unit = WN_CreateIoItem2 (IOU_INTERNAL, WN_kid0(ed_unit), WN_kid0(wn_edflag), NIL);
00596 STACK_PUSH(wn_unit);
00597 } else {
00598 STACK_PUSH(wn_unit);
00599 }
00600 STACK_PUSH(wn_fmtsrc);
00601 STACK_PUSH(wn_flflag);
00602 STACK_PUSH(wn_parsfmt);
00603 STACK_PUSH(wn_eeeflag);
00604 STACK_PUSH(wn_iostat);
00605 STACK_PUSH(wn_rec);
00606 STACK_PUSH(wn_advance);
00607 STACK_PUSH(wn_size);
00608 STACK_PUSH(wn_edflag);
00609 STACK_PUSH(wn_end);
00610 STACK_PUSH(wn_err);
00611 STACK_PUSH(wn_eor);
00612 }
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625 extern void
00626 fei_IO_list (int num_args, int mode )
00627 {
00628 int i;
00629 WN *wn;
00630 WN **iolist;
00631 WN *cray_type_code = NULL;
00632
00633 iolist = (WN **) malloc(sizeof (WN *) * num_args);
00634
00635 for (i=0; i < num_args; i++) {
00636
00637 if (!NAMELIST_MODE(mode)) {
00638 cray_type_code = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00639
00640
00641
00642
00643
00644
00645 if ((WN_opcode(cray_type_code) == OPC_IO_ITEM) &&
00646 (WN_io_item(cray_type_code) == IOL_IMPLIED_DO))
00647 cwh_stk_push(cray_type_code,WN_item);
00648 }
00649
00650 switch(cwh_stk_get_class()) {
00651 case STR_item :
00652 wn = cwh_io_str_ioitem(IOL_CHAR, mode, cray_type_code);
00653 break ;
00654
00655 default:
00656 wn = cwh_io_ioitem(mode, cray_type_code);
00657 break;
00658
00659 }
00660 iolist[i] = wn;
00661 }
00662
00663 for (i=num_args-1; i >= 0; i--) {
00664 cwh_stk_push(iolist[i], WN_item);
00665 }
00666
00667 num_list_items_last_processed = num_args;
00668
00669 free(iolist);
00670 }
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682 extern void
00683 fei_formatted_write( void )
00684 {
00685 WN *wn;
00686 BOOL status;
00687
00688 if (target_io_library == IOLIB_MIPS)
00689 wn = cwh_stk_pop_iostmt (IOS_WRITE, eeeflag);
00690 else
00691 wn = cwh_stk_pop_iostmt (IOS_CR_FWF, eeeflag);
00692
00693 if (Use_Three_Call) {
00694 cwh_io_split_io_statement(wn);
00695 } else {
00696 marked_set = NULL;
00697 status = cwh_io_analyse_io_statement(wn, WRITE_STMT);
00698 cwh_io_unmark();
00699
00700 if (status) {
00701 cwh_io_split_io_statement(wn);
00702 } else {
00703 cwh_io_create_dopes(wn);
00704 cwh_block_append(wn);
00705 }
00706 }
00707 }
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719 extern void
00720 fei_formatted_read(void)
00721 {
00722 WN *wn;
00723 BOOL status;
00724
00725 wn = cwh_stk_pop_iostmt (IOS_CR_FRF, eeeflag);
00726
00727 if (Use_Three_Call) {
00728 cwh_io_split_io_statement(wn);
00729 } else {
00730 marked_set = NULL;
00731 status = cwh_io_analyse_io_statement(wn, READ_STMT);
00732 cwh_io_unmark();
00733
00734 if (status) {
00735 cwh_io_split_io_statement(wn);
00736 } else {
00737 cwh_io_create_dopes(wn);
00738 cwh_block_append(wn);
00739 }
00740 }
00741 }
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753 extern void
00754 fei_unformatted_write(void)
00755 {
00756 WN *wn;
00757 BOOL status;
00758
00759 wn = cwh_stk_pop_iostmt (IOS_CR_FWU, eeeflag);
00760
00761 if (Use_Three_Call) {
00762 cwh_io_split_io_statement(wn);
00763 } else {
00764 marked_set = NULL;
00765 status = cwh_io_analyse_io_statement(wn, WRITE_STMT);
00766 cwh_io_unmark();
00767
00768 if (status) {
00769 cwh_io_split_io_statement(wn);
00770 } else {
00771 cwh_io_create_dopes(wn);
00772 cwh_block_append(wn);
00773 }
00774 }
00775 }
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787 extern void
00788 fei_unformatted_read(void)
00789 {
00790 WN *wn;
00791 BOOL status;
00792
00793 wn = cwh_stk_pop_iostmt (IOS_CR_FRU, eeeflag);
00794
00795 if (Use_Three_Call) {
00796 cwh_io_split_io_statement(wn);
00797 } else {
00798 marked_set = NULL;
00799 status = cwh_io_analyse_io_statement(wn, READ_STMT);
00800 cwh_io_unmark();
00801
00802 if (status) {
00803 cwh_io_split_io_statement(wn);
00804 } else {
00805 cwh_io_create_dopes(wn);
00806 cwh_block_append(wn);
00807 }
00808 }
00809 }
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821 extern void
00822 fei_namelist_write(void)
00823 {
00824 WN *wn;
00825
00826 wn = cwh_stk_pop_iostmt (IOS_CR_FWN, eeeflag);
00827 cwh_block_append(wn);
00828 }
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840 extern void
00841 fei_namelist_read(void)
00842 {
00843 WN *wn;
00844
00845 wn = cwh_stk_pop_iostmt (IOS_CR_FRN, eeeflag);
00846 cwh_block_append(wn);
00847 }
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863 extern void
00864 fei_implied_do(void)
00865 {
00866 WN **iolist;
00867 WN *incr;
00868 WN *stop;
00869 WN *start;
00870 WN *index;
00871 WN *wn;
00872 ST *st;
00873 INT32 num_list_items;
00874 INT32 i, j;
00875
00876 num_list_items = num_list_items_last_processed;
00877 iolist = (WN **) malloc(sizeof (WN *) * num_list_items);
00878
00879 for (i = 0; i < num_list_items; i++)
00880 iolist[i] = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00881
00882 incr = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00883 stop = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00884 start = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00885 st = cwh_stk_pop_ST();
00886 index = WN_CreateIdname(0, st);
00887
00888 wn = WN_CreateIoItemN ( IOL_IMPLIED_DO, num_list_items + 4, NIL);
00889 WN_index(wn) = index;
00890 WN_start(wn) = start;
00891 WN_end(wn) = stop;
00892 WN_step(wn) = incr;
00893
00894 for(i = num_list_items-1, j = 4; i >= 0 ; i--, j++) {
00895 WN_kid(wn,j) = iolist[i];
00896 }
00897
00898 cwh_stk_push(wn, WN_item);
00899 free (iolist);
00900 }
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918 static WN *
00919 cwh_io_ioitem(int mode, WN *cray_type_code)
00920 {
00921 WN * wn ;
00922 WN * wr ;
00923 TY_IDX ty ;
00924 TY_IDX ts = NIL ;
00925 TY_IDX cray_ptr_ty = NIL;
00926
00927 if (cwh_stk_get_class() == FLD_item) {
00928 ts = cwh_stk_get_FLD_TY();
00929 } else if (cwh_stk_get_class() == DEREF_item) {
00930 ts = cwh_stk_get_TY();
00931 if (ts) {
00932
00933 ts = TY_pointed(FLD_type(TY_fld(Ty_Table[ts])));
00934 }
00935 } else if ((cwh_stk_get_class() == ADDR_item) && !NAMELIST_MODE(mode)){
00936 ts = Be_Type_Tbl(Pointer_type);
00937 if (READ_MODE(mode))
00938 DevAssert((0),("Received an ADDR item in read mode"));
00939 } else if (cwh_stk_get_class() == ST_item) {
00940 ST *st;
00941
00942 st = cwh_stk_pop_ST();
00943
00944 if (ST_sclass(st) == SCLASS_FORMAL) {
00945 if ( !ST_is_value_parm(st) &&
00946 (TY_kind(TY_pointed(ST_type(st))) == KIND_POINTER)) {
00947
00948 DevAssert((!ST_is_temp_var(st)), ("Expecting a Cray Pointer"));
00949 cray_ptr_ty = ST_type(st);
00950 }
00951 } else if (TY_kind(ST_type(st)) == KIND_POINTER) {
00952
00953 DevAssert((!ST_is_temp_var(st)), ("Expecting a Cray Pointer"));
00954 cray_ptr_ty = ST_type(st);
00955 }
00956 cwh_stk_push(st,ST_item);
00957
00958 } else {
00959 ts = cwh_stk_get_TY();
00960 }
00961
00962 if (NAMELIST_MODE(mode) || READ_MODE(mode)) {
00963 wn = cwh_expr_address(f_NONE);
00964 } else {
00965 wn = cwh_expr_operand(DELETE_ARRAYEXP_WN);
00966 }
00967
00968 if (cray_ptr_ty != NIL) {
00969 ty = cray_ptr_ty;
00970 } else if (ts != NIL) {
00971 ty = cwh_types_array_TY(ts);
00972 ty = cwh_types_scalar_TY(ty);
00973 } else {
00974 ty = cwh_types_WN_TY(wn,FALSE);
00975 ty = cwh_types_array_TY(ty);
00976 ty = cwh_types_scalar_TY(ty);
00977 }
00978
00979 if (cwh_addr_find_section(wn, p_RETURN_SECTION)) {
00980 wn = WN_CreateIoItem3 (IOL_DOPE, wn, cray_type_code, NULL, ty);
00981 return wn;
00982 }
00983
00984 if ((WN_opcode(wn) == OPC_IO_ITEM) && (WN_io_item(wn) == IOL_IMPLIED_DO))
00985 return wn;
00986
00987
00988 if (NAMELIST_MODE(mode)) {
00989 wr = WN_CreateIoItem1 ( IOL_VAR, wn, ty);
00990 } else if (READ_MODE(mode)) {
00991 wr = WN_CreateIoItem2 ( IOL_VAR, wn, cray_type_code, ty);
00992 } else {
00993 wr = WN_CreateIoItem2 ( IOL_EXPR, wn, cray_type_code, ty);
00994 }
00995 return (wr);
00996 }
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009 static WN *
01010 cwh_io_str_ioitem(IOITEM it, int mode, WN *craytype)
01011 {
01012 WN * wn2 ;
01013 WN * wn ;
01014
01015 cwh_stk_pop_STR();
01016
01017 wn2 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01018 wn = cwh_io_char_ioitem(it,wn2, mode, craytype);
01019
01020 return(wn);
01021 }
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031 static WN *
01032 cwh_io_char_ioitem(IOITEM it, WN *len, int mode, WN *craytype)
01033 {
01034 WN * wn ;
01035 TY_IDX ty ;
01036
01037 ty = cwh_stk_get_TY();
01038
01039 wn = cwh_expr_address(f_NONE);
01040
01041 if (cwh_addr_find_section(wn, p_RETURN_SECTION)) {
01042 wn = WN_CreateIoItem3 (IOL_DOPE, wn, craytype, len, ty );
01043 return wn;
01044 }
01045
01046 wn = WN_CreateIoItem3 (it, wn, craytype, len, ty);
01047
01048 return (wn);
01049 }
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064 extern void
01065 fei_iolength(void)
01066 {
01067 INT32 num_items;
01068 INT32 i, j;
01069 WN *item;
01070 WN *wn;
01071 WN *wn1;
01072 ST *st;
01073 WN *temp;
01074 BOOL status;
01075
01076 num_items = cwh_stk_get_num_inquire_items();
01077 wn = WN_CreateIo ( IOS_INQLENGTH, num_items + 4);
01078
01079
01080
01081
01082
01083
01084
01085 WN_kid0(wn) = WN_CreateIoItem0 ( IOU_NONE, NIL );
01086 WN_kid1(wn) = WN_CreateIoItem0 ( IOF_NONE, NIL );
01087 for (i=0, j = 4+num_items-1; i<num_items; i++, j--) {
01088 item = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01089 WN_kid(wn,j) = item;
01090 }
01091 wn1 = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01092 WN_kid(wn,2) = WN_CreateIoItem1 ( IOC_CR_FLFLAG, wn1, NIL);
01093
01094 st = cwh_stk_pop_ST();
01095 cwh_stk_push(st, ST_item);
01096 wn1 = cwh_expr_address(f_NONE);
01097 WN_kid(wn,3) = WN_CreateIoItem1(IOC_INQLENGTH_VAR, wn1, NIL);
01098
01099
01100
01101
01102
01103
01104
01105 cwh_stk_push(st, ST_item);
01106 temp = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01107 cwh_stk_push(st, ST_item);
01108 cwh_stk_push(temp,WN_item);
01109
01110 if (Use_Three_Call) {
01111 cwh_io_split_io_statement(wn);
01112 } else {
01113 marked_set = NULL;
01114 status = cwh_io_analyse_io_statement(wn, WRITE_STMT);
01115 cwh_io_unmark();
01116
01117 if (status) {
01118 cwh_io_split_io_statement(wn);
01119 } else {
01120 cwh_io_create_dopes(wn);
01121 cwh_block_append(wn);
01122 }
01123 }
01124
01125 }
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139 extern void
01140 fei_start_ioblock(void)
01141 {
01142 char *str;
01143 TCON tc;
01144 ST *st;
01145 WN *wn;
01146
01147 cwh_stk_pop_STR();
01148 cwh_stk_pop_whatever();
01149 st = cwh_stk_pop_ST();
01150 ++cwh_io_in_ioblock;
01151
01152 if (IO_Comments) {
01153 tc = STC_val(st);
01154 str = Targ_String_Address(tc);
01155 wn = WN_CreateComment(str);
01156 cwh_auxst_clear(WN_st(wn));
01157 cwh_block_append(wn);
01158 str = (char *) malloc(9*sizeof(char));
01159 strcpy(str, "START_IO");
01160 wn = WN_CreateComment(str);
01161 cwh_auxst_clear(WN_st(wn));
01162 cwh_block_append(wn);
01163 free(str);
01164
01165 }
01166 wn = WN_CreatePragma(WN_PRAGMA_START_STMT_CLUMP, (ST *) NIL, NIL,NIL);
01167 cwh_block_append(wn);
01168
01169 }
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181 extern void
01182 fei_end_ioblock(void)
01183 {
01184 char *str;
01185 WN *wn;
01186
01187 wn = WN_CreatePragma(WN_PRAGMA_END_STMT_CLUMP, (ST *) NIL, NIL,NIL);
01188 cwh_block_append(wn);
01189
01190 --cwh_io_in_ioblock;
01191 if (IO_Comments) {
01192 str = (char *) malloc(7*sizeof(char));
01193 strcpy(str, "END_IO");
01194 wn = WN_CreateComment(str);
01195 cwh_auxst_clear(WN_st(wn));
01196 cwh_block_append(wn);
01197 free(str);
01198 }
01199 }
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210 static BOOL cwh_io_null_address(WN *addr)
01211 {
01212 if (WN_operator(addr) == OPR_INTCONST &&
01213 WN_const_val(addr) == 0) {
01214 WN_Delete(addr);
01215 return (TRUE);
01216 }
01217
01218 return (FALSE);
01219 }
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230 void
01231 fei_open(void)
01232 {
01233 INT item;
01234 WN **open_list;
01235 #ifdef KEY
01236 WN *wn = 0;
01237 #else
01238 WN *wn;
01239 #endif
01240 WN *length;
01241 WN *addr;
01242 WN *unit= NULL;
01243 TY_IDX ty = NIL;
01244 INT32 num_items = 0;
01245 INT32 i,j;
01246 TY_IDX ts = NIL;
01247
01248 open_list = (WN **) malloc(sizeof (WN *) * 15);
01249
01250 for (item=OPEN_ERR; item >= OPEN_CALLNAME; item--) {
01251 switch (item) {
01252
01253 case OPEN_ERR:
01254 addr = cwh_io_cvt_tos_label_to_wn(FALSE);
01255 if (addr != NULL) {
01256 wn = WN_CreateIoItem1(IOC_ERR, addr, NIL);
01257 open_list[num_items++] = wn;
01258 }
01259 break;
01260
01261 case OPEN_PAD:
01262 case OPEN_DELIM:
01263 case OPEN_ACTION:
01264 case OPEN_POSITION:
01265 case OPEN_BLANK:
01266 case OPEN_FORM:
01267 case OPEN_ACCESS:
01268 case OPEN_STATUS:
01269 case OPEN_FILE:
01270 switch(cwh_stk_get_class()) {
01271 case STR_item:
01272 cwh_stk_pop_STR();
01273 length = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01274 addr = cwh_expr_address(f_NONE);
01275
01276 if (item == OPEN_PAD)
01277 wn = WN_CreateIoItem2 (IOC_PAD, addr, length, NIL);
01278 else if (item == OPEN_DELIM)
01279 wn = WN_CreateIoItem2 (IOC_DELIM, addr, length, NIL);
01280 else if (item == OPEN_ACTION)
01281 wn = WN_CreateIoItem2 (IOC_ACTION, addr, length, NIL);
01282 else if (item == OPEN_POSITION)
01283 wn = WN_CreateIoItem2 (IOC_POSITION, addr, length, NIL);
01284 else if (item == OPEN_BLANK)
01285 wn = WN_CreateIoItem2 (IOC_BLANK, addr, length, NIL);
01286 else if (item == OPEN_FORM)
01287 wn = WN_CreateIoItem2 (IOC_FORM, addr, length, NIL);
01288 else if (item == OPEN_ACCESS)
01289 wn = WN_CreateIoItem2 (IOC_ACCESS, addr, length, NIL);
01290 else if (item == OPEN_STATUS)
01291 wn = WN_CreateIoItem2 (IOC_STATUS, addr, length, NIL);
01292 else if (item == OPEN_FILE)
01293 wn = WN_CreateIoItem2 (IOC_FILE, addr, length, NIL);
01294
01295 open_list[num_items++] = wn;
01296 break;
01297 default:
01298 cwh_stk_pop_whatever();
01299 break;
01300 }
01301 break;
01302
01303 case OPEN_RECL:
01304 case OPEN_IOSTAT:
01305 case OPEN_UNIT:
01306
01307 ts = cwh_stk_get_TY();
01308 switch(cwh_stk_get_class()) {
01309 case ADDR_item:
01310
01311 addr = cwh_expr_address(f_NONE);
01312 if (cwh_io_null_address(addr)) break;
01313
01314 if (ts != NIL) {
01315 ty = cwh_types_array_TY(ts);
01316 ty = cwh_types_scalar_TY(ty);
01317 } else {
01318 ty = cwh_io_scalar_type(addr);
01319 }
01320
01321 if (item == OPEN_RECL)
01322 wn = WN_CreateIoItem1(IOC_RECL, addr, ty);
01323 else if (item == OPEN_IOSTAT)
01324 wn = WN_CreateIoItem1(IOC_IOSTAT, addr, ty);
01325 else if (item == OPEN_UNIT)
01326 unit = WN_CreateIoItem1(IOU_EXTERNAL, addr, NIL);
01327
01328 if (item != OPEN_UNIT)
01329 open_list[num_items++] = wn;
01330 break;
01331 default:
01332 cwh_stk_pop_whatever();
01333 break;
01334 }
01335 break;
01336
01337 case OPEN_ERRFLAG:
01338 switch(cwh_stk_get_class()) {
01339 case ADDR_item:
01340 case WN_item:
01341 case WN_item_whole_array:
01342 wn = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01343 wn = WN_CreateIoItem1(IOC_ERRFLAG, wn, NIL);
01344 open_list[num_items++] = wn;
01345 break;
01346 default:
01347 DevAssert((0),("Odd Open Item"));
01348 }
01349 break;
01350 case OPEN_VERSION:
01351 case OPEN_CALLNAME:
01352 cwh_stk_pop_whatever();
01353 break;
01354 }
01355 }
01356
01357 wn = WN_CreateIo (IOS_CR_OPEN, num_items + 2);
01358
01359 if (unit)
01360 WN_kid0(wn) = unit;
01361 else
01362 WN_kid0(wn) = WN_CreateIoItem0 ( IOU_NONE, NIL );
01363
01364 WN_kid1(wn) = WN_CreateIoItem0 ( IOF_NONE, NIL );
01365 for(i=0,j=2; i<num_items; i++,j++)
01366 WN_kid(wn,j) = open_list[i];
01367 cwh_block_append(wn);
01368
01369 free(open_list);
01370 }
01371
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381 void
01382 fei_inquire(void)
01383 {
01384 INT item;
01385 WN **inq_list;
01386 #ifdef KEY
01387 WN *wn = 0;
01388 #else
01389 WN *wn;
01390 #endif
01391 WN *length;
01392 WN *addr;
01393 WN *unit= NULL;
01394 INT32 num_items = 0;
01395 INT32 i,j;
01396 TY_IDX ts = NIL;
01397
01398 inq_list = (WN **) malloc(sizeof (WN *) * 27);
01399
01400 for (item=INQ_ERR; item >= INQ_CALLNAME; item--) {
01401 switch (item) {
01402
01403 case INQ_ERR:
01404
01405 addr = cwh_io_cvt_tos_label_to_wn(FALSE);
01406
01407 if (addr != NULL) {
01408 wn = WN_CreateIoItem1(IOC_ERR, addr, NIL);
01409 inq_list[num_items++] = wn;
01410 }
01411 break;
01412
01413 case INQ_PAD:
01414 case INQ_DELIM:
01415 case INQ_READWRITE:
01416 case INQ_WRITE:
01417 case INQ_READ:
01418 case INQ_ACTION:
01419 case INQ_POSITION:
01420 case INQ_BLANK:
01421 case INQ_UNFORMATTED:
01422 case INQ_FORMATTED:
01423 case INQ_FORM:
01424 case INQ_DIRECT:
01425 case INQ_SEQUENTIAL:
01426 case INQ_ACCESS:
01427 case INQ_NAME:
01428 case INQ_FILE:
01429 switch(cwh_stk_get_class()) {
01430 case STR_item:
01431 cwh_stk_pop_STR();
01432 length = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01433 addr = cwh_expr_address(f_NONE);
01434
01435 if (item == INQ_PAD)
01436 wn = WN_CreateIoItem2 (IOC_PAD, addr, length, NIL);
01437 else if (item == INQ_DELIM)
01438 wn = WN_CreateIoItem2 (IOC_DELIM, addr, length, NIL);
01439 else if (item == INQ_READWRITE)
01440 wn = WN_CreateIoItem2 (IOC_READWRITE, addr, length, NIL);
01441 else if (item == INQ_WRITE)
01442 wn = WN_CreateIoItem2 (IOC_WRITE, addr, length, NIL);
01443 else if (item == INQ_READ)
01444 wn = WN_CreateIoItem2 (IOC_READ, addr, length, NIL);
01445 else if (item == INQ_ACTION)
01446 wn = WN_CreateIoItem2 (IOC_ACTION, addr, length, NIL);
01447 else if (item == INQ_POSITION)
01448 wn = WN_CreateIoItem2 (IOC_POSITION, addr, length, NIL);
01449 else if (item == INQ_BLANK)
01450 wn = WN_CreateIoItem2 (IOC_BLANK, addr, length, NIL);
01451 else if (item == INQ_UNFORMATTED)
01452 wn = WN_CreateIoItem2 (IOC_UNFORMATTED, addr, length, NIL);
01453 else if (item == INQ_FORMATTED)
01454 wn = WN_CreateIoItem2 (IOC_FORMATTED, addr, length, NIL);
01455 else if (item == INQ_FORM)
01456 wn = WN_CreateIoItem2 (IOC_FORM, addr, length, NIL);
01457 else if (item == INQ_DIRECT)
01458 wn = WN_CreateIoItem2 (IOC_DIRECT, addr, length, NIL);
01459 else if (item == INQ_SEQUENTIAL)
01460 wn = WN_CreateIoItem2 (IOC_SEQUENTIAL, addr, length, NIL);
01461 else if (item == INQ_ACCESS)
01462 wn = WN_CreateIoItem2 (IOC_ACCESS, addr, length, NIL);
01463 else if (item == INQ_NAME)
01464 wn = WN_CreateIoItem2 (IOC_NAME, addr, length, NIL);
01465 else if (item == INQ_FILE)
01466 wn = WN_CreateIoItem2 (IOC_FILE, addr, length, NIL);
01467
01468 inq_list[num_items++] = wn;
01469 break;
01470 default:
01471 cwh_stk_pop_whatever();
01472 break;
01473 }
01474 break;
01475
01476 case INQ_NEXTREC:
01477 case INQ_RECL:
01478 case INQ_NAMED:
01479 case INQ_NUMBER:
01480 case INQ_OPENED:
01481 case INQ_EXIST:
01482 case INQ_IOSTAT:
01483 case INQ_UNIT:
01484
01485 ts = cwh_stk_get_TY();
01486 switch(cwh_stk_get_class()) {
01487 TY_IDX ty;
01488
01489 case ADDR_item:
01490 addr = cwh_expr_address(f_NONE);
01491 if (cwh_io_null_address(addr)) break;
01492
01493 if (ts != NIL) {
01494 ty = cwh_types_array_TY(ts);
01495 ty = cwh_types_scalar_TY(ty);
01496 } else {
01497 ty = cwh_io_scalar_type(addr);
01498 }
01499
01500 if (item == INQ_NEXTREC)
01501 wn = WN_CreateIoItem1(IOC_NEXTREC, addr, ty);
01502 else if (item == INQ_RECL)
01503 wn = WN_CreateIoItem1(IOC_RECL, addr, ty);
01504 else if (item == INQ_NAMED)
01505 wn = WN_CreateIoItem1(IOC_NAMED, addr, ty);
01506 else if (item == INQ_NUMBER)
01507 wn = WN_CreateIoItem1(IOC_NUMBER, addr, ty);
01508 else if (item == INQ_OPENED)
01509 wn = WN_CreateIoItem1(IOC_OPENED, addr, ty);
01510 else if (item == INQ_EXIST)
01511 wn = WN_CreateIoItem1(IOC_EXIST, addr, ty);
01512 else if (item == INQ_IOSTAT)
01513 wn = WN_CreateIoItem1(IOC_IOSTAT, addr, ty);
01514 else if (item == INQ_UNIT)
01515 unit = WN_CreateIoItem1(IOU_EXTERNAL, addr, NIL);
01516
01517 if (item != INQ_UNIT)
01518 inq_list[num_items++] = wn;
01519 break;
01520 default:
01521 cwh_stk_pop_whatever();
01522 break;
01523 }
01524 break;
01525
01526 case INQ_ERRFLAG:
01527 switch(cwh_stk_get_class()) {
01528 case ADDR_item:
01529 case WN_item:
01530 case WN_item_whole_array:
01531 wn = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01532 wn = WN_CreateIoItem1(IOC_ERRFLAG, wn, NIL);
01533 inq_list[num_items++] = wn;
01534 break;
01535 default:
01536 DevAssert((0),("Odd Inquire Item"));
01537 }
01538 break;
01539 case INQ_VERSION:
01540 case INQ_CALLNAME:
01541 cwh_stk_pop_whatever();
01542 break;
01543 }
01544 }
01545
01546 wn = WN_CreateIo (IOS_CR_INQUIRE, num_items + 2);
01547
01548 if (unit)
01549 WN_kid0(wn) = unit;
01550 else
01551 WN_kid0(wn) = WN_CreateIoItem0 ( IOU_NONE, NIL );
01552
01553 WN_kid1(wn) = WN_CreateIoItem0 ( IOF_NONE, NIL );
01554 for(i=0,j=2; i<num_items; i++,j++)
01555 WN_kid(wn,j) = inq_list[i];
01556 cwh_block_append(wn);
01557
01558 free(inq_list);
01559 }
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570 void
01571 fei_close(void)
01572 {
01573 INT item;
01574 WN **close_list;
01575 #ifdef KEY
01576 WN *wn = 0;
01577 #else
01578 WN *wn;
01579 #endif
01580 WN *length;
01581 WN *addr;
01582 WN *unit= NULL;
01583 INT32 num_items = 0;
01584 INT32 i,j;
01585 TY_IDX ts = NIL;
01586
01587 close_list = (WN **) malloc(sizeof (WN *) * 6);
01588
01589 for (item=CLOSE_ERR; item >= CLOSE_CALLNAME; item--) {
01590 switch (item) {
01591
01592 case CLOSE_ERR:
01593
01594 addr = cwh_io_cvt_tos_label_to_wn(FALSE);
01595
01596 if (addr != NULL) {
01597 wn = WN_CreateIoItem1(IOC_ERR, addr, NIL);
01598 close_list[num_items++] = wn;
01599 }
01600 break;
01601
01602 case CLOSE_STATUS:
01603 switch(cwh_stk_get_class()) {
01604 case STR_item:
01605 cwh_stk_pop_STR();
01606 length = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01607 addr = cwh_expr_address(f_NONE);
01608 wn = WN_CreateIoItem2 (IOC_STATUS, addr, length, NIL);
01609 close_list[num_items++] = wn;
01610 break;
01611 default:
01612 cwh_stk_pop_whatever();
01613 break;
01614 }
01615 break;
01616
01617 case CLOSE_IOSTAT:
01618 case CLOSE_UNIT:
01619
01620 ts = cwh_stk_get_TY();
01621
01622 switch(cwh_stk_get_class()) {
01623 TY_IDX ty;
01624
01625 case ADDR_item:
01626
01627 addr = cwh_expr_address(f_NONE);
01628 if (cwh_io_null_address(addr)) break;
01629
01630 if (ts != NIL) {
01631 ty = cwh_types_array_TY(ts);
01632 ty = cwh_types_scalar_TY(ty);
01633 } else {
01634 ty = cwh_io_scalar_type(addr);
01635 }
01636
01637 if (item == CLOSE_IOSTAT)
01638 wn = WN_CreateIoItem1(IOC_IOSTAT, addr, ty);
01639 else if (item == CLOSE_UNIT)
01640 unit = WN_CreateIoItem1(IOU_EXTERNAL, addr, NIL);
01641
01642 if (item != CLOSE_UNIT)
01643 close_list[num_items++] = wn;
01644 break;
01645 default:
01646 cwh_stk_pop_whatever();
01647 break;
01648 }
01649 break;
01650
01651 case CLOSE_ERRFLAG:
01652 switch(cwh_stk_get_class()) {
01653 case ADDR_item:
01654 case WN_item:
01655 case WN_item_whole_array:
01656 wn = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01657 wn = WN_CreateIoItem1(IOC_ERRFLAG, wn, NIL);
01658 close_list[num_items++] = wn;
01659 break;
01660 default:
01661 DevAssert((0),("Odd Close Item"));
01662 }
01663 break;
01664 case CLOSE_VERSION:
01665 case CLOSE_CALLNAME:
01666 cwh_stk_pop_whatever();
01667 break;
01668 }
01669 }
01670
01671 wn = WN_CreateIo (IOS_CR_CLOSE, num_items + 2);
01672
01673 if (unit)
01674 WN_kid0(wn) = unit;
01675 else
01676 WN_kid0(wn) = WN_CreateIoItem0 ( IOU_NONE, NIL );
01677
01678 WN_kid1(wn) = WN_CreateIoItem0 ( IOF_NONE, NIL );
01679 for(i=0,j=2; i<num_items; i++,j++)
01680 WN_kid(wn,j) = close_list[i];
01681 cwh_block_append(wn);
01682
01683 free(close_list);
01684 }
01685
01686
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696 static void
01697 cwh_io_no_desc(IOSTATEMENT statement)
01698 {
01699 INT item;
01700 WN **nodesc_list;
01701 #ifdef KEY
01702 WN *wn = 0;
01703 #else
01704 WN *wn;
01705 #endif
01706 WN *addr;
01707 WN *unit= NULL;
01708 INT32 num_items = 0;
01709 INT32 i,j;
01710 TY_IDX ts = NIL;
01711
01712 nodesc_list = (WN **) malloc(sizeof (WN *) * 6);
01713
01714 for (item=NODESC_ERR; item >= NODESC_CALLNAME; item--) {
01715 switch (item) {
01716
01717 case NODESC_ERR:
01718
01719 addr = cwh_io_cvt_tos_label_to_wn(FALSE);
01720 if (addr != NULL) {
01721 wn = WN_CreateIoItem1(IOC_ERR, addr, NIL);
01722 nodesc_list[num_items++] = wn;
01723 }
01724 break;
01725
01726 case NODESC_IOSTAT:
01727 case NODESC_UNIT:
01728
01729 ts = cwh_stk_get_TY();
01730 switch(cwh_stk_get_class()) {
01731 TY_IDX ty;
01732
01733 case ADDR_item:
01734
01735 addr = cwh_expr_address(f_NONE);
01736 if (cwh_io_null_address(addr)) break;
01737
01738 if (ts != NIL) {
01739 ty = cwh_types_array_TY(ts);
01740 ty = cwh_types_scalar_TY(ty);
01741 } else {
01742 ty = cwh_io_scalar_type(addr);
01743 }
01744
01745 if (item == NODESC_IOSTAT)
01746 wn = WN_CreateIoItem1(IOC_IOSTAT, addr, ty);
01747 else if (item == NODESC_UNIT)
01748 unit = WN_CreateIoItem1(IOU_EXTERNAL, addr, NIL);
01749
01750 if (item != NODESC_UNIT)
01751 nodesc_list[num_items++] = wn;
01752 break;
01753 default:
01754 cwh_stk_pop_whatever();
01755 break;
01756 }
01757 break;
01758
01759 case NODESC_ERRFLAG:
01760 switch(cwh_stk_get_class()) {
01761 case ADDR_item:
01762 case WN_item:
01763 case WN_item_whole_array:
01764 wn = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01765 wn = WN_CreateIoItem1(IOC_ERRFLAG, wn, NIL);
01766 nodesc_list[num_items++] = wn;
01767 break;
01768 default:
01769 DevAssert((0),("Odd Close Item"));
01770 }
01771 break;
01772
01773 case NODESC_CALLNAME:
01774 cwh_stk_pop_whatever();
01775 break;
01776 }
01777 }
01778
01779 if (statement == IOS_CR_REWIND)
01780 wn = WN_CreateIo (IOS_CR_REWIND, num_items + 2);
01781 else if (statement == IOS_CR_BACKSPACE)
01782 wn = WN_CreateIo (IOS_CR_BACKSPACE, num_items + 2);
01783 else if (statement == IOS_CR_ENDFILE)
01784 wn = WN_CreateIo (IOS_CR_ENDFILE, num_items + 2);
01785
01786 if (unit)
01787 WN_kid0(wn) = unit;
01788 else
01789 WN_kid0(wn) = WN_CreateIoItem0 ( IOU_NONE, NIL );
01790
01791 WN_kid1(wn) = WN_CreateIoItem0 ( IOF_NONE, NIL );
01792 for(i=0,j=2; i<num_items; i++,j++)
01793 WN_kid(wn,j) = nodesc_list[i];
01794 cwh_block_append(wn);
01795
01796 free(nodesc_list);
01797 }
01798
01799
01800
01801
01802
01803
01804
01805
01806
01807
01808 void
01809 fei_rewind(void)
01810 {
01811 cwh_io_no_desc(IOS_CR_REWIND);
01812 }
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822
01823 void
01824 fei_backspace(void)
01825 {
01826 cwh_io_no_desc(IOS_CR_BACKSPACE);
01827 }
01828
01829
01830
01831
01832
01833
01834
01835
01836
01837
01838 void
01839 fei_endfile(void)
01840 {
01841 cwh_io_no_desc(IOS_CR_ENDFILE);
01842 }
01843
01844
01845
01846
01847
01848
01849
01850
01851
01852
01853
01854
01855 void
01856 fei_iotype(void)
01857 {
01858
01859 WN *wn;
01860
01861 wn = cwh_expr_operand(DELETE_ARRAYEXP_WN);
01862 cwh_stk_push(wn, WN_item);
01863 }
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873
01874
01875
01876
01877 static BOOL
01878 is_f90_pointer(WN *addr)
01879 {
01880 OPERATOR opr;
01881 opr = WN_operator(addr);
01882 if (opr == OPR_LDID || opr == OPR_LDA) {
01883 if (ST_class(WN_st(addr)) == CLASS_VAR) {
01884
01885 return (ST_auxst_is_f90_pointer(WN_st(addr)));
01886 } else {
01887 return FALSE;
01888 }
01889 } else if (opr == OPR_ILOAD) {
01890 return (TY_is_f90_pointer(Ty_Table[TY_pointed(WN_load_addr_ty(addr))]));
01891 } else {
01892 return (FALSE);
01893 }
01894 }
01895
01896
01897
01898
01899
01900
01901
01902
01903
01904
01905
01906 static ST *
01907 cwh_io_ST_base(ST *st)
01908 {
01909
01910 ST *base;
01911
01912
01913
01914
01915
01916
01917 if (ST_sclass(st) == SCLASS_REG ||
01918 ST_sclass(st) == SCLASS_TEXT ||
01919 ((Gen_PIC_Shared || Gen_PIC_Call_Shared) &&
01920 ST_export(st) == EXPORT_PREEMPTIBLE) )
01921 {
01922 return st;
01923 }
01924
01925
01926
01927
01928
01929
01930 if (Has_Base_Block(st)) {
01931
01932
01933
01934 TY_IDX ty = ST_type(ST_base(st));
01935 if (ty != NIL && TY_kind(ty) == KIND_POINTER) {
01936 return st;
01937 }
01938 }
01939
01940 base = st;
01941
01942 while ( ST_base(base) != base ) {
01943
01944 base = ST_base(base);
01945 }
01946
01947 return base;
01948 }
01949
01950
01951
01952
01953
01954
01955
01956
01957
01958
01959
01960
01961 static BOOL
01962 cwh_io_analyse_io_statement(WN *tree, int mode)
01963 {
01964
01965 INT32 iolist;
01966 INT32 i;
01967 WN *wn;
01968 INT32 ioitem;
01969
01970 for (iolist=0; iolist<WN_kid_count(tree); iolist++) {
01971 wn = WN_kid(tree,iolist);
01972 ioitem = WN_io_item(wn);
01973 if (ioitem >= IOL_ARRAY)
01974 break;
01975 }
01976
01977 for(i=iolist; i<WN_kid_count(tree); i++) {
01978 wn = WN_kid(tree,i);
01979 if (cwh_io_analyse_io_item(wn, NULL, mode))
01980 return TRUE;
01981 }
01982 return FALSE;
01983 }
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994
01995
01996
01997
01998
01999
02000
02001 static BOOL
02002 cwh_io_analyse_io_item(WN *tree, IMPDO_INFO *impdo_set, int mode)
02003 {
02004
02005 INT32 item;
02006 WN *kid0;
02007 OPERATOR opr;
02008 ST *index;
02009 IMPDO_INFO *new_impdo_set;
02010 BOOL visited;
02011 INT32 i;
02012 INT32 nd;
02013
02014 item = WN_intrinsic(tree);
02015
02016 switch(item) {
02017
02018 case IOL_IMPLIED_DO:
02019
02020 if (is_f90_pointer(WN_index(tree)))
02021 return TRUE;
02022
02023 index = cwh_io_ST_base(WN_st(WN_index(tree)));
02024 new_impdo_set = (IMPDO_INFO *) malloc(sizeof(IMPDO_INFO));
02025 Impdo_index(new_impdo_set) = WN_st(WN_index(tree));
02026 Impdo_next(new_impdo_set) = impdo_set;
02027
02028 #ifdef KEY
02029
02030
02031
02032 {
02033 if (MTYPE_I4 != TY_mtype(WN_type(WN_index(tree))) ||
02034 MTYPE_I4 != WN_rtype(WN_start(tree)) ||
02035 MTYPE_I4 != WN_rtype(WN_end(tree)) ||
02036 MTYPE_I4 != WN_rtype(WN_step(tree))) {
02037 return TRUE;
02038 }
02039 }
02040 #endif
02041
02042 visited = ST_auxst_visited(index);
02043 if (visited) {
02044 return TRUE;
02045 } else {
02046 Set_ST_auxst_visited(index,TRUE);
02047 cwh_io_add_st_to_marked_set(index);
02048 }
02049
02050 if (cwh_io_analyse_expr(WN_start(tree), new_impdo_set, mode))
02051 return TRUE;
02052 else if (cwh_io_analyse_expr(WN_end(tree), new_impdo_set, mode))
02053 return TRUE;
02054 else if (cwh_io_analyse_expr(WN_step(tree), new_impdo_set, mode))
02055 return TRUE;
02056
02057 for(i=4; i<WN_kid_count(tree); i++) {
02058 if (cwh_io_analyse_io_item(WN_kid(tree,i), new_impdo_set, mode))
02059 return TRUE;
02060 }
02061 free (new_impdo_set);
02062 break;
02063
02064 case IOL_EXPR:
02065
02066 kid0 = WN_kid0(tree);
02067 opr = WNOPR(kid0);
02068
02069 if ((opr == OPR_ILOAD) && (WNOPR(WN_kid0(kid0)) == OPR_ARRAY)) {
02070 if (cwh_io_analyse_arr(WN_kid0(kid0), impdo_set, mode))
02071 return TRUE;
02072 } else {
02073 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
02074 return TRUE;
02075 }
02076 break;
02077
02078 case IOL_VAR:
02079
02080 kid0 = WN_kid0(tree);
02081 opr = WNOPR(kid0);
02082
02083 if (opr == OPR_ARRAY) {
02084 if (cwh_io_analyse_arr(kid0, impdo_set, mode))
02085 return TRUE;
02086 } else {
02087 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
02088 return TRUE;
02089 }
02090 break;
02091
02092 case IOL_CHAR:
02093 kid0 = WN_kid0(tree);
02094
02095
02096
02097 if (cwh_io_analyse_expr(WN_kid2(tree), impdo_set, mode))
02098 return TRUE;
02099
02100 opr = WNOPR(kid0);
02101
02102 if (opr == OPR_ARRAY) {
02103
02104 nd = WN_kid_count(kid0)/2;
02105
02106 if (WNOPR(WN_kid0(kid0)) == OPR_LDA || WNOPR(WN_kid0(kid0)) == OPR_LDID) {
02107 if (cwh_io_analyse_arr(kid0, impdo_set, mode))
02108 return TRUE;
02109 } else if ((nd == 1) && (WNOPR(WN_kid0(kid0)) == OPR_ARRAY)) {
02110 if (cwh_io_analyse_arr(WN_kid0(kid0), impdo_set, mode))
02111 return TRUE;
02112 for (i=2*nd; i > nd; i-- ) {
02113 if (cwh_io_analyse_index_expr(WN_kid(kid0,i),
02114 impdo_set, mode) != 0)
02115 return TRUE;
02116 }
02117 } else {
02118 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
02119 return TRUE;
02120 }
02121
02122 } else {
02123 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
02124 return TRUE;
02125 }
02126 break;
02127
02128 case IOL_DOPE:
02129 kid0 = WN_kid0(tree);
02130 opr = WNOPR(kid0);
02131
02132
02133
02134 if (WN_kid2(tree) &&
02135 cwh_io_analyse_expr(WN_kid2(tree), impdo_set, mode))
02136 return TRUE;
02137
02138 if (opr == OPR_ARRSECTION) {
02139 if (cwh_io_analyse_arr(kid0, impdo_set, mode))
02140 return TRUE;
02141 } else if ((opr == OPR_ILOAD) &&
02142 (WNOPR(WN_kid0(kid0)) == OPR_ARRSECTION)) {
02143 if (cwh_io_analyse_arr(WN_kid0(kid0), impdo_set, mode))
02144 return TRUE;
02145 } else if (opr == OPR_ARRAY) {
02146 nd = WN_kid_count(kid0)/2;
02147 if ((nd == 1) && (WNOPR(WN_kid0(kid0)) == OPR_ARRSECTION)) {
02148 if (cwh_io_analyse_arr(WN_kid0(kid0), impdo_set, mode))
02149 return TRUE;
02150 for (i=2*nd; i > nd; i-- ) {
02151 if (cwh_io_analyse_index_expr(WN_kid(kid0,i),
02152 impdo_set, mode) != 0)
02153 return TRUE;
02154 }
02155 } else {
02156 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
02157 return TRUE;
02158 }
02159 } else {
02160 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
02161 return TRUE;
02162 }
02163 break;
02164
02165 default:
02166 DevAssert((0),("Odd iolist Item"));
02167 }
02168
02169 return FALSE;
02170 }
02171
02172
02173
02174
02175
02176
02177
02178
02179
02180
02181
02182
02183
02184
02185
02186
02187
02188
02189 static BOOL
02190 cwh_io_analyse_expr(WN *tree, IMPDO_INFO *impdo_set, int mode)
02191 {
02192 ST *st;
02193 BOOL visited;
02194 INT32 i;
02195
02196 if ((WNOPR(tree) == OPR_ILOAD) || ( OPCODE_has_aux(WN_opcode(tree))))
02197 if (is_f90_pointer(tree))
02198 return TRUE;
02199
02200 if ( OPCODE_has_aux(WN_opcode(tree))) {
02201 st = cwh_io_ST_base(WN_st(tree));
02202 visited = ST_auxst_visited(st);
02203 if (visited) {
02204 return TRUE;
02205 } else if (READ_MODE(mode)) {
02206 Set_ST_auxst_visited(st,TRUE);
02207 cwh_io_add_st_to_marked_set(st);
02208 }
02209 } else {
02210 for ( i = 0; i < WN_kid_count(tree); i++ )
02211 if (cwh_io_analyse_expr(WN_kid(tree,i), impdo_set, mode))
02212 return TRUE;
02213 }
02214 return FALSE;
02215 }
02216
02217
02218
02219
02220
02221
02222
02223
02224
02225
02226
02227
02228
02229
02230
02231
02232
02233
02234
02235 static BOOL
02236 cwh_io_analyse_arr(WN *tree, IMPDO_INFO *impdo_set, int mode)
02237 {
02238 INT32 nd;
02239 WN *addr;
02240 ST *st;
02241 BOOL visited;
02242 INT32 i;
02243
02244 nd = WN_kid_count(tree)/2;
02245
02246
02247 addr = WN_kid0(tree);
02248
02249 if (WNOPR(addr) == OPR_LDA || WNOPR(addr) == OPR_LDID) {
02250
02251 if (is_f90_pointer(addr))
02252 return TRUE;
02253
02254 st = cwh_io_ST_base(WN_st(addr));
02255 visited = ST_auxst_visited(st);
02256 if (visited) {
02257 return TRUE;
02258 } else if (READ_MODE(mode)) {
02259 Set_ST_auxst_visited(st,TRUE);
02260 cwh_io_add_st_to_marked_set(st);
02261 }
02262 for (i=2*nd; i > nd; i-- ) {
02263 if (cwh_io_analyse_index_expr(WN_kid(tree,i), impdo_set, mode) == -1)
02264 return TRUE;
02265 }
02266 } else {
02267 if (cwh_io_analyse_expr(tree, impdo_set, mode))
02268 return TRUE;
02269 }
02270
02271 return FALSE;
02272 }
02273
02274
02275
02276
02277
02278
02279
02280
02281
02282
02283
02284
02285
02286
02287
02288
02289
02290
02291
02292
02293
02294
02295
02296
02297
02298 static INT32
02299 cwh_io_analyse_index_expr(WN *tree, IMPDO_INFO *impdo_set, int mode)
02300 {
02301 INT32 kid0_status;
02302 INT32 kid1_status;
02303 INT32 i;
02304 INT32 pos;
02305 BOOL visited;
02306 ST *st;
02307
02308 if (WNOPR(tree) == OPR_TRIPLET) {
02309 for (i=1; i<=2; i++)
02310 if (cwh_io_analyse_expr(WN_kid(tree, i), impdo_set, mode))
02311 return -1;
02312
02313 kid0_status = cwh_io_analyse_index_expr(WN_kid0(tree), impdo_set,
02314 mode);
02315 return kid0_status;
02316
02317 } else if (WNOPR(tree) == OPR_LDID) {
02318
02319 if (is_f90_pointer(tree))
02320 return -1;
02321
02322 if ( (pos = member (WN_st(tree), impdo_set)) != 0) {
02323 return pos;
02324 } else {
02325 st = cwh_io_ST_base(WN_st(tree));
02326 visited = ST_auxst_visited(st);
02327 if (visited)
02328 return -1;
02329 else
02330 return 0;
02331 }
02332 } else if ( WN_operator_is(tree,OPR_CONST) ||
02333 WN_operator_is(tree,OPR_INTCONST)) {
02334 return 0;
02335 } else if ( WN_operator_is(tree,OPR_ADD) ) {
02336 kid0_status = cwh_io_analyse_index_expr(WN_kid0(tree), impdo_set, mode);
02337 kid1_status = cwh_io_analyse_index_expr(WN_kid1(tree), impdo_set, mode);
02338 switch(kid0_status) {
02339 case 0:
02340 return kid1_status;
02341 case -1:
02342 return -1;
02343 default:
02344 if (kid1_status == 0)
02345 return kid0_status;
02346 else
02347 return -1;
02348 }
02349 } else if (WN_operator_is(tree,OPR_SUB)) {
02350 kid0_status = cwh_io_analyse_index_expr(WN_kid0(tree), impdo_set, mode);
02351 kid1_status = cwh_io_analyse_index_expr(WN_kid1(tree), impdo_set, mode);
02352 switch(kid0_status) {
02353 case 0:
02354 if (kid1_status == 0)
02355 return 0;
02356 else
02357 return -1;
02358 case -1:
02359 return -1;
02360 default:
02361 if (kid1_status == 0)
02362 return kid0_status;
02363 else
02364 return -1;
02365 }
02366 }
02367 return -1;
02368 }
02369
02370
02371
02372
02373
02374
02375
02376
02377
02378
02379
02380
02381
02382 static mINT32
02383 member(ST *st, IMPDO_INFO *impdo_set)
02384 {
02385 mINT32 ret_val = 1;
02386 while (impdo_set) {
02387 if (st == Impdo_index(impdo_set))
02388 return ret_val;
02389 impdo_set = Impdo_next(impdo_set);
02390 ret_val++;
02391 }
02392 return 0;
02393 }
02394
02395
02396
02397
02398
02399
02400
02401
02402
02403
02404
02405
02406
02407
02408
02409
02410
02411
02412 static void
02413 cwh_io_create_dopes(WN *tree)
02414 {
02415 INT32 iolist;
02416 INT32 i;
02417 WN *wn;
02418 INT32 ioitem;
02419
02420 for (iolist=0; iolist<WN_kid_count(tree); iolist++) {
02421 wn = WN_kid(tree,iolist);
02422 ioitem = WN_io_item(wn);
02423 if (ioitem >= IOL_ARRAY)
02424 break;
02425 }
02426
02427 for(i=iolist; i<WN_kid_count(tree); i++) {
02428 wn = WN_kid(tree,i);
02429 cwh_io_create_dope_from_item(tree, i, NULL);
02430 }
02431 }
02432
02433
02434
02435
02436
02437
02438
02439
02440
02441
02442
02443
02444
02445
02446
02447 static void
02448 cwh_io_create_dope_from_item(WN *parent, int kid_num, IMPDO_INFO *impdo_set)
02449 {
02450 INT32 item;
02451 WN *kid0;
02452 OPERATOR opr;
02453 ST *index;
02454 IMPDO_INFO *new_impdo_set;
02455 INT32 i;
02456 WN *tree;
02457
02458 tree = WN_kid(parent, kid_num);
02459
02460 item = WN_intrinsic(tree);
02461
02462 switch(item) {
02463
02464 case IOL_IMPLIED_DO:
02465
02466 index = WN_st(WN_index(tree));
02467 new_impdo_set = (IMPDO_INFO *) malloc(sizeof(IMPDO_INFO));
02468 Impdo_index(new_impdo_set) = index;
02469 Impdo_next(new_impdo_set) = impdo_set;
02470
02471 for(i=4; i<WN_kid_count(tree); i++)
02472 cwh_io_create_dope_from_item(tree, i, new_impdo_set);
02473
02474 free(new_impdo_set);
02475 break;
02476
02477 case IOL_EXPR:
02478
02479 if (impdo_set == NULL)
02480 return;
02481
02482 kid0 = WN_kid0(tree);
02483 opr = WNOPR(kid0);
02484
02485 if ((opr == OPR_ILOAD) && (WNOPR(WN_kid0(kid0)) == OPR_ARRAY)) {
02486 WN_kid(parent,kid_num) = cwh_io_conv_array_to_dope(kid0,
02487 impdo_set, tree, NULL, WN_ty(tree), WN_COPY_Tree(WN_kid1(tree)));
02488 WN_Delete(tree);
02489 }
02490 break;
02491
02492 case IOL_VAR:
02493
02494 if (impdo_set == NULL)
02495 return;
02496
02497 kid0 = WN_kid0(tree);
02498 opr = WNOPR(kid0);
02499
02500 if (opr == OPR_ARRAY) {
02501 WN_kid(parent,kid_num) = cwh_io_conv_array_to_dope(kid0,
02502 impdo_set, tree, NULL,WN_ty(tree), WN_COPY_Tree(WN_kid1(tree)));
02503 WN_Delete(tree);
02504 }
02505
02506 break;
02507
02508 case IOL_CHAR:
02509
02510 if (impdo_set == NULL)
02511 return;
02512
02513 kid0 = WN_kid0(tree);
02514
02515 opr = WNOPR(kid0);
02516
02517 if (opr == OPR_ARRAY) {
02518
02519 if ( (WNOPR(WN_kid0(kid0)) == OPR_LDA) ||
02520 (WNOPR(WN_kid0(kid0)) == OPR_LDID) ||
02521 (WNOPR(WN_kid0(kid0)) == OPR_ARRAY)) {
02522 WN_kid(parent,kid_num) = cwh_io_conv_array_to_dope(kid0,
02523 impdo_set, tree, WN_kid2(tree),
02524 WN_ty(tree), WN_COPY_Tree(WN_kid1(tree)));
02525 WN_Delete(tree);
02526 }
02527 }
02528
02529 break;
02530
02531
02532 case IOL_DOPE:
02533
02534 kid0 = WN_kid0(tree);
02535 WN_kid(parent,kid_num) = cwh_io_conv_arrsection_to_dope(kid0, impdo_set,
02536 tree, WN_kid2(tree), WN_ty(tree), WN_kid1(tree));
02537 break;
02538
02539 default:
02540 DevAssert((0),("Odd iolist Item"));
02541 }
02542
02543 }
02544
02545
02546
02547
02548
02549
02550
02551
02552
02553
02554
02555
02556
02557
02558
02559
02560
02561
02562
02563
02564
02565
02566
02567
02568 static WN *
02569 cwh_io_conv_array_to_dope(WN *tree, IMPDO_INFO *impdo_set, WN *old_item, WN *char_len,TY_IDX ty, WN *craytype)
02570 {
02571 INT32 nd;
02572 ST *st;
02573 WN *wn;
02574 INT32 pos;
02575 INT32 indflag = 0;
02576 IMPDO_INFO *impdo;
02577 INT32 i;
02578 INT32 j;
02579 INT32 k;
02580 WN *index;
02581 WN *address_fixup;
02582 WN *final_address = NULL;
02583 WN *offset = NULL;
02584 WN *new_index_expr;
02585 WN *kid;
02586 OPERATOR opr;
02587 WN *arr;
02588
02589 opr = WNOPR(tree);
02590
02591 switch(opr) {
02592 case OPR_ILOAD:
02593 kid = WN_kid0(tree);
02594 if (WNOPR(kid) == OPR_ARRAY) {
02595 arr = kid;
02596 offset = WN_Intconst(Pointer_Mtype,WN_load_offset(tree));
02597 } else {
02598 return (WN_COPY_Tree(old_item));
02599 }
02600 break;
02601
02602 case OPR_ARRAY:
02603 kid = WN_kid0(tree);
02604 nd = WN_kid_count(tree)/2;
02605 if (WNOPR(kid) == OPR_LDA || WNOPR(kid) == OPR_LDID) {
02606 arr = tree;
02607 } else if ((WNOPR(kid) == OPR_ARRAY) && (nd == 1) ) {
02608 arr = kid;
02609 final_address = WN_Create(OPCODE_make_op(OPR_ARRAY,Pointer_Mtype,
02610 MTYPE_V), 3);
02611 WN_element_size(final_address) = WN_element_size(tree);
02612 WN_kid(final_address, 1) = WN_COPY_Tree(WN_kid(tree,nd));
02613 WN_kid(final_address, 2) = WN_COPY_Tree(WN_kid(tree, 2*nd));
02614 } else {
02615
02616
02617
02618
02619
02620
02621 return (WN_COPY_Tree(old_item));
02622 }
02623 break;
02624
02625 default:
02626
02627
02628
02629
02630
02631 return (WN_COPY_Tree(old_item));
02632 }
02633
02634 nd = WN_kid_count(arr)/2;
02635
02636 if (impdo_set != NULL) {
02637 for (i=2*nd; i > nd; i-- ) {
02638 index = WN_kid(arr,i);
02639 if (WNOPR(index) == OPR_TRIPLET)
02640 pos = cwh_io_search_implied_do_index(WN_kid0(index), impdo_set);
02641 else
02642 pos = cwh_io_search_implied_do_index(index, impdo_set);
02643 if (pos >= 1 ) {
02644 indflag = 1;
02645 break;
02646 }
02647 }
02648 }
02649
02650 if (indflag == 0) {
02651 return(WN_COPY_Tree(old_item));
02652 } else {
02653 wn = WN_CreateIoItemN (IOL_DOPE, nd+2, NIL);
02654 address_fixup = WN_Create(OPCODE_make_op(OPR_ARRAY,Pointer_Mtype,MTYPE_V),
02655 WN_kid_count(arr));
02656 WN_kid0(address_fixup) = WN_kid0(arr);
02657 WN_element_size(address_fixup) = WN_element_size(arr);
02658
02659
02660 for (i=2*nd, k=2; i > nd; i--, k++ ) {
02661 WN_kid(address_fixup,i-nd) = WN_COPY_Tree(WN_kid(arr,i-nd));
02662 index = WN_kid(arr,i);
02663 pos = cwh_io_search_implied_do_index(index, impdo_set);
02664 if (pos >= 1) {
02665 impdo = impdo_set;
02666 for (j=1; j < pos; j++)
02667 impdo = Impdo_next(impdo);
02668 WN_kid(wn,k) = WN_CreateLda (opc_lda, 0,
02669 Make_Pointer_Type(ST_type(Impdo_index(impdo))),
02670 Impdo_index(impdo));
02671 new_index_expr = Substitute_1_For_Impdo_Index_Val(
02672 WN_COPY_Tree(index), impdo);
02673 WN_kid(address_fixup,i) = new_index_expr;
02674 } else {
02675 WN_kid(address_fixup,i) = WN_COPY_Tree(index);
02676 WN_kid(wn,k) = WN_CreateIntconst ( OPC_I4INTCONST, 0);
02677 }
02678 }
02679 if (final_address != NULL) {
02680 WN_kid0(final_address) = address_fixup;
02681 } else if (offset != NULL) {
02682 final_address = WN_Add(Pointer_Mtype, address_fixup, offset);
02683 } else {
02684 final_address = address_fixup;
02685 }
02686 WN_kid0(wn) = cwh_dope_from_expression(arr, arr, char_len,ty, craytype);
02687 WN_kid1(wn) = cwh_addr_find_address(arr);
02688 st = WN_st(WN_kid0(wn));
02689 cwh_addr_store_ST(st, 0, Be_Type_Tbl(Pointer_type), final_address);
02690 return wn;
02691 }
02692 }
02693
02694
02695
02696
02697
02698
02699
02700
02701
02702
02703
02704
02705
02706
02707
02708
02709
02710
02711
02712
02713
02714
02715
02716
02717
02718
02719
02720
02721
02722 static WN *
02723 cwh_io_conv_arrsection_to_dope(WN *tree, IMPDO_INFO *impdo_set, WN *old_item,
02724 WN *char_len, TY_IDX ty, WN *craytype)
02725 {
02726 INT32 nd;
02727 ST *st;
02728 WN *wn;
02729 INT32 pos;
02730 INT32 indflag = 0;
02731 IMPDO_INFO *impdo;
02732 INT32 i;
02733 INT32 j;
02734 INT32 k;
02735 WN *index;
02736 WN *address_fixup;
02737 WN *final_address = NULL;
02738 WN *offset = NULL;
02739 WN *new_index_expr;
02740 WN *ad;
02741 WN *kid;
02742 OPERATOR opr;
02743 WN *arr;
02744
02745 opr = WNOPR(tree);
02746
02747 switch(opr) {
02748 case OPR_ILOAD:
02749 kid = WN_kid0(tree);
02750 if (WNOPR(kid) == OPR_ARRSECTION) {
02751 arr = kid;
02752 offset = WN_Intconst(Pointer_Mtype,WN_load_offset(tree));
02753 } else {
02754
02755
02756
02757
02758
02759
02760
02761 arr = cwh_addr_find_section(tree, p_RETURN_SECTION);
02762 ad = cwh_addr_find_address(arr);
02763 wn = cwh_dope_from_expression(tree, NULL, char_len, ty, craytype);
02764 wn = WN_CreateIoItem2(IOL_DOPE, wn, ad, NIL);
02765 return wn;
02766 }
02767 break;
02768
02769 case OPR_ARRAY:
02770 kid = WN_kid0(tree);
02771 nd = WN_kid_count(tree)/2;
02772 if ((WNOPR(kid) == OPR_ARRSECTION) && (nd == 1) ) {
02773 arr = kid;
02774 final_address = WN_Create(OPCODE_make_op(OPR_ARRAY,Pointer_Mtype,
02775 MTYPE_V), 3);
02776 WN_element_size(final_address) = WN_element_size(tree);
02777 WN_kid(final_address, 1) = WN_COPY_Tree(WN_kid(tree,nd));
02778 WN_kid(final_address, 2) = WN_COPY_Tree(WN_kid(tree, 2*nd));
02779 } else {
02780
02781
02782
02783
02784
02785
02786
02787 arr = cwh_addr_find_section(tree, p_RETURN_SECTION);
02788 ad = cwh_addr_find_address(arr);
02789 wn = cwh_dope_from_expression(tree, NULL, char_len, ty, craytype);
02790 wn = WN_CreateIoItem2(IOL_DOPE, wn, ad, NIL);
02791 return wn;
02792 }
02793 break;
02794
02795 case OPR_ARRSECTION:
02796 arr = tree;
02797 break;
02798
02799 default:
02800
02801
02802
02803
02804
02805
02806
02807 arr = cwh_addr_find_section(tree, p_RETURN_SECTION);
02808 ad = cwh_addr_find_address(arr);
02809 wn = cwh_dope_from_expression(tree, NULL, char_len, ty, craytype);
02810 wn = WN_CreateIoItem2(IOL_DOPE, wn, ad, NIL);
02811 return wn;
02812 }
02813
02814 nd = WN_kid_count(arr)/2;
02815
02816 if (impdo_set != NULL) {
02817 for (i=2*nd; i > nd; i-- ) {
02818 index = WN_kid(arr,i);
02819 if (WNOPR(index) == OPR_TRIPLET)
02820 pos = cwh_io_search_implied_do_index(WN_kid0(index), impdo_set);
02821 else
02822 pos = cwh_io_search_implied_do_index(index, impdo_set);
02823 if (pos >= 1 ) {
02824 indflag = 1;
02825 break;
02826 }
02827 }
02828 }
02829
02830 if (indflag == 0) {
02831 arr = cwh_addr_find_section(tree, p_RETURN_SECTION);
02832 ad = cwh_addr_find_address(arr);
02833 wn = cwh_dope_from_expression(tree, NULL, char_len, ty, craytype);
02834 wn = WN_CreateIoItem2(IOL_DOPE, wn, ad, NIL);
02835 return wn;
02836 } else {
02837 wn = WN_CreateIoItemN (IOL_DOPE, nd+2, NIL);
02838 address_fixup = WN_Create(OPCODE_make_op(OPR_ARRAY,Pointer_Mtype,MTYPE_V),
02839 WN_kid_count(arr));
02840 WN_kid0(address_fixup) = WN_kid0(arr);
02841 WN_element_size(address_fixup) = WN_element_size(arr);
02842
02843
02844 for (i=2*nd, k=2; i > nd; i--, k++ ) {
02845 WN_kid(address_fixup,i-nd) = WN_COPY_Tree(WN_kid(arr,i-nd));
02846 index = WN_kid(arr,i);
02847 if (WNOPR(index) == OPR_TRIPLET)
02848 index = WN_kid0(index);
02849 pos = cwh_io_search_implied_do_index(index, impdo_set);
02850 if (pos >= 1) {
02851 impdo = impdo_set;
02852 for (j=1; j < pos; j++)
02853 impdo = Impdo_next(impdo);
02854 WN_kid(wn,k) = WN_CreateLda (opc_lda, 0,
02855 Make_Pointer_Type(ST_type(Impdo_index(impdo))),
02856 Impdo_index(impdo));
02857 new_index_expr = Substitute_1_For_Impdo_Index_Val(
02858 WN_COPY_Tree(index), impdo);
02859 WN_kid(address_fixup,i) = new_index_expr;
02860 } else {
02861 WN_kid(address_fixup,i) = WN_COPY_Tree(index);
02862 WN_kid(wn,k) = WN_CreateIntconst ( OPC_I4INTCONST, 0);
02863 }
02864 }
02865
02866 if (final_address != NULL) {
02867 WN_kid0(final_address) = address_fixup;
02868 } else if (offset != NULL) {
02869 final_address = WN_Add(Pointer_Mtype, address_fixup, offset);
02870 } else {
02871 final_address = address_fixup;
02872 }
02873
02874 WN_kid0(wn) = cwh_dope_from_expression(arr, NULL, char_len, ty,
02875 craytype);
02876 WN_kid1(wn) = cwh_addr_find_address(arr);
02877 st = WN_st(WN_kid0(wn));
02878 cwh_addr_store_ST(st, 0, Be_Type_Tbl(Pointer_type), final_address);
02879 return wn;
02880 }
02881 }
02882
02883
02884
02885
02886
02887
02888
02889
02890
02891
02892
02893
02894 static INT32
02895 cwh_io_search_implied_do_index(WN *tree, IMPDO_INFO *impdo_set)
02896 {
02897 INT32 pos;
02898 ST *st;
02899 INT32 i;
02900
02901 if (WNOPR(tree) == OPR_LDID) {
02902 st = WN_st(tree);
02903 if ( (pos = member (st, impdo_set)) != 0)
02904 return pos;
02905 } else {
02906 for(i=0; i < WN_kid_count(tree); i++) {
02907 pos = cwh_io_search_implied_do_index(WN_kid(tree, i),impdo_set);
02908 if (pos != 0)
02909 return pos;
02910 }
02911 }
02912 return 0;
02913 }
02914
02915
02916
02917
02918
02919
02920
02921
02922
02923
02924 static void
02925 cwh_io_add_st_to_marked_set(ST *st) {
02926
02927 MARKED_SET *new_marked_set;
02928
02929 new_marked_set = (MARKED_SET *) malloc(sizeof(MARKED_SET));
02930 Marked_st(new_marked_set) = st;
02931 Marked_next(new_marked_set) = marked_set;
02932
02933 marked_set = new_marked_set;
02934 }
02935
02936
02937
02938
02939
02940
02941
02942
02943
02944
02945
02946 static void
02947 cwh_io_unmark(void) {
02948
02949 MARKED_SET *temp;
02950
02951 while(marked_set) {
02952 temp = marked_set;
02953 if (ST_auxst_visited(Marked_st(marked_set)))
02954 Set_ST_auxst_visited(Marked_st(marked_set),FALSE);
02955 marked_set = Marked_next(marked_set);
02956 free(temp);
02957 }
02958 }
02959
02960
02961
02962
02963
02964
02965
02966
02967
02968
02969
02970
02971 static WN *
02972 Substitute_1_For_Impdo_Index_Val(WN *tree, IMPDO_INFO *impdo)
02973 {
02974 INT32 i;
02975 #ifdef KEY
02976 OPCODE opc_intconst = OPC_I4INTCONST;
02977 #else
02978 OPCODE opc_intconst;
02979 #endif
02980 INT32 rtype;
02981
02982 if (WN_operator_is(tree,OPR_LDID) &&
02983 (WN_st(tree) == Impdo_index(impdo)) ) {
02984 rtype = WN_rtype(tree);
02985 switch (rtype) {
02986 case MTYPE_I4:
02987 opc_intconst = OPC_I4INTCONST;
02988 break;
02989 case MTYPE_I8:
02990 opc_intconst = OPC_I8INTCONST;
02991 break;
02992 case MTYPE_U4:
02993 opc_intconst = OPC_U4INTCONST;
02994 break;
02995 case MTYPE_U8:
02996 opc_intconst = OPC_U8INTCONST;
02997 break;
02998 default:
02999 DevAssert((0),("Odd type"));
03000 }
03001 return (WN_CreateIntconst ( opc_intconst, 1));
03002 } else {
03003 for(i=0; i<WN_kid_count(tree); i++ ) {
03004 WN_kid(tree, i) = Substitute_1_For_Impdo_Index_Val(WN_kid(tree, i),
03005 impdo);
03006 }
03007 }
03008 return tree;
03009 }
03010
03011
03012
03013
03014
03015
03016
03017
03018
03019 static void
03020 cwh_io_split_io_statement(WN *tree) {
03021 WN **cilist;
03022 WN *wn_tmp;
03023 WN *item;
03024 WN *wn;
03025 INT32 ioitem_tmp;
03026 INT32 i;
03027 INT32 j;
03028 INT32 iolist_marker;
03029 INT32 num_cilist_items;
03030 INT32 iostatement;
03031 WN *kid0;
03032 INT32 flflag;
03033 INT32 new_flflag;
03034
03035 iostatement = WN_io_statement(tree);
03036
03037 for(i=0; i<WN_kid_count(tree); i++) {
03038 wn_tmp = WN_kid(tree,i);
03039 ioitem_tmp = WN_io_item(wn_tmp);
03040 if (ioitem_tmp >= IOL_ARRAY)
03041 break;
03042 }
03043
03044 iolist_marker = i;
03045
03046 num_cilist_items = i ;
03047
03048 cilist = (WN **) malloc(sizeof (WN *) * num_cilist_items );
03049
03050 for(i=0; i<iolist_marker; i++)
03051 cilist[i] = WN_kid(tree,i);
03052
03053 wn = WN_CreateIo ( (IOSTATEMENT) iostatement, num_cilist_items);
03054
03055 for(j=0; j<num_cilist_items; j++) {
03056 wn_tmp = cilist[j];
03057 ioitem_tmp = WN_io_item(cilist[j]);
03058 if (ioitem_tmp == IOC_CR_FLFLAG) {
03059 kid0 = WN_kid0(wn_tmp);
03060 flflag = WN_const_val(kid0);
03061 new_flflag = flflag & 2;
03062 WN_kid(wn,j) = WN_CreateIoItem1 ( IOC_CR_FLFLAG,
03063 WN_CreateIntconst ( OPC_I4INTCONST, new_flflag),
03064 NIL);
03065 } else {
03066 WN_kid(wn,j) = WN_COPY_Tree(cilist[j]);
03067 }
03068 }
03069 cwh_block_append(wn);
03070
03071
03072 for(i=iolist_marker; i<WN_kid_count(tree); i++) {
03073 item = WN_kid(tree,i);
03074 cwh_io_split_io_items((IOSTATEMENT)iostatement, cilist, num_cilist_items, item);
03075 }
03076
03077 wn = WN_CreateIo ( (IOSTATEMENT)iostatement, num_cilist_items);
03078 for(j=0; j<num_cilist_items; j++) {
03079 wn_tmp = cilist[j];
03080 ioitem_tmp = WN_io_item(cilist[j]);
03081 if (ioitem_tmp == IOC_CR_FLFLAG) {
03082 kid0 = WN_kid0(wn_tmp);
03083 flflag = WN_const_val(kid0);
03084 new_flflag = flflag & 1;
03085 WN_kid(wn,j) = WN_CreateIoItem1 ( IOC_CR_FLFLAG,
03086 WN_CreateIntconst ( OPC_I4INTCONST, new_flflag),
03087 NIL);
03088 } else {
03089 WN_kid(wn,j) = WN_COPY_Tree(cilist[j]);
03090 }
03091 }
03092 cwh_block_append(wn);
03093 free(cilist);
03094 }
03095
03096
03097
03098
03099
03100
03101
03102
03103
03104
03105
03106
03107 static void
03108 cwh_io_split_io_items(IOSTATEMENT ios, WN **cilist,
03109 INT32 num_cilist_items, WN *item) {
03110 WN *wn;
03111 INT32 ioitem_tmp;
03112 INT32 i;
03113 INT32 j;
03114 WN *top_label;
03115 WN *cont_label;
03116 TY_IDX ty;
03117 INT32 mtype;
03118 INT32 ntype;
03119 WN *load_index;
03120 WN *start;
03121 WN *step;
03122 WN *end;
03123 PREG_NUM pregnum;
03124 ST *pregst;
03125 WN *ad;
03126 WN *se;
03127
03128 if (WN_io_item(item) == IOL_IMPLIED_DO) {
03129 top_label = cwh_io_create_new_label();
03130 cont_label = cwh_io_create_new_label();
03131 ty = ST_type(WN_st(WN_index(item)));
03132 if ( TY_kind(ty) != KIND_POINTER ) {
03133 ntype = mtype = TY_mtype(ty);
03134 if (ntype == MTYPE_I1 || ntype == MTYPE_I2)
03135 ntype = MTYPE_I4;
03136 load_index = WN_Ldid ( mtype, WN_idname_offset(WN_index(item)),
03137 WN_st(WN_index(item)), ty );
03138 start = WN_Stid ( mtype, WN_idname_offset(WN_index(item)),
03139 WN_st(WN_index(item)), ty, WN_start(item) );
03140 step = WN_Stid ( mtype, WN_idname_offset(WN_index(item)),
03141 WN_st(WN_index(item)), ty,
03142 WN_CreateExp2 ( OPCODE_make_op ( OPR_ADD, ntype,
03143 MTYPE_V ),
03144 WN_COPY_Tree ( load_index ),
03145 WN_COPY_Tree(WN_step(item)) ));
03146 } else {
03147 ntype = mtype = TY_mtype(TY_pointed(ty));
03148 if (ntype == MTYPE_I1 || ntype == MTYPE_I2)
03149 ntype = MTYPE_I4;
03150 load_index = WN_Iload ( mtype, 0, TY_pointed(ty),
03151 WN_Ldid ( Pointer_type,
03152 WN_idname_offset(WN_index(item)),
03153 WN_st(WN_index(item)), ty ));
03154 start = WN_Istore ( mtype, 0, ty,
03155 WN_Ldid ( Pointer_type,
03156 WN_idname_offset(WN_index(item)),
03157 WN_st(WN_index(item)), ty ),
03158 WN_start(item) );
03159 step = WN_Istore ( mtype, 0, ty,
03160 WN_Ldid ( Pointer_type,
03161 WN_idname_offset(WN_index(item)),
03162 WN_st(WN_index(item)), ty ),
03163 WN_CreateExp2 ( OPCODE_make_op ( OPR_ADD,
03164 ntype,
03165 MTYPE_V ),
03166 WN_COPY_Tree ( load_index ),
03167 WN_COPY_Tree(WN_step(item)) ));
03168 }
03169 if ( WN_operator(WN_step(item)) == OPR_INTCONST ||
03170 WN_operator(WN_step(item)) == OPR_CONST ) {
03171 if ( ( WN_operator(WN_step(item)) == OPR_INTCONST &&
03172 WN_const_val(WN_step(item)) >= 0 ) ||
03173 ( WN_operator(WN_step(item)) == OPR_CONST &&
03174 STC_val(WN_st(WN_step(item))).vals.ival.v0 >= 0 ) )
03175 end = WN_LE ( ntype, load_index, WN_end(item) );
03176 else
03177 end = WN_GE ( ntype, load_index, WN_end(item) );
03178 } else {
03179 pregst = MTYPE_To_PREG ( Boolean_type );
03180 pregnum = Create_Preg ( Boolean_type, "stoptemp");
03181 cwh_block_append( WN_StidIntoPreg ( Boolean_type, pregnum,
03182 pregst,
03183 WN_GE ( ntype,
03184 WN_COPY_Tree ( WN_step(item) ), WN_Zerocon ( ntype ))));
03185 end = WN_Select ( Boolean_type,
03186 WN_LdidPreg ( Boolean_type, pregnum ),
03187 WN_LE ( ntype, load_index, WN_end(item) ),
03188 WN_GE ( ntype, WN_COPY_Tree (load_index),
03189 WN_COPY_Tree (WN_end(item)) ));
03190 }
03191 cwh_block_append(start );
03192
03193 cwh_block_append( WN_CreateGoto ( (ST_IDX) NULL,
03194 WN_label_number(cont_label) ));
03195 cwh_block_append( top_label );
03196
03197 for (i=4; i < WN_kid_count(item); i++)
03198 cwh_io_split_io_items(ios, cilist, num_cilist_items,
03199 WN_kid(item,i));
03200
03201 cwh_block_append( step );
03202 cwh_block_append( cont_label );
03203 cwh_block_append( WN_CreateTruebr ( WN_label_number(top_label),
03204 end ));
03205
03206 } else {
03207
03208 if (WN_io_item(item) == IOL_DOPE) {
03209 se = cwh_addr_find_section(WN_kid0(item), p_RETURN_SECTION);
03210 ad = cwh_addr_find_address(se);
03211 wn = cwh_dope_from_expression(WN_kid0(item), NULL, WN_kid2(item), WN_ty(item), WN_kid1(item));
03212 WN_Delete(item);
03213 item = WN_CreateIoItem2(IOL_DOPE, wn, ad, NIL);
03214 }
03215
03216 wn = WN_CreateIo ( ios, num_cilist_items+1);
03217 for(j=0; j<num_cilist_items; j++) {
03218 ioitem_tmp = WN_io_item(cilist[j]);
03219 if (ioitem_tmp == IOC_CR_FLFLAG) {
03220 WN_kid(wn,j) = WN_CreateIoItem1 ( IOC_CR_FLFLAG,
03221 WN_CreateIntconst ( OPC_I4INTCONST, 0),
03222 NIL);
03223 } else {
03224 WN_kid(wn,j) = WN_COPY_Tree(cilist[j]);
03225 }
03226 }
03227
03228
03229 WN_kid(wn,num_cilist_items) = WN_COPY_Tree(item);
03230 cwh_block_append(wn);
03231 }
03232 }
03233
03234
03235
03236
03237
03238
03239
03240
03241
03242
03243 static BOOL
03244 OPCODE_has_aux(const OPCODE opc)
03245 {
03246
03247 OPERATOR opr = OPCODE_operator(opc);
03248 return (opr == OPR_LDID || opr == OPR_STID ||
03249 opr == OPR_LDA || opr == OPR_IDNAME);
03250 }
03251
03252
03253
03254
03255
03256
03257
03258
03259
03260
03261 static WN *
03262 cwh_io_create_new_label(void)
03263 {
03264 LABEL_IDX label;
03265
03266 (void) New_LABEL (CURRENT_SYMTAB, label);
03267 return WN_CreateLabel(NIL, label, 0, NIL);
03268 }
03269
03270
03271
03272
03273
03274
03275
03276
03277
03278
03279
03280 static WN *
03281 cwh_io_cvt_tos_label_to_wn(BOOL flag)
03282 {
03283 WN *wn;
03284
03285 if (cwh_stk_get_class() == LB_item) {
03286 LABEL_IDX lbl;
03287 lbl = (LABEL_IDX) cwh_stk_pop_LB();
03288 if (flag)
03289 Set_LABEL_KIND(Label_Table[lbl], LKIND_ASSIGNED);
03290 wn = WN_CreateGoto (lbl);
03291 } else {
03292 cwh_stk_pop_whatever();
03293 wn = NULL;
03294 }
03295 return wn;
03296 }