2 * Copyright (C) 2010-2016 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 {"--param", TAKES_ARG},
36 {"--save-temps", TOO_HARD},
37 {"--serialize-diagnostics", TAKES_ARG | TAKES_PATH},
39 {"-D", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG},
41 {"-F", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
43 {"-I", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
50 {"-U", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG},
52 {"-Xassembler", TAKES_ARG},
53 {"-Xclang", TAKES_ARG},
54 {"-Xlinker", TAKES_ARG},
55 {"-Xpreprocessor", AFFECTS_CPP | TOO_HARD_DIRECT | TAKES_ARG},
57 {"-aux-info", TAKES_ARG},
59 {"-fmodules", TOO_HARD},
60 {"-fno-working-directory", AFFECTS_CPP},
61 {"-fplugin=libcc1plugin", TOO_HARD}, /* interaction with GDB */
63 {"-fstack-usage", TOO_HARD},
64 {"-fworking-directory", AFFECTS_CPP},
65 {"-idirafter", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
66 {"-iframework", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
67 {"-imacros", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
68 {"-imultilib", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
69 {"-include", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
70 {"-include-pch", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
71 {"-install_name", TAKES_ARG}, /* Darwin linker option */
72 {"-iprefix", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
73 {"-iquote", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
74 {"-isysroot", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
75 {"-isystem", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
76 {"-iwithprefix", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
77 {"-iwithprefixbefore", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
78 {"-nostdinc", AFFECTS_CPP},
79 {"-nostdinc++", AFFECTS_CPP},
80 {"-remap", AFFECTS_CPP},
81 {"-save-temps", TOO_HARD},
82 {"-stdlib=", AFFECTS_CPP | TAKES_CONCAT_ARG},
83 {"-trigraphs", AFFECTS_CPP},
89 compare_compopts(const void *key1, const void *key2)
91 const struct compopt *opt1 = (const struct compopt *)key1;
92 const struct compopt *opt2 = (const struct compopt *)key2;
93 return strcmp(opt1->name, opt2->name);
97 compare_prefix_compopts(const void *key1, const void *key2)
99 const struct compopt *opt1 = (const struct compopt *)key1;
100 const struct compopt *opt2 = (const struct compopt *)key2;
101 return strncmp(opt1->name, opt2->name, strlen(opt2->name));
104 static const struct compopt *
105 find(const char *option)
110 &key, compopts, sizeof(compopts) / sizeof(compopts[0]),
111 sizeof(compopts[0]), compare_compopts);
114 static const struct compopt *
115 find_prefix(const char *option)
120 &key, compopts, sizeof(compopts) / sizeof(compopts[0]),
121 sizeof(compopts[0]), compare_prefix_compopts);
124 /* Runs fn on the first two characters of option. */
126 compopt_short(bool (*fn)(const char *), const char *option)
128 char *short_opt = x_strndup(option, 2);
129 bool retval = fn(short_opt);
134 /* For test purposes. */
136 compopt_verify_sortedness(void)
139 for (i = 1; i < sizeof(compopts)/sizeof(compopts[0]); i++) {
140 if (strcmp(compopts[i-1].name, compopts[i].name) >= 0) {
142 "compopt_verify_sortedness: %s >= %s\n",
152 compopt_affects_cpp(const char *option)
154 const struct compopt *co = find(option);
155 return co && (co->type & AFFECTS_CPP);
159 compopt_too_hard(const char *option)
161 const struct compopt *co = find(option);
162 return co && (co->type & TOO_HARD);
166 compopt_too_hard_for_direct_mode(const char *option)
168 const struct compopt *co = find(option);
169 return co && (co->type & TOO_HARD_DIRECT);
173 compopt_takes_path(const char *option)
175 const struct compopt *co = find(option);
176 return co && (co->type & TAKES_PATH);
180 compopt_takes_arg(const char *option)
182 const struct compopt *co = find(option);
183 return co && (co->type & TAKES_ARG);
186 /* Determines if the prefix of the option matches any option and affects the
190 compopt_prefix_affects_cpp(const char *option)
192 /* prefix options have to take concatentated args */
193 const struct compopt *co = find_prefix(option);
194 return co && (co->type & TAKES_CONCAT_ARG) && (co->type & AFFECTS_CPP);