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 #include <string.h>
00045 #include <ctype.h>
00046 #include <malloc.h>
00047 #include <stdlib.h>
00048 #include <getopt.h>
00049 #include "string_utils.h"
00050 #include "get_options.h"
00051 #include "options.h"
00052 #include "option_names.h"
00053 #include "errors.h"
00054 #include "file_utils.h"
00055 #include "lang_defs.h"
00056 #include "phases.h"
00057 #include "opt_actions.h"
00058
00059 char *option_name;
00060
00061
00062
00063
00064
00065
00066
00067
00068 char *optargs = NULL;
00069 int optargd = 0;
00070 static int optindex = 1;
00071
00072
00073 #define is_last_char(argv,argi) (argv[*argi][optindex+1] == '\0')
00074
00075
00076 #define get_next_arg(argi) (*argi)++; optindex = 1;
00077
00078
00079 #define is_new_arg (optindex == 1)
00080
00081 extern int getsubopt(char **, char *const *, char **);
00082
00083
00084
00085 static void
00086 get_next_char (char **argv, int *argi)
00087 {
00088 if (is_last_char(argv,argi)) {
00089 get_next_arg(argi);
00090 } else {
00091 optindex++;
00092 }
00093 }
00094
00095
00096 static void
00097 end_option (char **argv, int *argi, int length)
00098
00099 {
00100 optindex = length-1;
00101 }
00102
00103 #define current_string(argv,argi) &argv[*argi][optindex]
00104
00105
00106 static char *
00107 get_optarg (char **argv, int *argi)
00108 {
00109 if (is_last_char(argv,argi)) {
00110 (*argi)++;
00111 optindex = 0;
00112 } else {
00113 optindex++;
00114 }
00115 return current_string(argv,argi);
00116 }
00117
00118 static char *null_string = "";
00119
00120
00121 static char *
00122 next_string (char **argv, int *argi)
00123 {
00124 if (is_last_char(argv,argi)) {
00125 if (argv[*argi+1] == NULL)
00126 return null_string;
00127 else
00128 return argv[*argi+1];
00129 } else {
00130 return &argv[*argi][optindex+1];
00131 }
00132 }
00133
00134
00135 static char *
00136 next_string_after (char *prefix, char **argv, int *argi)
00137 {
00138
00139 size_t new_optindex = strlen(prefix);
00140 if (argv[*argi][new_optindex] == '\0') {
00141 if (argv[*argi+1] == NULL)
00142 return null_string;
00143 else
00144 return argv[*argi+1];
00145 } else {
00146 return &argv[*argi][new_optindex];
00147 }
00148 }
00149
00150 static boolean
00151 is_decimal (char *s)
00152 {
00153 if (isdigit(*s)) return TRUE;
00154 else return FALSE;
00155 }
00156
00157
00158 int
00159 add_string_option (int flag, char *arg)
00160 {
00161
00162
00163
00164 char *s = get_option_name(flag);
00165 if (arg == NULL || (*arg == '-' && s[strlen(s)-1] != ',')) {
00166 parse_error(get_option_name(flag), "no argument given for option");
00167 return flag;
00168 }
00169 return add_derived_option(flag, arg);
00170 }
00171
00172
00173 int
00174 add_string_option_or_dash (int flag, char *arg)
00175 {
00176
00177
00178
00179
00180
00181 char *s = get_option_name(flag);
00182 if (arg == NULL ||
00183 (*arg == '-' && arg[1] != '\0' &&
00184 (s[strlen(s)-1] != ',') && (s[1] != 'o'))) {
00185 parse_error(get_option_name(flag), "no argument given for option");
00186 return flag;
00187 }
00188 return add_derived_option(flag, arg);
00189 }
00190
00191 #ifdef KEY
00192
00193
00194 int
00195 add_any_string_option (int flag, char *arg)
00196 {
00197
00198 char *s = get_option_name(flag);
00199 if (arg == NULL) {
00200 parse_error(get_option_name(flag), "no argument given for option");
00201 return flag;
00202 }
00203 return add_derived_option(flag, arg);
00204 }
00205 #endif
00206
00207
00208 void
00209 check_for_driver_controls (int argc, char *argv[])
00210 {
00211 int i;
00212 char *s;
00213 for (i = 1; i < argc; i++) {
00214 if (strncmp(argv[i], "-woff", 5) == 0) {
00215 s = next_string_after("-woff",argv,&i);
00216 if (strcmp(s, "options") == 0) {
00217 print_warnings = FALSE;
00218 } else if (strcmp(s, "all") == 0) {
00219 print_warnings = FALSE;
00220 }
00221 }
00222 else if (strcmp(argv[i], "-fullwarn") == 0) {
00223 fullwarn = TRUE;
00224 }
00225 else if (strcmp(argv[i], "-v") == 0) {
00226 fullwarn = TRUE;
00227 }
00228 else if (strcmp(argv[i], "-fbgen") == 0) {
00229 Gen_feedback = TRUE;
00230 }
00231 else if (strcmp(argv[i], "-fbuse") == 0) {
00232 Use_feedback = TRUE;
00233 }
00234 else if (strcmp(argv[i], "-E") == 0) {
00235 last_phase = P_any_cpp;
00236 }
00237 else if (strcmp(argv[i], "-ignore_suffix") == 0) {
00238 ignore_suffix = TRUE;
00239 }
00240 else if (strcmp(argv[i], "-i32") == 0) {
00241 abi = ABI_I32;
00242 }
00243 else if (strcmp(argv[i], "-i64") == 0) {
00244 abi = ABI_I64;
00245 }
00246 else if (strcmp(argv[i], "-ia32") == 0) {
00247 abi = ABI_IA32;
00248 }
00249 }
00250 }
00251
00252
00253
00254
00255
00256
00257 static int
00258 parse_u_option (char **argv, int *argi)
00259 {
00260 if (invoked_lang == L_f77 || invoked_lang == L_f90) {
00261 int flag;
00262 get_next_arg(argi);
00263 flag = add_new_option("-u");
00264 add_phase_for_option(flag, P_f_fe);
00265 return flag;
00266 } else {
00267 optargs = get_optarg(argv, argi);
00268 get_next_arg(argi);
00269 return add_string_option(O_u,optargs);
00270 }
00271 }
00272
00273
00274
00275
00276
00277 static int
00278 parse_U_option (char **argv, int *argi)
00279 {
00280 if ((invoked_lang == L_f77 || invoked_lang == L_f90)
00281 && is_last_char(argv,argi))
00282 {
00283
00284 int flag;
00285 get_next_arg(argi);
00286 flag = add_new_option("-U");
00287 add_phase_for_option(flag, P_f_fe);
00288 return flag;
00289 } else {
00290
00291 optargs = get_optarg(argv, argi);
00292 get_next_arg(argi);
00293 return add_string_option(O_U,optargs);
00294 }
00295 }
00296
00297
00298
00299
00300
00301 static int
00302 parse_C_option (char **argv, int *argi)
00303 {
00304 if (is_last_char(argv,argi)) {
00305 if (invoked_lang == L_f77 || invoked_lang == L_f90)
00306 {
00307
00308 int flag;
00309 get_next_arg(argi);
00310 flag = add_new_option("-DEBUG:subscript_check");
00311 add_phase_for_option(flag, P_f_fe);
00312 add_phase_for_option(flag, P_f90_fe);
00313 return flag;
00314 } else {
00315
00316 int flag;
00317 get_next_arg(argi);
00318 flag = add_new_option("-C");
00319 add_phase_for_option(flag, P_any_cpp);
00320 return flag;
00321 }
00322 } else {
00323 get_next_arg(argi);
00324 return O_Unrecognized;
00325 }
00326 }
00327
00328
00329
00330 static int
00331 parse_R_option (char **argv, int *argi)
00332 {
00333 if ((invoked_lang == L_f77 || invoked_lang == L_f90)
00334 && !is_last_char(argv,argi))
00335 {
00336
00337 int flag;
00338 optargs = get_optarg(argv, argi);
00339 get_next_arg(argi);
00340 flag = add_new_option(optargs);
00341 add_phase_for_option(flag, P_ratfor);
00342 return flag;
00343 } else {
00344 parse_error(option_name, "no argument given for option");
00345 get_next_arg(argi);
00346 return O_Unrecognized;
00347 }
00348 }
00349
00350 #ifdef KEY
00351 static int
00352 parse_e_option (char **argv, int *argi)
00353 {
00354
00355 optargs = argv[*argi];
00356 get_next_arg(argi);
00357 return add_string_option(O_WlC, optargs);
00358 }
00359
00360
00361
00362 static int
00363 parse_Xlinker_option (char **argv, int *argi)
00364 {
00365 if (!strcmp(argv[*argi], "-Xlinker"))
00366 {
00367
00368 int flag;
00369 get_next_arg(argi);
00370 #ifndef KEY // Support -Xlinker for bug 13641.
00371 warning("%s is no longer supported, use %s instead",
00372 option_name, "-Wl,");
00373 #endif
00374 if (argv[*argi] == NULL) {
00375 parse_error(option_name, "no argument given for option");
00376 return add_new_option(option_name);
00377 }
00378 flag = add_derived_option(O_Xlinker__, argv[*argi]);
00379 add_phase_for_option(flag, P_any_ld);
00380 get_next_arg(argi);
00381 return flag;
00382 } else {
00383 get_next_arg(argi);
00384 return O_Unrecognized;
00385 }
00386 }
00387 #endif
00388
00389 static boolean middle_of_multi_option = FALSE;
00390
00391
00392 static void
00393 end_multi_option (char **argv, int *argi, char *p)
00394 {
00395 if (*p == NIL) {
00396 middle_of_multi_option = FALSE;
00397 (void) get_optarg(argv, argi);
00398 get_next_arg(argi);
00399 } else {
00400 middle_of_multi_option = TRUE;
00401 optargs = p+1;
00402 }
00403 }
00404
00405 static int
00406 parse_multi_option (char **argv, int *argi)
00407 {
00408 int flag;
00409 char *p, *q;
00410 buffer_t buf;
00411 if (! middle_of_multi_option) {
00412 optargs = next_string(argv,argi);
00413 for (p = optargs; *p != NIL && *p != ','; p++)
00414 ;
00415 if (*p == NIL) {
00416 parse_error(option_name, "bad syntax for option");
00417 end_multi_option(argv, argi, p);
00418 return O_Unrecognized;
00419 }
00420 p++;
00421 } else {
00422 p = optargs;
00423 }
00424 if (*p == NIL) {
00425
00426 parse_error(option_name, "bad syntax for option");
00427 end_multi_option(argv, argi, p);
00428 return O_Unrecognized;
00429 }
00430
00431 q = buf;
00432 while (*p != NIL && *p != ',') {
00433 if (*p == '\\' && *(p+1) == ',') {
00434 *q = ',';
00435 p++;
00436 } else {
00437 *q = *p;
00438 }
00439 p++;
00440 q++;
00441 }
00442 *q = NIL;
00443 flag = add_new_option(buf);
00444 end_multi_option(argv, argi, p);
00445 return flag;
00446 }
00447
00448
00449
00450
00451 static int
00452 parse_W_option (char **argv, int *argi)
00453 {
00454 int flag;
00455 phases_t phase;
00456 char *start = next_string(argv,argi);
00457 if ( strchr(start, ',') == NULL || *start == '-') {
00458 get_next_char(argv,argi);
00459 return O_W;
00460 }
00461 flag = parse_multi_option (argv, argi);
00462
00463 for (; *start != NIL && *start != ','; start++) {
00464 phase = get_phase(*start);
00465 if (phase == P_NONE) {
00466 parse_error(option_name, "bad phase for -W option");
00467 }
00468 add_phase_for_option(flag, phase);
00469 }
00470
00471
00472 if (auto_parallelize && phase == P_any_optfe) {
00473 warning("-WK,<options> is ignored with new -pfa/-pca");
00474 }
00475
00476
00477
00478
00479 set_internal_option ( flag );
00480
00481 return flag;
00482 }
00483
00484 #include "get_option.i"
00485