1 /* Command line option handling. 2 Copyright (C) 2006-2013 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify it under 7 the terms of the GNU General Public License as published by the Free 8 Software Foundation; either version 3, or (at your option) any later 9 version. 10 11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GCC; see the file COPYING3. If not see 18 <http://www.gnu.org/licenses/>. */ 19 20 #include "config.h" 21 #include "system.h" 22 #include "intl.h" 23 #include "coretypes.h" 24 #include "opts.h" 25 #include "flags.h" 26 #include "diagnostic.h" 27 28 static void prune_options (struct cl_decoded_option **, unsigned int *); 29 30 /* Perform a binary search to find which option the command-line INPUT 31 matches. Returns its index in the option array, and 32 OPT_SPECIAL_unknown on failure. 33 34 This routine is quite subtle. A normal binary search is not good 35 enough because some options can be suffixed with an argument, and 36 multiple sub-matches can occur, e.g. input of "-pedantic" matching 37 the initial substring of "-pedantic-errors". 38 39 A more complicated example is -gstabs. It should match "-g" with 40 an argument of "stabs". Suppose, however, that the number and list 41 of switches are such that the binary search tests "-gen-decls" 42 before having tested "-g". This doesn't match, and as "-gen-decls" 43 is less than "-gstabs", it will become the lower bound of the 44 binary search range, and "-g" will never be seen. To resolve this 45 issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member, 46 to "-g" so that failed searches that end between "-gen-decls" and 47 the lexicographically subsequent switch know to go back and see if 48 "-g" causes a match (which it does in this example). 49 50 This search is done in such a way that the longest match for the 51 front end in question wins. If there is no match for the current 52 front end, the longest match for a different front end is returned 53 (or N_OPTS if none) and the caller emits an error message. */ 54 size_t 55 find_opt (const char *input, unsigned int lang_mask) 56 { 57 size_t mn, mn_orig, mx, md, opt_len; 58 size_t match_wrong_lang; 59 int comp; 60 61 mn = 0; 62 mx = cl_options_count; 63 64 /* Find mn such this lexicographical inequality holds: 65 cl_options[mn] <= input < cl_options[mn + 1]. */ 66 while (mx - mn > 1) 67 { 68 md = (mn + mx) / 2; 69 opt_len = cl_options[md].opt_len; 70 comp = strncmp (input, cl_options[md].opt_text + 1, opt_len); 71 72 if (comp < 0) 73 mx = md; 74 else 75 mn = md; 76 } 77 78 mn_orig = mn; 79 80 /* This is the switch that is the best match but for a different 81 front end, or OPT_SPECIAL_unknown if there is no match at all. */ 82 match_wrong_lang = OPT_SPECIAL_unknown; 83 84 /* Backtrace the chain of possible matches, returning the longest 85 one, if any, that fits best. With current GCC switches, this 86 loop executes at most twice. */ 87 do 88 { 89 const struct cl_option *opt = &cl_options[mn]; 90 91 /* Is the input either an exact match or a prefix that takes a 92 joined argument? */ 93 if (!strncmp (input, opt->opt_text + 1, opt->opt_len) 94 && (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED))) 95 { 96 /* If language is OK, return it. */ 97 if (opt->flags & lang_mask) 98 return mn; 99 100 /* If we haven't remembered a prior match, remember this 101 one. Any prior match is necessarily better. */ 102 if (match_wrong_lang == OPT_SPECIAL_unknown) 103 match_wrong_lang = mn; 104 } 105 106 /* Try the next possibility. This is cl_options_count if there 107 are no more. */ 108 mn = opt->back_chain; 109 } 110 while (mn != cl_options_count); 111 112 if (match_wrong_lang == OPT_SPECIAL_unknown && input[0] == '-') 113 { 114 /* Long options, starting "--", may be abbreviated if the 115 abbreviation is unambiguous. This only applies to options 116 not taking a joined argument, and abbreviations of "--option" 117 are permitted even if there is a variant "--option=". */ 118 size_t mnc = mn_orig + 1; 119 size_t cmp_len = strlen (input); 120 while (mnc < cl_options_count 121 && strncmp (input, cl_options[mnc].opt_text + 1, cmp_len) == 0) 122 { 123 /* Option matching this abbreviation. OK if it is the first 124 match and that does not take a joined argument, or the 125 second match, taking a joined argument and with only '=' 126 added to the first match; otherwise considered 127 ambiguous. */ 128 if (mnc == mn_orig + 1 129 && !(cl_options[mnc].flags & CL_JOINED)) 130 match_wrong_lang = mnc; 131 else if (mnc == mn_orig + 2 132 && match_wrong_lang == mn_orig + 1 133 && (cl_options[mnc].flags & CL_JOINED) 134 && (cl_options[mnc].opt_len 135 == cl_options[mn_orig + 1].opt_len + 1) 136 && strncmp (cl_options[mnc].opt_text + 1, 137 cl_options[mn_orig + 1].opt_text + 1, 138 cl_options[mn_orig + 1].opt_len) == 0) 139 ; /* OK, as long as there are no more matches. */ 140 else 141 return OPT_SPECIAL_unknown; 142 mnc++; 143 } 144 } 145 146 /* Return the best wrong match, or OPT_SPECIAL_unknown if none. */ 147 return match_wrong_lang; 148 } 149 150 /* If ARG is a non-negative integer made up solely of digits, return its 151 value, otherwise return -1. */ 152 153 int 154 integral_argument (const char *arg) 155 { 156 const char *p = arg; 157 158 while (*p && ISDIGIT (*p)) 159 p++; 160 161 if (*p == '\0') 162 return atoi (arg); 163 164 return -1; 165 } 166 167 /* Return whether OPTION is OK for the language given by 168 LANG_MASK. */ 169 static bool 170 option_ok_for_language (const struct cl_option *option, 171 unsigned int lang_mask) 172 { 173 if (!(option->flags & lang_mask)) 174 return false; 175 else if ((option->flags & CL_TARGET) 176 && (option->flags & (CL_LANG_ALL | CL_DRIVER)) 177 && !(option->flags & (lang_mask & ~CL_COMMON & ~CL_TARGET))) 178 /* Complain for target flag language mismatches if any languages 179 are specified. */ 180 return false; 181 return true; 182 } 183 184 /* Return whether ENUM_ARG is OK for the language given by 185 LANG_MASK. */ 186 187 static bool 188 enum_arg_ok_for_language (const struct cl_enum_arg *enum_arg, 189 unsigned int lang_mask) 190 { 191 return (lang_mask & CL_DRIVER) || !(enum_arg->flags & CL_ENUM_DRIVER_ONLY); 192 } 193 194 /* Look up ARG in ENUM_ARGS for language LANG_MASK, returning true and 195 storing the value in *VALUE if found, and returning false without 196 modifying *VALUE if not found. */ 197 198 static bool 199 enum_arg_to_value (const struct cl_enum_arg *enum_args, 200 const char *arg, int *value, unsigned int lang_mask) 201 { 202 unsigned int i; 203 204 for (i = 0; enum_args[i].arg != NULL; i++) 205 if (strcmp (arg, enum_args[i].arg) == 0 206 && enum_arg_ok_for_language (&enum_args[i], lang_mask)) 207 { 208 *value = enum_args[i].value; 209 return true; 210 } 211 212 return false; 213 } 214 215 /* Look up ARG in the enum used by option OPT_INDEX for language 216 LANG_MASK, returning true and storing the value in *VALUE if found, 217 and returning false without modifying *VALUE if not found. */ 218 219 bool 220 opt_enum_arg_to_value (size_t opt_index, const char *arg, int *value, 221 unsigned int lang_mask) 222 { 223 const struct cl_option *option = &cl_options[opt_index]; 224 225 gcc_assert (option->var_type == CLVC_ENUM); 226 227 return enum_arg_to_value (cl_enums[option->var_enum].values, arg, 228 value, lang_mask); 229 } 230 231 /* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the 232 corresponding string in *ARGP, returning true if the found string 233 was marked as canonical, false otherwise. If VALUE is not found 234 (which may be the case for uninitialized values if the relevant 235 option has not been passed), set *ARGP to NULL and return 236 false. */ 237 238 bool 239 enum_value_to_arg (const struct cl_enum_arg *enum_args, 240 const char **argp, int value, unsigned int lang_mask) 241 { 242 unsigned int i; 243 244 for (i = 0; enum_args[i].arg != NULL; i++) 245 if (enum_args[i].value == value 246 && (enum_args[i].flags & CL_ENUM_CANONICAL) 247 && enum_arg_ok_for_language (&enum_args[i], lang_mask)) 248 { 249 *argp = enum_args[i].arg; 250 return true; 251 } 252 253 for (i = 0; enum_args[i].arg != NULL; i++) 254 if (enum_args[i].value == value 255 && enum_arg_ok_for_language (&enum_args[i], lang_mask)) 256 { 257 *argp = enum_args[i].arg; 258 return false; 259 } 260 261 *argp = NULL; 262 return false; 263 } 264 265 /* Fill in the canonical option part of *DECODED with an option 266 described by OPT_INDEX, ARG and VALUE. */ 267 268 static void 269 generate_canonical_option (size_t opt_index, const char *arg, int value, 270 struct cl_decoded_option *decoded) 271 { 272 const struct cl_option *option = &cl_options[opt_index]; 273 const char *opt_text = option->opt_text; 274 275 if (value == 0 276 && !option->cl_reject_negative 277 && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm')) 278 { 279 char *t = XOBNEWVEC (&opts_obstack, char, option->opt_len + 5); 280 t[0] = '-'; 281 t[1] = opt_text[1]; 282 t[2] = 'n'; 283 t[3] = 'o'; 284 t[4] = '-'; 285 memcpy (t + 5, opt_text + 2, option->opt_len); 286 opt_text = t; 287 } 288 289 decoded->canonical_option[2] = NULL; 290 decoded->canonical_option[3] = NULL; 291 292 if (arg) 293 { 294 if ((option->flags & CL_SEPARATE) 295 && !option->cl_separate_alias) 296 { 297 decoded->canonical_option[0] = opt_text; 298 decoded->canonical_option[1] = arg; 299 decoded->canonical_option_num_elements = 2; 300 } 301 else 302 { 303 gcc_assert (option->flags & CL_JOINED); 304 decoded->canonical_option[0] = opts_concat (opt_text, arg, NULL); 305 decoded->canonical_option[1] = NULL; 306 decoded->canonical_option_num_elements = 1; 307 } 308 } 309 else 310 { 311 decoded->canonical_option[0] = opt_text; 312 decoded->canonical_option[1] = NULL; 313 decoded->canonical_option_num_elements = 1; 314 } 315 } 316 317 /* Structure describing mappings from options on the command line to 318 options to look up with find_opt. */ 319 struct option_map 320 { 321 /* Prefix of the option on the command line. */ 322 const char *opt0; 323 /* If two argv elements are considered to be merged into one option, 324 prefix for the second element, otherwise NULL. */ 325 const char *opt1; 326 /* The new prefix to map to. */ 327 const char *new_prefix; 328 /* Whether at least one character is needed following opt1 or opt0 329 for this mapping to be used. (--optimize= is valid for -O, but 330 --warn- is not valid for -W.) */ 331 bool another_char_needed; 332 /* Whether the original option is a negated form of the option 333 resulting from this map. */ 334 bool negated; 335 }; 336 static const struct option_map option_map[] = 337 { 338 { "-Wno-", NULL, "-W", false, true }, 339 { "-fno-", NULL, "-f", false, true }, 340 { "-mno-", NULL, "-m", false, true }, 341 { "--debug=", NULL, "-g", false, false }, 342 { "--machine-", NULL, "-m", true, false }, 343 { "--machine-no-", NULL, "-m", false, true }, 344 { "--machine=", NULL, "-m", false, false }, 345 { "--machine=no-", NULL, "-m", false, true }, 346 { "--machine", "", "-m", false, false }, 347 { "--machine", "no-", "-m", false, true }, 348 { "--optimize=", NULL, "-O", false, false }, 349 { "--std=", NULL, "-std=", false, false }, 350 { "--std", "", "-std=", false, false }, 351 { "--warn-", NULL, "-W", true, false }, 352 { "--warn-no-", NULL, "-W", false, true }, 353 { "--", NULL, "-f", true, false }, 354 { "--no-", NULL, "-f", false, true } 355 }; 356 357 /* Decode the switch beginning at ARGV for the language indicated by 358 LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into 359 the structure *DECODED. Returns the number of switches 360 consumed. */ 361 362 static unsigned int 363 decode_cmdline_option (const char **argv, unsigned int lang_mask, 364 struct cl_decoded_option *decoded) 365 { 366 size_t opt_index; 367 const char *arg = 0; 368 int value = 1; 369 unsigned int result = 1, i, extra_args, separate_args = 0; 370 int adjust_len = 0; 371 size_t total_len; 372 char *p; 373 const struct cl_option *option; 374 int errors = 0; 375 const char *warn_message = NULL; 376 bool separate_arg_flag; 377 bool joined_arg_flag; 378 bool have_separate_arg = false; 379 380 extra_args = 0; 381 382 opt_index = find_opt (argv[0] + 1, lang_mask); 383 i = 0; 384 while (opt_index == OPT_SPECIAL_unknown 385 && i < ARRAY_SIZE (option_map)) 386 { 387 const char *opt0 = option_map[i].opt0; 388 const char *opt1 = option_map[i].opt1; 389 const char *new_prefix = option_map[i].new_prefix; 390 bool another_char_needed = option_map[i].another_char_needed; 391 size_t opt0_len = strlen (opt0); 392 size_t opt1_len = (opt1 == NULL ? 0 : strlen (opt1)); 393 size_t optn_len = (opt1 == NULL ? opt0_len : opt1_len); 394 size_t new_prefix_len = strlen (new_prefix); 395 396 extra_args = (opt1 == NULL ? 0 : 1); 397 value = !option_map[i].negated; 398 399 if (strncmp (argv[0], opt0, opt0_len) == 0 400 && (opt1 == NULL 401 || (argv[1] != NULL && strncmp (argv[1], opt1, opt1_len) == 0)) 402 && (!another_char_needed 403 || argv[extra_args][optn_len] != 0)) 404 { 405 size_t arglen = strlen (argv[extra_args]); 406 char *dup; 407 408 adjust_len = (int) optn_len - (int) new_prefix_len; 409 dup = XNEWVEC (char, arglen + 1 - adjust_len); 410 memcpy (dup, new_prefix, new_prefix_len); 411 memcpy (dup + new_prefix_len, argv[extra_args] + optn_len, 412 arglen - optn_len + 1); 413 opt_index = find_opt (dup + 1, lang_mask); 414 free (dup); 415 } 416 i++; 417 } 418 419 if (opt_index == OPT_SPECIAL_unknown) 420 { 421 arg = argv[0]; 422 extra_args = 0; 423 value = 1; 424 goto done; 425 } 426 427 option = &cl_options[opt_index]; 428 429 /* Reject negative form of switches that don't take negatives as 430 unrecognized. */ 431 if (!value && option->cl_reject_negative) 432 { 433 opt_index = OPT_SPECIAL_unknown; 434 errors |= CL_ERR_NEGATIVE; 435 arg = argv[0]; 436 goto done; 437 } 438 439 result = extra_args + 1; 440 warn_message = option->warn_message; 441 442 /* Check to see if the option is disabled for this configuration. */ 443 if (option->cl_disabled) 444 errors |= CL_ERR_DISABLED; 445 446 /* Determine whether there may be a separate argument based on 447 whether this option is being processed for the driver, and, if 448 so, how many such arguments. */ 449 separate_arg_flag = ((option->flags & CL_SEPARATE) 450 && !(option->cl_no_driver_arg 451 && (lang_mask & CL_DRIVER))); 452 separate_args = (separate_arg_flag 453 ? option->cl_separate_nargs + 1 454 : 0); 455 joined_arg_flag = (option->flags & CL_JOINED) != 0; 456 457 /* Sort out any argument the switch takes. */ 458 if (joined_arg_flag) 459 { 460 /* Have arg point to the original switch. This is because 461 some code, such as disable_builtin_function, expects its 462 argument to be persistent until the program exits. */ 463 arg = argv[extra_args] + cl_options[opt_index].opt_len + 1 + adjust_len; 464 465 if (*arg == '\0' && !option->cl_missing_ok) 466 { 467 if (separate_arg_flag) 468 { 469 arg = argv[extra_args + 1]; 470 result = extra_args + 2; 471 if (arg == NULL) 472 result = extra_args + 1; 473 else 474 have_separate_arg = true; 475 } 476 else 477 /* Missing argument. */ 478 arg = NULL; 479 } 480 } 481 else if (separate_arg_flag) 482 { 483 arg = argv[extra_args + 1]; 484 for (i = 0; i < separate_args; i++) 485 if (argv[extra_args + 1 + i] == NULL) 486 { 487 errors |= CL_ERR_MISSING_ARG; 488 break; 489 } 490 result = extra_args + 1 + i; 491 if (arg != NULL) 492 have_separate_arg = true; 493 } 494 495 if (arg == NULL && (separate_arg_flag || joined_arg_flag)) 496 errors |= CL_ERR_MISSING_ARG; 497 498 /* Is this option an alias (or an ignored option, marked as an alias 499 of OPT_SPECIAL_ignore)? */ 500 if (option->alias_target != N_OPTS 501 && (!option->cl_separate_alias || have_separate_arg)) 502 { 503 size_t new_opt_index = option->alias_target; 504 505 if (new_opt_index == OPT_SPECIAL_ignore) 506 { 507 gcc_assert (option->alias_arg == NULL); 508 gcc_assert (option->neg_alias_arg == NULL); 509 opt_index = new_opt_index; 510 arg = NULL; 511 value = 1; 512 } 513 else 514 { 515 const struct cl_option *new_option = &cl_options[new_opt_index]; 516 517 /* The new option must not be an alias itself. */ 518 gcc_assert (new_option->alias_target == N_OPTS 519 || new_option->cl_separate_alias); 520 521 if (option->neg_alias_arg) 522 { 523 gcc_assert (option->alias_arg != NULL); 524 gcc_assert (arg == NULL); 525 gcc_assert (!option->cl_negative_alias); 526 if (value) 527 arg = option->alias_arg; 528 else 529 arg = option->neg_alias_arg; 530 value = 1; 531 } 532 else if (option->alias_arg) 533 { 534 gcc_assert (value == 1); 535 gcc_assert (arg == NULL); 536 gcc_assert (!option->cl_negative_alias); 537 arg = option->alias_arg; 538 } 539 540 if (option->cl_negative_alias) 541 value = !value; 542 543 opt_index = new_opt_index; 544 option = new_option; 545 546 if (value == 0) 547 gcc_assert (!option->cl_reject_negative); 548 549 /* Recompute what arguments are allowed. */ 550 separate_arg_flag = ((option->flags & CL_SEPARATE) 551 && !(option->cl_no_driver_arg 552 && (lang_mask & CL_DRIVER))); 553 joined_arg_flag = (option->flags & CL_JOINED) != 0; 554 555 if (separate_args > 1 || option->cl_separate_nargs) 556 gcc_assert (separate_args 557 == (unsigned int) option->cl_separate_nargs + 1); 558 559 if (!(errors & CL_ERR_MISSING_ARG)) 560 { 561 if (separate_arg_flag || joined_arg_flag) 562 { 563 if (option->cl_missing_ok && arg == NULL) 564 arg = ""; 565 gcc_assert (arg != NULL); 566 } 567 else 568 gcc_assert (arg == NULL); 569 } 570 571 /* Recheck for warnings and disabled options. */ 572 if (option->warn_message) 573 { 574 gcc_assert (warn_message == NULL); 575 warn_message = option->warn_message; 576 } 577 if (option->cl_disabled) 578 errors |= CL_ERR_DISABLED; 579 } 580 } 581 582 /* Check if this is a switch for a different front end. */ 583 if (!option_ok_for_language (option, lang_mask)) 584 errors |= CL_ERR_WRONG_LANG; 585 586 /* Convert the argument to lowercase if appropriate. */ 587 if (arg && option->cl_tolower) 588 { 589 size_t j; 590 size_t len = strlen (arg); 591 char *arg_lower = XOBNEWVEC (&opts_obstack, char, len + 1); 592 593 for (j = 0; j < len; j++) 594 arg_lower[j] = TOLOWER ((unsigned char) arg[j]); 595 arg_lower[len] = 0; 596 arg = arg_lower; 597 } 598 599 /* If the switch takes an integer, convert it. */ 600 if (arg && option->cl_uinteger) 601 { 602 value = integral_argument (arg); 603 if (value == -1) 604 errors |= CL_ERR_UINT_ARG; 605 } 606 607 /* If the switch takes an enumerated argument, convert it. */ 608 if (arg && (option->var_type == CLVC_ENUM)) 609 { 610 const struct cl_enum *e = &cl_enums[option->var_enum]; 611 612 gcc_assert (value == 1); 613 if (enum_arg_to_value (e->values, arg, &value, lang_mask)) 614 { 615 const char *carg = NULL; 616 617 if (enum_value_to_arg (e->values, &carg, value, lang_mask)) 618 arg = carg; 619 gcc_assert (carg != NULL); 620 } 621 else 622 errors |= CL_ERR_ENUM_ARG; 623 } 624 625 done: 626 decoded->opt_index = opt_index; 627 decoded->arg = arg; 628 decoded->value = value; 629 decoded->errors = errors; 630 decoded->warn_message = warn_message; 631 632 if (opt_index == OPT_SPECIAL_unknown) 633 gcc_assert (result == 1); 634 635 gcc_assert (result >= 1 && result <= ARRAY_SIZE (decoded->canonical_option)); 636 decoded->canonical_option_num_elements = result; 637 total_len = 0; 638 for (i = 0; i < ARRAY_SIZE (decoded->canonical_option); i++) 639 { 640 if (i < result) 641 { 642 size_t len; 643 if (opt_index == OPT_SPECIAL_unknown) 644 decoded->canonical_option[i] = argv[i]; 645 else 646 decoded->canonical_option[i] = NULL; 647 len = strlen (argv[i]); 648 /* If the argument is an empty string, we will print it as "" in 649 orig_option_with_args_text. */ 650 total_len += (len != 0 ? len : 2) + 1; 651 } 652 else 653 decoded->canonical_option[i] = NULL; 654 } 655 if (opt_index != OPT_SPECIAL_unknown && opt_index != OPT_SPECIAL_ignore) 656 { 657 generate_canonical_option (opt_index, arg, value, decoded); 658 if (separate_args > 1) 659 { 660 for (i = 0; i < separate_args; i++) 661 { 662 if (argv[extra_args + 1 + i] == NULL) 663 break; 664 else 665 decoded->canonical_option[1 + i] = argv[extra_args + 1 + i]; 666 } 667 gcc_assert (result == 1 + i); 668 decoded->canonical_option_num_elements = result; 669 } 670 } 671 decoded->orig_option_with_args_text 672 = p = XOBNEWVEC (&opts_obstack, char, total_len); 673 for (i = 0; i < result; i++) 674 { 675 size_t len = strlen (argv[i]); 676 677 /* Print the empty string verbally. */ 678 if (len == 0) 679 { 680 *p++ = '"'; 681 *p++ = '"'; 682 } 683 else 684 memcpy (p, argv[i], len); 685 p += len; 686 if (i == result - 1) 687 *p++ = 0; 688 else 689 *p++ = ' '; 690 } 691 692 return result; 693 } 694 695 /* Obstack for option strings. */ 696 697 struct obstack opts_obstack; 698 699 /* Like libiberty concat, but allocate using opts_obstack. */ 700 701 char * 702 opts_concat (const char *first, ...) 703 { 704 char *newstr, *end; 705 size_t length = 0; 706 const char *arg; 707 va_list ap; 708 709 /* First compute the size of the result and get sufficient memory. */ 710 va_start (ap, first); 711 for (arg = first; arg; arg = va_arg (ap, const char *)) 712 length += strlen (arg); 713 newstr = XOBNEWVEC (&opts_obstack, char, length + 1); 714 va_end (ap); 715 716 /* Now copy the individual pieces to the result string. */ 717 va_start (ap, first); 718 for (arg = first, end = newstr; arg; arg = va_arg (ap, const char *)) 719 { 720 length = strlen (arg); 721 memcpy (end, arg, length); 722 end += length; 723 } 724 *end = '\0'; 725 va_end (ap); 726 return newstr; 727 } 728 729 /* Decode command-line options (ARGC and ARGV being the arguments of 730 main) into an array, setting *DECODED_OPTIONS to a pointer to that 731 array and *DECODED_OPTIONS_COUNT to the number of entries in the 732 array. The first entry in the array is always one for the program 733 name (OPT_SPECIAL_program_name). LANG_MASK indicates the language 734 flags applicable for decoding (including CL_COMMON and CL_TARGET if 735 those options should be considered applicable). Do not produce any 736 diagnostics or set state outside of these variables. */ 737 738 void 739 decode_cmdline_options_to_array (unsigned int argc, const char **argv, 740 unsigned int lang_mask, 741 struct cl_decoded_option **decoded_options, 742 unsigned int *decoded_options_count) 743 { 744 unsigned int n, i; 745 struct cl_decoded_option *opt_array; 746 unsigned int num_decoded_options; 747 748 opt_array = XNEWVEC (struct cl_decoded_option, argc); 749 750 opt_array[0].opt_index = OPT_SPECIAL_program_name; 751 opt_array[0].warn_message = NULL; 752 opt_array[0].arg = argv[0]; 753 opt_array[0].orig_option_with_args_text = argv[0]; 754 opt_array[0].canonical_option_num_elements = 1; 755 opt_array[0].canonical_option[0] = argv[0]; 756 opt_array[0].canonical_option[1] = NULL; 757 opt_array[0].canonical_option[2] = NULL; 758 opt_array[0].canonical_option[3] = NULL; 759 opt_array[0].value = 1; 760 opt_array[0].errors = 0; 761 num_decoded_options = 1; 762 763 for (i = 1; i < argc; i += n) 764 { 765 const char *opt = argv[i]; 766 767 /* Interpret "-" or a non-switch as a file name. */ 768 if (opt[0] != '-' || opt[1] == '\0') 769 { 770 generate_option_input_file (opt, &opt_array[num_decoded_options]); 771 num_decoded_options++; 772 n = 1; 773 continue; 774 } 775 776 n = decode_cmdline_option (argv + i, lang_mask, 777 &opt_array[num_decoded_options]); 778 num_decoded_options++; 779 } 780 781 *decoded_options = opt_array; 782 *decoded_options_count = num_decoded_options; 783 prune_options (decoded_options, decoded_options_count); 784 } 785 786 /* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the 787 next one is the same as ORIG_NEXT_OPT_IDX. */ 788 789 static bool 790 cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx) 791 { 792 /* An option can be canceled by the same option or an option with 793 Negative. */ 794 if (cl_options [next_opt_idx].neg_index == opt_idx) 795 return true; 796 797 if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx) 798 return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index, 799 orig_next_opt_idx); 800 801 return false; 802 } 803 804 /* Filter out options canceled by the ones after them. */ 805 806 static void 807 prune_options (struct cl_decoded_option **decoded_options, 808 unsigned int *decoded_options_count) 809 { 810 unsigned int old_decoded_options_count = *decoded_options_count; 811 struct cl_decoded_option *old_decoded_options = *decoded_options; 812 unsigned int new_decoded_options_count; 813 struct cl_decoded_option *new_decoded_options 814 = XNEWVEC (struct cl_decoded_option, old_decoded_options_count); 815 unsigned int i; 816 const struct cl_option *option; 817 818 /* Remove arguments which are negated by others after them. */ 819 new_decoded_options_count = 0; 820 for (i = 0; i < old_decoded_options_count; i++) 821 { 822 unsigned int j, opt_idx, next_opt_idx; 823 824 if (old_decoded_options[i].errors & ~CL_ERR_WRONG_LANG) 825 goto keep; 826 827 opt_idx = old_decoded_options[i].opt_index; 828 switch (opt_idx) 829 { 830 case OPT_SPECIAL_unknown: 831 case OPT_SPECIAL_ignore: 832 case OPT_SPECIAL_program_name: 833 case OPT_SPECIAL_input_file: 834 goto keep; 835 836 default: 837 gcc_assert (opt_idx < cl_options_count); 838 option = &cl_options[opt_idx]; 839 if (option->neg_index < 0) 840 goto keep; 841 842 /* Skip joined switches. */ 843 if ((option->flags & CL_JOINED)) 844 goto keep; 845 846 for (j = i + 1; j < old_decoded_options_count; j++) 847 { 848 if (old_decoded_options[j].errors & ~CL_ERR_WRONG_LANG) 849 continue; 850 next_opt_idx = old_decoded_options[j].opt_index; 851 if (next_opt_idx >= cl_options_count) 852 continue; 853 if (cl_options[next_opt_idx].neg_index < 0) 854 continue; 855 if ((cl_options[next_opt_idx].flags & CL_JOINED)) 856 continue; 857 if (cancel_option (opt_idx, next_opt_idx, next_opt_idx)) 858 break; 859 } 860 if (j == old_decoded_options_count) 861 { 862 keep: 863 new_decoded_options[new_decoded_options_count] 864 = old_decoded_options[i]; 865 new_decoded_options_count++; 866 } 867 break; 868 } 869 } 870 871 free (old_decoded_options); 872 new_decoded_options = XRESIZEVEC (struct cl_decoded_option, 873 new_decoded_options, 874 new_decoded_options_count); 875 *decoded_options = new_decoded_options; 876 *decoded_options_count = new_decoded_options_count; 877 } 878 879 /* Handle option DECODED for the language indicated by LANG_MASK, 880 using the handlers in HANDLERS and setting fields in OPTS and 881 OPTS_SET. KIND is the diagnostic_t if this is a diagnostics 882 option, DK_UNSPECIFIED otherwise, and LOC is the location of the 883 option for options from the source file, UNKNOWN_LOCATION 884 otherwise. GENERATED_P is true for an option generated as part of 885 processing another option or otherwise generated internally, false 886 for one explicitly passed by the user. Returns false if the switch 887 was invalid. DC is the diagnostic context for options affecting 888 diagnostics state, or NULL. */ 889 890 static bool 891 handle_option (struct gcc_options *opts, 892 struct gcc_options *opts_set, 893 const struct cl_decoded_option *decoded, 894 unsigned int lang_mask, int kind, location_t loc, 895 const struct cl_option_handlers *handlers, 896 bool generated_p, diagnostic_context *dc) 897 { 898 size_t opt_index = decoded->opt_index; 899 const char *arg = decoded->arg; 900 int value = decoded->value; 901 const struct cl_option *option = &cl_options[opt_index]; 902 void *flag_var = option_flag_var (opt_index, opts); 903 size_t i; 904 905 if (flag_var) 906 set_option (opts, (generated_p ? NULL : opts_set), 907 opt_index, value, arg, kind, loc, dc); 908 909 for (i = 0; i < handlers->num_handlers; i++) 910 if (option->flags & handlers->handlers[i].mask) 911 { 912 if (!handlers->handlers[i].handler (opts, opts_set, decoded, 913 lang_mask, kind, loc, 914 handlers, dc)) 915 return false; 916 } 917 918 return true; 919 } 920 921 /* Like handle_option, but OPT_INDEX, ARG and VALUE describe the 922 option instead of DECODED. This is used for callbacks when one 923 option implies another instead of an option being decoded from the 924 command line. */ 925 926 bool 927 handle_generated_option (struct gcc_options *opts, 928 struct gcc_options *opts_set, 929 size_t opt_index, const char *arg, int value, 930 unsigned int lang_mask, int kind, location_t loc, 931 const struct cl_option_handlers *handlers, 932 diagnostic_context *dc) 933 { 934 struct cl_decoded_option decoded; 935 936 generate_option (opt_index, arg, value, lang_mask, &decoded); 937 return handle_option (opts, opts_set, &decoded, lang_mask, kind, loc, 938 handlers, true, dc); 939 } 940 941 /* Fill in *DECODED with an option described by OPT_INDEX, ARG and 942 VALUE for a front end using LANG_MASK. This is used when the 943 compiler generates options internally. */ 944 945 void 946 generate_option (size_t opt_index, const char *arg, int value, 947 unsigned int lang_mask, struct cl_decoded_option *decoded) 948 { 949 const struct cl_option *option = &cl_options[opt_index]; 950 951 decoded->opt_index = opt_index; 952 decoded->warn_message = NULL; 953 decoded->arg = arg; 954 decoded->value = value; 955 decoded->errors = (option_ok_for_language (option, lang_mask) 956 ? 0 957 : CL_ERR_WRONG_LANG); 958 959 generate_canonical_option (opt_index, arg, value, decoded); 960 switch (decoded->canonical_option_num_elements) 961 { 962 case 1: 963 decoded->orig_option_with_args_text = decoded->canonical_option[0]; 964 break; 965 966 case 2: 967 decoded->orig_option_with_args_text 968 = opts_concat (decoded->canonical_option[0], " ", 969 decoded->canonical_option[1], NULL); 970 break; 971 972 default: 973 gcc_unreachable (); 974 } 975 } 976 977 /* Fill in *DECODED with an option for input file FILE. */ 978 979 void 980 generate_option_input_file (const char *file, 981 struct cl_decoded_option *decoded) 982 { 983 decoded->opt_index = OPT_SPECIAL_input_file; 984 decoded->warn_message = NULL; 985 decoded->arg = file; 986 decoded->orig_option_with_args_text = file; 987 decoded->canonical_option_num_elements = 1; 988 decoded->canonical_option[0] = file; 989 decoded->canonical_option[1] = NULL; 990 decoded->canonical_option[2] = NULL; 991 decoded->canonical_option[3] = NULL; 992 decoded->value = 1; 993 decoded->errors = 0; 994 } 995 996 /* Handle the switch DECODED (location LOC) for the language indicated 997 by LANG_MASK, using the handlers in *HANDLERS and setting fields in 998 OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for 999 diagnostic options. */ 1000 1001 void 1002 read_cmdline_option (struct gcc_options *opts, 1003 struct gcc_options *opts_set, 1004 struct cl_decoded_option *decoded, 1005 location_t loc, 1006 unsigned int lang_mask, 1007 const struct cl_option_handlers *handlers, 1008 diagnostic_context *dc) 1009 { 1010 const struct cl_option *option; 1011 const char *opt = decoded->orig_option_with_args_text; 1012 1013 if (decoded->warn_message) 1014 warning_at (loc, 0, decoded->warn_message, opt); 1015 1016 if (decoded->opt_index == OPT_SPECIAL_unknown) 1017 { 1018 if (handlers->unknown_option_callback (decoded)) 1019 error_at (loc, "unrecognized command line option %qs", decoded->arg); 1020 return; 1021 } 1022 1023 if (decoded->opt_index == OPT_SPECIAL_ignore) 1024 return; 1025 1026 option = &cl_options[decoded->opt_index]; 1027 1028 if (decoded->errors & CL_ERR_DISABLED) 1029 { 1030 error_at (loc, "command line option %qs" 1031 " is not supported by this configuration", opt); 1032 return; 1033 } 1034 1035 if (decoded->errors & CL_ERR_MISSING_ARG) 1036 { 1037 if (option->missing_argument_error) 1038 error_at (loc, option->missing_argument_error, opt); 1039 else 1040 error_at (loc, "missing argument to %qs", opt); 1041 return; 1042 } 1043 1044 if (decoded->errors & CL_ERR_UINT_ARG) 1045 { 1046 error_at (loc, "argument to %qs should be a non-negative integer", 1047 option->opt_text); 1048 return; 1049 } 1050 1051 if (decoded->errors & CL_ERR_ENUM_ARG) 1052 { 1053 const struct cl_enum *e = &cl_enums[option->var_enum]; 1054 unsigned int i; 1055 size_t len; 1056 char *s, *p; 1057 1058 if (e->unknown_error) 1059 error_at (loc, e->unknown_error, decoded->arg); 1060 else 1061 error_at (loc, "unrecognized argument in option %qs", opt); 1062 1063 len = 0; 1064 for (i = 0; e->values[i].arg != NULL; i++) 1065 len += strlen (e->values[i].arg) + 1; 1066 1067 s = XALLOCAVEC (char, len); 1068 p = s; 1069 for (i = 0; e->values[i].arg != NULL; i++) 1070 { 1071 size_t arglen = strlen (e->values[i].arg); 1072 memcpy (p, e->values[i].arg, arglen); 1073 p[arglen] = ' '; 1074 p += arglen + 1; 1075 } 1076 p[-1] = 0; 1077 inform (loc, "valid arguments to %qs are: %s", option->opt_text, s); 1078 return; 1079 } 1080 1081 if (decoded->errors & CL_ERR_WRONG_LANG) 1082 { 1083 handlers->wrong_lang_callback (decoded, lang_mask); 1084 return; 1085 } 1086 1087 gcc_assert (!decoded->errors); 1088 1089 if (!handle_option (opts, opts_set, decoded, lang_mask, DK_UNSPECIFIED, 1090 loc, handlers, false, dc)) 1091 error_at (loc, "unrecognized command line option %qs", opt); 1092 } 1093 1094 /* Set any field in OPTS, and OPTS_SET if not NULL, for option 1095 OPT_INDEX according to VALUE and ARG, diagnostic kind KIND, 1096 location LOC, using diagnostic context DC if not NULL for 1097 diagnostic classification. */ 1098 1099 void 1100 set_option (struct gcc_options *opts, struct gcc_options *opts_set, 1101 int opt_index, int value, const char *arg, int kind, 1102 location_t loc, diagnostic_context *dc) 1103 { 1104 const struct cl_option *option = &cl_options[opt_index]; 1105 void *flag_var = option_flag_var (opt_index, opts); 1106 void *set_flag_var = NULL; 1107 1108 if (!flag_var) 1109 return; 1110 1111 if (opts_set != NULL) 1112 set_flag_var = option_flag_var (opt_index, opts_set); 1113 1114 switch (option->var_type) 1115 { 1116 case CLVC_BOOLEAN: 1117 *(int *) flag_var = value; 1118 if (set_flag_var) 1119 *(int *) set_flag_var = 1; 1120 break; 1121 1122 case CLVC_EQUAL: 1123 if (option->cl_host_wide_int) 1124 *(HOST_WIDE_INT *) flag_var = (value 1125 ? option->var_value 1126 : !option->var_value); 1127 else 1128 *(int *) flag_var = (value 1129 ? option->var_value 1130 : !option->var_value); 1131 if (set_flag_var) 1132 *(int *) set_flag_var = 1; 1133 break; 1134 1135 case CLVC_BIT_CLEAR: 1136 case CLVC_BIT_SET: 1137 if ((value != 0) == (option->var_type == CLVC_BIT_SET)) 1138 { 1139 if (option->cl_host_wide_int) 1140 *(HOST_WIDE_INT *) flag_var |= option->var_value; 1141 else 1142 *(int *) flag_var |= option->var_value; 1143 } 1144 else 1145 { 1146 if (option->cl_host_wide_int) 1147 *(HOST_WIDE_INT *) flag_var &= ~option->var_value; 1148 else 1149 *(int *) flag_var &= ~option->var_value; 1150 } 1151 if (set_flag_var) 1152 { 1153 if (option->cl_host_wide_int) 1154 *(HOST_WIDE_INT *) set_flag_var |= option->var_value; 1155 else 1156 *(int *) set_flag_var |= option->var_value; 1157 } 1158 break; 1159 1160 case CLVC_STRING: 1161 *(const char **) flag_var = arg; 1162 if (set_flag_var) 1163 *(const char **) set_flag_var = ""; 1164 break; 1165 1166 case CLVC_ENUM: 1167 { 1168 const struct cl_enum *e = &cl_enums[option->var_enum]; 1169 1170 e->set (flag_var, value); 1171 if (set_flag_var) 1172 e->set (set_flag_var, 1); 1173 } 1174 break; 1175 1176 case CLVC_DEFER: 1177 { 1178 vec<cl_deferred_option> *v 1179 = (vec<cl_deferred_option> *) *(void **) flag_var; 1180 cl_deferred_option p = {opt_index, arg, value}; 1181 if (!v) 1182 v = XCNEW (vec<cl_deferred_option>); 1183 v->safe_push (p); 1184 *(void **) flag_var = v; 1185 if (set_flag_var) 1186 *(void **) set_flag_var = v; 1187 } 1188 break; 1189 } 1190 1191 if ((diagnostic_t) kind != DK_UNSPECIFIED 1192 && dc != NULL) 1193 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc); 1194 } 1195 1196 /* Return the address of the flag variable for option OPT_INDEX in 1197 options structure OPTS, or NULL if there is no flag variable. */ 1198 1199 void * 1200 option_flag_var (int opt_index, struct gcc_options *opts) 1201 { 1202 const struct cl_option *option = &cl_options[opt_index]; 1203 1204 if (option->flag_var_offset == (unsigned short) -1) 1205 return NULL; 1206 return (void *)(((char *) opts) + option->flag_var_offset); 1207 } 1208 1209 /* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled, 1210 or -1 if it isn't a simple on-off switch. */ 1211 1212 int 1213 option_enabled (int opt_idx, void *opts) 1214 { 1215 const struct cl_option *option = &(cl_options[opt_idx]); 1216 struct gcc_options *optsg = (struct gcc_options *) opts; 1217 void *flag_var = option_flag_var (opt_idx, optsg); 1218 1219 if (flag_var) 1220 switch (option->var_type) 1221 { 1222 case CLVC_BOOLEAN: 1223 return *(int *) flag_var != 0; 1224 1225 case CLVC_EQUAL: 1226 if (option->cl_host_wide_int) 1227 return *(HOST_WIDE_INT *) flag_var == option->var_value; 1228 else 1229 return *(int *) flag_var == option->var_value; 1230 1231 case CLVC_BIT_CLEAR: 1232 if (option->cl_host_wide_int) 1233 return (*(HOST_WIDE_INT *) flag_var & option->var_value) == 0; 1234 else 1235 return (*(int *) flag_var & option->var_value) == 0; 1236 1237 case CLVC_BIT_SET: 1238 if (option->cl_host_wide_int) 1239 return (*(HOST_WIDE_INT *) flag_var & option->var_value) != 0; 1240 else 1241 return (*(int *) flag_var & option->var_value) != 0; 1242 1243 case CLVC_STRING: 1244 case CLVC_ENUM: 1245 case CLVC_DEFER: 1246 break; 1247 } 1248 return -1; 1249 } 1250 1251 /* Fill STATE with the current state of option OPTION in OPTS. Return 1252 true if there is some state to store. */ 1253 1254 bool 1255 get_option_state (struct gcc_options *opts, int option, 1256 struct cl_option_state *state) 1257 { 1258 void *flag_var = option_flag_var (option, opts); 1259 1260 if (flag_var == 0) 1261 return false; 1262 1263 switch (cl_options[option].var_type) 1264 { 1265 case CLVC_BOOLEAN: 1266 case CLVC_EQUAL: 1267 state->data = flag_var; 1268 state->size = (cl_options[option].cl_host_wide_int 1269 ? sizeof (HOST_WIDE_INT) 1270 : sizeof (int)); 1271 break; 1272 1273 case CLVC_BIT_CLEAR: 1274 case CLVC_BIT_SET: 1275 state->ch = option_enabled (option, opts); 1276 state->data = &state->ch; 1277 state->size = 1; 1278 break; 1279 1280 case CLVC_STRING: 1281 state->data = *(const char **) flag_var; 1282 if (state->data == 0) 1283 state->data = ""; 1284 state->size = strlen ((const char *) state->data) + 1; 1285 break; 1286 1287 case CLVC_ENUM: 1288 state->data = flag_var; 1289 state->size = cl_enums[cl_options[option].var_enum].var_size; 1290 break; 1291 1292 case CLVC_DEFER: 1293 return false; 1294 } 1295 return true; 1296 } 1297 1298 /* Set a warning option OPT_INDEX (language mask LANG_MASK, option 1299 handlers HANDLERS) to have diagnostic kind KIND for option 1300 structures OPTS and OPTS_SET and diagnostic context DC (possibly 1301 NULL), at location LOC (UNKNOWN_LOCATION for -Werror=). If IMPLY, 1302 the warning option in question is implied at this point. This is 1303 used by -Werror= and #pragma GCC diagnostic. */ 1304 1305 void 1306 control_warning_option (unsigned int opt_index, int kind, bool imply, 1307 location_t loc, unsigned int lang_mask, 1308 const struct cl_option_handlers *handlers, 1309 struct gcc_options *opts, 1310 struct gcc_options *opts_set, 1311 diagnostic_context *dc) 1312 { 1313 if (cl_options[opt_index].alias_target != N_OPTS) 1314 opt_index = cl_options[opt_index].alias_target; 1315 if (opt_index == OPT_SPECIAL_ignore) 1316 return; 1317 if (dc) 1318 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc); 1319 if (imply) 1320 { 1321 /* -Werror=foo implies -Wfoo. */ 1322 if (cl_options[opt_index].var_type == CLVC_BOOLEAN) 1323 handle_generated_option (opts, opts_set, 1324 opt_index, NULL, 1, lang_mask, 1325 kind, loc, handlers, dc); 1326 } 1327 } 1328