1 1.12 mrg # Copyright (C) 2003-2022 Free Software Foundation, Inc. 2 1.1 mrg # Contributed by Kelley Cook, June 2004. 3 1.1 mrg # Original code from Neil Booth, May 2003. 4 1.1 mrg # 5 1.1 mrg # This program is free software; you can redistribute it and/or modify it 6 1.1 mrg # under the terms of the GNU General Public License as published by the 7 1.1 mrg # Free Software Foundation; either version 3, or (at your option) any 8 1.1 mrg # later version. 9 1.1 mrg # 10 1.1 mrg # This program is distributed in the hope that it will be useful, 11 1.1 mrg # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 1.1 mrg # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 1.1 mrg # GNU General Public License for more details. 14 1.1 mrg # 15 1.1 mrg # You should have received a copy of the GNU General Public License 16 1.1 mrg # along with this program; see the file COPYING3. If not see 17 1.1 mrg # <http://www.gnu.org/licenses/>. 18 1.1 mrg 19 1.1 mrg # This Awk script reads in the option records generated from 20 1.1 mrg # opt-gather.awk, combines the flags of duplicate options and generates a 21 1.1 mrg # C file. 22 1.1 mrg # 23 1.3 mrg 24 1.3 mrg # This program uses functions from opt-functions.awk and code from 25 1.3 mrg # opt-read.awk. 26 1.1 mrg # 27 1.3 mrg # Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-gen.awk \ 28 1.12 mrg # [-v header_name=header.h] < inputfile > options.cc 29 1.1 mrg 30 1.1 mrg # Dump that array of options into a C file. 31 1.1 mrg END { 32 1.3 mrg 33 1.6 mrg 34 1.6 mrg # Combine the flags of identical switches. Switches 35 1.6 mrg # appear many times if they are handled by many front 36 1.6 mrg # ends, for example. 37 1.6 mrg for (i = 0; i < n_opts; i++) { 38 1.6 mrg merged_flags[i] = flags[i] 39 1.6 mrg } 40 1.6 mrg for (i = 0; i < n_opts; i++) { 41 1.6 mrg while(i + 1 != n_opts && opts[i] == opts[i + 1] ) { 42 1.6 mrg merged_flags[i + 1] = merged_flags[i] " " merged_flags[i + 1]; 43 1.6 mrg i++; 44 1.6 mrg } 45 1.6 mrg } 46 1.6 mrg 47 1.6 mrg # Record EnabledBy and LangEnabledBy uses. 48 1.3 mrg n_enabledby = 0; 49 1.3 mrg for (i = 0; i < n_langs; i++) { 50 1.3 mrg n_enabledby_lang[i] = 0; 51 1.3 mrg } 52 1.3 mrg for (i = 0; i < n_opts; i++) { 53 1.3 mrg enabledby_arg = opt_args("EnabledBy", flags[i]); 54 1.3 mrg if (enabledby_arg != "") { 55 1.5 mrg logical_and = index(enabledby_arg, " && "); 56 1.5 mrg if (logical_and != 0) { 57 1.5 mrg # EnabledBy(arg1 && arg2) 58 1.5 mrg split_sep = " && "; 59 1.5 mrg } else { 60 1.5 mrg # EnabledBy(arg) or EnabledBy(arg1 || arg2 || arg3) 61 1.5 mrg split_sep = " \\|\\| "; 62 1.5 mrg } 63 1.5 mrg n_enabledby_names = split(enabledby_arg, enabledby_names, split_sep); 64 1.5 mrg if (logical_and != 0 && n_enabledby_names > 2) { 65 1.6 mrg print "#error " opts[i] " EnabledBy(Wfoo && Wbar && Wbaz) currently not supported" 66 1.3 mrg } 67 1.3 mrg for (j = 1; j <= n_enabledby_names; j++) { 68 1.3 mrg enabledby_name = enabledby_names[j]; 69 1.3 mrg enabledby_index = opt_numbers[enabledby_name]; 70 1.3 mrg if (enabledby_index == "") { 71 1.6 mrg print "#error " opts[i] " Enabledby(" enabledby_name "), unknown option '" enabledby_name "'" 72 1.6 mrg } else if (!flag_set_p("Common", merged_flags[enabledby_index])) { 73 1.6 mrg print "#error " opts[i] " Enabledby(" enabledby_name "), '" \ 74 1.6 mrg enabledby_name "' must have flag 'Common'" \ 75 1.6 mrg " to use Enabledby(), otherwise use LangEnabledBy()" 76 1.6 mrg } else { 77 1.6 mrg condition = ""; 78 1.5 mrg if (logical_and != 0) { 79 1.3 mrg opt_var_name_1 = search_var_name(enabledby_names[1], opt_numbers, opts, flags, n_opts); 80 1.3 mrg opt_var_name_2 = search_var_name(enabledby_names[2], opt_numbers, opts, flags, n_opts); 81 1.3 mrg if (opt_var_name_1 == "") { 82 1.3 mrg print "#error " enabledby_names[1] " does not have a Var() flag" 83 1.3 mrg } 84 1.3 mrg if (opt_var_name_2 == "") { 85 1.3 mrg print "#error " enabledby_names[2] " does not have a Var() flag" 86 1.3 mrg } 87 1.3 mrg condition = "opts->x_" opt_var_name_1 " && opts->x_" opt_var_name_2; 88 1.3 mrg } 89 1.3 mrg if (enables[enabledby_name] == "") { 90 1.3 mrg enabledby[n_enabledby] = enabledby_name; 91 1.3 mrg n_enabledby++; 92 1.3 mrg } 93 1.3 mrg enables[enabledby_name] = enables[enabledby_name] opts[i] ";"; 94 1.3 mrg enablesif[enabledby_name] = enablesif[enabledby_name] condition ";"; 95 1.3 mrg } 96 1.3 mrg } 97 1.3 mrg } 98 1.3 mrg 99 1.3 mrg enabledby_arg = opt_args("LangEnabledBy", flags[i]); 100 1.3 mrg if (enabledby_arg != "") { 101 1.12 mrg enabledby_n_args = n_args(enabledby_arg) 102 1.12 mrg if (enabledby_n_args != 2 \ 103 1.12 mrg && enabledby_n_args != 4) { 104 1.12 mrg print "#error " opts[i] " LangEnabledBy(" enabledby_arg ") must specify two or four arguments" 105 1.12 mrg } 106 1.12 mrg 107 1.12 mrg enabledby_langs = nth_arg(0, enabledby_arg); 108 1.12 mrg if (enabledby_langs == "") 109 1.12 mrg print "#error " opts[i] " LangEnabledBy(" enabledby_arg ") must specify LANGUAGE" 110 1.12 mrg enabledby_opt = nth_arg(1, enabledby_arg); 111 1.12 mrg if (enabledby_opt == "") 112 1.12 mrg print "#error " opts[i] " LangEnabledBy(" enabledby_arg ") must specify OPT" 113 1.12 mrg 114 1.12 mrg enabledby_posarg_negarg = "" 115 1.12 mrg if (enabledby_n_args == 4) { 116 1.12 mrg enabledby_posarg = nth_arg(2, enabledby_arg); 117 1.12 mrg enabledby_negarg = nth_arg(3, enabledby_arg); 118 1.12 mrg if (enabledby_posarg == "" \ 119 1.12 mrg || enabledby_negarg == "") 120 1.12 mrg print "#error " opts[i] " LangEnabledBy(" enabledby_arg ") with four arguments must specify POSARG and NEGARG" 121 1.12 mrg else 122 1.12 mrg enabledby_posarg_negarg = "," enabledby_posarg "," enabledby_negarg 123 1.12 mrg } 124 1.12 mrg 125 1.12 mrg n_enabledby_arg_langs = split(enabledby_langs, enabledby_arg_langs, " "); 126 1.12 mrg n_enabledby_array = split(enabledby_opt, enabledby_array, " \\|\\| "); 127 1.12 mrg for (k = 1; k <= n_enabledby_array; k++) { 128 1.12 mrg enabledby_index = opt_numbers[enabledby_array[k]]; 129 1.12 mrg if (enabledby_index == "") { 130 1.12 mrg print "#error " opts[i] " LangEnabledBy(" enabledby_arg "), unknown option '" enabledby_opt "'" 131 1.12 mrg continue 132 1.12 mrg } 133 1.12 mrg 134 1.12 mrg for (j = 1; j <= n_enabledby_arg_langs; j++) { 135 1.12 mrg lang_name = enabledby_arg_langs[j] 136 1.12 mrg lang_index = lang_numbers[lang_name]; 137 1.12 mrg if (lang_index == "") { 138 1.12 mrg print "#error " opts[i] " LangEnabledBy(" enabledby_arg "), unknown language '" lang_name "'" 139 1.12 mrg continue 140 1.12 mrg } 141 1.12 mrg 142 1.12 mrg lang_name = lang_sanitized_name(lang_name); 143 1.12 mrg 144 1.12 mrg if (enables[lang_name,enabledby_array[k]] == "") { 145 1.12 mrg enabledby[lang_name,n_enabledby_lang[lang_index]] = enabledby_array[k]; 146 1.12 mrg n_enabledby_lang[lang_index]++; 147 1.12 mrg } 148 1.12 mrg enables[lang_name,enabledby_array[k]] \ 149 1.12 mrg = enables[lang_name,enabledby_array[k]] opts[i] enabledby_posarg_negarg ";"; 150 1.12 mrg } 151 1.12 mrg } 152 1.3 mrg } 153 1.12 mrg 154 1.12 mrg if (flag_set_p("Param", flags[i]) && !(opts[i] ~ "^-param=")) 155 1.12 mrg print "#error Parameter option name '" opts[i] "' must start with '-param='" 156 1.3 mrg } 157 1.3 mrg 158 1.3 mrg 159 1.1 mrg print "/* This file is auto-generated by optc-gen.awk. */" 160 1.1 mrg print "" 161 1.1 mrg n_headers = split(header_name, headers, " ") 162 1.1 mrg for (i = 1; i <= n_headers; i++) 163 1.1 mrg print "#include " quote headers[i] quote 164 1.1 mrg print "#include " quote "opts.h" quote 165 1.1 mrg print "#include " quote "intl.h" quote 166 1.3 mrg print "#include " quote "insn-attr-common.h" quote 167 1.1 mrg print "" 168 1.3 mrg 169 1.3 mrg if (n_extra_c_includes > 0) { 170 1.3 mrg for (i = 0; i < n_extra_c_includes; i++) { 171 1.3 mrg print "#include " quote extra_c_includes[i] quote 172 1.3 mrg } 173 1.3 mrg print "" 174 1.3 mrg } 175 1.3 mrg 176 1.3 mrg for (i = 0; i < n_enums; i++) { 177 1.3 mrg name = enum_names[i] 178 1.3 mrg type = enum_type[name] 179 1.3 mrg print "static const struct cl_enum_arg cl_enum_" name \ 180 1.3 mrg "_data[] = " 181 1.3 mrg print "{" 182 1.3 mrg print enum_data[name] " { NULL, 0, 0 }" 183 1.3 mrg print "};" 184 1.3 mrg print "" 185 1.3 mrg print "static void" 186 1.3 mrg print "cl_enum_" name "_set (void *var, int value)" 187 1.3 mrg print "{" 188 1.3 mrg print " *((" type " *) var) = (" type ") value;" 189 1.3 mrg print "}" 190 1.3 mrg print "" 191 1.3 mrg print "static int" 192 1.3 mrg print "cl_enum_" name "_get (const void *var)" 193 1.3 mrg print "{" 194 1.3 mrg print " return (int) *((const " type " *) var);" 195 1.3 mrg print "}" 196 1.3 mrg print "" 197 1.3 mrg } 198 1.3 mrg 199 1.3 mrg print "const struct cl_enum cl_enums[] =" 200 1.3 mrg print "{" 201 1.3 mrg for (i = 0; i < n_enums; i++) { 202 1.3 mrg name = enum_names[i] 203 1.3 mrg ehelp = enum_help[name] 204 1.3 mrg if (ehelp == "") 205 1.3 mrg ehelp = "NULL" 206 1.3 mrg else 207 1.3 mrg ehelp = quote ehelp quote 208 1.3 mrg unknown_error = enum_unknown_error[name] 209 1.3 mrg if (unknown_error == "") 210 1.3 mrg unknown_error = "NULL" 211 1.3 mrg else 212 1.3 mrg unknown_error = quote unknown_error quote 213 1.3 mrg print " {" 214 1.3 mrg print " " ehelp "," 215 1.3 mrg print " " unknown_error "," 216 1.3 mrg print " cl_enum_" name "_data," 217 1.3 mrg print " sizeof (" enum_type[name] ")," 218 1.3 mrg print " cl_enum_" name "_set," 219 1.3 mrg print " cl_enum_" name "_get" 220 1.3 mrg print " }," 221 1.3 mrg } 222 1.3 mrg print "};" 223 1.3 mrg print "const unsigned int cl_enums_count = " n_enums ";" 224 1.1 mrg print "" 225 1.1 mrg 226 1.3 mrg print "const struct gcc_options global_options_init =\n{" 227 1.3 mrg for (i = 0; i < n_extra_vars; i++) { 228 1.3 mrg var = extra_vars[i] 229 1.3 mrg init = extra_vars[i] 230 1.3 mrg if (var ~ "=" ) { 231 1.3 mrg sub(".*= *", "", init) 232 1.3 mrg } else { 233 1.3 mrg init = "0" 234 1.3 mrg } 235 1.3 mrg sub(" *=.*", "", var) 236 1.3 mrg name = var 237 1.3 mrg sub("^.*[ *]", "", name) 238 1.3 mrg sub("\\[.*\\]$", "", name) 239 1.3 mrg var_seen[name] = 1 240 1.3 mrg print " " init ", /* " name " */" 241 1.3 mrg } 242 1.1 mrg for (i = 0; i < n_opts; i++) { 243 1.3 mrg name = var_name(flags[i]); 244 1.12 mrg init = opt_args("Init", flags[i]) 245 1.12 mrg 246 1.12 mrg if (name == "") { 247 1.12 mrg if (init != "") 248 1.12 mrg print "#error " opts[i] " must specify Var to use Init" 249 1.3 mrg continue; 250 1.12 mrg } 251 1.1 mrg 252 1.3 mrg if (init != "") { 253 1.3 mrg if (name in var_init && var_init[name] != init) 254 1.3 mrg print "#error multiple initializers for " name 255 1.3 mrg var_init[name] = init 256 1.3 mrg } 257 1.3 mrg } 258 1.3 mrg for (i = 0; i < n_opts; i++) { 259 1.1 mrg name = var_name(flags[i]); 260 1.1 mrg if (name == "") 261 1.1 mrg continue; 262 1.1 mrg 263 1.3 mrg if (name in var_seen) 264 1.3 mrg continue; 265 1.3 mrg 266 1.3 mrg if (name in var_init) 267 1.3 mrg init = var_init[name] 268 1.3 mrg else 269 1.3 mrg init = "0" 270 1.1 mrg 271 1.3 mrg print " " init ", /* " name " */" 272 1.1 mrg 273 1.1 mrg var_seen[name] = 1; 274 1.1 mrg } 275 1.1 mrg for (i = 0; i < n_opts; i++) { 276 1.1 mrg name = static_var(opts[i], flags[i]); 277 1.3 mrg if (name != "") { 278 1.3 mrg print " 0, /* " name " (private state) */" 279 1.3 mrg print "#undef x_" name 280 1.3 mrg } 281 1.3 mrg } 282 1.3 mrg for (i = 0; i < n_opts; i++) { 283 1.3 mrg if (flag_set_p("SetByCombined", flags[i])) 284 1.3 mrg print " false, /* frontend_set_" var_name(flags[i]) " */" 285 1.1 mrg } 286 1.3 mrg print "};" 287 1.3 mrg print "" 288 1.3 mrg print "struct gcc_options global_options;" 289 1.3 mrg print "struct gcc_options global_options_set;" 290 1.1 mrg print "" 291 1.1 mrg 292 1.1 mrg print "const char * const lang_names[] =\n{" 293 1.1 mrg for (i = 0; i < n_langs; i++) { 294 1.3 mrg macros[i] = "CL_" lang_sanitized_name(langs[i]) 295 1.1 mrg s = substr(" ", length (macros[i])) 296 1.1 mrg print " " quote langs[i] quote "," 297 1.1 mrg } 298 1.1 mrg 299 1.1 mrg print " 0\n};\n" 300 1.1 mrg print "const unsigned int cl_options_count = N_OPTS;\n" 301 1.3 mrg print "#if (1U << " n_langs ") > CL_MIN_OPTION_CLASS" 302 1.3 mrg print " #error the number of languages exceeds the implementation limit" 303 1.3 mrg print "#endif" 304 1.1 mrg print "const unsigned int cl_lang_count = " n_langs ";\n" 305 1.1 mrg 306 1.1 mrg print "const struct cl_option cl_options[] =\n{" 307 1.1 mrg 308 1.1 mrg j = 0 309 1.1 mrg for (i = 0; i < n_opts; i++) { 310 1.1 mrg back_chain[i] = "N_OPTS"; 311 1.1 mrg indices[opts[i]] = j; 312 1.1 mrg # Combine the flags of identical switches. Switches 313 1.1 mrg # appear many times if they are handled by many front 314 1.1 mrg # ends, for example. 315 1.1 mrg while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { 316 1.1 mrg flags[i + 1] = flags[i] " " flags[i + 1]; 317 1.1 mrg if (help[i + 1] == "") 318 1.1 mrg help[i + 1] = help[i] 319 1.12 mrg else if (help[i] != "" && help[i + 1] != help[i]) { 320 1.3 mrg print "#error Multiple different help strings for " \ 321 1.12 mrg opts[i] ":" 322 1.12 mrg print "#error " help[i] 323 1.12 mrg print "#error " help[i + 1] 324 1.12 mrg } 325 1.3 mrg 326 1.1 mrg i++; 327 1.1 mrg back_chain[i] = "N_OPTS"; 328 1.1 mrg indices[opts[i]] = j; 329 1.1 mrg } 330 1.1 mrg j++; 331 1.1 mrg } 332 1.1 mrg 333 1.10 mrg optindex = 0 334 1.1 mrg for (i = 0; i < n_opts; i++) { 335 1.1 mrg # With identical flags, pick only the last one. The 336 1.1 mrg # earlier loop ensured that it has all flags merged, 337 1.1 mrg # and a nonempty help text if one of the texts was nonempty. 338 1.1 mrg while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { 339 1.1 mrg i++; 340 1.1 mrg } 341 1.1 mrg 342 1.1 mrg len = length (opts[i]); 343 1.3 mrg enum = opt_enum(opts[i]) 344 1.1 mrg 345 1.1 mrg # If this switch takes joined arguments, back-chain all 346 1.1 mrg # subsequent switches to it for which it is a prefix. If 347 1.1 mrg # a later switch S is a longer prefix of a switch T, T 348 1.1 mrg # will be back-chained to S in a later iteration of this 349 1.1 mrg # for() loop, which is what we want. 350 1.1 mrg if (flag_set_p("Joined.*", flags[i])) { 351 1.1 mrg for (j = i + 1; j < n_opts; j++) { 352 1.1 mrg if (substr (opts[j], 1, len) != opts[i]) 353 1.1 mrg break; 354 1.1 mrg back_chain[j] = enum; 355 1.1 mrg } 356 1.1 mrg } 357 1.1 mrg 358 1.1 mrg s = substr(" ", length (opts[i])) 359 1.1 mrg if (i + 1 == n_opts) 360 1.1 mrg comma = "" 361 1.1 mrg 362 1.1 mrg if (help[i] == "") 363 1.10 mrg hlp = "NULL" 364 1.1 mrg else 365 1.1 mrg hlp = quote help[i] quote; 366 1.1 mrg 367 1.3 mrg missing_arg_error = opt_args("MissingArgError", flags[i]) 368 1.3 mrg if (missing_arg_error == "") 369 1.10 mrg missing_arg_error = "NULL" 370 1.3 mrg else 371 1.3 mrg missing_arg_error = quote missing_arg_error quote 372 1.3 mrg 373 1.3 mrg 374 1.3 mrg warn_message = opt_args("Warn", flags[i]) 375 1.3 mrg if (warn_message == "") 376 1.10 mrg warn_message = "NULL" 377 1.3 mrg else 378 1.3 mrg warn_message = quote warn_message quote 379 1.3 mrg 380 1.3 mrg alias_arg = opt_args("Alias", flags[i]) 381 1.3 mrg if (alias_arg == "") { 382 1.10 mrg if (flag_set_p("Ignore", flags[i])) { 383 1.10 mrg alias_data = "NULL, NULL, OPT_SPECIAL_ignore" 384 1.10 mrg if (warn_message != "NULL") 385 1.10 mrg print "#error Ignored option with Warn" 386 1.10 mrg if (var_name(flags[i]) != "") 387 1.10 mrg print "#error Ignored option with Var" 388 1.10 mrg } 389 1.11 mrg else if (flag_set_p("Deprecated", flags[i])) 390 1.11 mrg print "#error Deprecated was replaced with WarnRemoved" 391 1.11 mrg else if (flag_set_p("WarnRemoved", flags[i])) { 392 1.11 mrg alias_data = "NULL, NULL, OPT_SPECIAL_warn_removed" 393 1.10 mrg if (warn_message != "NULL") 394 1.11 mrg print "#error WarnRemoved option with Warn" 395 1.10 mrg } 396 1.3 mrg else 397 1.3 mrg alias_data = "NULL, NULL, N_OPTS" 398 1.8 mrg if (flag_set_p("Enum.*", flags[i])) { 399 1.8 mrg if (!flag_set_p("RejectNegative", flags[i]) \ 400 1.12 mrg && !flag_set_p("EnumSet", flags[i]) \ 401 1.12 mrg && !flag_set_p("EnumBitSet", flags[i]) \ 402 1.9 mrg && opts[i] ~ "^[Wfgm]") 403 1.8 mrg print "#error Enum allowing negative form" 404 1.8 mrg } 405 1.3 mrg } else { 406 1.3 mrg alias_opt = nth_arg(0, alias_arg) 407 1.3 mrg alias_posarg = nth_arg(1, alias_arg) 408 1.3 mrg alias_negarg = nth_arg(2, alias_arg) 409 1.3 mrg 410 1.9 mrg if (var_ref(opts[i], flags[i]) != "(unsigned short) -1") 411 1.3 mrg print "#error Alias setting variable" 412 1.3 mrg 413 1.3 mrg if (alias_posarg != "" && alias_negarg == "") { 414 1.3 mrg if (!flag_set_p("RejectNegative", flags[i]) \ 415 1.3 mrg && opts[i] ~ "^[Wfm]") 416 1.3 mrg print "#error Alias with single argument " \ 417 1.3 mrg "allowing negative form" 418 1.3 mrg } 419 1.3 mrg if (alias_posarg != "" \ 420 1.3 mrg && flag_set_p("NegativeAlias", flags[i])) { 421 1.3 mrg print "#error Alias with multiple arguments " \ 422 1.3 mrg "used with NegativeAlias" 423 1.3 mrg } 424 1.3 mrg 425 1.3 mrg alias_opt = opt_enum(alias_opt) 426 1.3 mrg if (alias_posarg == "") 427 1.3 mrg alias_posarg = "NULL" 428 1.3 mrg else 429 1.3 mrg alias_posarg = quote alias_posarg quote 430 1.3 mrg if (alias_negarg == "") 431 1.3 mrg alias_negarg = "NULL" 432 1.3 mrg else 433 1.3 mrg alias_negarg = quote alias_negarg quote 434 1.3 mrg alias_data = alias_posarg ", " alias_negarg ", " alias_opt 435 1.3 mrg } 436 1.3 mrg 437 1.1 mrg neg = opt_args("Negative", flags[i]); 438 1.1 mrg if (neg != "") 439 1.1 mrg idx = indices[neg] 440 1.1 mrg else { 441 1.1 mrg if (flag_set_p("RejectNegative", flags[i])) 442 1.1 mrg idx = -1; 443 1.1 mrg else { 444 1.9 mrg if (opts[i] ~ "^[Wfgm]") 445 1.1 mrg idx = indices[opts[i]]; 446 1.1 mrg else 447 1.1 mrg idx = -1; 448 1.1 mrg } 449 1.1 mrg } 450 1.1 mrg # Split the printf after %u to work around an ia64-hp-hpux11.23 451 1.1 mrg # awk bug. 452 1.10 mrg printf(" /* [%i] = */ {\n", optindex) 453 1.10 mrg printf(" %c-%s%c,\n %s,\n %s,\n %s,\n %s, %s, %u,", 454 1.3 mrg quote, opts[i], quote, hlp, missing_arg_error, warn_message, 455 1.3 mrg alias_data, back_chain[i], len) 456 1.10 mrg printf(" /* .neg_idx = */ %d,\n", idx) 457 1.1 mrg condition = opt_args("Condition", flags[i]) 458 1.1 mrg cl_flags = switch_flags(flags[i]) 459 1.3 mrg cl_bit_fields = switch_bit_fields(flags[i]) 460 1.3 mrg cl_zero_bit_fields = switch_bit_fields("") 461 1.1 mrg if (condition != "") 462 1.1 mrg printf("#if %s\n" \ 463 1.1 mrg " %s,\n" \ 464 1.3 mrg " 0, %s,\n" \ 465 1.1 mrg "#else\n" \ 466 1.3 mrg " 0,\n" \ 467 1.3 mrg " 1 /* Disabled. */, %s,\n" \ 468 1.1 mrg "#endif\n", 469 1.3 mrg condition, cl_flags, cl_bit_fields, cl_zero_bit_fields) 470 1.1 mrg else 471 1.3 mrg printf(" %s,\n" \ 472 1.3 mrg " 0, %s,\n", 473 1.3 mrg cl_flags, cl_bit_fields) 474 1.9 mrg printf(" %s, %s, %s }%s\n", var_ref(opts[i], flags[i]), 475 1.9 mrg var_set(flags[i]), integer_range_info(opt_args("IntegerRange", flags[i]), 476 1.12 mrg opt_args("Init", flags[i]), opts[i], flag_set_p("UInteger", flags[i])), comma) 477 1.10 mrg 478 1.10 mrg # Bump up the informational option index. 479 1.10 mrg ++optindex 480 1.10 mrg } 481 1.1 mrg 482 1.1 mrg print "};" 483 1.1 mrg 484 1.3 mrg print "\n\n" 485 1.3 mrg print "bool " 486 1.3 mrg print "common_handle_option_auto (struct gcc_options *opts, " 487 1.3 mrg print " struct gcc_options *opts_set, " 488 1.3 mrg print " const struct cl_decoded_option *decoded, " 489 1.3 mrg print " unsigned int lang_mask, int kind, " 490 1.3 mrg print " location_t loc, " 491 1.3 mrg print " const struct cl_option_handlers *handlers, " 492 1.3 mrg print " diagnostic_context *dc) " 493 1.3 mrg print "{ " 494 1.3 mrg print " size_t scode = decoded->opt_index; " 495 1.10 mrg print " HOST_WIDE_INT value = decoded->value; " 496 1.3 mrg print " enum opt_code code = (enum opt_code) scode; " 497 1.3 mrg print " " 498 1.3 mrg print " gcc_assert (decoded->canonical_option_num_elements <= 2); " 499 1.3 mrg print " " 500 1.3 mrg print " switch (code) " 501 1.3 mrg print " { " 502 1.3 mrg # Handle EnabledBy 503 1.3 mrg for (i = 0; i < n_enabledby; i++) { 504 1.3 mrg enabledby_name = enabledby[i]; 505 1.3 mrg print " case " opt_enum(enabledby_name) ":" 506 1.3 mrg n_enables = split(enables[enabledby_name], thisenable, ";"); 507 1.3 mrg n_enablesif = split(enablesif[enabledby_name], thisenableif, ";"); 508 1.3 mrg if (n_enables != n_enablesif) { 509 1.3 mrg print "#error n_enables != n_enablesif: Something went wrong!" 510 1.3 mrg } 511 1.3 mrg for (j = 1; j < n_enables; j++) { 512 1.3 mrg opt_var_name = var_name(flags[opt_numbers[thisenable[j]]]); 513 1.3 mrg if (opt_var_name != "") { 514 1.3 mrg condition = "!opts_set->x_" opt_var_name 515 1.3 mrg if (thisenableif[j] != "") { 516 1.5 mrg value = "(" thisenableif[j] ")" 517 1.5 mrg } else { 518 1.5 mrg value = "value" 519 1.3 mrg } 520 1.3 mrg print " if (" condition ")" 521 1.3 mrg print " handle_generated_option (opts, opts_set," 522 1.5 mrg print " " opt_enum(thisenable[j]) ", NULL, " value "," 523 1.8 mrg print " lang_mask, kind, loc, handlers, true, dc);" 524 1.3 mrg } else { 525 1.3 mrg print "#error " thisenable[j] " does not have a Var() flag" 526 1.3 mrg } 527 1.3 mrg } 528 1.3 mrg print " break;\n" 529 1.1 mrg } 530 1.3 mrg print " default: " 531 1.3 mrg print " break; " 532 1.3 mrg print " } " 533 1.3 mrg print " return true; " 534 1.3 mrg print "} " 535 1.1 mrg 536 1.3 mrg # Handle LangEnabledBy 537 1.3 mrg for (i = 0; i < n_langs; i++) { 538 1.3 mrg lang_name = lang_sanitized_name(langs[i]); 539 1.3 mrg mark_unused = " ATTRIBUTE_UNUSED"; 540 1.1 mrg 541 1.3 mrg print "\n\n" 542 1.3 mrg print "bool " 543 1.3 mrg print lang_name "_handle_option_auto (struct gcc_options *opts" mark_unused ", " 544 1.3 mrg print " struct gcc_options *opts_set" mark_unused ", " 545 1.10 mrg print " size_t scode" mark_unused ", const char *arg" mark_unused ", HOST_WIDE_INT value" mark_unused ", " 546 1.3 mrg print " unsigned int lang_mask" mark_unused ", int kind" mark_unused ", " 547 1.3 mrg print " location_t loc" mark_unused ", " 548 1.3 mrg print " const struct cl_option_handlers *handlers" mark_unused ", " 549 1.3 mrg print " diagnostic_context *dc" mark_unused ") " 550 1.3 mrg print "{ " 551 1.3 mrg print " enum opt_code code = (enum opt_code) scode; " 552 1.3 mrg print " " 553 1.3 mrg print " switch (code) " 554 1.3 mrg print " { " 555 1.3 mrg 556 1.3 mrg for (k = 0; k < n_enabledby_lang[i]; k++) { 557 1.3 mrg enabledby_name = enabledby[lang_name,k]; 558 1.3 mrg print " case " opt_enum(enabledby_name) ":" 559 1.3 mrg n_thisenable = split(enables[lang_name,enabledby_name], thisenable, ";"); 560 1.3 mrg for (j = 1; j < n_thisenable; j++) { 561 1.3 mrg n_thisenable_args = split(thisenable[j], thisenable_args, ","); 562 1.3 mrg if (n_thisenable_args == 1) { 563 1.3 mrg thisenable_opt = thisenable[j]; 564 1.3 mrg value = "value"; 565 1.3 mrg } else { 566 1.3 mrg thisenable_opt = thisenable_args[1]; 567 1.3 mrg with_posarg = thisenable_args[2]; 568 1.3 mrg with_negarg = thisenable_args[3]; 569 1.3 mrg value = "value ? " with_posarg " : " with_negarg; 570 1.3 mrg } 571 1.3 mrg opt_var_name = var_name(flags[opt_numbers[thisenable_opt]]); 572 1.3 mrg if (opt_var_name != "") { 573 1.3 mrg print " if (!opts_set->x_" opt_var_name ")" 574 1.3 mrg print " handle_generated_option (opts, opts_set," 575 1.3 mrg print " " opt_enum(thisenable_opt) ", NULL, " value "," 576 1.8 mrg print " lang_mask, kind, loc, handlers, true, dc);" 577 1.3 mrg } else { 578 1.3 mrg print "#error " thisenable_opt " does not have a Var() flag" 579 1.3 mrg } 580 1.3 mrg } 581 1.3 mrg print " break;\n" 582 1.3 mrg } 583 1.3 mrg print " default: " 584 1.3 mrg print " break; " 585 1.3 mrg print " } " 586 1.3 mrg print " return true; " 587 1.3 mrg print "} " 588 1.1 mrg } 589 1.1 mrg 590 1.5 mrg #Handle CPP() 591 1.5 mrg print "\n" 592 1.5 mrg print "#include " quote "cpplib.h" quote; 593 1.5 mrg print "void" 594 1.5 mrg print "cpp_handle_option_auto (const struct gcc_options * opts, " 595 1.5 mrg print " size_t scode, struct cpp_options * cpp_opts)" 596 1.5 mrg print "{ " 597 1.5 mrg print " enum opt_code code = (enum opt_code) scode; " 598 1.5 mrg print " " 599 1.5 mrg print " switch (code) " 600 1.5 mrg print " { " 601 1.5 mrg for (i = 0; i < n_opts; i++) { 602 1.5 mrg # With identical flags, pick only the last one. The 603 1.5 mrg # earlier loop ensured that it has all flags merged, 604 1.5 mrg # and a nonempty help text if one of the texts was nonempty. 605 1.5 mrg while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { 606 1.5 mrg i++; 607 1.5 mrg } 608 1.5 mrg 609 1.5 mrg cpp_option = nth_arg(0, opt_args("CPP", flags[i])); 610 1.5 mrg if (cpp_option != "") { 611 1.5 mrg opt_var_name = var_name(flags[i]); 612 1.5 mrg init = opt_args("Init", flags[i]) 613 1.5 mrg if (opt_var_name != "" && init != "") { 614 1.5 mrg print " case " opt_enum(opts[i]) ":" 615 1.5 mrg print " cpp_opts->" cpp_option " = opts->x_" opt_var_name ";" 616 1.5 mrg print " break;" 617 1.5 mrg } else if (opt_var_name == "" && init == "") { 618 1.5 mrg print "#error CPP() requires setting Init() and Var() for " opts[i] 619 1.5 mrg } else if (opt_var_name != "") { 620 1.5 mrg print "#error CPP() requires setting Init() for " opts[i] 621 1.5 mrg } else { 622 1.5 mrg print "#error CPP() requires setting Var() for " opts[i] 623 1.5 mrg } 624 1.5 mrg } 625 1.5 mrg } 626 1.5 mrg print " default: " 627 1.5 mrg print " break; " 628 1.5 mrg print " } " 629 1.5 mrg print "}\n" 630 1.5 mrg print "void" 631 1.5 mrg print "init_global_opts_from_cpp(struct gcc_options * opts, " 632 1.5 mrg print " const struct cpp_options * cpp_opts)" 633 1.5 mrg print "{ " 634 1.5 mrg for (i = 0; i < n_opts; i++) { 635 1.5 mrg # With identical flags, pick only the last one. The 636 1.5 mrg # earlier loop ensured that it has all flags merged, 637 1.5 mrg # and a nonempty help text if one of the texts was nonempty. 638 1.5 mrg while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { 639 1.5 mrg i++; 640 1.5 mrg } 641 1.5 mrg cpp_option = nth_arg(0, opt_args("CPP", flags[i])); 642 1.5 mrg opt_var_name = var_name(flags[i]); 643 1.5 mrg if (cpp_option != "" && opt_var_name != "") { 644 1.5 mrg print " opts->x_" opt_var_name " = cpp_opts->" cpp_option ";" 645 1.5 mrg } 646 1.5 mrg } 647 1.5 mrg print "} " 648 1.5 mrg 649 1.12 mrg split("", var_seen, ":") 650 1.12 mrg print "\n#if !defined(GENERATOR_FILE) && defined(ENABLE_PLUGIN)" 651 1.12 mrg print "DEBUG_VARIABLE const struct cl_var cl_vars[] =\n{" 652 1.12 mrg 653 1.12 mrg for (i = 0; i < n_opts; i++) { 654 1.12 mrg name = var_name(flags[i]); 655 1.12 mrg if (name == "") 656 1.12 mrg continue; 657 1.12 mrg var_seen[name] = 1; 658 1.1 mrg } 659 1.5 mrg 660 1.12 mrg for (i = 0; i < n_extra_vars; i++) { 661 1.12 mrg var = extra_vars[i] 662 1.12 mrg sub(" *=.*", "", var) 663 1.12 mrg name = var 664 1.12 mrg sub("^.*[ *]", "", name) 665 1.12 mrg sub("\\[.*\\]$", "", name) 666 1.12 mrg if (name in var_seen) 667 1.12 mrg continue; 668 1.12 mrg print " { " quote name quote ", offsetof (struct gcc_options, x_" name ") }," 669 1.12 mrg var_seen[name] = 1 670 1.12 mrg } 671 1.12 mrg 672 1.12 mrg print " { NULL, (unsigned short) -1 }\n};\n#endif" 673 1.12 mrg 674 1.12 mrg } 675