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 #ifdef _KEEP_RCS_ID
00058
00059 static char *rcs_id = "$Source: /depot/CVSROOT/javi/src/sw/cmplr/be/whirl2f/wn2f_pragma.cxx,v $ $Revision: 1.1 $";
00060 #endif
00061
00062 #include "alloca.h"
00063 #include "whirl2f_common.h"
00064 #include "w2cf_parentize.h"
00065 #include "const.h"
00066 #include "pf_cg.h"
00067 #include "region_util.h"
00068 #include "PUinfo.h"
00069 #include "wn2f.h"
00070 #include "st2f.h"
00071 #include "ty2f.h"
00072 #include "tcon2f.h"
00073 #include "wn2f_pragma.h"
00074
00075 extern BOOL Run_w2fc_early;
00076 extern WN_MAP *W2F_Construct_Map;
00077 extern BOOL W2F_Prompf_Emission;
00078 extern BOOL W2F_Emit_Omp;
00079
00080
00081 extern void WN2F_Append_Purple_Funcinfo(TOKEN_BUFFER tokens);
00082
00083
00084 #define WN_pragma_nest(wn) WN_pragma_arg1(wn)
00085 #define WN_max_nest_level(wn) WN_pragma_arg2(wn)
00086 #define WN_mp_schedtype(wn) (WN_PRAGMA_SCHEDTYPE_KIND)WN_pragma_arg1(wn)
00087
00088 #define EMIT_ARG_NUMBERS1(tokens, val1) \
00089 Append_Arg_Numbers((tokens), (val1), -1)
00090
00091 #define EMIT_ARG_NUMBERS2(tokens, val1, val2) \
00092 Append_Arg_Numbers((tokens), (val1), (val2))
00093
00094 #define PARENTHESIZE_ARG_NUMBERS1(tokens, val1) \
00095 Append_Token_Special((tokens), '('); \
00096 EMIT_ARG_NUMBERS1((tokens), (val1)); \
00097 Append_Token_Special((tokens), ')')
00098
00099 #define PARENTHESIZE_ARG_NUMBERS2(tokens, val1, val2) \
00100 Append_Token_Special((tokens), '('); \
00101 EMIT_ARG_NUMBERS2((tokens), (val1), (val2)); \
00102 Append_Token_Special((tokens), ')')
00103
00104
00105 typedef struct Array_Distribution
00106 {
00107 INT current_dimension;
00108 WN *base;
00109 WN *cyclic_expr;
00110 WN *dimension_bound;
00111 } ARRAY_DISTRIBUTION;
00112
00113
00114 #define MAX_PRAGMAS_TO_SKIP 50
00115 static struct Set_Of_Pragmas_To_Skip
00116 {
00117 INT start, end;
00118 WN *array[MAX_PRAGMAS_TO_SKIP];
00119 } Pragmas_To_Skip = {0, 0,
00120 {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00121 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00122 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00123 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00124 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}};
00125
00126
00127 typedef struct Local_Preg
00128 {
00129 ST * st;
00130 PREG_IDX preg_idx;
00131 } LOCAL_PREG;
00132
00133
00134 static WN * WN2F_Prompf_Subsection = NULL;
00135
00136
00137
00138
00139
00140 inline BOOL
00141 WN2F_is_omp(const WN *pragma)
00142 {
00143 return (WN_pragma_omp(pragma) ||
00144 (W2F_Emit_Omp && WN_pragma_compiler_generated(pragma)));
00145 }
00146
00147 static void
00148 WN2F_Start_Prompf_Construct(TOKEN_BUFFER tokens, WN *pragma)
00149 {
00150 INT32 construct_id = WN_MAP32_Get(*W2F_Construct_Map, pragma);
00151
00152 Append_F77_Directive_Newline(tokens, sgi_comment_str);
00153 Append_Token_String(tokens, "start");
00154 Append_Token_String(tokens, Number_as_String(construct_id, "%llu"));
00155 }
00156
00157
00158 static void
00159 WN2F_End_Prompf_Construct(TOKEN_BUFFER tokens, WN *pragma)
00160 {
00161 INT32 construct_id = WN_MAP32_Get(*W2F_Construct_Map, pragma);
00162
00163 Append_F77_Directive_Newline(tokens, sgi_comment_str);
00164 Append_Token_String(tokens, "end");
00165 Append_Token_String(tokens, Number_as_String(construct_id, "%llu"));
00166 }
00167
00168
00169 static void
00170 WN2F_Directive_Newline(TOKEN_BUFFER tokens,
00171 const char *directive_prefix,
00172 SRCPOS srcpos)
00173 {
00174 Append_F77_Directive_Newline(tokens, directive_prefix);
00175 if (W2F_File[W2F_LOC_FILE] != NULL)
00176 Append_Srcpos_Map(tokens, srcpos);
00177 }
00178
00179
00180
00181
00182
00183
00184 static void
00185 WN2F_Append_Pragma_Preamble(TOKEN_BUFFER tokens,WN * apragma)
00186 {
00187
00188
00189
00190
00191
00192
00193 if (WN2F_is_omp(apragma))
00194 Append_Token_String(tokens, "OMP");
00195 else
00196 Append_Token_String(tokens, "PAR");
00197 }
00198
00199 static void
00200 Append_Reduction_Operator(TOKEN_BUFFER tokens,OPERATOR op)
00201 {
00202
00203
00204
00205
00206 const char * p;
00207
00208 switch(op)
00209 {
00210 case OPR_MAX:
00211 p = "MAX";
00212 break;
00213
00214 case OPR_MIN:
00215 p = "MIN";
00216 break;
00217
00218 case OPR_BAND:
00219 p = "IAND";
00220 break;
00221
00222 case OPR_BIOR:
00223 p = "IOR";
00224 break;
00225
00226 case OPR_BXOR:
00227 p = "IEOR";
00228 break;
00229
00230 case OPR_LAND:
00231 p = ".AND.";
00232 break;
00233
00234 case OPR_LIOR:
00235 p = ".OR.";
00236 break;
00237
00238 case OPR_EQ:
00239 p = ".EQV.";
00240 break;
00241
00242 case OPR_NE:
00243 p = ".NEQV.";
00244 break;
00245
00246 case OPR_ADD:
00247 p = "+";
00248 break;
00249
00250 case OPR_MPY:
00251 p = "*";
00252 break;
00253
00254 case OPR_SUB:
00255 p = "-";
00256 break;
00257
00258 default:
00259 p = "?" ;
00260 }
00261 Append_Token_String(tokens, p);
00262 Append_Token_Special(tokens,':');
00263 }
00264
00265 static BOOL
00266 Is_Valid_Doacross(WN *doacross)
00267 {
00268
00269
00270
00271
00272 const WN *region = W2CF_Get_Parent(W2CF_Get_Parent(doacross));
00273 WN *region_body;
00274
00275 ASSERT_DBG_FATAL(WN_operator(region) == OPR_REGION,
00276 (DIAG_W2F_UNEXPECTED_OPC, "Is_Valid_Doacross"));
00277
00278 region_body = WN_region_body(region);
00279 return (WN_operator(WN_first(region_body)) == OPR_DO_LOOP &&
00280 WN_first(region_body) == WN_last(region_body));
00281 }
00282
00283
00284 static void
00285 Put_Pragma_Start_With_Caveats(TOKEN_BUFFER tokens, WN *apragma, BOOL warn)
00286 {
00287
00288
00289
00290
00291
00292
00293
00294 if (Is_Valid_Doacross(apragma))
00295 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
00296 else if (W2F_Prompf_Emission)
00297 WN2F_Directive_Newline(tokens, "CC$", WN_Get_Linenum(apragma));
00298 else
00299 {
00300 WN2F_Directive_Newline(tokens,"C<misplaced>$", WN_Get_Linenum(apragma));
00301
00302 if ( warn )
00303 {
00304 if (WN_pragma(apragma) == WN_PRAGMA_DOACROSS)
00305 ASSERT_WARN(FALSE, (DIAG_W2F_MISPLACED_PRAGMA, "DOACROSS"));
00306 else if (WN_pragma(apragma) == WN_PRAGMA_PDO_BEGIN)
00307 ASSERT_WARN(FALSE, (DIAG_W2F_MISPLACED_PRAGMA, "PDO"));
00308 else
00309 ASSERT_WARN(FALSE, (DIAG_W2F_MISPLACED_PRAGMA, "PARALLEL DO"));
00310 }
00311 }
00312 }
00313
00314 static BOOL
00315 Preg_Is_In_Clause_List(const WN *clause_list, ST *preg_st, PREG_IDX preg_idx)
00316 {
00317
00318
00319
00320
00321 BOOL found = FALSE;
00322
00323 while (!found && clause_list != NULL)
00324 {
00325 switch (WN_pragma(clause_list))
00326 {
00327 case WN_PRAGMA_LOCAL:
00328 case WN_PRAGMA_LASTLOCAL:
00329 case WN_PRAGMA_SHARED:
00330 case WN_PRAGMA_FIRSTPRIVATE:
00331 case WN_PRAGMA_REDUCTION:
00332 if (WN_operator(clause_list) != OPR_XPRAGMA &&
00333 WN_st(clause_list) == preg_st &&
00334 WN_pragma_arg1(clause_list) == preg_idx)
00335 {
00336 found = TRUE;
00337 }
00338 break;
00339 default:
00340 break;
00341 }
00342 clause_list = WN_next(clause_list);
00343 }
00344 return found;
00345 }
00346
00347
00348 static void
00349 Get_Implicit_Locals(WN_PRAGMA_ID kind,
00350 const WN *wn,
00351 const WN *clauses,
00352 LOCAL_PREG **ptr_to_local_list,
00353 UINT *next_local,
00354 UINT *max_locals)
00355 {
00356
00357
00358
00359 OPERATOR opr = WN_operator(wn);
00360 ST *st;
00361 PREG_IDX preg_idx;
00362
00363
00364
00365 switch (opr)
00366 {
00367 case OPR_LDA:
00368 st = WN_st(wn);
00369 preg_idx = WN_lda_offset(wn);
00370 break;
00371 case OPR_LDID:
00372 st = WN_st(wn);
00373 preg_idx = WN_load_offset(wn);
00374 break;
00375 case OPR_STID:
00376 st = WN_st(wn);
00377 preg_idx = WN_store_offset(wn);
00378 break;
00379 default:
00380 st = NULL;
00381 preg_idx = 0;
00382 }
00383
00384
00385
00386 if (st != NULL &&
00387 ST_sym_class(st) == CLASS_PREG &&
00388 !Preg_Is_In_Clause_List(clauses, st, preg_idx))
00389 {
00390
00391
00392 INT i;
00393 BOOL found = FALSE;
00394 LOCAL_PREG *local_list = *ptr_to_local_list;
00395
00396 for (i = 0; !found && i < *next_local; i++)
00397 if (local_list[i].st == st && local_list[i].preg_idx == preg_idx)
00398 found = TRUE;
00399
00400 if (!found)
00401 {
00402 if (*next_local >= *max_locals)
00403 {
00404
00405
00406
00407 *max_locals += 200;
00408 local_list = TYPE_ALLOC_N(LOCAL_PREG, *max_locals);
00409
00410
00411
00412 if (*ptr_to_local_list != NULL)
00413 {
00414 for (i = 0; i < *next_local; i++)
00415 local_list[i] = (*ptr_to_local_list)[i];
00416 FREE(*ptr_to_local_list);
00417 }
00418 *ptr_to_local_list = local_list;
00419 }
00420
00421
00422
00423 local_list[*next_local].st = st;
00424 local_list[*next_local].preg_idx = preg_idx;
00425 (*next_local)++;
00426 }
00427 }
00428
00429
00430
00431 if (!OPCODE_is_leaf(WN_opcode(wn)))
00432 {
00433 if (opr == OPR_REGION)
00434 {
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450 Get_Implicit_Locals(kind, WN_region_body(wn), clauses,
00451 ptr_to_local_list, next_local, max_locals);
00452 }
00453 else if (opr == OPR_BLOCK)
00454 {
00455 const WN* kid = WN_first(wn);
00456 while (kid)
00457 {
00458 Get_Implicit_Locals(kind, kid, clauses,
00459 ptr_to_local_list, next_local, max_locals);
00460 kid = WN_next(kid);
00461 }
00462 }
00463 else
00464 {
00465 INT kidno;
00466 const WN* kid;
00467 for (kidno=0; kidno < WN_kid_count(wn); kidno++)
00468 {
00469 kid = WN_kid (wn, kidno);
00470 if (kid)
00471 {
00472 Get_Implicit_Locals(kind, kid, clauses,
00473 ptr_to_local_list, next_local, max_locals);
00474 }
00475 }
00476 }
00477 }
00478 }
00479
00480
00481 static void
00482 Append_Implicit_Locals(TOKEN_BUFFER tokens,
00483 WN_PRAGMA_ID region_kind,
00484 const WN *region_body,
00485 const WN *region_clauses)
00486 {
00487
00488
00489
00490 LOCAL_PREG *local_list = NULL;
00491 UINT i, number_of_locals = 0, max_number_of_locals = 0;
00492
00493
00494
00495 Get_Implicit_Locals(region_kind, region_body, region_clauses,
00496 &local_list, &number_of_locals, &max_number_of_locals);
00497
00498
00499
00500 if (number_of_locals > 0)
00501 {
00502 if (region_clauses != NULL)
00503 Append_Token_Special(tokens, ',');
00504
00505 Append_Token_String(tokens, "local");
00506 Append_Token_Special(tokens, '(');
00507 for (i = 0; i < number_of_locals; i++)
00508 {
00509 if (i > 0)
00510 Append_Token_Special(tokens, ',');
00511
00512 ST2F_Use_Preg(tokens,
00513 ST_type(local_list[i].st), local_list[i].preg_idx);
00514 }
00515 Append_Token_Special(tokens, ')');
00516 }
00517
00518 if (local_list != NULL)
00519 FREE(local_list);
00520 }
00521
00522
00523 static BOOL
00524 WN2F_pragma_list_nowait(WN *first_pragma)
00525 {
00526 WN *wn;
00527 BOOL nowait = FALSE;
00528
00529 for (wn = first_pragma; !nowait && wn != NULL; wn = WN_next(wn))
00530 if ((WN_operator(wn) == OPR_PRAGMA || WN_operator(wn) == OPR_XPRAGMA) &&
00531 WN_pragma(wn) == WN_PRAGMA_NOWAIT)
00532 nowait = TRUE;
00533
00534 return nowait;
00535 }
00536
00537
00538 static void
00539 WN2F_Append_Value_Reference(TOKEN_BUFFER tokens, WN *expression)
00540 {
00541 WN2F_CONTEXT context = INIT_WN2F_CONTEXT;
00542
00543
00544
00545 if (TY_Is_Pointer(WN_Tree_Type(expression)))
00546 set_WN2F_CONTEXT_deref_addr(context);
00547 (void)WN2F_translate(tokens, expression, context);
00548 }
00549
00550
00551 static void
00552 WN2F_Prepend_Value_Reference(TOKEN_BUFFER tokens, WN *expression)
00553 {
00554 WN2F_CONTEXT context = INIT_WN2F_CONTEXT;
00555 TOKEN_BUFFER expr_tokens = New_Token_Buffer();
00556
00557
00558
00559 if (TY_Is_Pointer(WN_Tree_Type(expression)))
00560 set_WN2F_CONTEXT_deref_addr(context);
00561 (void)WN2F_translate(expr_tokens, expression, context);
00562 Prepend_And_Reclaim_Token_List(tokens, &expr_tokens);
00563 }
00564
00565
00566 static void
00567 Append_MP_Schedtype(TOKEN_BUFFER tokens, WN_PRAGMA_SCHEDTYPE_KIND kind)
00568 {
00569 switch (kind)
00570 {
00571 case WN_PRAGMA_SCHEDTYPE_RUNTIME:
00572 Append_Token_String(tokens, "runtime");
00573 break;
00574 case WN_PRAGMA_SCHEDTYPE_SIMPLE:
00575 Append_Token_String(tokens, "simple");
00576 break;
00577 case WN_PRAGMA_SCHEDTYPE_INTERLEAVE:
00578 Append_Token_String(tokens, "interleaved");
00579 break;
00580 case WN_PRAGMA_SCHEDTYPE_DYNAMIC:
00581 Append_Token_String(tokens, "dynamic");
00582 break;
00583 case WN_PRAGMA_SCHEDTYPE_GSS:
00584 Append_Token_String(tokens, "gss");
00585 break;
00586 case WN_PRAGMA_SCHEDTYPE_PSEUDOLOWERED:
00587 Append_Token_String(tokens, "pseudolowered");
00588 break;
00589 default:
00590 ASSERT_DBG_FATAL(FALSE,
00591 (DIAG_W2F_UNEXPECTED_OPC, "Append_MP_Schedtype"));
00592 break;
00593 }
00594 }
00595
00596
00597 static void
00598 Append_Arg_Numbers(TOKEN_BUFFER tokens,
00599 INT32 val1,
00600 INT32 val2)
00601 {
00602 if (val1 != -1)
00603 Append_Token_String(tokens, WHIRL2F_number_as_name(val1));
00604
00605 if (val2 != -1)
00606 {
00607 Append_Token_Special(tokens, ',');
00608 Append_Token_String(tokens, WHIRL2F_number_as_name(val2));
00609 }
00610 }
00611
00612
00613 static void
00614 Append_Prefetch_Attributes(TOKEN_BUFFER tokens,
00615 WN *prefetch,
00616 INT32 size)
00617 {
00618 INT pflag = WN_prefetch_flag(prefetch);
00619
00620
00621
00622 Append_Token_Special(tokens, '=');
00623 WN2F_Append_Value_Reference(tokens, WN_kid0(prefetch));
00624
00625
00626
00627 Append_Token_Special(tokens, ',');
00628 if (PF_GET_STRIDE_1L(pflag) > 0)
00629 {
00630 if (PF_GET_STRIDE_2L(pflag) > 0)
00631 {
00632 Append_Token_String(tokens,
00633 Concat2_Strings("stride=",
00634 Concat2_Strings(WHIRL2F_number_as_name(PF_GET_STRIDE_1L(pflag)),
00635 Concat2_Strings(",",
00636 WHIRL2F_number_as_name(PF_GET_STRIDE_2L(pflag))))));
00637 Append_Token_Special(tokens, ',');
00638 Append_Token_String(tokens, "level=1,2");
00639 }
00640 else
00641 {
00642 Append_Token_String(tokens,
00643 Concat2_Strings("stride=",
00644 WHIRL2F_number_as_name(PF_GET_STRIDE_1L(pflag))));
00645 Append_Token_Special(tokens, ',');
00646 Append_Token_String(tokens, "level=1");
00647 }
00648 }
00649 else if (PF_GET_STRIDE_2L(pflag) > 0)
00650 {
00651 Append_Token_String(tokens,
00652 Concat2_Strings("stride=,",
00653 WHIRL2F_number_as_name(PF_GET_STRIDE_2L(pflag))));
00654 Append_Token_Special(tokens, ',');
00655 Append_Token_String(tokens, "level=,2");
00656 }
00657 else
00658 {
00659 Append_Token_String(tokens, "stride=");
00660 Append_Token_Special(tokens, ',');
00661 Append_Token_String(tokens, "level=");
00662 }
00663
00664
00665
00666 Append_Token_Special(tokens, ',');
00667 if (PF_GET_READ(pflag))
00668 Append_Token_String(tokens, "kind=rd");
00669 else
00670 Append_Token_String(tokens, "kind=wr");
00671
00672
00673
00674 if (size > 0)
00675 {
00676 Append_Token_Special(tokens, ',');
00677 Append_Token_String(tokens,
00678 Concat2_Strings("size=", WHIRL2F_number_as_name(size)));
00679 }
00680 }
00681
00682
00683 static void
00684 Append_Distribution(TOKEN_BUFFER tokens, WN **apragma, WN_PRAGMA_ID id)
00685 {
00686 INT32 dim, num_dims;
00687 ARRAY_DISTRIBUTION distr[MAX_PRAGMAS_TO_SKIP];
00688 WN *wn = *apragma;
00689 WN2F_CONTEXT context = INIT_WN2F_CONTEXT;
00690
00691 ASSERT_DBG_FATAL(WN_operator(wn) == OPR_PRAGMA,
00692 (DIAG_W2F_UNEXPECTED_OPC, "Append_Distribution"));
00693
00694
00695
00696 for (num_dims = 0;
00697 (WN_operator(wn) == OPR_PRAGMA &&
00698 WN_pragma(wn) == id &&
00699 num_dims == WN_pragma_index(wn));
00700 num_dims++)
00701 {
00702
00703 distr[num_dims].current_dimension = WN_pragma_index(wn);
00704 distr[num_dims].base = wn;
00705 if (WN_pragma_distr_type(wn) == DISTRIBUTE_CYCLIC_EXPR)
00706 distr[num_dims].cyclic_expr = wn = WN_next(wn);
00707 distr[num_dims].dimension_bound = wn = WN_next(wn);
00708 wn = WN_next(wn);
00709 }
00710
00711
00712
00713
00714 if (WN_operator(wn)==OPR_STID && ST_class(WN_st(wn))==CLASS_PREG)
00715 {
00716 wn = WN_next(wn);
00717 if (WN_operator(wn)==OPR_STID && ST_class(WN_st(wn))==CLASS_PREG)
00718 wn = WN_next(wn);
00719 }
00720 *apragma = wn;
00721
00722
00723
00724
00725 Append_Token_Special(tokens, '(');
00726 for (dim = num_dims-1; dim >= 0; dim--)
00727 {
00728 switch (WN_pragma_distr_type(distr[dim].base))
00729 {
00730 case DISTRIBUTE_STAR:
00731 Append_Token_Special(tokens, '*');
00732 break;
00733
00734 case DISTRIBUTE_BLOCK:
00735 Append_Token_String(tokens, "block");
00736 break;
00737
00738 case DISTRIBUTE_CYCLIC_EXPR:
00739 Append_Token_String(tokens, "cyclic");
00740 Append_Token_Special(tokens, '(');
00741 WN2F_translate(tokens, WN_kid0(distr[dim].cyclic_expr), context);
00742 Append_Token_Special(tokens, ')');
00743 break;
00744
00745 case DISTRIBUTE_CYCLIC_CONST:
00746 Append_Token_String(tokens, "cyclic");
00747 PARENTHESIZE_ARG_NUMBERS1(tokens,
00748 WN_pragma_preg(distr[dim].base));
00749 break;
00750
00751 default:
00752 Append_Token_String(tokens, "unknown_distribution");
00753 break;
00754 }
00755
00756 if (dim > 0)
00757 Append_Token_Special(tokens, ',');
00758
00759 }
00760 Append_Token_Special(tokens, ')');
00761
00762 }
00763
00764
00765 static void
00766 Append_A_Clause_Symbol(TOKEN_BUFFER tokens, WN *clause, WN_OFFSET ofst)
00767 {
00768 ST * const st = WN_st(clause);
00769
00770 if (ST_class(st) == CLASS_PREG)
00771 {
00772 INT32 preg_num = WN_pragma_arg1(clause);
00773
00774 ST2F_Use_Preg(tokens, ST_type(st), preg_num);
00775 }
00776 else
00777 {
00778 const TY_IDX base_ty = ST_type(st);
00779 WN2F_CONTEXT context = INIT_WN2F_CONTEXT;
00780
00781 WN2F_Offset_Symref(tokens,
00782 st,
00783 Stab_Pointer_To(base_ty),
00784 base_ty,
00785 ofst,
00786 context);
00787 }
00788 }
00789
00790
00791 static void
00792 Append_Clause_Symbols(TOKEN_BUFFER tokens,
00793 WN_PRAGMA_ID id,
00794 WN **next)
00795 {
00796
00797
00798
00799
00800
00801
00802 WN *clause;
00803
00804 ASSERT_DBG_FATAL(WN_operator(*next) == OPR_PRAGMA,
00805 (DIAG_W2F_UNEXPECTED_OPC, "Append_Clause_Symbols"));
00806
00807 Append_Token_Special(tokens, '(');
00808 for (clause = *next;
00809 (clause != NULL &&
00810 WN_operator(clause) == OPR_PRAGMA &&
00811 WN_pragma(clause) == id);
00812 clause = WN_next(clause))
00813 {
00814 if (clause != *next)
00815 Append_Token_Special(tokens, ',');
00816
00817 Append_A_Clause_Symbol(tokens, clause, 0);
00818 }
00819 Append_Token_Special(tokens, ')');
00820 *next = clause;
00821 }
00822
00823
00824 static void
00825 Append_Reduction_Clause(TOKEN_BUFFER tokens,
00826 WN_PRAGMA_ID id,
00827 WN **next)
00828 {
00829
00830
00831
00832
00833 WN * clause;
00834 WN * const first_clause = *next;
00835
00836 ASSERT_DBG_FATAL(WN_operator(first_clause) == OPR_PRAGMA,
00837 (DIAG_W2F_UNEXPECTED_OPC, "Append_Reduction_Clause"));
00838
00839 Append_Token_String(tokens, "reduction (");
00840 for (clause = first_clause;
00841 (clause != NULL &&
00842 WN_operator(clause) == OPR_PRAGMA &&
00843 WN_pragma(clause) == id);
00844 clause = WN_next(clause))
00845 {
00846 if (WN2F_is_omp(clause) &&
00847 WN_pragma(clause) == WN_PRAGMA_REDUCTION &&
00848 WN_pragma_arg2(clause) != OPERATOR_UNKNOWN)
00849 {
00850 if (first_clause != clause)
00851 Append_Token_String(tokens, "), reduction (");
00852 Append_Reduction_Operator(tokens, (OPERATOR) WN_pragma_arg2(clause));
00853
00854 }
00855 else if (clause != first_clause)
00856 Append_Token_Special(tokens, ',');
00857
00858 Append_A_Clause_Symbol(tokens, clause, 0);
00859 }
00860
00861 Append_Token_Special(tokens, ')');
00862 *next = clause;
00863
00864 }
00865
00866
00867 static void
00868 Append_Clause_Expressions(TOKEN_BUFFER tokens,
00869 WN_PRAGMA_ID id,
00870 WN **next,
00871 BOOL reverse_order = FALSE)
00872 {
00873
00874
00875
00876
00877
00878
00879 TOKEN_BUFFER clause_tokens = New_Token_Buffer();
00880 WN * clause;
00881 WN * const first_clause = *next;
00882
00883 ASSERT_DBG_FATAL(WN_operator(first_clause) == OPR_XPRAGMA,
00884 (DIAG_W2F_UNEXPECTED_OPC, "Append_Clause_Expressions"));
00885
00886 Append_Token_Special(tokens, '(');
00887 for (clause = first_clause;
00888 (clause != NULL &&
00889 WN_operator(clause) == OPR_XPRAGMA &&
00890 WN_pragma(clause) == id);
00891 clause = WN_next(clause))
00892 {
00893 if (clause != first_clause)
00894 {
00895 if (reverse_order)
00896 Prepend_Token_Special(clause_tokens, ',');
00897 else
00898 Append_Token_Special(clause_tokens, ',');
00899 }
00900
00901
00902 if (id == WN_PRAGMA_ONTO &&
00903 WN_operator(WN_kid0(clause)) == OPR_INTCONST &&
00904 WN_const_val(WN_kid0(clause)) == 0)
00905 {
00906
00907
00908 if (reverse_order)
00909 Prepend_Token_Special(clause_tokens, '*');
00910 else
00911 Append_Token_Special(clause_tokens, '*');
00912 }
00913 else
00914 {
00915 if (reverse_order)
00916 WN2F_Prepend_Value_Reference(tokens, WN_kid0(clause));
00917 else
00918 WN2F_Append_Value_Reference(tokens, WN_kid0(clause));
00919 }
00920 }
00921 Append_And_Reclaim_Token_List(tokens, &clause_tokens);
00922 Append_Token_Special(tokens, ')');
00923 *next = clause;
00924 }
00925
00926
00927 static void
00928 Append_Array_Segment(TOKEN_BUFFER tokens,
00929 WN_PRAGMA_ID id,
00930 WN **next)
00931 {
00932
00933
00934
00935
00936
00937
00938 WN *clause;
00939
00940 ASSERT_DBG_FATAL(WN_operator(*next) == OPR_XPRAGMA,
00941 (DIAG_W2F_UNEXPECTED_OPC, "Append_Array_Segment"));
00942
00943 Append_Token_Special(tokens, '(');
00944 for (clause = *next;
00945 (clause != NULL &&
00946 WN_operator(clause) == OPR_XPRAGMA &&
00947 WN_pragma(clause) == id);
00948 clause = WN_next(clause))
00949 {
00950 if (clause != *next)
00951 Append_Token_Special(tokens, ',');
00952
00953 Append_A_Clause_Symbol(tokens, clause, 0);
00954 Append_Token_Special(tokens, '(');
00955 EMIT_ARG_NUMBERS1(tokens, 1);
00956 Append_Token_Special(tokens, ':');
00957 WN2F_Append_Value_Reference(tokens, WN_kid0(clause));
00958 Append_Token_Special(tokens, ')');
00959 }
00960 Append_Token_Special(tokens, ')');
00961
00962 *next = clause;
00963 }
00964
00965
00966 static void
00967 Append_Nest_Clauses(TOKEN_BUFFER tokens,
00968 const WN *nest_region,
00969 INT nest_levels,
00970 WN2F_CONTEXT context)
00971 {
00972 BOOL pattern_error = FALSE;
00973 INT nest;
00974 ST *idx_var;
00975 TY_IDX idx_ty;
00976 const WN *next_stmt = nest_region;
00977 WN_PRAGMA_ID nest_kind = WN_PRAGMA_UNDEFINED;
00978 TOKEN_BUFFER nest_tokens = New_Token_Buffer();
00979
00980 ASSERT_DBG_FATAL(next_stmt != NULL &&
00981 WN_operator(next_stmt) == OPR_REGION &&
00982 WN_first(WN_region_pragmas(next_stmt)) != NULL,
00983 (DIAG_W2F_UNEXPECTED_OPC, "Append_Nest_Clauses"));
00984
00985 nest_kind =
00986 (WN_PRAGMA_ID)WN_pragma(WN_first(WN_region_pragmas(next_stmt)));
00987
00988 Append_Token_String(nest_tokens, "nest");
00989 Append_Token_Special(nest_tokens, '(');
00990 reset_WN2F_CONTEXT(context);
00991 for (nest = 1; !pattern_error && nest <= nest_levels; nest++)
00992 {
00993
00994
00995
00996 next_stmt = WN_first(WN_region_body(next_stmt));
00997 while (next_stmt != NULL && WN_operator(next_stmt) != OPR_DO_LOOP)
00998 next_stmt = WN_next(next_stmt);
00999
01000 if (next_stmt == NULL)
01001 pattern_error = TRUE;
01002 else
01003 {
01004
01005
01006 idx_var = WN_st(WN_index(next_stmt));
01007 idx_ty = ST_type(idx_var);
01008 if (ST_class(idx_var) == CLASS_PREG)
01009 {
01010 ST2F_Use_Preg(nest_tokens,
01011 idx_ty,
01012 WN_idname_offset(WN_index(next_stmt)));
01013 }
01014 else
01015 {
01016 WN2F_Offset_Symref(nest_tokens,
01017 idx_var,
01018 Stab_Pointer_To(idx_ty),
01019 idx_ty,
01020 0,
01021 context);
01022 }
01023
01024
01025
01026
01027 if (nest < nest_levels)
01028 {
01029 Append_Token_Special(nest_tokens, ',');
01030
01031 next_stmt = WN_first(WN_do_body(next_stmt));
01032 while (next_stmt != NULL &&
01033 WN_operator(next_stmt) != OPR_REGION)
01034 next_stmt = WN_next(next_stmt);
01035
01036 if (next_stmt == NULL ||
01037 WN_first(WN_region_pragmas(next_stmt)) == NULL ||
01038 WN_pragma(WN_first(WN_region_pragmas(next_stmt))) !=
01039 nest_kind)
01040 pattern_error = TRUE;
01041 }
01042 }
01043 }
01044 Append_Token_Special(nest_tokens, ')');
01045
01046 if (!pattern_error)
01047 Append_And_Reclaim_Token_List(tokens, &nest_tokens);
01048 }
01049
01050
01051 static void
01052 Skip_Pragma_Clauses(WN **clause_list,
01053 WN2F_CONTEXT context)
01054 {
01055
01056
01057 WN *clause = *clause_list;
01058 BOOL more;
01059
01060 more = (clause != NULL &&
01061 (WN_operator(clause) == OPR_PRAGMA ||
01062 WN_operator(clause) == OPR_XPRAGMA));
01063
01064 while (more)
01065 {
01066 switch (WN_pragma(clause))
01067 {
01068 case WN_PRAGMA_AFFINITY:
01069 case WN_PRAGMA_DATA_AFFINITY:
01070 case WN_PRAGMA_THREAD_AFFINITY:
01071 case WN_PRAGMA_CHUNKSIZE:
01072 case WN_PRAGMA_IF:
01073 case WN_PRAGMA_LASTLOCAL:
01074 case WN_PRAGMA_LOCAL:
01075 case WN_PRAGMA_MPSCHEDTYPE:
01076 case WN_PRAGMA_ORDERED:
01077 case WN_PRAGMA_REDUCTION:
01078 case WN_PRAGMA_SHARED:
01079 case WN_PRAGMA_ONTO:
01080 case WN_PRAGMA_LASTTHREAD:
01081 case WN_PRAGMA_MPNUM:
01082 case WN_PRAGMA_SYNC_DOACROSS:
01083 case WN_PRAGMA_FIRSTPRIVATE:
01084 clause = WN_next(clause);
01085 break;
01086
01087 default:
01088 more = FALSE;
01089 break;
01090 }
01091
01092 more = (more &&
01093 clause != NULL &&
01094 (WN_operator(clause) == OPR_PRAGMA ||
01095 WN_operator(clause) == OPR_XPRAGMA));
01096 }
01097
01098 *clause_list = clause;
01099 }
01100
01101
01102 static void
01103 Skip_Ignored_Clauses(WN *following_clauses, WN **next_clause)
01104 {
01105 BOOL skipped = TRUE;
01106
01107 while (skipped && *next_clause != following_clauses)
01108 {
01109 switch (WN_pragma(*next_clause))
01110 {
01111 case WN_PRAGMA_DATA_AFFINITY:
01112 case WN_PRAGMA_THREAD_AFFINITY:
01113 case WN_PRAGMA_MPNUM:
01114 case WN_PRAGMA_SYNC_DOACROSS:
01115 *next_clause = WN_next(*next_clause);
01116 break;
01117 default:
01118 skipped = FALSE;
01119 break;
01120 }
01121 }
01122 }
01123
01124
01125 static void
01126 Append_Pragma_Clauses(TOKEN_BUFFER tokens,
01127 WN **clause_list,
01128 WN2F_CONTEXT context)
01129 {
01130
01131
01132
01133
01134
01135
01136
01137 WN *next;
01138 WN *clause = *clause_list;
01139 WN *wn_after_clauses = *clause_list;
01140
01141 Skip_Pragma_Clauses(&wn_after_clauses, context);
01142 while (clause != wn_after_clauses)
01143 {
01144 BOOL ignored_clause = FALSE;
01145
01146 next = clause;
01147 switch (WN_pragma(clause))
01148 {
01149 case WN_PRAGMA_DATA_AFFINITY:
01150 case WN_PRAGMA_THREAD_AFFINITY:
01151 case WN_PRAGMA_MPNUM:
01152 case WN_PRAGMA_SYNC_DOACROSS:
01153 case WN_PRAGMA_DEFAULT:
01154 ignored_clause = TRUE;
01155 break;
01156
01157 case WN_PRAGMA_AFFINITY:
01158 Append_Token_String(tokens, "affinity");
01159 Append_Clause_Expressions(tokens, WN_PRAGMA_AFFINITY, &clause);
01160
01161 Append_Token_Special(tokens, '=');
01162 if (WN_pragma(clause) == WN_PRAGMA_DATA_AFFINITY)
01163 Append_Token_String(tokens, "data");
01164 else if (WN_pragma(clause) == WN_PRAGMA_THREAD_AFFINITY)
01165 Append_Token_String(tokens, "thread");
01166 else
01167 ASSERT_DBG_FATAL(FALSE,
01168 (DIAG_W2F_UNEXPECTED_OPC,
01169 "Append_Pragma_Clauses"));
01170
01171
01172
01173
01174 Append_Token_Special(tokens, '(');
01175 WN2F_Append_Value_Reference(tokens, WN_kid0(clause));
01176 Append_Token_Special(tokens, ')');
01177 clause = WN_next(clause);
01178 break;
01179
01180 case WN_PRAGMA_CHUNKSIZE:
01181 Append_Token_String(tokens, "chunk");
01182 Append_Token_Special(tokens, '=');
01183 Append_Clause_Expressions(tokens, WN_PRAGMA_CHUNKSIZE, &clause);
01184 break;
01185
01186 case WN_PRAGMA_IF:
01187 Append_Token_String(tokens, "if");
01188 Append_Clause_Expressions(tokens, WN_PRAGMA_IF, &clause);
01189 break;
01190
01191 case WN_PRAGMA_LASTLOCAL:
01192 if (WN2F_is_omp(clause))
01193 Append_Token_String(tokens, "lastprivate");
01194 else
01195 Append_Token_String(tokens, "lastlocal");
01196 Append_Clause_Symbols(tokens, WN_PRAGMA_LASTLOCAL, &clause);
01197 break;
01198
01199 case WN_PRAGMA_LOCAL:
01200 if (WN2F_is_omp(clause))
01201 Append_Token_String(tokens, "private");
01202 else
01203 Append_Token_String(tokens, "local");
01204 if (WN_operator(clause) == OPR_XPRAGMA)
01205 {
01206 Append_Array_Segment(tokens, WN_PRAGMA_LOCAL, &clause);
01207 }
01208 else
01209 {
01210 Append_Clause_Symbols(tokens, WN_PRAGMA_LOCAL, &clause);
01211 }
01212 break;
01213
01214 case WN_PRAGMA_MPSCHEDTYPE:
01215
01216 if (WN2F_is_omp(clause))
01217 {
01218 Append_Token_String(tokens, "schedule");
01219 Append_Token_Special(tokens, '(');
01220 Append_MP_Schedtype(tokens, WN_mp_schedtype(clause));
01221 if (WN_next(clause) != NULL &&
01222 WN_pragma(WN_next(clause)) == WN_PRAGMA_CHUNKSIZE)
01223 {
01224 clause = WN_next(clause);
01225 Append_Token_Special(tokens, ',');
01226 WN2F_Append_Value_Reference(tokens, WN_kid0(clause));
01227 }
01228 Append_Token_Special(tokens, ')');
01229 clause = WN_next(clause);
01230 }
01231 else
01232 {
01233 Append_Token_String(tokens, "mp_schedtype");
01234 Append_Token_Special(tokens, '=');
01235 Append_MP_Schedtype(tokens, WN_mp_schedtype(clause));
01236 }
01237 break;
01238
01239 case WN_PRAGMA_ORDERED:
01240 if (WN2F_is_omp(clause))
01241 Append_Token_String(tokens, "ordered");
01242 else
01243 Append_Token_String(tokens, "(ordered)");
01244 break;
01245
01246 case WN_PRAGMA_REDUCTION:
01247 if (WN_operator(clause) == OPR_XPRAGMA)
01248 {
01249 Append_Token_String(tokens, "reduction");
01250 Append_Clause_Expressions(tokens, WN_PRAGMA_REDUCTION, &clause);
01251 }
01252 else
01253 {
01254 Append_Reduction_Clause(tokens, WN_PRAGMA_REDUCTION, &clause);
01255 }
01256 break;
01257
01258 case WN_PRAGMA_SHARED:
01259 Append_Token_String(tokens, "shared");
01260 Append_Clause_Symbols(tokens, WN_PRAGMA_SHARED, &clause);
01261 break;
01262
01263 case WN_PRAGMA_ONTO:
01264 Append_Token_String(tokens, "onto");
01265 Append_Clause_Expressions(tokens, WN_PRAGMA_ONTO, &clause,
01266 TRUE);
01267 break;
01268
01269 case WN_PRAGMA_LASTTHREAD:
01270 Append_Token_String(tokens, "lastthread");
01271 Append_Clause_Symbols(tokens, WN_PRAGMA_LASTTHREAD, &clause);
01272 break;
01273
01274 case WN_PRAGMA_FIRSTPRIVATE:
01275 Append_Token_String(tokens, "firstprivate");
01276 Append_Clause_Symbols(tokens, WN_PRAGMA_FIRSTPRIVATE, &clause);
01277 break;
01278
01279 default:
01280 ASSERT_WARN(FALSE,
01281 (DIAG_W2F_UNEXPECTED_PRAGMA, " Append_Pragma_Clauses"));
01282 break;
01283 }
01284
01285
01286
01287
01288
01289 if (next == clause)
01290 clause = WN_next(clause);
01291
01292 Skip_Ignored_Clauses(wn_after_clauses, &clause);
01293 if (clause != wn_after_clauses && !ignored_clause)
01294 Append_Token_Special(tokens, ',');
01295 }
01296
01297 *clause_list = clause;
01298 }
01299
01300
01301 static void
01302 Emit_To_PUinfo_Pragmas(WN **next, WN2F_CONTEXT context)
01303 {
01304
01305
01306
01307
01308 TOKEN_BUFFER tokens = New_Token_Buffer();
01309
01310 ASSERT_DBG_FATAL(WN_operator(*next) == OPR_PRAGMA ||
01311 WN_operator(*next) == OPR_XPRAGMA,
01312 (DIAG_W2F_UNEXPECTED_OPC, "WN2F_pragma"));
01313
01314 switch (WN_pragma(*next))
01315 {
01316 case WN_PRAGMA_DISTRIBUTE:
01317 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(*next));
01318 Append_Token_String(tokens, "DISTRIBUTE");
01319 Append_A_Clause_Symbol(tokens, *next, 0);
01320 Append_Distribution(tokens, next, WN_PRAGMA_DISTRIBUTE);
01321 Append_Pragma_Clauses(tokens, next, context);
01322 break;
01323
01324 case WN_PRAGMA_DISTRIBUTE_RESHAPE:
01325 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(*next));
01326 Append_Token_String(tokens, "DISTRIBUTE RESHAPE");
01327 Append_A_Clause_Symbol(tokens, *next, 0);
01328 Append_Distribution(tokens, next, WN_PRAGMA_DISTRIBUTE_RESHAPE);
01329 Append_Pragma_Clauses(tokens, next, context);
01330 break;
01331
01332 default:
01333 ASSERT_WARN(FALSE,
01334 (DIAG_W2F_UNEXPECTED_PRAGMA, "Emit_To_PUinfo_Pragmas"));
01335 break;
01336 }
01337 Prepend_And_Reclaim_Token_List(PUinfo_pragmas, &tokens);
01338 }
01339
01340
01341 static WN *
01342 Get_Enclosing_Parallel_Region(const WN *construct)
01343 {
01344 WN *found_parallel = NULL;
01345
01346 construct = W2CF_Get_Parent(construct);
01347 while (found_parallel == NULL && construct != NULL)
01348 {
01349 if (WN_operator(construct) == OPR_REGION)
01350 {
01351 WN *pragma = WN_first(WN_region_pragmas(construct));
01352 if (WN_pragma(pragma) == WN_PRAGMA_PARALLEL_BEGIN)
01353 found_parallel = pragma;
01354 }
01355 construct = W2CF_Get_Parent(construct);
01356 }
01357 return found_parallel;
01358 }
01359
01360
01361 static void
01362 WN2F_process_pragma(TOKEN_BUFFER tokens, WN **next, WN2F_CONTEXT context)
01363 {
01364
01365
01366
01367
01368 WN *apragma = *next;
01369 WN *this_pragma = apragma;
01370 WN *first_clause;
01371 const WN *surrounding_region;
01372
01373 ASSERT_DBG_FATAL(WN_operator(apragma) == OPR_PRAGMA ||
01374 WN_operator(apragma) == OPR_XPRAGMA,
01375 (DIAG_W2F_UNEXPECTED_OPC, "WN2F_process_pragma"));
01376
01377 switch (WN_pragma(apragma))
01378 {
01379 case WN_PRAGMA_INLINE_DEPTH:
01380 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01381 Append_Token_String(tokens,"INLINE_DEPTH");
01382 Append_Token_Special(tokens,'=');
01383 EMIT_ARG_NUMBERS1(tokens, WN_pragma_arg1(apragma));
01384 break;
01385
01386 case WN_PRAGMA_AGGRESSIVE_INNER_LOOP_FISSION:
01387 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01388 Append_Token_String(tokens,"AGGRESSIVE INNER LOOP FISSION");
01389 break;
01390
01391 case WN_PRAGMA_FISSION:
01392 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01393 Append_Token_String(tokens,"FISSION");
01394 PARENTHESIZE_ARG_NUMBERS1(tokens, WN_pragma_arg1(apragma));
01395 break;
01396
01397 case WN_PRAGMA_FISSIONABLE:
01398 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01399 Append_Token_String(tokens,"FISSIONABLE");
01400 break;
01401
01402 case WN_PRAGMA_FUSE:
01403 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01404 Append_Token_String(tokens,"FUSE");
01405 PARENTHESIZE_ARG_NUMBERS2(tokens,
01406 WN_pragma_arg1(apragma),
01407 WN_pragma_arg2(apragma));
01408 break;
01409
01410 case WN_PRAGMA_FUSEABLE:
01411 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01412 Append_Token_String(tokens,"FUSABLE");
01413 break;
01414
01415 case WN_PRAGMA_NO_FISSION:
01416 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01417 Append_Token_String(tokens,"NO FISSION");
01418 break;
01419
01420 case WN_PRAGMA_NO_FUSION:
01421 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01422 Append_Token_String(tokens,"NO FUSION");
01423 break;
01424
01425 case WN_PRAGMA_INTERCHANGE:
01426 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01427 Append_Token_String(tokens, "INTERCHANGE");
01428 Append_Clause_Symbols(tokens, (WN_PRAGMA_ID)WN_pragma(apragma),
01429 &apragma);
01430 break;
01431
01432 case WN_PRAGMA_NO_INTERCHANGE:
01433 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01434 Append_Token_String(tokens, "NO INTERCHANGE");
01435 break;
01436
01437 case WN_PRAGMA_BLOCKING_SIZE:
01438 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01439 Append_Token_String(tokens, "BLOCKING SIZE");
01440 PARENTHESIZE_ARG_NUMBERS2(tokens,
01441 WN_pragma_arg1(apragma),
01442 WN_pragma_arg2(apragma));
01443 break;
01444
01445 case WN_PRAGMA_NO_BLOCKING:
01446 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01447 Append_Token_String(tokens, "NO BLOCKING");
01448 break;
01449
01450 case WN_PRAGMA_UNROLL:
01451 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01452 Append_Token_String(tokens, "UNROLL");
01453 PARENTHESIZE_ARG_NUMBERS2(tokens,
01454 WN_pragma_arg1(apragma),
01455 WN_pragma_arg2(apragma));
01456 break;
01457
01458 case WN_PRAGMA_BLOCKABLE:
01459 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01460 Append_Token_String(tokens, "BLOCKABLE");
01461 Append_Clause_Symbols(tokens, (WN_PRAGMA_ID)WN_pragma(apragma),
01462 &apragma);
01463 break;
01464
01465 case WN_PRAGMA_PREFETCH:
01466 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01467 Append_Token_String(tokens, "PREFETCH");
01468 PARENTHESIZE_ARG_NUMBERS2(tokens,
01469 WN_pragma_arg1(apragma),
01470 WN_pragma_arg2(apragma));
01471 break;
01472
01473 case WN_PRAGMA_PREFETCH_MANUAL:
01474 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01475 Append_Token_String(tokens, "PREFETCH_MANUAL");
01476 PARENTHESIZE_ARG_NUMBERS1(tokens, WN_pragma_arg1(apragma));
01477 break;
01478
01479 case WN_PRAGMA_PREFETCH_REF:
01480 if (WN_next(apragma) != NULL &&
01481 WN_operator(WN_next(apragma)) == OPR_PREFETCH)
01482 {
01483 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01484 Append_Token_String(tokens, "PREFETCH_REF");
01485 Append_Prefetch_Attributes(tokens,
01486 WN_next(apragma),
01487 WN_pragma_arg2(apragma));
01488 }
01489 break;
01490
01491 case WN_PRAGMA_PREFETCH_REF_DISABLE:
01492 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01493 Append_Token_String(tokens, "PREFETCH_REF_DISABLE");
01494 Append_Token_Special(tokens, '=');
01495 Append_A_Clause_Symbol(tokens, apragma, 0);
01496 if (WN_pragma_arg2(apragma) > 0)
01497 {
01498 Append_Token_Special(tokens, ',');
01499 Append_Token_String(tokens, "size");
01500 Append_Token_Special(tokens, '=');
01501 EMIT_ARG_NUMBERS1(tokens, WN_pragma_arg2(apragma));
01502 }
01503 break;
01504
01505 case WN_PRAGMA_DISTRIBUTE:
01506 Emit_To_PUinfo_Pragmas(&apragma, context);
01507 break;
01508
01509 case WN_PRAGMA_REDISTRIBUTE:
01510 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01511 Append_Token_String(tokens, "REDISTRIBUTE");
01512 Append_A_Clause_Symbol(tokens, apragma, 0);
01513 Append_Distribution(tokens, &apragma, WN_PRAGMA_REDISTRIBUTE);
01514 Append_Pragma_Clauses(tokens, &apragma, context);
01515 break;
01516
01517 case WN_PRAGMA_DISTRIBUTE_RESHAPE:
01518 Emit_To_PUinfo_Pragmas(&apragma, context);
01519 break;
01520
01521 case WN_PRAGMA_DYNAMIC:
01522 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01523 Append_Token_String(tokens, "DYNAMIC");
01524 Append_A_Clause_Symbol(tokens, apragma, 0);
01525 break;
01526
01527 case WN_PRAGMA_IVDEP:
01528 WN2F_Directive_Newline(tokens, "CDIR$", WN_Get_Linenum(apragma));
01529 Append_Token_String(tokens, "IVDEP");
01530 break;
01531
01532 case WN_PRAGMA_DOACROSS:
01533
01534
01535 if (WN_pragma_nest(apragma) <= 0 &&
01536 !Ignore_Synchronized_Construct(apragma, context))
01537 {
01538 surrounding_region = W2CF_Get_Parent(W2CF_Get_Parent(apragma));
01539 first_clause = WN_next(apragma);
01540
01541 Put_Pragma_Start_With_Caveats(tokens,apragma,TRUE);
01542 Append_Token_String(tokens, "DOACROSS");
01543 if (WN_max_nest_level(apragma) > 1)
01544 Append_Nest_Clauses(tokens,
01545 surrounding_region,
01546 WN_max_nest_level(apragma),
01547 context);
01548 apragma = first_clause;
01549 Append_Pragma_Clauses(tokens, &apragma, context);
01550 Append_Implicit_Locals(tokens,
01551 WN_PRAGMA_DOACROSS,
01552 WN_region_body(surrounding_region),
01553 first_clause);
01554 }
01555 else
01556 {
01557 apragma = WN_next(apragma);
01558 Skip_Pragma_Clauses(&apragma, context);
01559 }
01560 break;
01561
01562 case WN_PRAGMA_MPSCHEDTYPE:
01563
01564
01565 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01566 if (WN2F_is_omp(apragma))
01567 {
01568 Append_Token_String(tokens, "SCHEDULE");
01569 Append_Token_Special(tokens, '(');
01570 Append_MP_Schedtype(tokens, WN_mp_schedtype(apragma));
01571 if (WN_next(apragma) != NULL &&
01572 WN_pragma(WN_next(apragma)) == WN_PRAGMA_CHUNKSIZE)
01573 {
01574 apragma = WN_next(apragma);
01575 Append_Token_Special(tokens, ',');
01576 WN2F_Append_Value_Reference(tokens, WN_kid0(apragma));
01577 }
01578 Append_Token_Special(tokens, ')');
01579 apragma = WN_next(apragma);
01580 }
01581 else
01582 {
01583 Append_Token_String(tokens, "MP_SCHEDTYPE");
01584 Append_Token_Special(tokens, '=');
01585 Append_MP_Schedtype(tokens, WN_mp_schedtype(apragma));
01586 }
01587 break;
01588
01589 case WN_PRAGMA_BARRIER:
01590 if (W2F_Prompf_Emission)
01591 WN2F_Start_Prompf_Construct(tokens, apragma);
01592 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01593 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01594 Append_Token_String(tokens, "BARRIER");
01595 if (W2F_Prompf_Emission)
01596 WN2F_End_Prompf_Construct(tokens, apragma);
01597 break;
01598
01599 case WN_PRAGMA_COPYIN:
01600 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01601 if (WN2F_is_omp(apragma))
01602 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01603 Append_Token_String(tokens, "COPYIN");
01604 if (WN_operator(apragma) == OPR_XPRAGMA)
01605 Append_Clause_Expressions(tokens,
01606 (WN_PRAGMA_ID)WN_pragma(apragma),
01607 &apragma);
01608 else
01609 {
01610
01611 Append_Token_Special(tokens, '/');
01612 ST2F_use_translate(tokens, WN_st(apragma));
01613 Append_Token_Special(tokens, '/');
01614 }
01615 break;
01616
01617 case WN_PRAGMA_CRITICAL_SECTION_BEGIN:
01618 if (W2F_Prompf_Emission)
01619 WN2F_Start_Prompf_Construct(tokens, apragma);
01620 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01621 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01622 if (WN2F_is_omp(apragma))
01623 Append_Token_String(tokens, "CRITICAL");
01624 else
01625 Append_Token_String(tokens, "CRITICAL SECTION");
01626 if (WN_operator(apragma) == OPR_XPRAGMA)
01627 Append_Clause_Expressions(tokens,
01628 (WN_PRAGMA_ID)WN_pragma(apragma),
01629 &apragma);
01630 break;
01631
01632 case WN_PRAGMA_CRITICAL_SECTION_END:
01633 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01634 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01635 if (WN2F_is_omp(apragma))
01636 Append_Token_String(tokens, "END CRITICAL");
01637 else
01638 Append_Token_String(tokens, "END CRITICAL SECTION");
01639 if (W2F_Prompf_Emission)
01640 WN2F_End_Prompf_Construct(tokens, apragma);
01641 break;
01642
01643 case WN_PRAGMA_ORDERED_BEGIN:
01644 if (W2F_Prompf_Emission)
01645 WN2F_Start_Prompf_Construct(tokens, apragma);
01646 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01647 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01648 Append_Token_String(tokens, "ORDERED");
01649 if (WN_operator(apragma) == OPR_XPRAGMA)
01650 Append_Clause_Expressions(tokens,
01651 (WN_PRAGMA_ID)WN_pragma(apragma),
01652 &apragma);
01653 break;
01654
01655 case WN_PRAGMA_ORDERED_END:
01656 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01657 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01658 Append_Token_String(tokens, "END ORDERED");
01659 if (W2F_Prompf_Emission)
01660 WN2F_End_Prompf_Construct(tokens, apragma);
01661 break;
01662
01663 case WN_PRAGMA_ATOMIC:
01664 if (W2F_Prompf_Emission)
01665 WN2F_Start_Prompf_Construct(tokens, apragma);
01666 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01667 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01668 Append_Token_String(tokens, "ATOMIC");
01669 if (WN_operator(apragma) == OPR_XPRAGMA)
01670 Append_Clause_Expressions(tokens,
01671 (WN_PRAGMA_ID)WN_pragma(apragma),
01672 &apragma);
01673 if (W2F_Prompf_Emission)
01674 WN2F_End_Prompf_Construct(tokens, this_pragma);
01675 break;
01676
01677 case WN_PRAGMA_PARALLEL_BEGIN:
01678
01679
01680 if (!Ignore_Synchronized_Construct(apragma, context))
01681 {
01682 surrounding_region = W2CF_Get_Parent(W2CF_Get_Parent(apragma));
01683 first_clause = WN_next(apragma);
01684
01685 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01686
01687 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01688 Append_Token_String(tokens, "PARALLEL");
01689 apragma = first_clause;
01690 Append_Pragma_Clauses(tokens, &apragma, context);
01691 Append_Implicit_Locals(tokens,
01692 WN_PRAGMA_PARALLEL_BEGIN,
01693 WN_region_body(surrounding_region),
01694 first_clause);
01695 }
01696 break;
01697
01698 case WN_PRAGMA_PARALLEL_DO:
01699
01700
01701 if (WN_pragma_nest(apragma) <= 0 &&
01702 !Ignore_Synchronized_Construct(apragma, context))
01703 {
01704 surrounding_region = W2CF_Get_Parent(W2CF_Get_Parent(apragma));
01705 first_clause = WN_next(apragma);
01706 Put_Pragma_Start_With_Caveats(tokens,apragma,TRUE);
01707 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01708 Append_Token_String(tokens, "PARALLEL DO");
01709
01710 if (WN_max_nest_level(apragma) > 1)
01711 Append_Nest_Clauses(tokens,
01712 surrounding_region,
01713 WN_max_nest_level(apragma),
01714 context);
01715 apragma = first_clause;
01716 Append_Pragma_Clauses(tokens, &apragma, context);
01717 Append_Implicit_Locals(tokens,
01718 WN_PRAGMA_PARALLEL_DO,
01719 WN_region_body(surrounding_region),
01720 first_clause);
01721 }
01722 else
01723 {
01724 apragma = WN_next(apragma);
01725 Skip_Pragma_Clauses(&apragma, context);
01726 }
01727 break;
01728
01729 case WN_PRAGMA_PDO_BEGIN:
01730
01731
01732 if (WN_pragma_nest(apragma) <= 0 &&
01733 !Ignore_Synchronized_Construct(apragma, context))
01734 {
01735 surrounding_region = W2CF_Get_Parent(W2CF_Get_Parent(apragma));
01736 first_clause = WN_next(apragma);
01737
01738 Put_Pragma_Start_With_Caveats(tokens,apragma,TRUE);
01739 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01740 if (WN2F_is_omp(apragma))
01741 Append_Token_String(tokens, "DO");
01742 else
01743 Append_Token_String(tokens, "PDO");
01744
01745 if (WN_max_nest_level(apragma) > 1)
01746 Append_Nest_Clauses(tokens,
01747 surrounding_region,
01748 WN_max_nest_level(apragma),
01749 context);
01750 apragma = first_clause;
01751 Append_Pragma_Clauses(tokens, &apragma, context);
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762 }
01763 else
01764 {
01765 apragma = WN_next(apragma);
01766 Skip_Pragma_Clauses(&apragma, context);
01767 }
01768 break;
01769
01770
01771
01772 case WN_PRAGMA_PARALLEL_SECTIONS:
01773 case WN_PRAGMA_PSECTION_BEGIN:
01774 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01775 WN2F_Append_Pragma_Preamble(tokens,apragma);
01776 if (WN2F_is_omp(apragma))
01777 Append_Token_String(tokens, "PARALLEL SECTIONS");
01778 else
01779 Append_Token_String(tokens, "PSECTIONS");
01780 apragma = WN_next(apragma);
01781 Append_Pragma_Clauses(tokens, &apragma, context);
01782 break;
01783
01784 case WN_PRAGMA_SECTION:
01785 if (W2F_Prompf_Emission)
01786 {
01787 if (WN2F_Prompf_Subsection != NULL)
01788 {
01789
01790
01791 WN2F_End_Prompf_Construct(tokens, WN2F_Prompf_Subsection);
01792 }
01793 WN2F_Prompf_Subsection = apragma;
01794 WN2F_Start_Prompf_Construct(tokens, apragma);
01795 }
01796 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01797 WN2F_Append_Pragma_Preamble(tokens,apragma);
01798 Append_Token_String(tokens, "SECTION");
01799 break;
01800
01801
01802
01803 case WN_PRAGMA_SINGLE_PROCESS_BEGIN:
01804 if (!Ignore_Synchronized_Construct(apragma, context))
01805 {
01806 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01807 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01808 if (WN2F_is_omp(apragma))
01809 Append_Token_String(tokens, "SINGLE");
01810 else
01811 Append_Token_String(tokens, "SINGLE PROCESS");
01812 apragma = WN_next(apragma);
01813 Append_Pragma_Clauses(tokens, &apragma, context);
01814 }
01815 break;
01816
01817
01818
01819 case WN_PRAGMA_MASTER_BEGIN:
01820 if (!Ignore_Synchronized_Construct(apragma, context))
01821 {
01822 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01823 WN2F_Append_Pragma_Preamble(tokens,apragma) ;
01824 if (WN2F_is_omp(apragma))
01825 Append_Token_String(tokens, "MASTER");
01826 else
01827 Append_Token_String(tokens, "MASTER PROCESS");
01828 }
01829 break;
01830
01831 case WN_PRAGMA_NUMTHREADS:
01832
01833
01834
01835 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01836 Append_Token_String(tokens, "NUMTHREADS");
01837 Append_Clause_Expressions(tokens,
01838 (WN_PRAGMA_ID)WN_pragma(apragma),
01839 &apragma);
01840 break;
01841
01842 case WN_PRAGMA_PAGE_PLACE:
01843 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(apragma));
01844 Append_Token_String(tokens, "PAGE_PLACE");
01845 Append_Clause_Expressions(tokens,
01846 (WN_PRAGMA_ID)WN_pragma(apragma),
01847 &apragma);
01848 break;
01849
01850 case WN_PRAGMA_NORECURRENCE:
01851 WN2F_Directive_Newline(tokens, "CDIR$", WN_Get_Linenum(apragma));
01852 Append_Token_String(tokens, "NO RECURRENCE");
01853 break;
01854
01855 case WN_PRAGMA_NEXT_SCALAR:
01856 WN2F_Directive_Newline(tokens, "CDIR$", WN_Get_Linenum(apragma));
01857 Append_Token_String(tokens, "NEXT SCALAR");
01858 break;
01859
01860 case WN_PRAGMA_KAP_CONCURRENTIZE:
01861 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01862 Append_Token_String(tokens, "CONCURRENTIZE");
01863 break;
01864
01865 case WN_PRAGMA_KAP_NOCONCURRENTIZE:
01866 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01867 Append_Token_String(tokens, "NO CONCURRENTIZE");
01868 break;
01869
01870 case WN_PRAGMA_KAP_ASSERT_PERMUTATION:
01871 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01872 Append_Token_String(tokens, "ASSERT PERMUTATION");
01873 Append_A_Clause_Symbol(tokens, apragma, 0);
01874 break;
01875
01876 case WN_PRAGMA_CRI_CNCALL:
01877 case WN_PRAGMA_KAP_ASSERT_CONCURRENT_CALL:
01878 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01879 Append_Token_String(tokens, "ASSERT CONCURRENT CALL");
01880 break;
01881
01882 case WN_PRAGMA_KAP_ASSERT_DO:
01883 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01884 if (WN_pragma_arg1(apragma) == ASSERT_DO_CONCURRENT)
01885 Append_Token_String(tokens, "ASSERT DO (CONCURRENT)");
01886 else
01887 Append_Token_String(tokens, "ASSERT DO (SERIAL)");
01888 break;
01889
01890 case WN_PRAGMA_KAP_ASSERT_DOPREFER:
01891 WN2F_Directive_Newline(tokens, "C*$*", WN_Get_Linenum(apragma));
01892 if (WN_pragma_arg1(apragma) == ASSERT_DO_CONCURRENT)
01893 Append_Token_String(tokens, "ASSERT DO PREFER (CONCURRENT)");
01894 else
01895 Append_Token_String(tokens, "ASSERT DO PREFER (SERIAL)");
01896 break;
01897
01898
01899 default:
01900
01901
01902
01903 break;
01904
01905 }
01906
01907
01908
01909
01910
01911 if (apragma == *next)
01912 *next = WN_next(apragma);
01913 else
01914 *next = apragma;
01915
01916 }
01917
01918
01919
01920
01921
01922
01923 BOOL
01924 WN2F_Skip_Pragma_Stmt(WN *wn)
01925 {
01926
01927
01928
01929
01930 BOOL found = (Pragmas_To_Skip.array[Pragmas_To_Skip.start] == wn);
01931
01932 if (found)
01933 {
01934 if (Pragmas_To_Skip.end - Pragmas_To_Skip.start == 1)
01935 {
01936 Pragmas_To_Skip.start = Pragmas_To_Skip.end = 0;
01937 Pragmas_To_Skip.array[0] = NULL;
01938 }
01939 else
01940 {
01941 Pragmas_To_Skip.start++;
01942 }
01943 }
01944 return found;
01945 }
01946
01947
01948 WN2F_STATUS
01949 WN2F_pragma(TOKEN_BUFFER tokens, WN *wn, WN2F_CONTEXT context)
01950 {
01951 WN *skip;
01952 WN *next = wn;
01953
01954 ASSERT_DBG_FATAL(WN_operator(wn) == OPR_PRAGMA ||
01955 WN_operator(wn) == OPR_XPRAGMA,
01956 (DIAG_W2F_UNEXPECTED_OPC, "WN2F_pragma"));
01957
01958
01959
01960
01961 if (W2F_Purple_Emission && WN_pragma(wn) == WN_PRAGMA_PREAMBLE_END)
01962 {
01963
01964
01965 Append_F77_Indented_Newline(tokens, 1, NULL);
01966 Append_Token_String(tokens, "<#PRP_XSYM:INIT_STMT");
01967 WN2F_Append_Purple_Funcinfo(tokens);
01968 Append_Token_String(tokens, "#>");
01969 next = WN_next(wn);
01970 }
01971 else
01972 {
01973 WN2F_process_pragma(tokens, &next, context);
01974 }
01975
01976 ASSERT_FATAL(Pragmas_To_Skip.end == 0,
01977 (DIAG_W2F_BUFFER_ERROR,
01978 "Unexpected index for Pragmas_To_Skip in WN2F_pragma()"));
01979
01980
01981
01982
01983 for (skip = WN_next(wn); skip != next; skip = WN_next(skip))
01984 {
01985 ASSERT_FATAL(Pragmas_To_Skip.end < MAX_PRAGMAS_TO_SKIP,
01986 (DIAG_W2F_BUFFER_ERROR,
01987 "Too many pragmas in sequence in WN2F_pragma()"));
01988
01989 Pragmas_To_Skip.array[Pragmas_To_Skip.end++] = skip;
01990 }
01991
01992 return EMPTY_WN2F_STATUS;
01993 }
01994
01995
01996 WN2F_STATUS
01997 WN2F_pragma_list_begin(TOKEN_BUFFER tokens,
01998 WN *first_pragma,
01999 WN2F_CONTEXT context)
02000 {
02001
02002
02003
02004 WN *next_pragma = first_pragma;
02005
02006 while (next_pragma != NULL)
02007 {
02008 if (WN_operator(next_pragma) == OPR_PRAGMA ||
02009 WN_operator(next_pragma) == OPR_XPRAGMA)
02010 WN2F_process_pragma(tokens, &next_pragma, context);
02011 else
02012 next_pragma = WN_next(next_pragma);
02013 }
02014 return EMPTY_WN2F_STATUS;
02015 }
02016
02017
02018 WN2F_STATUS
02019 WN2F_pragma_list_end(TOKEN_BUFFER tokens,
02020 WN *first_pragma,
02021 WN2F_CONTEXT context)
02022 {
02023
02024
02025
02026 BOOL emitted = TRUE;
02027
02028
02029
02030
02031 while (first_pragma != NULL &&
02032 WN_operator(first_pragma) != OPR_PRAGMA &&
02033 WN_operator(first_pragma) != OPR_XPRAGMA)
02034 {
02035 first_pragma = WN_next(first_pragma);
02036 }
02037
02038 if (first_pragma != NULL)
02039 {
02040 ASSERT_DBG_FATAL(WN_operator(first_pragma) == OPR_PRAGMA ||
02041 WN_operator(first_pragma) == OPR_XPRAGMA,
02042 (DIAG_W2F_UNEXPECTED_OPC, "WN2F_pragma_list_end"));
02043
02044 switch (WN_pragma(first_pragma))
02045 {
02046 case WN_PRAGMA_PARALLEL_BEGIN:
02047 if (!Ignore_Synchronized_Construct(first_pragma, context))
02048 {
02049 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(first_pragma));
02050 WN2F_Append_Pragma_Preamble(tokens,first_pragma);
02051 Append_Token_String(tokens, "END PARALLEL");
02052 }
02053 break;
02054
02055 case WN_PRAGMA_DOACROSS:
02056 case WN_PRAGMA_PARALLEL_DO:
02057 break;
02058
02059 case WN_PRAGMA_PDO_BEGIN:
02060 if (WN_pragma_nest(first_pragma) <= 0 &&
02061 !Ignore_Synchronized_Construct(first_pragma, context))
02062 {
02063 Put_Pragma_Start_With_Caveats(tokens,first_pragma,FALSE);
02064 WN2F_Append_Pragma_Preamble(tokens,first_pragma);
02065 if (WN2F_is_omp(first_pragma))
02066 Append_Token_String(tokens, "END DO");
02067 else
02068 Append_Token_String(tokens, "END PDO");
02069 }
02070 break;
02071
02072 case WN_PRAGMA_PARALLEL_SECTIONS:
02073 case WN_PRAGMA_PSECTION_BEGIN:
02074 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(first_pragma));
02075 WN2F_Append_Pragma_Preamble(tokens,first_pragma);
02076 Append_Token_String(tokens, "END PSECTION");
02077 if (WN2F_is_omp(first_pragma))
02078 {
02079 if (WN2F_Prompf_Subsection != NULL)
02080 {
02081
02082
02083 WN2F_End_Prompf_Construct(tokens, WN2F_Prompf_Subsection);
02084 WN2F_Prompf_Subsection = NULL;
02085 }
02086 }
02087 break;
02088
02089 case WN_PRAGMA_SINGLE_PROCESS_BEGIN:
02090 if (!Ignore_Synchronized_Construct(first_pragma, context))
02091 {
02092 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(first_pragma));
02093 WN2F_Append_Pragma_Preamble(tokens,first_pragma);
02094 if (WN2F_is_omp(first_pragma))
02095 Append_Token_String(tokens, "END SINGLE");
02096 else
02097 Append_Token_String(tokens, "END SINGLE PROCESS");
02098 }
02099 break;
02100
02101 case WN_PRAGMA_MASTER_BEGIN:
02102 if (!Ignore_Synchronized_Construct(first_pragma, context))
02103 {
02104 WN2F_Directive_Newline(tokens, "C$", WN_Get_Linenum(first_pragma));
02105 WN2F_Append_Pragma_Preamble(tokens,first_pragma);
02106 Append_Token_String(tokens, "END MASTER");
02107 }
02108 break;
02109
02110 default:
02111 emitted = FALSE;
02112 break;
02113 }
02114
02115 if (emitted && WN2F_pragma_list_nowait(first_pragma))
02116 Append_Token_String(tokens, "nowait");
02117 }
02118 return EMPTY_WN2F_STATUS;
02119 }
02120
02121
02122 BOOL
02123 Ignore_Synchronized_Construct(WN *construct_pragma,
02124 WN2F_CONTEXT context)
02125 {
02126
02127
02128
02129
02130 BOOL ignore_construct;
02131
02132 Is_True(WN_operator(construct_pragma) == OPR_PRAGMA,
02133 ("Unexpected WHIRL tree in Ignore_Synchronized_Construct"));
02134
02135 if (!Run_w2fc_early)
02136 {
02137 ignore_construct = FALSE;
02138 }
02139 else
02140 {
02141 if (WN_pragma(construct_pragma) != WN_PRAGMA_DOACROSS)
02142 construct_pragma = Get_Enclosing_Parallel_Region(construct_pragma);
02143
02144 if (construct_pragma == NULL)
02145 ignore_construct = FALSE;
02146 else
02147 {
02148 WN *clause = WN_next(construct_pragma);
02149 WN *beyond_last_clause = clause;
02150
02151 Skip_Pragma_Clauses(&beyond_last_clause, context);
02152 while (clause != beyond_last_clause &&
02153 WN_pragma(clause) != WN_PRAGMA_SYNC_DOACROSS)
02154 clause = WN_next(clause);
02155 ignore_construct = (clause != beyond_last_clause);
02156 }
02157 }
02158 return ignore_construct;
02159 }
02160