1# Copyright (C) 2003-2019 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 "#include " quote "inchash.h" quote 43print "#include " quote "hash-set.h" quote 44print "#include " quote "vec.h" quote 45print "#include " quote "input.h" quote 46print "#include " quote "alias.h" quote 47print "#include " quote "symtab.h" quote 48print "#include " quote "inchash.h" quote 49print "#include " quote "tree.h" quote 50print "#include " quote "fold-const.h" quote 51print "#include " quote "tree-ssa-alias.h" quote 52print "#include " quote "is-a.h" quote 53print "#include " quote "predict.h" quote 54print "#include " quote "function.h" quote 55print "#include " quote "basic-block.h" quote 56print "#include " quote "gimple-expr.h" quote 57print "#include " quote "gimple.h" quote 58print "#include " quote "data-streamer.h" quote 59print "#include " quote "ipa-ref.h" quote 60print "#include " quote "cgraph.h" quote 61print "" 62 63if (n_extra_c_includes > 0) { 64 for (i = 0; i < n_extra_c_includes; i++) { 65 print "#include " quote extra_c_includes[i] quote 66 } 67 print "" 68} 69 70have_save = 0; 71if (n_extra_target_vars) 72 have_save = 1 73 74for (i = 0; i < n_opts; i++) { 75 if (flag_set_p("Save", flags[i])) 76 have_save = 1; 77} 78 79print "/* Save optimization variables into a structure. */" 80print "void"; 81print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)"; 82print "{"; 83 84n_opt_char = 4; 85n_opt_short = 0; 86n_opt_int = 0; 87n_opt_enum = 0; 88n_opt_string = 0; 89n_opt_other = 0; 90var_opt_char[0] = "optimize"; 91var_opt_char[1] = "optimize_size"; 92var_opt_char[2] = "optimize_debug"; 93var_opt_char[3] = "optimize_fast"; 94var_opt_range["optimize"] = "0, 255"; 95var_opt_range["optimize_size"] = "0, 1"; 96var_opt_range["optimize_debug"] = "0, 1"; 97var_opt_range["optimize_fast"] = "0, 1"; 98 99# Sort by size to mimic how the structure is laid out to be friendlier to the 100# cache. 101 102for (i = 0; i < n_opts; i++) { 103 if (flag_set_p("(Optimization|PerFunction)", flags[i])) { 104 name = var_name(flags[i]) 105 if(name == "") 106 continue; 107 108 if(name in var_opt_seen) 109 continue; 110 111 var_opt_seen[name]++; 112 otype = var_type_struct(flags[i]); 113 if (otype ~ "^((un)?signed +)?int *$") 114 var_opt_int[n_opt_int++] = name; 115 116 else if (otype ~ "^((un)?signed +)?short *$") 117 var_opt_short[n_opt_short++] = name; 118 119 else if (otype ~ ("^enum +[_" alnum "]+ *")) 120 var_opt_enum[n_opt_enum++] = name; 121 122 else if (otype ~ "^((un)?signed +)?char *$") { 123 var_opt_char[n_opt_char++] = name; 124 if (otype ~ "^unsigned +char *$") 125 var_opt_range[name] = "0, 255" 126 else if (otype ~ "^signed +char *$") 127 var_opt_range[name] = "-128, 127" 128 } 129 else if (otype ~ "^const char \\**$") 130 var_opt_string[n_opt_string++] = name; 131 else 132 var_opt_other[n_opt_other++] = name; 133 } 134} 135 136for (i = 0; i < n_opt_char; i++) { 137 name = var_opt_char[i]; 138 if (var_opt_range[name] != "") 139 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));"; 140} 141 142print ""; 143for (i = 0; i < n_opt_other; i++) { 144 print " ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";"; 145} 146 147for (i = 0; i < n_opt_int; i++) { 148 print " ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";"; 149} 150 151for (i = 0; i < n_opt_enum; i++) { 152 print " ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";"; 153} 154 155for (i = 0; i < n_opt_short; i++) { 156 print " ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";"; 157} 158 159for (i = 0; i < n_opt_char; i++) { 160 print " ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";"; 161} 162 163for (i = 0; i < n_opt_string; i++) { 164 print " ptr->x_" var_opt_string[i] " = opts->x_" var_opt_string[i] ";"; 165} 166 167print "}"; 168 169print ""; 170print "/* Restore optimization options from a structure. */"; 171print "void"; 172print "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)"; 173print "{"; 174 175for (i = 0; i < n_opt_other; i++) { 176 print " opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";"; 177} 178 179for (i = 0; i < n_opt_int; i++) { 180 print " opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";"; 181} 182 183for (i = 0; i < n_opt_enum; i++) { 184 print " opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";"; 185} 186 187for (i = 0; i < n_opt_short; i++) { 188 print " opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";"; 189} 190 191for (i = 0; i < n_opt_char; i++) { 192 print " opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";"; 193} 194 195for (i = 0; i < n_opt_string; i++) { 196 print " opts->x_" var_opt_string[i] " = ptr->x_" var_opt_string[i] ";"; 197} 198 199print " targetm.override_options_after_change ();"; 200print "}"; 201 202print ""; 203print "/* Print optimization options from a structure. */"; 204print "void"; 205print "cl_optimization_print (FILE *file,"; 206print " int indent_to,"; 207print " struct cl_optimization *ptr)"; 208print "{"; 209 210print " fputs (\"\\n\", file);"; 211for (i = 0; i < n_opt_other; i++) { 212 print " if (ptr->x_" var_opt_other[i] ")"; 213 print " fprintf (file, \"%*s%s (%#lx)\\n\","; 214 print " indent_to, \"\","; 215 print " \"" var_opt_other[i] "\","; 216 print " (unsigned long)ptr->x_" var_opt_other[i] ");"; 217 print ""; 218} 219 220for (i = 0; i < n_opt_int; i++) { 221 print " if (ptr->x_" var_opt_int[i] ")"; 222 print " fprintf (file, \"%*s%s (%#x)\\n\","; 223 print " indent_to, \"\","; 224 print " \"" var_opt_int[i] "\","; 225 print " ptr->x_" var_opt_int[i] ");"; 226 print ""; 227} 228 229for (i = 0; i < n_opt_enum; i++) { 230 print " fprintf (file, \"%*s%s (%#x)\\n\","; 231 print " indent_to, \"\","; 232 print " \"" var_opt_enum[i] "\","; 233 print " (int) ptr->x_" var_opt_enum[i] ");"; 234 print ""; 235} 236 237for (i = 0; i < n_opt_short; i++) { 238 print " if (ptr->x_" var_opt_short[i] ")"; 239 print " fprintf (file, \"%*s%s (%#x)\\n\","; 240 print " indent_to, \"\","; 241 print " \"" var_opt_short[i] "\","; 242 print " ptr->x_" var_opt_short[i] ");"; 243 print ""; 244} 245 246for (i = 0; i < n_opt_char; i++) { 247 print " if (ptr->x_" var_opt_char[i] ")"; 248 print " fprintf (file, \"%*s%s (%#x)\\n\","; 249 print " indent_to, \"\","; 250 print " \"" var_opt_char[i] "\","; 251 print " ptr->x_" var_opt_char[i] ");"; 252 print ""; 253} 254 255for (i = 0; i < n_opt_string; i++) { 256 print " if (ptr->x_" var_opt_string[i] ")"; 257 print " fprintf (file, \"%*s%s (%s)\\n\","; 258 print " indent_to, \"\","; 259 print " \"" var_opt_string[i] "\","; 260 print " ptr->x_" var_opt_string[i] ");"; 261 print ""; 262} 263 264print "}"; 265 266print ""; 267print "/* Print different optimization variables from structures provided as arguments. */"; 268print "void"; 269print "cl_optimization_print_diff (FILE *file,"; 270print " int indent_to,"; 271print " struct cl_optimization *ptr1,"; 272print " struct cl_optimization *ptr2)"; 273print "{"; 274 275print " fputs (\"\\n\", file);"; 276for (i = 0; i < n_opt_other; i++) { 277 print " if (ptr1->x_" var_opt_other[i] " != ptr2->x_" var_opt_other[i] ")"; 278 print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\","; 279 print " indent_to, \"\","; 280 print " \"" var_opt_other[i] "\","; 281 print " (unsigned long)ptr1->x_" var_opt_other[i] ","; 282 print " (unsigned long)ptr2->x_" var_opt_other[i] ");"; 283 print ""; 284} 285 286for (i = 0; i < n_opt_int; i++) { 287 print " if (ptr1->x_" var_opt_int[i] " != ptr2->x_" var_opt_int[i] ")"; 288 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 289 print " indent_to, \"\","; 290 print " \"" var_opt_int[i] "\","; 291 print " ptr1->x_" var_opt_int[i] ","; 292 print " ptr2->x_" var_opt_int[i] ");"; 293 print ""; 294} 295 296for (i = 0; i < n_opt_enum; i++) { 297 print " if (ptr1->x_" var_opt_enum[i] " != ptr2->x_" var_opt_enum[i] ")"; 298 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 299 print " indent_to, \"\","; 300 print " \"" var_opt_enum[i] "\","; 301 print " (int) ptr1->x_" var_opt_enum[i] ","; 302 print " (int) ptr2->x_" var_opt_enum[i] ");"; 303 print ""; 304} 305 306for (i = 0; i < n_opt_short; i++) { 307 print " if (ptr1->x_" var_opt_short[i] " != ptr2->x_" var_opt_short[i] ")"; 308 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 309 print " indent_to, \"\","; 310 print " \"" var_opt_short[i] "\","; 311 print " ptr1->x_" var_opt_short[i] ","; 312 print " ptr2->x_" var_opt_short[i] ");"; 313 print ""; 314} 315 316for (i = 0; i < n_opt_char; i++) { 317 print " if (ptr1->x_" var_opt_char[i] " != ptr2->x_" var_opt_char[i] ")"; 318 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 319 print " indent_to, \"\","; 320 print " \"" var_opt_char[i] "\","; 321 print " ptr1->x_" var_opt_char[i] ","; 322 print " ptr2->x_" var_opt_char[i] ");"; 323 print ""; 324} 325 326for (i = 0; i < n_opt_string; i++) { 327 name = var_opt_string[i] 328 print " if (ptr1->x_" name " != ptr2->x_" name ""; 329 print " && (!ptr1->x_" name" || !ptr2->x_" name 330 print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))"; 331 print " fprintf (file, \"%*s%s (%s/%s)\\n\","; 332 print " indent_to, \"\","; 333 print " \"" name "\","; 334 print " ptr1->x_" name " ? ptr1->x_" name " : \"(null)\","; 335 print " ptr2->x_" name " ? ptr2->x_" name " : \"(null)\");"; 336 print ""; 337} 338 339print "}"; 340 341 342print ""; 343print "/* Save selected option variables into a structure. */" 344print "void"; 345print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)"; 346print "{"; 347 348n_target_char = 0; 349n_target_short = 0; 350n_target_int = 0; 351n_target_enum = 0; 352n_target_string = 0; 353n_target_other = 0; 354 355if (have_save) { 356 for (i = 0; i < n_opts; i++) { 357 if (flag_set_p("Save", flags[i])) { 358 name = var_name(flags[i]) 359 if(name == "") 360 name = "target_flags"; 361 362 if(name in var_save_seen) 363 continue; 364 365 var_save_seen[name]++; 366 otype = var_type_struct(flags[i]) 367 if (otype ~ "^((un)?signed +)?int *$") 368 var_target_int[n_target_int++] = name; 369 370 else if (otype ~ "^((un)?signed +)?short *$") 371 var_target_short[n_target_short++] = name; 372 373 else if (otype ~ ("^enum +[_" alnum "]+ *$")) 374 var_target_enum[n_target_enum++] = name; 375 376 else if (otype ~ "^((un)?signed +)?char *$") { 377 var_target_char[n_target_char++] = name; 378 if (otype ~ "^unsigned +char *$") 379 var_target_range[name] = "0, 255" 380 else if (otype ~ "^signed +char *$") 381 var_target_range[name] = "-128, 127" 382 if (otype == var_type(flags[i])) 383 var_target_range[name] = "" 384 } 385 else if (otype ~ "^const char \\**$") 386 var_target_string[n_target_string++] = name; 387 else 388 var_target_other[n_target_other++] = name; 389 } 390 } 391} else { 392 var_target_int[n_target_int++] = "target_flags"; 393} 394 395have_assert = 0; 396for (i = 0; i < n_target_char; i++) { 397 name = var_target_char[i]; 398 if (var_target_range[name] != "") { 399 have_assert = 1; 400 print " gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));"; 401 } 402} 403 404if (have_assert) 405 print ""; 406 407print " if (targetm.target_option.save)"; 408print " targetm.target_option.save (ptr, opts);"; 409print ""; 410 411for (i = 0; i < n_extra_target_vars; i++) { 412 print " ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";"; 413} 414 415for (i = 0; i < n_target_other; i++) { 416 print " ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";"; 417} 418 419for (i = 0; i < n_target_enum; i++) { 420 print " ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";"; 421} 422 423for (i = 0; i < n_target_int; i++) { 424 print " ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";"; 425} 426 427for (i = 0; i < n_target_short; i++) { 428 print " ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";"; 429} 430 431for (i = 0; i < n_target_char; i++) { 432 print " ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";"; 433} 434 435for (i = 0; i < n_target_string; i++) { 436 print " ptr->x_" var_target_string[i] " = opts->x_" var_target_string[i] ";"; 437} 438 439print "}"; 440 441print ""; 442print "/* Restore selected current options from a structure. */"; 443print "void"; 444print "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)"; 445print "{"; 446 447for (i = 0; i < n_extra_target_vars; i++) { 448 print " opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";"; 449} 450 451for (i = 0; i < n_target_other; i++) { 452 print " opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";"; 453} 454 455for (i = 0; i < n_target_enum; i++) { 456 print " opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";"; 457} 458 459for (i = 0; i < n_target_int; i++) { 460 print " opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";"; 461} 462 463for (i = 0; i < n_target_short; i++) { 464 print " opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";"; 465} 466 467for (i = 0; i < n_target_char; i++) { 468 print " opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";"; 469} 470 471for (i = 0; i < n_target_string; i++) { 472 print " opts->x_" var_target_string[i] " = ptr->x_" var_target_string[i] ";"; 473} 474 475# This must occur after the normal variables in case the code depends on those 476# variables. 477print ""; 478print " if (targetm.target_option.restore)"; 479print " targetm.target_option.restore (opts, ptr);"; 480 481print "}"; 482 483print ""; 484print "/* Print optimization options from a structure. */"; 485print "void"; 486print "cl_target_option_print (FILE *file,"; 487print " int indent,"; 488print " struct cl_target_option *ptr)"; 489print "{"; 490 491print " fputs (\"\\n\", file);"; 492for (i = 0; i < n_target_other; i++) { 493 print " if (ptr->x_" var_target_other[i] ")"; 494 hwi = host_wide_int[var_target_other[i]] 495 if (hwi == "yes") 496 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; 497 else 498 print " fprintf (file, \"%*s%s (%#lx)\\n\","; 499 print " indent, \"\","; 500 print " \"" var_target_other[i] "\","; 501 if (hwi == "yes") 502 print " ptr->x_" var_target_other[i] ");"; 503 else 504 print " (unsigned long)ptr->x_" var_target_other[i] ");"; 505 print ""; 506} 507 508for (i = 0; i < n_target_enum; i++) { 509 print " if (ptr->x_" var_target_enum[i] ")"; 510 print " fprintf (file, \"%*s%s (%#x)\\n\","; 511 print " indent, \"\","; 512 print " \"" var_target_enum[i] "\","; 513 print " ptr->x_" var_target_enum[i] ");"; 514 print ""; 515} 516 517for (i = 0; i < n_target_int; i++) { 518 print " if (ptr->x_" var_target_int[i] ")"; 519 print " fprintf (file, \"%*s%s (%#x)\\n\","; 520 print " indent, \"\","; 521 print " \"" var_target_int[i] "\","; 522 print " ptr->x_" var_target_int[i] ");"; 523 print ""; 524} 525 526for (i = 0; i < n_target_short; i++) { 527 print " if (ptr->x_" var_target_short[i] ")"; 528 print " fprintf (file, \"%*s%s (%#x)\\n\","; 529 print " indent, \"\","; 530 print " \"" var_target_short[i] "\","; 531 print " ptr->x_" var_target_short[i] ");"; 532 print ""; 533} 534 535for (i = 0; i < n_target_char; i++) { 536 print " if (ptr->x_" var_target_char[i] ")"; 537 print " fprintf (file, \"%*s%s (%#x)\\n\","; 538 print " indent, \"\","; 539 print " \"" var_target_char[i] "\","; 540 print " ptr->x_" var_target_char[i] ");"; 541 print ""; 542} 543 544for (i = 0; i < n_target_string; i++) { 545 print " if (ptr->x_" var_target_string[i] ")"; 546 print " fprintf (file, \"%*s%s (%s)\\n\","; 547 print " indent, \"\","; 548 print " \"" var_target_string[i] "\","; 549 print " ptr->x_" var_target_string[i] ");"; 550 print ""; 551} 552 553print ""; 554print " if (targetm.target_option.print)"; 555print " targetm.target_option.print (file, indent, ptr);"; 556print "}"; 557 558print ""; 559print "/* Print different target option variables from structures provided as arguments. */"; 560print "void"; 561print "cl_target_option_print_diff (FILE *file,"; 562print " int indent ATTRIBUTE_UNUSED,"; 563print " struct cl_target_option *ptr1 ATTRIBUTE_UNUSED,"; 564print " struct cl_target_option *ptr2 ATTRIBUTE_UNUSED)"; 565print "{"; 566 567print " fputs (\"\\n\", file);"; 568for (i = 0; i < n_target_other; i++) { 569 print " if (ptr1->x_" var_target_other[i] " != ptr2->x_" var_target_other[i] ")"; 570 hwi = host_wide_int[var_target_other[i]] 571 if (hwi == "yes") 572 print " fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x/%#\" HOST_WIDE_INT_PRINT \"x)\\n\","; 573 else 574 print " fprintf (file, \"%*s%s (%#lx/%#lx)\\n\","; 575 print " indent, \"\","; 576 print " \"" var_target_other[i] "\","; 577 if (hwi == "yes") { 578 print " ptr1->x_" var_target_other[i] ","; 579 print " ptr2->x_" var_target_other[i] ");"; 580 } 581 else { 582 print " (unsigned long)ptr1->x_" var_target_other[i] ","; 583 print " (unsigned long)ptr2->x_" var_target_other[i] ");"; 584 } 585 print ""; 586} 587 588for (i = 0; i < n_target_enum; i++) { 589 print " if (ptr1->x_" var_target_enum[i] " != ptr2->x_" var_target_enum[i] ")"; 590 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 591 print " indent, \"\","; 592 print " \"" var_target_enum[i] "\","; 593 print " ptr1->x_" var_target_enum[i] ","; 594 print " ptr2->x_" var_target_enum[i] ");"; 595 print ""; 596} 597 598for (i = 0; i < n_target_int; i++) { 599 print " if (ptr1->x_" var_target_int[i] " != ptr2->x_" var_target_int[i] ")"; 600 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 601 print " indent, \"\","; 602 print " \"" var_target_int[i] "\","; 603 print " ptr1->x_" var_target_int[i] ","; 604 print " ptr2->x_" var_target_int[i] ");"; 605 print ""; 606} 607 608for (i = 0; i < n_target_short; i++) { 609 print " if (ptr1->x_" var_target_short[i] " != ptr2->x_" var_target_short[i] ")"; 610 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 611 print " indent, \"\","; 612 print " \"" var_target_short[i] "\","; 613 print " ptr1->x_" var_target_short[i] ","; 614 print " ptr2->x_" var_target_short[i] ");"; 615 print ""; 616} 617 618for (i = 0; i < n_target_char; i++) { 619 print " if (ptr1->x_" var_target_char[i] " != ptr2->x_" var_target_char[i] ")"; 620 print " fprintf (file, \"%*s%s (%#x/%#x)\\n\","; 621 print " indent, \"\","; 622 print " \"" var_target_char[i] "\","; 623 print " ptr1->x_" var_target_char[i] ","; 624 print " ptr2->x_" var_target_char[i] ");"; 625 print ""; 626} 627 628for (i = 0; i < n_target_string; i++) { 629 name = var_target_string[i] 630 print " if (ptr1->x_" name " != ptr2->x_" name ""; 631 print " && (!ptr1->x_" name" || !ptr2->x_" name 632 print " || strcmp (ptr1->x_" name", ptr2->x_" name ")))"; 633 print " fprintf (file, \"%*s%s (%s/%s)\\n\","; 634 print " indent, \"\","; 635 print " \"" name "\","; 636 print " ptr1->x_" name " ? ptr1->x_" name " : \"(null)\","; 637 print " ptr2->x_" name " ? ptr1->x_" name " : \"(null)\");"; 638 print ""; 639} 640 641print "}"; 642 643print ""; 644print "/* Compare two target options */"; 645print "bool"; 646print "cl_target_option_eq (struct cl_target_option const *ptr1 ATTRIBUTE_UNUSED,"; 647print " struct cl_target_option const *ptr2 ATTRIBUTE_UNUSED)"; 648print "{"; 649n_target_val = 0; 650n_target_str = 0; 651n_target_array = 0; 652 653for (i = 0; i < n_target_save; i++) { 654 var = target_save_decl[i]; 655 sub (" *=.*", "", var); 656 name = var; 657 type = var; 658 sub("^.*[ *]", "", name) 659 sub(" *" name "$", "", type) 660 if (target_save_decl[i] ~ "^const char \\*+[_" alnum "]+$") 661 var_target_str[n_target_str++] = name; 662 else { 663 if (target_save_decl[i] ~ " .*\\[.+\\]+$") { 664 size = name; 665 sub("[^\\[]+\\[", "", size); 666 sub("\\]$", "", size); 667 sub("\\[.+", "", name) 668 sub(" [^ ]+$", "", type) 669 var_target_array[n_target_array] = name 670 var_target_array_type[n_target_array] = type 671 var_target_array_size[n_target_array++] = size 672 } 673 else { 674 var_target_val_type[n_target_val] = type; 675 var_target_val[n_target_val++] = name; 676 } 677 } 678} 679if (have_save) { 680 for (i = 0; i < n_opts; i++) { 681 if (flag_set_p("Save", flags[i])) { 682 name = var_name(flags[i]) 683 if(name == "") 684 name = "target_flags"; 685 686 if(name in var_list_seen) 687 continue; 688 689 var_list_seen[name]++; 690 otype = var_type_struct(flags[i]) 691 if (otype ~ "^const char \\**$") 692 var_target_str[n_target_str++] = "x_" name; 693 else { 694 var_target_val_type[n_target_val] = otype; 695 var_target_val[n_target_val++] = "x_" name; 696 } 697 } 698 } 699} else { 700 var_target_val_type[n_target_val] = "int"; 701 var_target_val[n_target_val++] = "x_target_flags"; 702} 703 704for (i = 0; i < n_target_str; i++) { 705 name = var_target_str[i] 706 print " if (ptr1->" name" != ptr2->" name; 707 print " && (!ptr1->" name" || !ptr2->" name 708 print " || strcmp (ptr1->" name", ptr2->" name ")))"; 709 print " return false;"; 710} 711for (i = 0; i < n_target_array; i++) { 712 name = var_target_array[i] 713 size = var_target_array_size[i] 714 type = var_target_array_type[i] 715 print " if (ptr1->" name" != ptr2->" name ""; 716 print " || memcmp (ptr1->" name ", ptr2->" name ", " size " * sizeof(" type ")))" 717 print " return false;"; 718} 719for (i = 0; i < n_target_val; i++) { 720 name = var_target_val[i] 721 print " if (ptr1->" name" != ptr2->" name ")"; 722 print " return false;"; 723} 724 725print " return true;"; 726 727print "}"; 728 729print ""; 730print "/* Hash target options */"; 731print "hashval_t"; 732print "cl_target_option_hash (struct cl_target_option const *ptr ATTRIBUTE_UNUSED)"; 733print "{"; 734print " inchash::hash hstate;"; 735for (i = 0; i < n_target_str; i++) { 736 name = var_target_str[i] 737 print " if (ptr->" name")"; 738 print " hstate.add (ptr->" name", strlen (ptr->" name"));"; 739 print " else"; 740 print " hstate.add_int (0);"; 741} 742for (i = 0; i < n_target_array; i++) { 743 name= var_target_array[i] 744 size = var_target_array_size[i] 745 type = var_target_array_type[i] 746 print " hstate.add_int (" size ");"; 747 print " hstate.add (ptr->" name ", sizeof (" type ") * " size ");"; 748} 749for (i = 0; i < n_target_val; i++) { 750 name = var_target_val[i] 751 print " hstate.add_hwi (ptr->" name");"; 752} 753print " return hstate.end ();"; 754print "}"; 755 756print ""; 757print "/* Stream out target options */"; 758print "void"; 759print "cl_target_option_stream_out (struct output_block *ob ATTRIBUTE_UNUSED,"; 760print " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; 761print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; 762print "{"; 763for (i = 0; i < n_target_str; i++) { 764 name = var_target_str[i] 765 print " bp_pack_string (ob, bp, ptr->" name", true);"; 766} 767for (i = 0; i < n_target_array; i++) { 768 name = var_target_array[i] 769 size = var_target_array_size[i] 770 print " for (unsigned i = 0; i < " size "; i++)" 771 print " bp_pack_value (bp, ptr->" name "[i], 64);"; 772} 773for (i = 0; i < n_target_val; i++) { 774 name = var_target_val[i] 775 print " bp_pack_value (bp, ptr->" name", 64);"; 776} 777print "}"; 778 779print ""; 780print "/* Stream in target options */"; 781print "void"; 782print "cl_target_option_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,"; 783print " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; 784print " struct cl_target_option *ptr ATTRIBUTE_UNUSED)"; 785print "{"; 786for (i = 0; i < n_target_str; i++) { 787 name = var_target_str[i] 788 print " ptr->" name" = bp_unpack_string (data_in, bp);"; 789 print " if (ptr->" name")"; 790 print " ptr->" name" = xstrdup (ptr->" name");"; 791} 792for (i = 0; i < n_target_array; i++) { 793 name = var_target_array[i] 794 size = var_target_array_size[i] 795 print " for (int i = " size " - 1; i >= 0; i--)" 796 print " ptr->" name "[i] = (" var_target_array_type[i] ") bp_unpack_value (bp, 64);"; 797} 798for (i = 0; i < n_target_val; i++) { 799 name = var_target_val[i] 800 print " ptr->" name" = (" var_target_val_type[i] ") bp_unpack_value (bp, 64);"; 801} 802 803print "}"; 804 805n_opt_val = 4; 806var_opt_val[0] = "x_optimize" 807var_opt_val_type[0] = "char " 808var_opt_hash[0] = 1; 809var_opt_val[1] = "x_optimize_size" 810var_opt_val_type[1] = "char " 811var_opt_hash[1] = 1; 812var_opt_val[2] = "x_optimize_debug" 813var_opt_val_type[2] = "char " 814var_opt_hash[2] = 1; 815var_opt_val[3] = "x_optimize_fast" 816var_opt_val_type[3] = "char " 817var_opt_hash[3] = 1; 818for (i = 0; i < n_opts; i++) { 819 if (flag_set_p("(Optimization|PerFunction)", flags[i])) { 820 name = var_name(flags[i]) 821 if(name == "") 822 continue; 823 824 if(name in var_opt_list_seen) 825 continue; 826 827 var_opt_list_seen[name]++; 828 829 otype = var_type_struct(flags[i]) 830 var_opt_val_type[n_opt_val] = otype; 831 var_opt_val[n_opt_val] = "x_" name; 832 var_opt_hash[n_opt_val] = flag_set_p("Optimization", flags[i]); 833 n_opt_val++; 834 } 835} 836print ""; 837print "/* Hash optimization options */"; 838print "hashval_t"; 839print "cl_optimization_hash (struct cl_optimization const *ptr ATTRIBUTE_UNUSED)"; 840print "{"; 841print " inchash::hash hstate;"; 842for (i = 0; i < n_opt_val; i++) { 843 if (!var_opt_hash[i]) 844 continue; 845 name = var_opt_val[i] 846 otype = var_opt_val_type[i]; 847 if (otype ~ "^const char \\**$") 848 { 849 print " if (ptr->" name")"; 850 print " hstate.add (ptr->" name", strlen (ptr->" name"));"; 851 print " else"; 852 print " hstate.add_int (0);"; 853 } 854 else 855 print " hstate.add_hwi (ptr->" name");"; 856} 857print " return hstate.end ();"; 858print "}"; 859 860print ""; 861print "/* Compare two optimization options */"; 862print "bool"; 863print "cl_optimization_option_eq (cl_optimization const *ptr1,"; 864print " cl_optimization const *ptr2)"; 865print "{"; 866for (i = 0; i < n_opt_val; i++) { 867 if (!var_opt_hash[i]) 868 continue; 869 name = var_opt_val[i] 870 otype = var_opt_val_type[i]; 871 if (otype ~ "^const char \\**$") 872 { 873 print " if (ptr1->" name" != ptr2->" name; 874 print " && (!ptr1->" name" || !ptr2->" name 875 print " || strcmp (ptr1->" name", ptr2->" name ")))"; 876 print " return false;"; 877 } 878 else 879 { 880 print " if (ptr1->" name" != ptr2->" name ")"; 881 print " return false;"; 882 } 883} 884print " return true;"; 885print "}"; 886 887print ""; 888print "/* Stream out optimization options */"; 889print "void"; 890print "cl_optimization_stream_out (struct output_block *ob,"; 891print " struct bitpack_d *bp,"; 892print " struct cl_optimization *ptr)"; 893print "{"; 894for (i = 0; i < n_opt_val; i++) { 895 name = var_opt_val[i] 896 otype = var_opt_val_type[i]; 897 if (otype ~ "^const char \\**$") 898 print " bp_pack_string (ob, bp, ptr->" name", true);"; 899 else 900 print " bp_pack_value (bp, ptr->" name", 64);"; 901} 902print "}"; 903 904print ""; 905print "/* Stream in optimization options */"; 906print "void"; 907print "cl_optimization_stream_in (struct data_in *data_in ATTRIBUTE_UNUSED,"; 908print " struct bitpack_d *bp ATTRIBUTE_UNUSED,"; 909print " struct cl_optimization *ptr ATTRIBUTE_UNUSED)"; 910print "{"; 911for (i = 0; i < n_opt_val; i++) { 912 name = var_opt_val[i] 913 otype = var_opt_val_type[i]; 914 if (otype ~ "^const char \\**$") 915 { 916 print " ptr->" name" = bp_unpack_string (data_in, bp);"; 917 print " if (ptr->" name")"; 918 print " ptr->" name" = xstrdup (ptr->" name");"; 919 } 920 else 921 print " ptr->" name" = (" var_opt_val_type[i] ") bp_unpack_value (bp, 64);"; 922} 923print "}"; 924} 925