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 #include <ctype.h>
00060 #include <cmplrs/rcodes.h>
00061 #include "defs.h"
00062 #include "glob.h"
00063 #include "erglob.h"
00064 #include "file_util.h"
00065 #include "phase.h"
00066 #include "flags.h"
00067 #include "config.h"
00068 #include "config_list.h"
00069 #include "timing.h"
00070 #include "tracing.h"
00071 #include "wn.h"
00072 #include "stab.h"
00073 #include "stblock.h"
00074 #include "wn_lower.h"
00075 #include "wn_fio.h"
00076 #include "wn_instrument.h"
00077 #include "driver_util.h"
00078
00079 BOOL warnings_are_errors = FALSE;
00080
00081
00082 static UINT phase_argc[PHASE_COUNT];
00083 static STRING *phase_argv[PHASE_COUNT];
00084 static UINT phase_max_argc[PHASE_COUNT];
00085
00086
00087 # define MAX_MSG_LEVEL 2
00088
00089
00090 #define ERR_FILE_EXTENSION ".e"
00091 #define TRC_FILE_EXTENSION ".t"
00092 #define IRB_FILE_EXTENSION ".B"
00093 #ifdef KEY // bug 4711
00094 #define LST_FILE_EXTENSION ".lst"
00095 #else
00096 #define LST_FILE_EXTENSION ".l"
00097 #endif
00098 #define TLOG_FILE_EXTENSION ".tlog"
00099
00100 static BOOL Tlog_Enabled = FALSE;
00101 extern BOOL Run_Dsm_Cloner;
00102 extern BOOL Run_Dsm_Check;
00103 extern BOOL Run_Dsm_Common_Check;
00104 extern BOOL Run_autopar;
00105 extern BOOL Run_MemCtr;
00106 static BOOL Dsm_Recompile = FALSE;
00107
00108
00109
00110
00111
00112 static void
00113 add_phase_args (BE_PHASES phase, char *flag)
00114 {
00115 if (phase_argc[phase] == 0) {
00116 phase_max_argc[phase] = 4;
00117 phase_argv[phase] = (STRING *)
00118 malloc (phase_max_argc[phase] * sizeof(STRING *));
00119 } else if (phase_argc[phase] >= phase_max_argc[phase]) {
00120 phase_max_argc[phase] *= 2;
00121 phase_argv[phase] = (STRING *)
00122 realloc (phase_argv[phase],
00123 phase_max_argc[phase] * sizeof(STRING *));
00124 }
00125
00126 FmtAssert (phase_argv[phase], ("No more memory."));
00127 phase_argv[phase][(phase_argc[phase])++] = flag;
00128
00129 }
00130
00131
00132 void
00133 Get_Phase_Args (BE_PHASES phase, INT *argc, char ***argv)
00134 {
00135 *argc = phase_argc[phase];
00136 *argv = phase_argv[phase];
00137 }
00138
00139
00140
00141
00142
00143
00144 static BOOL
00145 Handle_Phase_Specific_Options (char *flag)
00146 {
00147 register PHASE_SPECIFIC_OPTION_GROUP *og;
00148 BE_PHASES phase = PHASE_COMMON;
00149
00150 for (og = phase_ogroup_table; og->group_name != NULL; og++)
00151
00152 if (flag[1] == og->group_name[0] &&
00153 strncmp (flag+1, og->group_name, og->group_name_length) == 0) {
00154 phase = og->phase;
00155 break;
00156 }
00157
00158 if (phase == PHASE_COMMON || phase >= PHASE_COUNT)
00159 return FALSE;
00160
00161 add_phase_args (phase, flag);
00162
00163 return TRUE;
00164
00165 }
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 void
00178 Process_Command_Line (INT argc, char **argv)
00179 {
00180 INT16 i,j;
00181 char *cp;
00182 BOOL Echo_Flag = FALSE;
00183 INT Src_Count = 0;
00184 char *myname;
00185 BOOL opt_set = FALSE;
00186 BOOL dashdash_flag = FALSE;
00187
00188
00189 for (i = 1; i < argc; i++) {
00190 if ( argv[i] != NULL && (strcmp(argv[i],"--")==0)) {
00191 dashdash_flag = TRUE;
00192 continue;
00193 }
00194 if ( !dashdash_flag && argv[i] != NULL && *(argv[i]) == '-' ) {
00195 cp = argv[i]+1;
00196
00197 if (Handle_Phase_Specific_Options (argv[i]))
00198 continue;
00199
00200
00201 if (Process_Command_Line_Group (cp, Common_Option_Groups))
00202 continue;
00203
00204 switch ( *cp++ ) {
00205
00206 #ifdef TARG_IA64
00207 case 'I':
00208
00209 add_phase_args (PHASE_CG, argv[i]);
00210 break;
00211
00212 case 'C':
00213
00214 add_phase_args (PHASE_CG, argv[i]);
00215 Create_Cycle_Output = TRUE;
00216 break;
00217
00218 case 'V':
00219
00220 add_phase_args (PHASE_CG, argv[i]);
00221 break;
00222 #endif
00223 case 'c':
00224 if (strcmp (cp, "mds") == 0 && Run_ipl) {
00225 while (i < argc) {
00226 add_phase_args (PHASE_IPL, argv[i]);
00227 i++;
00228 }
00229 } else
00230 ErrMsg (EC_Unknown_Flag, *(cp-1), argv[i]);
00231 break;
00232 case 'd':
00233 if (strcmp (cp, "sm_clone") == 0 )
00234 Run_Dsm_Cloner = TRUE;
00235 else if (strcmp (cp, "sm") == 0 )
00236 Run_Dsm_Common_Check = TRUE;
00237 else if (strcmp (cp, "sm_check") == 0 )
00238 Run_Dsm_Check = TRUE;
00239 else if (strcmp (cp, "sm_recompile") == 0 )
00240 Dsm_Recompile = TRUE;
00241 else
00242 ErrMsg (EC_Unknown_Flag, *(cp-1), argv[i]);
00243 break;
00244
00245 case '#':
00246 case 'v':
00247 if ( Echo_Flag )
00248 break;
00249 Echo_Flag = TRUE;
00250 for ( j=0; j<=argc; j++ )
00251 if ( argv[j] ) fprintf (stderr," %s",argv[j]);
00252 fprintf (stderr, "\n");
00253 break;
00254
00255 case 'f':
00256 if (*cp == 0)
00257 ErrMsg (EC_File_Name, '?', argv[i]);
00258 else if (*(cp+1) != ',' && *(cp+1) != ':')
00259 ErrMsg (EC_File_Name, *cp, argv[i]);
00260 else {
00261 switch (*cp) {
00262 #if defined(TARG_NVISA)
00263 case 'c':
00264 Whirl2C_File_Name = cp + 2;
00265 break;
00266 #endif
00267 case 'f':
00268 Feedback_File_Name = cp + 2;
00269 break;
00270 case 'i':
00271 Set_Instrumentation_File_Name(cp + 2);
00272 break;
00273 case 'o':
00274 Obj_File_Name = cp + 2;
00275
00276 case 's':
00277 case 'a':
00278 add_phase_args (PHASE_CG, argv[i]);
00279 break;
00280
00281 case 'l':
00282 List_Enabled = TRUE;
00283 Lst_File_Name = cp + 2;
00284 break;
00285
00286 case 'q':
00287 Tlog_File_Name = cp + 2;
00288 break;
00289
00290 case 't':
00291 Trc_File_Name = cp + 2;
00292 break;
00293
00294 case 'B':
00295 Irb_File_Name = cp + 2;
00296 break;
00297
00298 case 'G':
00299 Global_File_Name = cp + 2;
00300 break;
00301
00302 default:
00303 ErrMsg ( EC_File_Flag, *cp, argv[i] );
00304 break;
00305 }
00306 }
00307 break;
00308
00309 case 'g':
00310 Debug_Level = Get_Numeric_Flag (&cp, 0, MAX_DEBUG_LEVEL, 2,
00311 argv[i]);
00312 #ifdef TARG_IA64
00313 if (Debug_Level > 0 && !opt_set)
00314 #else
00315 if (Debug_Level > 1 && !opt_set)
00316 #endif
00317 Opt_Level = 0;
00318 break;
00319
00320 case 'G':
00321 Max_Sdata_Elt_Size =
00322 Get_Numeric_Flag (&cp, 0, MAX_SDATA_ELT_SIZE,
00323 DEF_SDATA_ELT_SIZE, argv[i] );
00324 break;
00325
00326 case 'm':
00327 if (!strcmp( cp, "pio" )) {
00328 mp_io = TRUE;
00329 cp += 3;
00330 break;
00331 } else if (!strcmp(cp, "plist")) {
00332 Run_w2fc_early = TRUE;
00333 cp += 5;
00334 break;
00335 } else if (!strcmp(cp, "emctr")) {
00336 Run_MemCtr = TRUE;
00337 cp += 5;
00338 break;
00339 }
00340 j = Get_Numeric_Flag (&cp, 0, MAX_MSG_LEVEL, MAX_MSG_LEVEL,
00341 argv[i] );
00342 switch (j) {
00343 case 0: Min_Error_Severity = ES_ERROR; break;
00344 case 1: Min_Error_Severity = ES_WARNING; break;
00345 case 2: Min_Error_Severity = ES_ADVISORY; break;
00346 }
00347 break;
00348
00349 case 'n':
00350 if (!strcmp( cp, "o_exceptions" )) {
00351 CXX_Exceptions_On = FALSE;
00352 }
00353 else {
00354 ErrMsg ( EC_Unknown_Flag, *(cp-1), argv[i] );
00355 }
00356 break;
00357
00358 case 'e':
00359 if (!strcmp( cp, "xceptions" )) {
00360 CXX_Exceptions_On = TRUE;
00361 }
00362 else {
00363 ErrMsg ( EC_Unknown_Flag, *(cp-1), argv[i] );
00364 }
00365 break;
00366
00367 case 'O':
00368 Opt_Level = Get_Numeric_Flag (&cp, 0, MAX_OPT_LEVEL,
00369 DEF_O_LEVEL, argv[i] );
00370 opt_set = TRUE;
00371 break;
00372
00373 case 's':
00374 if (strcmp (cp, "how") == 0) {
00375 Show_Progress = TRUE;
00376 break;
00377 }
00378 #if defined(TARG_SL)
00379 case 'i':
00380 if (strcmp (cp, "pisr") == 0) {
00381 Run_ipisr = TRUE;
00382 break;
00383 }
00384 #endif
00385
00386
00387 case 'a':
00388 case 'S':
00389 add_phase_args (PHASE_CG, argv[i]);
00390 break;
00391
00392 case 't':
00393
00394 if ( strncmp ( cp-1, "tfprev10", 8 ) == 0 ) {
00395 add_phase_args (PHASE_CG, argv[i]);
00396 break;
00397 } else {
00398 Process_Trace_Option ( cp-2 );
00399 }
00400
00401 break;
00402
00403 case 'w':
00404 if (strncmp(cp, "off", 3) == 0) {
00405 Rag_Handle_Woff_Args(cp + 3);
00406 }
00407 else {
00408 Min_Error_Severity = ES_ERROR;
00409 }
00410 break;
00411 case 'W':
00412 if (strcmp(cp, "error") == 0) {
00413 warnings_are_errors = TRUE;
00414 }
00415 break;
00416
00417 case 'p':
00418 if (strncmp(cp, "fa", 2) == 0) {
00419 Run_autopar = TRUE;
00420 cp += 2;
00421 } else
00422 ErrMsg (EC_Unknown_Flag, *(cp-1), argv[i]);
00423 break;
00424
00425 default:
00426 ErrMsg ( EC_Unknown_Flag, *(cp-1), argv[i] );
00427 break;
00428 }
00429 } else if (argv[i] != NULL) {
00430 dashdash_flag = FALSE;
00431 Src_Count++;
00432 Src_File_Name = argv[i];
00433 }
00434 }
00435
00436 if (Dsm_Recompile)
00437 Run_Dsm_Common_Check = FALSE;
00438
00439 if ( Tracing_Enabled ) {
00440 Initialize_Timing (TRUE);
00441 }
00442
00443 myname = Last_Pathname_Component (argv[0]);
00444
00445 if (myname[0] == 'i' && strcmp (myname, "ipl") == 0) {
00446 Run_ipl = TRUE;
00447
00448
00449 Olimit_opt = FALSE;
00450 } else {
00451 Run_ipl = FALSE;
00452
00453 switch (myname[0]) {
00454 case 'l':
00455 if (strcmp (myname, "lnopt") == 0)
00456 Run_lno = TRUE;
00457 break;
00458 case 'w':
00459 if (strcmp (myname, "wopt") == 0)
00460 Run_wopt = TRUE;
00461 else if (strcmp (myname, "whirl2c") == 0)
00462 Run_w2c = TRUE;
00463 else if (strcmp (myname, "whirl2f") == 0)
00464 Run_w2f = TRUE;
00465 break;
00466 case 'p':
00467 if (strcmp (myname, "preopt") == 0)
00468 Run_preopt = TRUE;
00469 else if (strcmp (myname, "purple") == 0)
00470 Run_purple = TRUE;
00471 break;
00472 case 'c':
00473 if (strcmp (myname, "cg") == 0)
00474 Run_cg = TRUE;
00475 break;
00476 }
00477 }
00478
00479 if (Src_Count == 0) {
00480 ErrMsg ( EC_No_Sources );
00481 exit (RC_USER_ERROR);
00482 }
00483
00484 if (Run_lno && Run_preopt)
00485 Run_preopt = FALSE;
00486
00487
00488 if ( Get_Trace ( TP_PTRACE1, TP_PTRACE1_ALL ) ) {
00489 Set_Trace ( TP_PTRACE1, 0xffffffff );
00490 Set_Trace ( TP_PTRACE2, 0xffffffff );
00491 }
00492
00493 if ( Get_Trace ( TP_PTRACE1, 0xffffffff ) ||
00494 Get_Trace ( TP_PTRACE2, 0xffffffff ) )
00495 {
00496 Tlog_Enabled=TRUE;
00497 }
00498
00499
00500 if ( Get_Trace ( TKIND_INFO, TINFO_TFLAGS ) ) {
00501 List_Phase_Numbers ();
00502 }
00503
00504 }
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516 void
00517 Prepare_Source (void)
00518 {
00519
00520
00521
00522
00523
00524
00525 char *fname;
00526 if( Irb_File_Name )
00527 fname = Last_Pathname_Component ( Irb_File_Name );
00528 else
00529 fname = Last_Pathname_Component ( Src_File_Name );
00530
00531 if (Err_File_Name && Err_File_Name[0] == 0)
00532 Err_File_Name = New_Extension (fname, ERR_FILE_EXTENSION);
00533 Set_Error_File ( Err_File_Name );
00534
00535
00536 if ( Tlog_Enabled ) {
00537 if ( Tlog_File_Name == NULL ) {
00538
00539 Tlog_File_Name = New_Extension (fname, TLOG_FILE_EXTENSION);
00540 }
00541 if ( (Tlog_File = fopen ( Tlog_File_Name, "w" ) ) == NULL ) {
00542 ErrMsg ( EC_Tlog_Open, Tlog_File_Name, errno );
00543 Tlog_File_Name = NULL;
00544 Tlog_File = stdout;
00545 }
00546 }
00547
00548
00549 if ( Trc_File_Name == NULL ) {
00550 if ( Tracing_Enabled ) {
00551
00552 Trc_File_Name = New_Extension (fname, TRC_FILE_EXTENSION);
00553 }
00554 } else if ( *Trc_File_Name == '-' ) {
00555
00556 Trc_File_Name = NULL;
00557 }
00558 Set_Trace_File ( Trc_File_Name );
00559 if ( Get_Trace (TKIND_INFO, TINFO_TIME) )
00560 Tim_File = TFile;
00561 else if ( Get_Trace (TKIND_INFO, TINFO_CTIME) )
00562 Tim_File = TFile;
00563
00564 if (Irb_File_Name == NULL)
00565 Irb_File_Name = New_Extension (Src_File_Name, IRB_FILE_EXTENSION);
00566
00567 }
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577 void
00578 Prepare_Listing_File (void)
00579 {
00580 char *fname = Last_Pathname_Component ( Src_File_Name );
00581
00582 if ( List_Enabled ) {
00583 if (Lst_File_Name == NULL) {
00584
00585 Lst_File_Name = New_Extension (fname, LST_FILE_EXTENSION);
00586 } else if ( *Lst_File_Name == '-' ) {
00587
00588 Lst_File_Name = NULL;
00589 }
00590 if (Lst_File_Name) {
00591 if ( (Lst_File = fopen ( Lst_File_Name, "w" ) ) == NULL ) {
00592 ErrMsg ( EC_Lst_Open, Lst_File_Name, errno );
00593 Lst_File_Name = NULL;
00594 Lst_File = stdout;
00595 }
00596 } else Lst_File = stdout;
00597 }
00598 }
00599
00600
00601 void
00602 Lowering_Initialize (void)
00603 {
00604 Create_Slink_Symbol();
00605
00606
00607
00608
00609 Lower_Init();
00610 }