2 * Copyright (C) 2010 Joel Rosdahl
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the Free
6 * Software Foundation; either version 3 of the License, or (at your option)
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 51
16 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #define TOO_HARD (1 << 0)
23 #define TOO_HARD_DIRECT (1 << 1)
24 #define TAKES_ARG (1 << 2)
25 #define TAKES_CONCAT_ARG (1 << 3)
26 #define TAKES_PATH (1 << 4)
27 #define AFFECTS_CPP (1 << 5)
34 static const struct compopt compopts[] = {
35 {"--coverage", TOO_HARD},
36 {"--param", TAKES_ARG},
38 {"-D", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG},
40 {"-F", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
42 {"-I", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
49 {"-U", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG},
51 {"-Xassembler", TAKES_ARG},
52 {"-Xlinker", TAKES_ARG},
53 {"-Xpreprocessor", TOO_HARD_DIRECT | TAKES_ARG},
54 {"-aux-info", TAKES_ARG},
56 {"-fbranch-probabilities", TOO_HARD},
57 {"-fprofile-arcs", TOO_HARD},
58 {"-fprofile-generate", TOO_HARD},
59 {"-fprofile-use", TOO_HARD},
61 {"-ftest-coverage", TOO_HARD},
62 {"-idirafter", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
63 {"-iframework", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
64 {"-imacros", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
65 {"-imultilib", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
66 {"-include", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
67 {"-install_name", TAKES_ARG}, /* Darwin linker option */
68 {"-iprefix", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
69 {"-iquote", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
70 {"-isysroot", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
71 {"-isystem", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
72 {"-iwithprefix", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
73 {"-iwithprefixbefore", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
74 {"-nostdinc", AFFECTS_CPP},
75 {"-nostdinc++", AFFECTS_CPP},
76 {"-save-temps", TOO_HARD},
81 compare_compopts(const void *key1, const void *key2)
83 const struct compopt *opt1 = (const struct compopt *)key1;
84 const struct compopt *opt2 = (const struct compopt *)key2;
85 return strcmp(opt1->name, opt2->name);
88 static const struct compopt *
89 find(const char *option)
94 &key, compopts, sizeof(compopts) / sizeof(compopts[0]),
95 sizeof(compopts[0]), compare_compopts);
98 /* Runs fn on the first two characters of option. */
100 compopt_short(bool (*fn)(const char *), const char *option)
102 char *short_opt = x_strndup(option, 2);
103 bool retval = fn(short_opt);
108 /* For test purposes. */
110 compopt_verify_sortedness(void)
113 for (i = 1; i < sizeof(compopts)/sizeof(compopts[0]); i++) {
114 if (strcmp(compopts[i-1].name, compopts[i].name) >= 0) {
116 "compopt_verify_sortedness: %s >= %s\n",
126 compopt_affects_cpp(const char *option)
128 const struct compopt *co = find(option);
129 return co && (co->type & AFFECTS_CPP);
133 compopt_too_hard(const char *option)
135 const struct compopt *co = find(option);
136 return co && (co->type & TOO_HARD);
140 compopt_too_hard_for_direct_mode(const char *option)
142 const struct compopt *co = find(option);
143 return co && (co->type & TOO_HARD_DIRECT);
147 compopt_takes_path(const char *option)
149 const struct compopt *co = find(option);
150 return co && (co->type & TAKES_PATH);
154 compopt_takes_arg(const char *option)
156 const struct compopt *co = find(option);
157 return co && (co->type & TAKES_ARG);