1# Copyright (C) 2003-2013 Free Software Foundation, Inc. 2# Contributed by Kelley Cook, June 2004. 3# Original code from Neil Booth, May 2003. 4# 5# This program is free software; you can redistribute it and/or modify it 6# under the terms of the GNU General Public License as published by the 7# Free Software Foundation; either version 3, or (at your option) any 8# later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program; see the file COPYING3. If not see 17# <http://www.gnu.org/licenses/>. 18 19# This Awk script reads in the option records generated from 20# opt-gather.awk, combines the flags of duplicate options and generates a 21# C file. 22# 23 24# This program uses functions from opt-functions.awk and code from 25# opt-read.awk. 26# 27# Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-save-gen.awk \ 28# [-v header_name=header.h] < inputfile > options-save.c 29 30# Dump that array of options into a C file. 31END { 32print "/* This file is auto-generated by optc-save-gen.awk. */" 33print "" 34n_headers = split(header_name, headers, " ") 35for (i = 1; i <= n_headers; i++) 36 print "#include " quote headers[i] quote 37print "#include " quote "opts.h" quote 38print "#include " quote "intl.h" quote 39print "" 40print "#include " quote "flags.h" quote 41print "#include " quote "target.h" quote 42print "" 43 44if (n_extra_c_includes > 0) { 45 for (i = 0; i < n_extra_c_includes; i++) { 46 print "#include " quote extra_c_includes[i] quote 47 } 48 print "" 49} 50 51have_save = 0; 52if (n_extra_target_vars) 53 have_save = 1 54 55for (i = 0; i < n_opts; i++) { 56 if (flag_set_p("Save", flags[i])) 57 have_save = 1; 58} 59 60print "/* Save optimization variables into a structure. */" 61print "void"; 62print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)"; 63print "{"; 64 65n_opt_char = 2; 66n_opt_short = 0; 67n_opt_int = 0; 68n_opt_enum = 1; 69n_opt_other = 0; 70var_opt_char[0] = "optimize"; 71var_opt_char[1] = "optimize_size"; 72var_opt_range["optimize"] = "0, 255"; 73var_opt_range["optimize_size"] = "0, 255"; 74var_opt_enum[0] = "flag_fp_contract_mode"; 75 76# Sort by size to mimic how the structure is laid out to be friendlier to the 77# cache. 78 79for (i = 0; i < n_opts; i++) { 80 if (flag_set_p("Optimization", flags[i])) { 81 name = var_name(flags[i]) 82 if(name == "") 83 continue; 84 85 if(name in var_opt_seen) 86 continue; 87 88 var_opt_seen[name]++; 89 otype = var_type_struct(flags[i]); 90 if (otype ~ "^((un)?signed +)?int *$") 91 var_opt_int[n_opt_int++] = name; 92 93 else if (otype ~ "^((un)?signed +)?short *$") 94 var_opt_short[n_opt_short++] = name; 95 96 else if (otype ~ ("^enum +[_" alnum "]+ *")) 97 var_opt_enum[n_opt_enum++] = name; 98 99 else if (otype ~ "^((un)?signed +)?char *$") { 100 var_opt_char[n_opt_char++] = name; 101 if (otype ~ "^unsigned +char *$") 102 var_opt_range[name] = "0, 255" 103 else if (otype ~ "^signed +char *$") 104 var_opt_range[name] = "-128, 127" 105 } 106 else 107 var_opt_other[n_opt_other++] = name; 108 } 109} 110 111for (i = 0; i < n_opt_char; i++) { 112 name = var_opt_char[i]; 113 if (var_opt_range[name] != "") 114 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));"; 115} 116 117print ""; 118for (i = 0; i < n_opt_other; i++) { 119 print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";"; 120} 121 122for (i = 0; i < n_opt_int; i++) { 123 print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";"; 124} 125 126for (i = 0; i < n_opt_enum; i++) { 127 print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";"; 128} 129 130for (i = 0; i < n_opt_short; i++) { 131 print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";"; 132} 133 134for (i = 0; i < n_opt_char; i++) { 135 print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";"; 136} 137 138print "}"; 139 140print ""; 141print "/* Restore optimization options from a structure. */"; 142print "void"; 143print "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)"; 144print "{"; 145 146for (i = 0; i < n_opt_other; i++) { 147 print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";"; 148} 149 150for (i = 0; i < n_opt_int; i++) { 151 print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";"; 152} 153 154for (i = 0; i < n_opt_enum; i++) { 155 print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";"; 156} 157 158for (i = 0; i < n_opt_short; i++) { 159 print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";"; 160} 161 162for (i = 0; i < n_opt_char; i++) { 163 print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";"; 164} 165 166print " targetm.override_options_after_change ();"; 167print "}"; 168 169print ""; 170print "/* Print optimization options from a structure. */"; 171print "void"; 172print "cl_optimization_print (FILE *file,"; 173print " int indent_to,"; 174print " struct cl_optimization *ptr)"; 175print "{"; 176 177print " fputs (\"\\n\", file);"; 178for (i = 0; i < n_opt_other; i++) { 179 print " if (ptr->x_" var_opt_other[i] ")"; 180 print " fprintf (file, \"%*s%s (%#lx)\\n\","; 181 print " indent_to, \"\","; 182 print " \"" var_opt_other[i] "\","; 183 print " (unsigned long)ptr->x_" var_opt_other[i] ");"; 184 print ""; 185} 186 187for (i = 0; i < n_opt_int; i++) { 188 print " if (ptr->x_" var_opt_int[i] ")"; 189 print " fprintf (file, \"%*s%s (%#x)\\n\","; 190 print " indent_to, \"\","; 191 print " \"" var_opt_int[i] "\","; 192 print " ptr->x_" var_opt_int[i] ");"; 193 print ""; 194} 195 196for (i = 0; i < n_opt_enum; i++) { 197 print " fprintf (file, \"%*s%s (%#x)\\n\","; 198 print " indent_to, \"\","; 199 print " \"" var_opt_enum[i] "\","; 200 print " (int) ptr->x_" var_opt_enum[i] ");"; 201 print ""; 202} 203 204for (i = 0; i < n_opt_short; i++) { 205 print " if (ptr->x_" var_opt_short[i] ")"; 206 print " fprintf (file, \"%*s%s (%#x)\\n\","; 207 print " indent_to, \"\","; 208 print " \"" var_opt_short[i] "\","; 209 print " ptr->x_" var_opt_short[i] ");"; 210 print ""; 211} 212 213for (i = 0; i < n_opt_char; i++) { 214 print " if (ptr->x_" var_opt_char[i] ")"; 215 print " fprintf (file, \"%*s%s (%#x)\\n\","; 216 print " indent_to, \"\","; 217 print " \"" var_opt_char[i] "\","; 218 print " ptr->x_" var_opt_char[i] ");"; 219 print ""; 220} 221 222print "}"; 223 224print ""; 225print "/* Save selected option variables into a structure. */" 226print "void"; 227print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)"; 228print "{"; 229 230n_target_char = 0; 231n_target_short = 0; 232n_target_int = 0; 233n_target_enum = 0; 234n_target_other = 0; 235 236if (have_save) { 237 for (i = 0; i < n_opts; i++) { 238 if (flag_set_p("Save", flags[i])) { 239 name = var_name(flags[i]) 240 if(name == "") 241 name = "target_flags"; 242 243 if(name in var_save_seen) 244 continue; 245 246 var_save_seen[name]++; 247 otype = var_type_struct(flags[i]) 248 if (otype ~ "^((un)?signed +)?int *$") 249 var_target_int[n_target_int++] = name; 250 251 else if (otype ~ "^((un)?signed +)?short *$") 252 var_target_short[n_target_short++] = name; 253 254 else if (otype ~ ("^enum +[_" alnum "]+ *$")) 255 var_target_enum[n_target_enum++] = name; 256 257 else if (otype ~ "^((un)?signed +)?char *$") { 258 var_target_char[n_target_char++] = name; 259 if (otype ~ "^unsigned +char *$") 260 var_target_range[name] = "0, 255" 261 else if (otype ~ "^signed +char *$") 262 var_target_range[name] = "-128, 127" 263 if (otype == var_type(flags[i])) 264 var_target_range[name] = "" 265 } 266 else 267 var_target_other[n_target_other++] = name; 268 } 269 } 270} else { 271 var_target_int[n_target_int++] = "target_flags"; 272} 273 274have_assert = 0; 275for (i = 0; i < n_target_char; i++) { 276 name = var_target_char[i]; 277 if (var_target_range[name] != "") { 278 have_assert = 1; 279 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));"; 280 } 281} 282 283if (have_assert) 284 print ""; 285 286print " if (targetm.target_option.save)"; 287print " targetm.target_option.save (ptr);"; 288print ""; 289 290for (i = 0; i < n_extra_target_vars; i++) { 291 print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";"; 292} 293 294for (i = 0; i < n_target_other; i++) { 295 print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";"; 296} 297 298for (i = 0; i < n_target_enum; i++) { 299 print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";"; 300} 301 302for (i = 0; i < n_target_int; i++) { 303 print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";"; 304} 305 306for (i = 0; i < n_target_short; i++) { 307 print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";"; 308} 309 310for (i = 0; i < n_target_char; i++) { 311 print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";"; 312} 313 314print "}"; 315 316print ""; 317print "/* Restore selected current options from a structure. */"; 318print "void"; 319print "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)"; 320print "{"; 321 322for (i = 0; i < n_extra_target_vars; i++) { 323 print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";"; 324} 325 326for (i = 0; i < n_target_other; i++) { 327 print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";"; 328} 329 330for (i = 0; i < n_target_enum; i++) { 331 print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";"; 332} 333 334for (i = 0; i < n_target_int; i++) { 335 print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";"; 336} 337 338for (i = 0; i < n_target_short; i++) { 339 print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";"; 340} 341 342for (i = 0; i < n_target_char; i++) { 343 print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";"; 344} 345 346# This must occur after the normal variables in case the code depends on those 347# variables. 348print ""; 349print " if (targetm.target_option.restore)"; 350print " targetm.target_option.restore (ptr);"; 351 352print "}"; 353 354print ""; 355print "/* Print optimization options from a structure. */"; 356print "void"; 357print "cl_target_option_print (FILE *file,"; 358print " int indent,"; 359print " struct cl_target_option *ptr)"; 360print "{"; 361 362print " fputs (\"\\n\", file);"; 363for (i = 0; i < n_target_other; i++) { 364 print " if (ptr->x_" var_target_other[i] ")"; 365 if (host_wide_int[var_target_other[i]] == "yes") 366 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; 367 else 368 print " fprintf (file, \"%*s%s (%#x)\\n\","; 369 print " indent, \"\","; 370 print " \"" var_target_other[i] "\","; 371 if (host_wide_int[var_target_other[i]] == "yes") 372 print " ptr->x_" var_target_other[i] ");"; 373 else 374 print " (unsigned long)ptr->x_" var_target_other[i] ");"; 375 print ""; 376} 377 378for (i = 0; i < n_target_enum; i++) { 379 print " if (ptr->x_" var_target_enum[i] ")"; 380 print " fprintf (file, \"%*s%s (%#x)\\n\","; 381 print " indent, \"\","; 382 print " \"" var_target_enum[i] "\","; 383 print " ptr->x_" var_target_enum[i] ");"; 384 print ""; 385} 386 387for (i = 0; i < n_target_int; i++) { 388 print " if (ptr->x_" var_target_int[i] ")"; 389 print " fprintf (file, \"%*s%s (%#x)\\n\","; 390 print " indent, \"\","; 391 print " \"" var_target_int[i] "\","; 392 print " ptr->x_" var_target_int[i] ");"; 393 print ""; 394} 395 396for (i = 0; i < n_target_short; i++) { 397 print " if (ptr->x_" var_target_short[i] ")"; 398 print " fprintf (file, \"%*s%s (%#x)\\n\","; 399 print " indent, \"\","; 400 print " \"" var_target_short[i] "\","; 401 print " ptr->x_" var_target_short[i] ");"; 402 print ""; 403} 404 405for (i = 0; i < n_target_char; i++) { 406 print " if (ptr->x_" var_target_char[i] ")"; 407 print " fprintf (file, \"%*s%s (%#x)\\n\","; 408 print " indent, \"\","; 409 print " \"" var_target_char[i] "\","; 410 print " ptr->x_" var_target_char[i] ");"; 411 print ""; 412} 413 414print ""; 415print " if (targetm.target_option.print)"; 416print " targetm.target_option.print (file, indent, ptr);"; 417 418print "}"; 419 420} 421