1 /* Wrapper to call lto. Used by collect2 and the linker plugin. 2 Copyright (C) 2009-2020 Free Software Foundation, Inc. 3 4 Factored out of collect2 by Rafael Espindola <espindola@google.com> 5 6 This file is part of GCC. 7 8 GCC is free software; you can redistribute it and/or modify it under 9 the terms of the GNU General Public License as published by the Free 10 Software Foundation; either version 3, or (at your option) any later 11 version. 12 13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14 WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16 for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GCC; see the file COPYING3. If not see 20 <http://www.gnu.org/licenses/>. */ 21 22 23 /* This program is passed a gcc, a list of gcc arguments and a list of 24 object files containing IL. It scans the argument list to check if 25 we are in whopr mode or not modifies the arguments and needed and 26 prints a list of output files on stdout. 27 28 Example: 29 30 $ lto-wrapper gcc/xgcc -B gcc a.o b.o -o test -flto 31 32 The above will print something like 33 /tmp/ccwbQ8B2.lto.o 34 35 If WHOPR is used instead, more than one file might be produced 36 ./ccXj2DTk.lto.ltrans.o 37 ./ccCJuXGv.lto.ltrans.o 38 */ 39 40 #define INCLUDE_STRING 41 #include "config.h" 42 #include "system.h" 43 #include "coretypes.h" 44 #include "intl.h" 45 #include "diagnostic.h" 46 #include "obstack.h" 47 #include "opts.h" 48 #include "options.h" 49 #include "simple-object.h" 50 #include "lto-section-names.h" 51 #include "collect-utils.h" 52 #include "opts-jobserver.h" 53 54 /* Environment variable, used for passing the names of offload targets from GCC 55 driver to lto-wrapper. */ 56 #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES" 57 58 enum lto_mode_d { 59 LTO_MODE_NONE, /* Not doing LTO. */ 60 LTO_MODE_LTO, /* Normal LTO. */ 61 LTO_MODE_WHOPR /* WHOPR. */ 62 }; 63 64 /* Current LTO mode. */ 65 static enum lto_mode_d lto_mode = LTO_MODE_NONE; 66 67 static char *ltrans_output_file; 68 static char *flto_out; 69 static unsigned int nr; 70 static int *ltrans_priorities; 71 static char **input_names; 72 static char **output_names; 73 static char **offload_names; 74 static char *offload_objects_file_name; 75 static char *makefile; 76 static unsigned int num_deb_objs; 77 static const char **early_debug_object_names; 78 static bool xassembler_options_error = false; 79 80 const char tool_name[] = "lto-wrapper"; 81 82 /* Delete tempfiles. Called from utils_cleanup. */ 83 84 void 85 tool_cleanup (bool) 86 { 87 unsigned int i; 88 89 if (ltrans_output_file) 90 maybe_unlink (ltrans_output_file); 91 if (flto_out) 92 maybe_unlink (flto_out); 93 if (offload_objects_file_name) 94 maybe_unlink (offload_objects_file_name); 95 if (makefile) 96 maybe_unlink (makefile); 97 if (early_debug_object_names) 98 for (i = 0; i < num_deb_objs; ++i) 99 if (early_debug_object_names[i]) 100 maybe_unlink (early_debug_object_names[i]); 101 for (i = 0; i < nr; ++i) 102 { 103 maybe_unlink (input_names[i]); 104 if (output_names[i]) 105 maybe_unlink (output_names[i]); 106 } 107 } 108 109 static void 110 lto_wrapper_cleanup (void) 111 { 112 utils_cleanup (false); 113 } 114 115 /* Unlink a temporary LTRANS file unless requested otherwise. */ 116 117 void 118 maybe_unlink (const char *file) 119 { 120 if (!save_temps) 121 { 122 if (unlink_if_ordinary (file) 123 && errno != ENOENT) 124 fatal_error (input_location, "deleting LTRANS file %s: %m", file); 125 } 126 else if (verbose) 127 fprintf (stderr, "[Leaving LTRANS %s]\n", file); 128 } 129 130 /* Template of LTRANS dumpbase suffix. */ 131 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615" 132 133 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS 134 environment. */ 135 136 static void 137 get_options_from_collect_gcc_options (const char *collect_gcc, 138 const char *collect_gcc_options, 139 struct cl_decoded_option **decoded_options, 140 unsigned int *decoded_options_count) 141 { 142 struct obstack argv_obstack; 143 const char **argv; 144 int argc; 145 146 obstack_init (&argv_obstack); 147 obstack_ptr_grow (&argv_obstack, collect_gcc); 148 149 parse_options_from_collect_gcc_options (collect_gcc_options, 150 &argv_obstack, &argc); 151 argv = XOBFINISH (&argv_obstack, const char **); 152 153 decode_cmdline_options_to_array (argc, (const char **)argv, CL_DRIVER, 154 decoded_options, decoded_options_count); 155 obstack_free (&argv_obstack, NULL); 156 } 157 158 /* Append OPTION to the options array DECODED_OPTIONS with size 159 DECODED_OPTIONS_COUNT. */ 160 161 static void 162 append_option (struct cl_decoded_option **decoded_options, 163 unsigned int *decoded_options_count, 164 struct cl_decoded_option *option) 165 { 166 ++*decoded_options_count; 167 *decoded_options 168 = (struct cl_decoded_option *) 169 xrealloc (*decoded_options, 170 (*decoded_options_count 171 * sizeof (struct cl_decoded_option))); 172 memcpy (&(*decoded_options)[*decoded_options_count - 1], option, 173 sizeof (struct cl_decoded_option)); 174 } 175 176 /* Remove option number INDEX from DECODED_OPTIONS, update 177 DECODED_OPTIONS_COUNT. */ 178 179 static void 180 remove_option (struct cl_decoded_option **decoded_options, 181 int index, unsigned int *decoded_options_count) 182 { 183 --*decoded_options_count; 184 memmove (&(*decoded_options)[index + 1], 185 &(*decoded_options)[index], 186 sizeof (struct cl_decoded_option) 187 * (*decoded_options_count - index)); 188 } 189 190 /* Try to merge and complain about options FDECODED_OPTIONS when applied 191 ontop of DECODED_OPTIONS. */ 192 193 static void 194 merge_and_complain (struct cl_decoded_option **decoded_options, 195 unsigned int *decoded_options_count, 196 struct cl_decoded_option *fdecoded_options, 197 unsigned int fdecoded_options_count, 198 struct cl_decoded_option *decoded_cl_options, 199 unsigned int decoded_cl_options_count) 200 { 201 unsigned int i, j; 202 struct cl_decoded_option *pic_option = NULL; 203 struct cl_decoded_option *pie_option = NULL; 204 struct cl_decoded_option *cf_protection_option = NULL; 205 206 /* ??? Merge options from files. Most cases can be 207 handled by either unioning or intersecting 208 (for example -fwrapv is a case for unioning, 209 -ffast-math is for intersection). Most complaints 210 about real conflicts between different options can 211 be deferred to the compiler proper. Options that 212 we can neither safely handle by intersection nor 213 unioning would need to be complained about here. 214 Ideally we'd have a flag in the opt files that 215 tells whether to union or intersect or reject. 216 In absence of that it's unclear what a good default is. 217 It's also difficult to get positional handling correct. */ 218 219 /* Look for a -fcf-protection option in the link-time options 220 which overrides any -fcf-protection from the lto sections. */ 221 for (i = 0; i < decoded_cl_options_count; ++i) 222 { 223 struct cl_decoded_option *foption = &decoded_cl_options[i]; 224 if (foption->opt_index == OPT_fcf_protection_) 225 { 226 cf_protection_option = foption; 227 } 228 } 229 230 /* The following does what the old LTO option code did, 231 union all target and a selected set of common options. */ 232 for (i = 0; i < fdecoded_options_count; ++i) 233 { 234 struct cl_decoded_option *foption = &fdecoded_options[i]; 235 switch (foption->opt_index) 236 { 237 case OPT_SPECIAL_unknown: 238 case OPT_SPECIAL_ignore: 239 case OPT_SPECIAL_warn_removed: 240 case OPT_SPECIAL_program_name: 241 case OPT_SPECIAL_input_file: 242 break; 243 244 default: 245 if (!(cl_options[foption->opt_index].flags & CL_TARGET)) 246 break; 247 248 /* Fallthru. */ 249 case OPT_fdiagnostics_show_caret: 250 case OPT_fdiagnostics_show_labels: 251 case OPT_fdiagnostics_show_line_numbers: 252 case OPT_fdiagnostics_show_option: 253 case OPT_fdiagnostics_show_location_: 254 case OPT_fshow_column: 255 case OPT_fcommon: 256 case OPT_fgnu_tm: 257 case OPT_g: 258 /* Do what the old LTO code did - collect exactly one option 259 setting per OPT code, we pick the first we encounter. 260 ??? This doesn't make too much sense, but when it doesn't 261 then we should complain. */ 262 for (j = 0; j < *decoded_options_count; ++j) 263 if ((*decoded_options)[j].opt_index == foption->opt_index) 264 break; 265 if (j == *decoded_options_count) 266 append_option (decoded_options, decoded_options_count, foption); 267 break; 268 269 /* Figure out what PIC/PIE level wins and merge the results. */ 270 case OPT_fPIC: 271 case OPT_fpic: 272 pic_option = foption; 273 break; 274 case OPT_fPIE: 275 case OPT_fpie: 276 pie_option = foption; 277 break; 278 279 case OPT_fopenmp: 280 case OPT_fopenacc: 281 /* For selected options we can merge conservatively. */ 282 for (j = 0; j < *decoded_options_count; ++j) 283 if ((*decoded_options)[j].opt_index == foption->opt_index) 284 break; 285 if (j == *decoded_options_count) 286 append_option (decoded_options, decoded_options_count, foption); 287 /* -fopenmp > -fno-openmp, 288 -fopenacc > -fno-openacc */ 289 else if (foption->value > (*decoded_options)[j].value) 290 (*decoded_options)[j] = *foption; 291 break; 292 293 case OPT_fopenacc_dim_: 294 /* Append or check identical. */ 295 for (j = 0; j < *decoded_options_count; ++j) 296 if ((*decoded_options)[j].opt_index == foption->opt_index) 297 break; 298 if (j == *decoded_options_count) 299 append_option (decoded_options, decoded_options_count, foption); 300 else if (strcmp ((*decoded_options)[j].arg, foption->arg)) 301 fatal_error (input_location, 302 "option %s with different values", 303 foption->orig_option_with_args_text); 304 break; 305 306 case OPT_fcf_protection_: 307 /* Default to link-time option, else append or check identical. */ 308 if (!cf_protection_option 309 || cf_protection_option->value == CF_CHECK) 310 { 311 for (j = 0; j < *decoded_options_count; ++j) 312 if ((*decoded_options)[j].opt_index == foption->opt_index) 313 break; 314 if (j == *decoded_options_count) 315 append_option (decoded_options, decoded_options_count, foption); 316 else if ((*decoded_options)[j].value != foption->value) 317 { 318 if (cf_protection_option 319 && cf_protection_option->value == CF_CHECK) 320 fatal_error (input_location, 321 "option -fcf-protection with mismatching values" 322 " (%s, %s)", 323 (*decoded_options)[j].arg, foption->arg); 324 else 325 { 326 /* Merge and update the -fcf-protection option. */ 327 (*decoded_options)[j].value &= (foption->value 328 & CF_FULL); 329 switch ((*decoded_options)[j].value) 330 { 331 case CF_NONE: 332 (*decoded_options)[j].arg = "none"; 333 break; 334 case CF_BRANCH: 335 (*decoded_options)[j].arg = "branch"; 336 break; 337 case CF_RETURN: 338 (*decoded_options)[j].arg = "return"; 339 break; 340 default: 341 gcc_unreachable (); 342 } 343 } 344 } 345 } 346 break; 347 348 case OPT_O: 349 case OPT_Ofast: 350 case OPT_Og: 351 case OPT_Os: 352 for (j = 0; j < *decoded_options_count; ++j) 353 if ((*decoded_options)[j].opt_index == OPT_O 354 || (*decoded_options)[j].opt_index == OPT_Ofast 355 || (*decoded_options)[j].opt_index == OPT_Og 356 || (*decoded_options)[j].opt_index == OPT_Os) 357 break; 358 if (j == *decoded_options_count) 359 append_option (decoded_options, decoded_options_count, foption); 360 else if ((*decoded_options)[j].opt_index == foption->opt_index 361 && foption->opt_index != OPT_O) 362 /* Exact same options get merged. */ 363 ; 364 else 365 { 366 /* For mismatched option kinds preserve the optimization 367 level only, thus merge it as -On. This also handles 368 merging of same optimization level -On. */ 369 int level = 0; 370 switch (foption->opt_index) 371 { 372 case OPT_O: 373 if (foption->arg[0] == '\0') 374 level = MAX (level, 1); 375 else 376 level = MAX (level, atoi (foption->arg)); 377 break; 378 case OPT_Ofast: 379 level = MAX (level, 3); 380 break; 381 case OPT_Og: 382 level = MAX (level, 1); 383 break; 384 case OPT_Os: 385 level = MAX (level, 2); 386 break; 387 default: 388 gcc_unreachable (); 389 } 390 switch ((*decoded_options)[j].opt_index) 391 { 392 case OPT_O: 393 if ((*decoded_options)[j].arg[0] == '\0') 394 level = MAX (level, 1); 395 else 396 level = MAX (level, atoi ((*decoded_options)[j].arg)); 397 break; 398 case OPT_Ofast: 399 level = MAX (level, 3); 400 break; 401 case OPT_Og: 402 level = MAX (level, 1); 403 break; 404 case OPT_Os: 405 level = MAX (level, 2); 406 break; 407 default: 408 gcc_unreachable (); 409 } 410 (*decoded_options)[j].opt_index = OPT_O; 411 char *tem; 412 tem = xasprintf ("-O%d", level); 413 (*decoded_options)[j].arg = &tem[2]; 414 (*decoded_options)[j].canonical_option[0] = tem; 415 (*decoded_options)[j].value = 1; 416 } 417 break; 418 419 420 case OPT_foffload_abi_: 421 for (j = 0; j < *decoded_options_count; ++j) 422 if ((*decoded_options)[j].opt_index == foption->opt_index) 423 break; 424 if (j == *decoded_options_count) 425 append_option (decoded_options, decoded_options_count, foption); 426 else if (foption->value != (*decoded_options)[j].value) 427 fatal_error (input_location, 428 "option %s not used consistently in all LTO input" 429 " files", foption->orig_option_with_args_text); 430 break; 431 432 433 case OPT_foffload_: 434 append_option (decoded_options, decoded_options_count, foption); 435 break; 436 } 437 } 438 439 /* Merge PIC options: 440 -fPIC + -fpic = -fpic 441 -fPIC + -fno-pic = -fno-pic 442 -fpic/-fPIC + nothing = nothing. 443 It is a common mistake to mix few -fPIC compiled objects into otherwise 444 non-PIC code. We do not want to build everything with PIC then. 445 446 Similarly we merge PIE options, however in addition we keep 447 -fPIC + -fPIE = -fPIE 448 -fpic + -fPIE = -fpie 449 -fPIC/-fpic + -fpie = -fpie 450 451 It would be good to warn on mismatches, but it is bit hard to do as 452 we do not know what nothing translates to. */ 453 454 for (unsigned int j = 0; j < *decoded_options_count;) 455 if ((*decoded_options)[j].opt_index == OPT_fPIC 456 || (*decoded_options)[j].opt_index == OPT_fpic) 457 { 458 /* -fno-pic in one unit implies -fno-pic everywhere. */ 459 if ((*decoded_options)[j].value == 0) 460 j++; 461 /* If we have no pic option or merge in -fno-pic, we still may turn 462 existing pic/PIC mode into pie/PIE if -fpie/-fPIE is present. */ 463 else if ((pic_option && pic_option->value == 0) 464 || !pic_option) 465 { 466 if (pie_option) 467 { 468 bool big = (*decoded_options)[j].opt_index == OPT_fPIC 469 && pie_option->opt_index == OPT_fPIE; 470 (*decoded_options)[j].opt_index = big ? OPT_fPIE : OPT_fpie; 471 if (pie_option->value) 472 (*decoded_options)[j].canonical_option[0] 473 = big ? "-fPIE" : "-fpie"; 474 else 475 (*decoded_options)[j].canonical_option[0] = "-fno-pie"; 476 (*decoded_options)[j].value = pie_option->value; 477 j++; 478 } 479 else if (pic_option) 480 { 481 (*decoded_options)[j] = *pic_option; 482 j++; 483 } 484 /* We do not know if target defaults to pic or not, so just remove 485 option if it is missing in one unit but enabled in other. */ 486 else 487 remove_option (decoded_options, j, decoded_options_count); 488 } 489 else if (pic_option->opt_index == OPT_fpic 490 && (*decoded_options)[j].opt_index == OPT_fPIC) 491 { 492 (*decoded_options)[j] = *pic_option; 493 j++; 494 } 495 else 496 j++; 497 } 498 else if ((*decoded_options)[j].opt_index == OPT_fPIE 499 || (*decoded_options)[j].opt_index == OPT_fpie) 500 { 501 /* -fno-pie in one unit implies -fno-pie everywhere. */ 502 if ((*decoded_options)[j].value == 0) 503 j++; 504 /* If we have no pie option or merge in -fno-pie, we still preserve 505 PIE/pie if pic/PIC is present. */ 506 else if ((pie_option && pie_option->value == 0) 507 || !pie_option) 508 { 509 /* If -fPIC/-fpic is given, merge it with -fPIE/-fpie. */ 510 if (pic_option) 511 { 512 if (pic_option->opt_index == OPT_fpic 513 && (*decoded_options)[j].opt_index == OPT_fPIE) 514 { 515 (*decoded_options)[j].opt_index = OPT_fpie; 516 (*decoded_options)[j].canonical_option[0] 517 = pic_option->value ? "-fpie" : "-fno-pie"; 518 } 519 else if (!pic_option->value) 520 (*decoded_options)[j].canonical_option[0] = "-fno-pie"; 521 (*decoded_options)[j].value = pic_option->value; 522 j++; 523 } 524 else if (pie_option) 525 { 526 (*decoded_options)[j] = *pie_option; 527 j++; 528 } 529 /* Because we always append pic/PIE options this code path should 530 not happen unless the LTO object was built by old lto1 which 531 did not contain that logic yet. */ 532 else 533 remove_option (decoded_options, j, decoded_options_count); 534 } 535 else if (pie_option->opt_index == OPT_fpie 536 && (*decoded_options)[j].opt_index == OPT_fPIE) 537 { 538 (*decoded_options)[j] = *pie_option; 539 j++; 540 } 541 else 542 j++; 543 } 544 else 545 j++; 546 547 if (!xassembler_options_error) 548 for (i = j = 0; ; i++, j++) 549 { 550 for (; i < *decoded_options_count; i++) 551 if ((*decoded_options)[i].opt_index == OPT_Xassembler) 552 break; 553 554 for (; j < fdecoded_options_count; j++) 555 if (fdecoded_options[j].opt_index == OPT_Xassembler) 556 break; 557 558 if (i == *decoded_options_count && j == fdecoded_options_count) 559 break; 560 else if (i < *decoded_options_count && j == fdecoded_options_count) 561 { 562 warning (0, "Extra option to -Xassembler: %s," 563 " dropping all -Xassembler and -Wa options.", 564 (*decoded_options)[i].arg); 565 xassembler_options_error = true; 566 break; 567 } 568 else if (i == *decoded_options_count && j < fdecoded_options_count) 569 { 570 warning (0, "Extra option to -Xassembler: %s," 571 " dropping all -Xassembler and -Wa options.", 572 fdecoded_options[j].arg); 573 xassembler_options_error = true; 574 break; 575 } 576 else if (strcmp ((*decoded_options)[i].arg, fdecoded_options[j].arg)) 577 { 578 warning (0, "Options to Xassembler do not match: %s, %s," 579 " dropping all -Xassembler and -Wa options.", 580 (*decoded_options)[i].arg, fdecoded_options[j].arg); 581 xassembler_options_error = true; 582 break; 583 } 584 } 585 } 586 587 /* Auxiliary function that frees elements of PTR and PTR itself. 588 N is number of elements to be freed. If PTR is NULL, nothing is freed. 589 If an element is NULL, subsequent elements are not freed. */ 590 591 static void ** 592 free_array_of_ptrs (void **ptr, unsigned n) 593 { 594 if (!ptr) 595 return NULL; 596 for (unsigned i = 0; i < n; i++) 597 { 598 if (!ptr[i]) 599 break; 600 free (ptr[i]); 601 } 602 free (ptr); 603 return NULL; 604 } 605 606 /* Parse STR, saving found tokens into PVALUES and return their number. 607 Tokens are assumed to be delimited by ':'. If APPEND is non-null, 608 append it to every token we find. */ 609 610 static unsigned 611 parse_env_var (const char *str, char ***pvalues, const char *append) 612 { 613 const char *curval, *nextval; 614 char **values; 615 unsigned num = 1, i; 616 617 curval = strchr (str, ':'); 618 while (curval) 619 { 620 num++; 621 curval = strchr (curval + 1, ':'); 622 } 623 624 values = (char**) xmalloc (num * sizeof (char*)); 625 curval = str; 626 nextval = strchr (curval, ':'); 627 if (nextval == NULL) 628 nextval = strchr (curval, '\0'); 629 630 int append_len = append ? strlen (append) : 0; 631 for (i = 0; i < num; i++) 632 { 633 int l = nextval - curval; 634 values[i] = (char*) xmalloc (l + 1 + append_len); 635 memcpy (values[i], curval, l); 636 values[i][l] = 0; 637 if (append) 638 strcat (values[i], append); 639 curval = nextval + 1; 640 nextval = strchr (curval, ':'); 641 if (nextval == NULL) 642 nextval = strchr (curval, '\0'); 643 } 644 *pvalues = values; 645 return num; 646 } 647 648 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */ 649 650 static void 651 append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts, 652 unsigned int count) 653 { 654 /* Append compiler driver arguments as far as they were merged. */ 655 for (unsigned int j = 1; j < count; ++j) 656 { 657 struct cl_decoded_option *option = &opts[j]; 658 659 /* File options have been properly filtered by lto-opts.c. */ 660 switch (option->opt_index) 661 { 662 /* Drop arguments that we want to take from the link line. */ 663 case OPT_flto_: 664 case OPT_flto: 665 case OPT_flto_partition_: 666 continue; 667 668 default: 669 break; 670 } 671 672 /* For now do what the original LTO option code was doing - pass 673 on any CL_TARGET flag and a few selected others. */ 674 switch (option->opt_index) 675 { 676 case OPT_fdiagnostics_show_caret: 677 case OPT_fdiagnostics_show_labels: 678 case OPT_fdiagnostics_show_line_numbers: 679 case OPT_fdiagnostics_show_option: 680 case OPT_fdiagnostics_show_location_: 681 case OPT_fshow_column: 682 case OPT_fPIC: 683 case OPT_fpic: 684 case OPT_fPIE: 685 case OPT_fpie: 686 case OPT_fcommon: 687 case OPT_fgnu_tm: 688 case OPT_fopenmp: 689 case OPT_fopenacc: 690 case OPT_fopenacc_dim_: 691 case OPT_foffload_abi_: 692 case OPT_fcf_protection_: 693 case OPT_g: 694 case OPT_O: 695 case OPT_Ofast: 696 case OPT_Og: 697 case OPT_Os: 698 break; 699 700 case OPT_Xassembler: 701 /* When we detected a mismatch in assembler options between 702 the input TU's fall back to previous behavior of ignoring them. */ 703 if (xassembler_options_error) 704 continue; 705 break; 706 707 default: 708 if (!(cl_options[option->opt_index].flags & CL_TARGET)) 709 continue; 710 } 711 712 /* Pass the option on. */ 713 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i) 714 obstack_ptr_grow (argv_obstack, option->canonical_option[i]); 715 } 716 } 717 718 /* Append diag options in OPTS with length COUNT to ARGV_OBSTACK. */ 719 720 static void 721 append_diag_options (obstack *argv_obstack, struct cl_decoded_option *opts, 722 unsigned int count) 723 { 724 /* Append compiler driver arguments as far as they were merged. */ 725 for (unsigned int j = 1; j < count; ++j) 726 { 727 struct cl_decoded_option *option = &opts[j]; 728 729 switch (option->opt_index) 730 { 731 case OPT_fdiagnostics_color_: 732 case OPT_fdiagnostics_format_: 733 case OPT_fdiagnostics_show_caret: 734 case OPT_fdiagnostics_show_labels: 735 case OPT_fdiagnostics_show_line_numbers: 736 case OPT_fdiagnostics_show_option: 737 case OPT_fdiagnostics_show_location_: 738 case OPT_fshow_column: 739 break; 740 default: 741 continue; 742 } 743 744 /* Pass the option on. */ 745 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i) 746 obstack_ptr_grow (argv_obstack, option->canonical_option[i]); 747 } 748 } 749 750 751 /* Append linker options OPTS to ARGV_OBSTACK. */ 752 753 static void 754 append_linker_options (obstack *argv_obstack, struct cl_decoded_option *opts, 755 unsigned int count) 756 { 757 /* Append linker driver arguments. Compiler options from the linker 758 driver arguments will override / merge with those from the compiler. */ 759 for (unsigned int j = 1; j < count; ++j) 760 { 761 struct cl_decoded_option *option = &opts[j]; 762 763 /* Do not pass on frontend specific flags not suitable for lto. */ 764 if (!(cl_options[option->opt_index].flags 765 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO))) 766 continue; 767 768 switch (option->opt_index) 769 { 770 case OPT_o: 771 case OPT_flto_: 772 case OPT_flto: 773 /* We've handled these LTO options, do not pass them on. */ 774 continue; 775 776 case OPT_fopenmp: 777 case OPT_fopenacc: 778 /* Ignore -fno-XXX form of these options, as otherwise 779 corresponding builtins will not be enabled. */ 780 if (option->value == 0) 781 continue; 782 break; 783 784 default: 785 break; 786 } 787 788 /* Pass the option on. */ 789 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i) 790 obstack_ptr_grow (argv_obstack, option->canonical_option[i]); 791 } 792 } 793 794 /* Extract options for TARGET offload compiler from OPTIONS and append 795 them to ARGV_OBSTACK. */ 796 797 static void 798 append_offload_options (obstack *argv_obstack, const char *target, 799 struct cl_decoded_option *options, 800 unsigned int options_count) 801 { 802 for (unsigned i = 0; i < options_count; i++) 803 { 804 const char *cur, *next, *opts; 805 char **argv; 806 unsigned argc; 807 struct cl_decoded_option *option = &options[i]; 808 809 if (option->opt_index != OPT_foffload_) 810 continue; 811 812 /* If option argument starts with '-' then no target is specified. That 813 means offload options are specified for all targets, so we need to 814 append them. */ 815 if (option->arg[0] == '-') 816 opts = option->arg; 817 else 818 { 819 opts = strchr (option->arg, '='); 820 /* If there are offload targets specified, but no actual options, 821 there is nothing to do here. */ 822 if (!opts) 823 continue; 824 825 cur = option->arg; 826 827 while (cur < opts) 828 { 829 next = strchr (cur, ','); 830 if (next == NULL) 831 next = opts; 832 next = (next > opts) ? opts : next; 833 834 /* Are we looking for this offload target? */ 835 if (strlen (target) == (size_t) (next - cur) 836 && strncmp (target, cur, next - cur) == 0) 837 break; 838 839 /* Skip the comma or equal sign. */ 840 cur = next + 1; 841 } 842 843 if (cur >= opts) 844 continue; 845 846 opts++; 847 } 848 849 argv = buildargv (opts); 850 for (argc = 0; argv[argc]; argc++) 851 obstack_ptr_grow (argv_obstack, argv[argc]); 852 } 853 } 854 855 /* Check whether NAME can be accessed in MODE. This is like access, 856 except that it never considers directories to be executable. */ 857 858 static int 859 access_check (const char *name, int mode) 860 { 861 if (mode == X_OK) 862 { 863 struct stat st; 864 865 if (stat (name, &st) < 0 866 || S_ISDIR (st.st_mode)) 867 return -1; 868 } 869 870 return access (name, mode); 871 } 872 873 /* Prepare a target image for offload TARGET, using mkoffload tool from 874 COMPILER_PATH. Return the name of the resultant object file. */ 875 876 static char * 877 compile_offload_image (const char *target, const char *compiler_path, 878 unsigned in_argc, char *in_argv[], 879 struct cl_decoded_option *compiler_opts, 880 unsigned int compiler_opt_count, 881 struct cl_decoded_option *linker_opts, 882 unsigned int linker_opt_count) 883 { 884 char *filename = NULL; 885 char **argv; 886 char *suffix 887 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target)); 888 strcpy (suffix, "/accel/"); 889 strcat (suffix, target); 890 strcat (suffix, "/mkoffload"); 891 892 char **paths = NULL; 893 unsigned n_paths = parse_env_var (compiler_path, &paths, suffix); 894 895 const char *compiler = NULL; 896 for (unsigned i = 0; i < n_paths; i++) 897 if (access_check (paths[i], X_OK) == 0) 898 { 899 compiler = paths[i]; 900 break; 901 } 902 903 if (!compiler) 904 fatal_error (input_location, 905 "could not find %s in %s (consider using %<-B%>)", 906 suffix + 1, compiler_path); 907 908 /* Generate temporary output file name. */ 909 filename = make_temp_file (".target.o"); 910 911 struct obstack argv_obstack; 912 obstack_init (&argv_obstack); 913 obstack_ptr_grow (&argv_obstack, compiler); 914 if (save_temps) 915 obstack_ptr_grow (&argv_obstack, "-save-temps"); 916 if (verbose) 917 obstack_ptr_grow (&argv_obstack, "-v"); 918 obstack_ptr_grow (&argv_obstack, "-o"); 919 obstack_ptr_grow (&argv_obstack, filename); 920 921 /* Append names of input object files. */ 922 for (unsigned i = 0; i < in_argc; i++) 923 obstack_ptr_grow (&argv_obstack, in_argv[i]); 924 925 /* Append options from offload_lto sections. */ 926 append_compiler_options (&argv_obstack, compiler_opts, 927 compiler_opt_count); 928 append_diag_options (&argv_obstack, linker_opts, linker_opt_count); 929 930 /* Append options specified by -foffload last. In case of conflicting 931 options we expect offload compiler to choose the latest. */ 932 append_offload_options (&argv_obstack, target, compiler_opts, 933 compiler_opt_count); 934 append_offload_options (&argv_obstack, target, linker_opts, 935 linker_opt_count); 936 937 obstack_ptr_grow (&argv_obstack, NULL); 938 argv = XOBFINISH (&argv_obstack, char **); 939 fork_execute (argv[0], argv, true); 940 obstack_free (&argv_obstack, NULL); 941 942 free_array_of_ptrs ((void **) paths, n_paths); 943 return filename; 944 } 945 946 947 /* The main routine dealing with offloading. 948 The routine builds a target image for each offload target. IN_ARGC and 949 IN_ARGV specify options and input object files. As all of them could contain 950 target sections, we pass them all to target compilers. */ 951 952 static void 953 compile_images_for_offload_targets (unsigned in_argc, char *in_argv[], 954 struct cl_decoded_option *compiler_opts, 955 unsigned int compiler_opt_count, 956 struct cl_decoded_option *linker_opts, 957 unsigned int linker_opt_count) 958 { 959 char **names = NULL; 960 const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV); 961 if (!target_names) 962 return; 963 unsigned num_targets = parse_env_var (target_names, &names, NULL); 964 965 int next_name_entry = 0; 966 const char *compiler_path = getenv ("COMPILER_PATH"); 967 if (!compiler_path) 968 goto out; 969 970 /* Prepare an image for each target and save the name of the resultant object 971 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */ 972 offload_names = XCNEWVEC (char *, num_targets + 1); 973 for (unsigned i = 0; i < num_targets; i++) 974 { 975 /* HSA does not use LTO-like streaming and a different compiler, skip 976 it. */ 977 if (strcmp (names[i], "hsa") == 0) 978 continue; 979 980 offload_names[next_name_entry] 981 = compile_offload_image (names[i], compiler_path, in_argc, in_argv, 982 compiler_opts, compiler_opt_count, 983 linker_opts, linker_opt_count); 984 if (!offload_names[next_name_entry]) 985 fatal_error (input_location, 986 "problem with building target image for %s", names[i]); 987 next_name_entry++; 988 } 989 990 out: 991 free_array_of_ptrs ((void **) names, num_targets); 992 } 993 994 /* Copy a file from SRC to DEST. */ 995 996 static void 997 copy_file (const char *dest, const char *src) 998 { 999 FILE *d = fopen (dest, "wb"); 1000 FILE *s = fopen (src, "rb"); 1001 char buffer[512]; 1002 while (!feof (s)) 1003 { 1004 size_t len = fread (buffer, 1, 512, s); 1005 if (ferror (s) != 0) 1006 fatal_error (input_location, "reading input file"); 1007 if (len > 0) 1008 { 1009 fwrite (buffer, 1, len, d); 1010 if (ferror (d) != 0) 1011 fatal_error (input_location, "writing output file"); 1012 } 1013 } 1014 fclose (d); 1015 fclose (s); 1016 } 1017 1018 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of 1019 the copy to the linker. */ 1020 1021 static void 1022 find_crtoffloadtable (void) 1023 { 1024 char **paths = NULL; 1025 const char *library_path = getenv ("LIBRARY_PATH"); 1026 if (!library_path) 1027 return; 1028 unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadtable.o"); 1029 1030 unsigned i; 1031 for (i = 0; i < n_paths; i++) 1032 if (access_check (paths[i], R_OK) == 0) 1033 { 1034 /* The linker will delete the filename we give it, so make a copy. */ 1035 char *crtoffloadtable = make_temp_file (".crtoffloadtable.o"); 1036 copy_file (crtoffloadtable, paths[i]); 1037 printf ("%s\n", crtoffloadtable); 1038 XDELETEVEC (crtoffloadtable); 1039 break; 1040 } 1041 if (i == n_paths) 1042 fatal_error (input_location, 1043 "installation error, cannot find %<crtoffloadtable.o%>"); 1044 1045 free_array_of_ptrs ((void **) paths, n_paths); 1046 } 1047 1048 /* A subroutine of run_gcc. Examine the open file FD for lto sections with 1049 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS 1050 and OPT_COUNT. Return true if we found a matching section, false 1051 otherwise. COLLECT_GCC holds the value of the environment variable with 1052 the same name. */ 1053 1054 static bool 1055 find_and_merge_options (int fd, off_t file_offset, const char *prefix, 1056 struct cl_decoded_option *decoded_cl_options, 1057 unsigned int decoded_cl_options_count, 1058 struct cl_decoded_option **opts, 1059 unsigned int *opt_count, const char *collect_gcc) 1060 { 1061 off_t offset, length; 1062 char *data; 1063 char *fopts; 1064 const char *errmsg; 1065 int err; 1066 struct cl_decoded_option *fdecoded_options = *opts; 1067 unsigned int fdecoded_options_count = *opt_count; 1068 1069 simple_object_read *sobj; 1070 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO", 1071 &errmsg, &err); 1072 if (!sobj) 1073 return false; 1074 1075 char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts")); 1076 strcpy (secname, prefix); 1077 strcat (secname, ".opts"); 1078 if (!simple_object_find_section (sobj, secname, &offset, &length, 1079 &errmsg, &err)) 1080 { 1081 simple_object_release_read (sobj); 1082 return false; 1083 } 1084 1085 lseek (fd, file_offset + offset, SEEK_SET); 1086 data = (char *)xmalloc (length); 1087 read (fd, data, length); 1088 fopts = data; 1089 do 1090 { 1091 struct cl_decoded_option *f2decoded_options; 1092 unsigned int f2decoded_options_count; 1093 get_options_from_collect_gcc_options (collect_gcc, fopts, 1094 &f2decoded_options, 1095 &f2decoded_options_count); 1096 if (!fdecoded_options) 1097 { 1098 fdecoded_options = f2decoded_options; 1099 fdecoded_options_count = f2decoded_options_count; 1100 } 1101 else 1102 merge_and_complain (&fdecoded_options, 1103 &fdecoded_options_count, 1104 f2decoded_options, f2decoded_options_count, 1105 decoded_cl_options, 1106 decoded_cl_options_count); 1107 1108 fopts += strlen (fopts) + 1; 1109 } 1110 while (fopts - data < length); 1111 1112 free (data); 1113 simple_object_release_read (sobj); 1114 *opts = fdecoded_options; 1115 *opt_count = fdecoded_options_count; 1116 return true; 1117 } 1118 1119 /* Copy early debug info sections from INFILE to a new file whose name 1120 is returned. Return NULL on error. */ 1121 1122 const char * 1123 debug_objcopy (const char *infile, bool rename) 1124 { 1125 char *outfile; 1126 const char *errmsg; 1127 int err; 1128 1129 const char *p; 1130 const char *orig_infile = infile; 1131 off_t inoff = 0; 1132 long loffset; 1133 int consumed; 1134 if ((p = strrchr (infile, '@')) 1135 && p != infile 1136 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1 1137 && strlen (p) == (unsigned int) consumed) 1138 { 1139 char *fname = xstrdup (infile); 1140 fname[p - infile] = '\0'; 1141 infile = fname; 1142 inoff = (off_t) loffset; 1143 } 1144 int infd = open (infile, O_RDONLY | O_BINARY); 1145 if (infd == -1) 1146 return NULL; 1147 simple_object_read *inobj = simple_object_start_read (infd, inoff, 1148 "__GNU_LTO", 1149 &errmsg, &err); 1150 if (!inobj) 1151 return NULL; 1152 1153 off_t off, len; 1154 if (simple_object_find_section (inobj, ".gnu.debuglto_.debug_info", 1155 &off, &len, &errmsg, &err) != 1) 1156 { 1157 if (errmsg) 1158 fatal_error (0, "%s: %s", errmsg, xstrerror (err)); 1159 1160 simple_object_release_read (inobj); 1161 close (infd); 1162 return NULL; 1163 } 1164 1165 if (save_temps) 1166 { 1167 outfile = (char *) xmalloc (strlen (orig_infile) 1168 + sizeof (".debug.temp.o") + 1); 1169 strcpy (outfile, orig_infile); 1170 strcat (outfile, ".debug.temp.o"); 1171 } 1172 else 1173 outfile = make_temp_file (".debug.temp.o"); 1174 errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename); 1175 if (errmsg) 1176 { 1177 unlink_if_ordinary (outfile); 1178 fatal_error (0, "%s: %s", errmsg, xstrerror (err)); 1179 } 1180 1181 simple_object_release_read (inobj); 1182 close (infd); 1183 1184 return outfile; 1185 } 1186 1187 /* Helper for qsort: compare priorities for parallel compilation. */ 1188 1189 int 1190 cmp_priority (const void *a, const void *b) 1191 { 1192 return *((const int *)b)-*((const int *)a); 1193 } 1194 1195 /* Number of CPUs that can be used for parallel LTRANS phase. */ 1196 1197 static unsigned long nthreads_var = 0; 1198 1199 #ifdef HAVE_PTHREAD_AFFINITY_NP 1200 unsigned long cpuset_size; 1201 static unsigned long get_cpuset_size; 1202 cpu_set_t *cpusetp; 1203 1204 unsigned long 1205 static cpuset_popcount (unsigned long cpusetsize, cpu_set_t *cpusetp) 1206 { 1207 #ifdef CPU_COUNT_S 1208 /* glibc 2.7 and above provide a macro for this. */ 1209 return CPU_COUNT_S (cpusetsize, cpusetp); 1210 #else 1211 #ifdef CPU_COUNT 1212 if (cpusetsize == sizeof (cpu_set_t)) 1213 /* glibc 2.6 and above provide a macro for this. */ 1214 return CPU_COUNT (cpusetp); 1215 #endif 1216 size_t i; 1217 unsigned long ret = 0; 1218 STATIC_ASSERT (sizeof (cpusetp->__bits[0]) == sizeof (unsigned long int)); 1219 for (i = 0; i < cpusetsize / sizeof (cpusetp->__bits[0]); i++) 1220 { 1221 unsigned long int mask = cpusetp->__bits[i]; 1222 if (mask == 0) 1223 continue; 1224 ret += __builtin_popcountl (mask); 1225 } 1226 return ret; 1227 #endif 1228 } 1229 #endif 1230 1231 /* At startup, determine the default number of threads. It would seem 1232 this should be related to the number of cpus online. */ 1233 1234 static void 1235 init_num_threads (void) 1236 { 1237 #ifdef HAVE_PTHREAD_AFFINITY_NP 1238 #if defined (_SC_NPROCESSORS_CONF) && defined (CPU_ALLOC_SIZE) 1239 cpuset_size = sysconf (_SC_NPROCESSORS_CONF); 1240 cpuset_size = CPU_ALLOC_SIZE (cpuset_size); 1241 #else 1242 cpuset_size = sizeof (cpu_set_t); 1243 #endif 1244 1245 cpusetp = (cpu_set_t *) xmalloc (gomp_cpuset_size); 1246 do 1247 { 1248 int ret = pthread_getaffinity_np (pthread_self (), gomp_cpuset_size, 1249 cpusetp); 1250 if (ret == 0) 1251 { 1252 /* Count only the CPUs this process can use. */ 1253 nthreads_var = cpuset_popcount (cpuset_size, cpusetp); 1254 if (nthreads_var == 0) 1255 break; 1256 get_cpuset_size = cpuset_size; 1257 #ifdef CPU_ALLOC_SIZE 1258 unsigned long i; 1259 for (i = cpuset_size * 8; i; i--) 1260 if (CPU_ISSET_S (i - 1, cpuset_size, cpusetp)) 1261 break; 1262 cpuset_size = CPU_ALLOC_SIZE (i); 1263 #endif 1264 return; 1265 } 1266 if (ret != EINVAL) 1267 break; 1268 #ifdef CPU_ALLOC_SIZE 1269 if (cpuset_size < sizeof (cpu_set_t)) 1270 cpuset_size = sizeof (cpu_set_t); 1271 else 1272 cpuset_size = cpuset_size * 2; 1273 if (cpuset_size < 8 * sizeof (cpu_set_t)) 1274 cpusetp 1275 = (cpu_set_t *) realloc (cpusetp, cpuset_size); 1276 else 1277 { 1278 /* Avoid fatal if too large memory allocation would be 1279 requested, e.g. kernel returning EINVAL all the time. */ 1280 void *p = realloc (cpusetp, cpuset_size); 1281 if (p == NULL) 1282 break; 1283 cpusetp = (cpu_set_t *) p; 1284 } 1285 #else 1286 break; 1287 #endif 1288 } 1289 while (1); 1290 cpuset_size = 0; 1291 nthreads_var = 1; 1292 free (cpusetp); 1293 cpusetp = NULL; 1294 #endif 1295 #ifdef _SC_NPROCESSORS_ONLN 1296 nthreads_var = sysconf (_SC_NPROCESSORS_ONLN); 1297 #endif 1298 } 1299 1300 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */ 1301 1302 static void 1303 run_gcc (unsigned argc, char *argv[]) 1304 { 1305 unsigned i, j; 1306 const char **new_argv; 1307 const char **argv_ptr; 1308 char *list_option_full = NULL; 1309 const char *linker_output = NULL; 1310 const char *collect_gcc; 1311 char *collect_gcc_options; 1312 int parallel = 0; 1313 int jobserver = 0; 1314 int auto_parallel = 0; 1315 bool no_partition = false; 1316 struct cl_decoded_option *fdecoded_options = NULL; 1317 struct cl_decoded_option *offload_fdecoded_options = NULL; 1318 unsigned int fdecoded_options_count = 0; 1319 unsigned int offload_fdecoded_options_count = 0; 1320 struct cl_decoded_option *decoded_options; 1321 unsigned int decoded_options_count; 1322 struct obstack argv_obstack; 1323 int new_head_argc; 1324 bool have_lto = false; 1325 bool have_offload = false; 1326 unsigned lto_argc = 0, ltoobj_argc = 0; 1327 char **lto_argv, **ltoobj_argv; 1328 bool linker_output_rel = false; 1329 bool skip_debug = false; 1330 unsigned n_debugobj; 1331 1332 /* Get the driver and options. */ 1333 collect_gcc = getenv ("COLLECT_GCC"); 1334 if (!collect_gcc) 1335 fatal_error (input_location, 1336 "environment variable %<COLLECT_GCC%> must be set"); 1337 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS"); 1338 if (!collect_gcc_options) 1339 fatal_error (input_location, 1340 "environment variable %<COLLECT_GCC_OPTIONS%> must be set"); 1341 1342 char *collect_as_options = getenv ("COLLECT_AS_OPTIONS"); 1343 1344 /* Prepend -Xassembler to each option, and append the string 1345 to collect_gcc_options. */ 1346 if (collect_as_options) 1347 { 1348 obstack temporary_obstack; 1349 obstack_init (&temporary_obstack); 1350 1351 prepend_xassembler_to_collect_as_options (collect_as_options, 1352 &temporary_obstack); 1353 obstack_1grow (&temporary_obstack, '\0'); 1354 1355 char *xassembler_opts_string 1356 = XOBFINISH (&temporary_obstack, char *); 1357 collect_gcc_options = concat (collect_gcc_options, xassembler_opts_string, 1358 NULL); 1359 } 1360 1361 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options, 1362 &decoded_options, 1363 &decoded_options_count); 1364 1365 /* Allocate array for input object files with LTO IL, 1366 and for possible preceding arguments. */ 1367 lto_argv = XNEWVEC (char *, argc); 1368 ltoobj_argv = XNEWVEC (char *, argc); 1369 1370 /* Look at saved options in the IL files. */ 1371 for (i = 1; i < argc; ++i) 1372 { 1373 char *p; 1374 int fd; 1375 off_t file_offset = 0; 1376 long loffset; 1377 int consumed; 1378 char *filename = argv[i]; 1379 1380 if (strncmp (argv[i], "-foffload-objects=", 1381 sizeof ("-foffload-objects=") - 1) == 0) 1382 { 1383 have_offload = true; 1384 offload_objects_file_name 1385 = argv[i] + sizeof ("-foffload-objects=") - 1; 1386 continue; 1387 } 1388 1389 if ((p = strrchr (argv[i], '@')) 1390 && p != argv[i] 1391 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1 1392 && strlen (p) == (unsigned int) consumed) 1393 { 1394 filename = XNEWVEC (char, p - argv[i] + 1); 1395 memcpy (filename, argv[i], p - argv[i]); 1396 filename[p - argv[i]] = '\0'; 1397 file_offset = (off_t) loffset; 1398 } 1399 fd = open (filename, O_RDONLY | O_BINARY); 1400 /* Linker plugin passes -fresolution and -flinker-output options. 1401 -flinker-output is passed only when user did not specify one and thus 1402 we do not need to worry about duplicities with the option handling 1403 below. */ 1404 if (fd == -1) 1405 { 1406 lto_argv[lto_argc++] = argv[i]; 1407 if (strcmp (argv[i], "-flinker-output=rel") == 0) 1408 linker_output_rel = true; 1409 continue; 1410 } 1411 1412 if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX, 1413 decoded_options, decoded_options_count, 1414 &fdecoded_options, &fdecoded_options_count, 1415 collect_gcc)) 1416 { 1417 have_lto = true; 1418 ltoobj_argv[ltoobj_argc++] = argv[i]; 1419 } 1420 close (fd); 1421 } 1422 1423 /* Initalize the common arguments for the driver. */ 1424 obstack_init (&argv_obstack); 1425 obstack_ptr_grow (&argv_obstack, collect_gcc); 1426 obstack_ptr_grow (&argv_obstack, "-xlto"); 1427 obstack_ptr_grow (&argv_obstack, "-c"); 1428 1429 append_compiler_options (&argv_obstack, fdecoded_options, 1430 fdecoded_options_count); 1431 append_linker_options (&argv_obstack, decoded_options, decoded_options_count); 1432 1433 /* Scan linker driver arguments for things that are of relevance to us. */ 1434 for (j = 1; j < decoded_options_count; ++j) 1435 { 1436 struct cl_decoded_option *option = &decoded_options[j]; 1437 switch (option->opt_index) 1438 { 1439 case OPT_o: 1440 linker_output = option->arg; 1441 break; 1442 1443 case OPT_save_temps: 1444 save_temps = 1; 1445 break; 1446 1447 case OPT_v: 1448 verbose = 1; 1449 break; 1450 1451 case OPT_flto_partition_: 1452 if (strcmp (option->arg, "none") == 0) 1453 no_partition = true; 1454 break; 1455 1456 case OPT_flto_: 1457 if (strcmp (option->arg, "jobserver") == 0) 1458 { 1459 parallel = 1; 1460 jobserver = 1; 1461 } 1462 else if (strcmp (option->arg, "auto") == 0) 1463 { 1464 parallel = 1; 1465 auto_parallel = 1; 1466 } 1467 else 1468 { 1469 parallel = atoi (option->arg); 1470 if (parallel <= 1) 1471 parallel = 0; 1472 } 1473 /* Fallthru. */ 1474 1475 case OPT_flto: 1476 lto_mode = LTO_MODE_WHOPR; 1477 break; 1478 1479 case OPT_flinker_output_: 1480 linker_output_rel = !strcmp (option->arg, "rel"); 1481 break; 1482 1483 case OPT_g: 1484 /* Recognize -g0. */ 1485 skip_debug = option->arg && !strcmp (option->arg, "0"); 1486 break; 1487 1488 default: 1489 break; 1490 } 1491 } 1492 1493 /* Output lto-wrapper invocation command. */ 1494 if (verbose) 1495 { 1496 for (i = 0; i < argc; ++i) 1497 { 1498 fputs (argv[i], stderr); 1499 fputc (' ', stderr); 1500 } 1501 fputc ('\n', stderr); 1502 } 1503 1504 if (linker_output_rel) 1505 no_partition = true; 1506 1507 if (no_partition) 1508 { 1509 lto_mode = LTO_MODE_LTO; 1510 jobserver = 0; 1511 auto_parallel = 0; 1512 parallel = 0; 1513 } 1514 else 1515 { 1516 jobserver_info jinfo; 1517 if (jobserver && !jinfo.is_active) 1518 { 1519 warning (0, jinfo.error_msg.c_str ()); 1520 parallel = 0; 1521 jobserver = 0; 1522 } 1523 else if (!jobserver && jinfo.is_active) 1524 { 1525 parallel = 1; 1526 jobserver = 1; 1527 } 1528 } 1529 1530 if (linker_output) 1531 { 1532 char *output_dir, *base, *name; 1533 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0; 1534 1535 output_dir = xstrdup (linker_output); 1536 base = output_dir; 1537 for (name = base; *name; name++) 1538 if (IS_DIR_SEPARATOR (*name)) 1539 base = name + 1; 1540 *base = '\0'; 1541 1542 linker_output = &linker_output[base - output_dir]; 1543 if (*output_dir == '\0') 1544 { 1545 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' }; 1546 output_dir = current_dir; 1547 } 1548 if (!bit_bucket) 1549 { 1550 obstack_ptr_grow (&argv_obstack, "-dumpdir"); 1551 obstack_ptr_grow (&argv_obstack, output_dir); 1552 } 1553 1554 obstack_ptr_grow (&argv_obstack, "-dumpbase"); 1555 } 1556 1557 /* Remember at which point we can scrub args to re-use the commons. */ 1558 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *); 1559 1560 if (have_offload) 1561 { 1562 unsigned i, num_offload_files; 1563 char **offload_argv; 1564 FILE *f; 1565 1566 f = fopen (offload_objects_file_name, "r"); 1567 if (f == NULL) 1568 fatal_error (input_location, "cannot open %s: %m", 1569 offload_objects_file_name); 1570 if (fscanf (f, "%u ", &num_offload_files) != 1) 1571 fatal_error (input_location, "cannot read %s: %m", 1572 offload_objects_file_name); 1573 offload_argv = XCNEWVEC (char *, num_offload_files); 1574 1575 /* Read names of object files with offload. */ 1576 for (i = 0; i < num_offload_files; i++) 1577 { 1578 const unsigned piece = 32; 1579 char *buf, *filename = XNEWVEC (char, piece); 1580 size_t len; 1581 1582 buf = filename; 1583 cont1: 1584 if (!fgets (buf, piece, f)) 1585 break; 1586 len = strlen (filename); 1587 if (filename[len - 1] != '\n') 1588 { 1589 filename = XRESIZEVEC (char, filename, len + piece); 1590 buf = filename + len; 1591 goto cont1; 1592 } 1593 filename[len - 1] = '\0'; 1594 offload_argv[i] = filename; 1595 } 1596 fclose (f); 1597 if (offload_argv[num_offload_files - 1] == NULL) 1598 fatal_error (input_location, "invalid format of %s", 1599 offload_objects_file_name); 1600 maybe_unlink (offload_objects_file_name); 1601 offload_objects_file_name = NULL; 1602 1603 /* Look at saved offload options in files. */ 1604 for (i = 0; i < num_offload_files; i++) 1605 { 1606 char *p; 1607 long loffset; 1608 int fd, consumed; 1609 off_t file_offset = 0; 1610 char *filename = offload_argv[i]; 1611 1612 if ((p = strrchr (offload_argv[i], '@')) 1613 && p != offload_argv[i] 1614 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1 1615 && strlen (p) == (unsigned int) consumed) 1616 { 1617 filename = XNEWVEC (char, p - offload_argv[i] + 1); 1618 memcpy (filename, offload_argv[i], p - offload_argv[i]); 1619 filename[p - offload_argv[i]] = '\0'; 1620 file_offset = (off_t) loffset; 1621 } 1622 fd = open (filename, O_RDONLY | O_BINARY); 1623 if (fd == -1) 1624 fatal_error (input_location, "cannot open %s: %m", filename); 1625 if (!find_and_merge_options (fd, file_offset, 1626 OFFLOAD_SECTION_NAME_PREFIX, 1627 decoded_options, decoded_options_count, 1628 &offload_fdecoded_options, 1629 &offload_fdecoded_options_count, 1630 collect_gcc)) 1631 fatal_error (input_location, "cannot read %s: %m", filename); 1632 close (fd); 1633 if (filename != offload_argv[i]) 1634 XDELETEVEC (filename); 1635 } 1636 1637 compile_images_for_offload_targets (num_offload_files, offload_argv, 1638 offload_fdecoded_options, 1639 offload_fdecoded_options_count, 1640 decoded_options, 1641 decoded_options_count); 1642 1643 free_array_of_ptrs ((void **) offload_argv, num_offload_files); 1644 1645 if (offload_names) 1646 { 1647 find_crtoffloadtable (); 1648 for (i = 0; offload_names[i]; i++) 1649 printf ("%s\n", offload_names[i]); 1650 free_array_of_ptrs ((void **) offload_names, i); 1651 } 1652 } 1653 1654 /* If object files contain offload sections, but do not contain LTO sections, 1655 then there is no need to perform a link-time recompilation, i.e. 1656 lto-wrapper is used only for a compilation of offload images. */ 1657 if (have_offload && !have_lto) 1658 goto finish; 1659 1660 if (lto_mode == LTO_MODE_LTO) 1661 { 1662 if (linker_output) 1663 { 1664 obstack_ptr_grow (&argv_obstack, linker_output); 1665 flto_out = (char *) xmalloc (strlen (linker_output) 1666 + sizeof (".lto.o") + 1); 1667 strcpy (flto_out, linker_output); 1668 strcat (flto_out, ".lto.o"); 1669 } 1670 else 1671 flto_out = make_temp_file (".lto.o"); 1672 obstack_ptr_grow (&argv_obstack, "-o"); 1673 obstack_ptr_grow (&argv_obstack, flto_out); 1674 } 1675 else 1676 { 1677 const char *list_option = "-fltrans-output-list="; 1678 size_t list_option_len = strlen (list_option); 1679 char *tmp; 1680 1681 if (linker_output) 1682 { 1683 char *dumpbase = (char *) xmalloc (strlen (linker_output) 1684 + sizeof (".wpa") + 1); 1685 strcpy (dumpbase, linker_output); 1686 strcat (dumpbase, ".wpa"); 1687 obstack_ptr_grow (&argv_obstack, dumpbase); 1688 } 1689 1690 if (linker_output && save_temps) 1691 { 1692 ltrans_output_file = (char *) xmalloc (strlen (linker_output) 1693 + sizeof (".ltrans.out") + 1); 1694 strcpy (ltrans_output_file, linker_output); 1695 strcat (ltrans_output_file, ".ltrans.out"); 1696 } 1697 else 1698 { 1699 char *prefix = NULL; 1700 if (linker_output) 1701 { 1702 prefix = (char *) xmalloc (strlen (linker_output) + 2); 1703 strcpy (prefix, linker_output); 1704 strcat (prefix, "."); 1705 } 1706 1707 ltrans_output_file = make_temp_file_with_prefix (prefix, 1708 ".ltrans.out"); 1709 free (prefix); 1710 } 1711 list_option_full = (char *) xmalloc (sizeof (char) * 1712 (strlen (ltrans_output_file) + list_option_len + 1)); 1713 tmp = list_option_full; 1714 1715 obstack_ptr_grow (&argv_obstack, tmp); 1716 strcpy (tmp, list_option); 1717 tmp += list_option_len; 1718 strcpy (tmp, ltrans_output_file); 1719 1720 if (jobserver) 1721 { 1722 if (verbose) 1723 fprintf (stderr, "Using make jobserver\n"); 1724 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver")); 1725 } 1726 else if (auto_parallel) 1727 { 1728 char buf[256]; 1729 init_num_threads (); 1730 if (verbose) 1731 fprintf (stderr, "LTO parallelism level set to %ld\n", 1732 nthreads_var); 1733 sprintf (buf, "-fwpa=%ld", nthreads_var); 1734 obstack_ptr_grow (&argv_obstack, xstrdup (buf)); 1735 } 1736 else if (parallel > 1) 1737 { 1738 char buf[256]; 1739 sprintf (buf, "-fwpa=%i", parallel); 1740 obstack_ptr_grow (&argv_obstack, xstrdup (buf)); 1741 } 1742 else 1743 obstack_ptr_grow (&argv_obstack, "-fwpa"); 1744 } 1745 1746 /* Append input arguments. */ 1747 for (i = 0; i < lto_argc; ++i) 1748 obstack_ptr_grow (&argv_obstack, lto_argv[i]); 1749 /* Append the input objects. */ 1750 for (i = 0; i < ltoobj_argc; ++i) 1751 obstack_ptr_grow (&argv_obstack, ltoobj_argv[i]); 1752 obstack_ptr_grow (&argv_obstack, NULL); 1753 1754 new_argv = XOBFINISH (&argv_obstack, const char **); 1755 argv_ptr = &new_argv[new_head_argc]; 1756 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true); 1757 1758 /* Copy the early generated debug info from the objects to temporary 1759 files and append those to the partial link commandline. */ 1760 n_debugobj = 0; 1761 early_debug_object_names = NULL; 1762 if (! skip_debug) 1763 { 1764 early_debug_object_names = XCNEWVEC (const char *, ltoobj_argc+ 1); 1765 num_deb_objs = ltoobj_argc; 1766 for (i = 0; i < ltoobj_argc; ++i) 1767 { 1768 const char *tem; 1769 if ((tem = debug_objcopy (ltoobj_argv[i], !linker_output_rel))) 1770 { 1771 early_debug_object_names[i] = tem; 1772 n_debugobj++; 1773 } 1774 } 1775 } 1776 1777 if (lto_mode == LTO_MODE_LTO) 1778 { 1779 printf ("%s\n", flto_out); 1780 if (!skip_debug) 1781 { 1782 for (i = 0; i < ltoobj_argc; ++i) 1783 if (early_debug_object_names[i] != NULL) 1784 printf ("%s\n", early_debug_object_names[i]); 1785 } 1786 /* These now belong to collect2. */ 1787 free (flto_out); 1788 flto_out = NULL; 1789 free (early_debug_object_names); 1790 early_debug_object_names = NULL; 1791 } 1792 else 1793 { 1794 FILE *stream = fopen (ltrans_output_file, "r"); 1795 FILE *mstream = NULL; 1796 struct obstack env_obstack; 1797 int priority; 1798 1799 if (!stream) 1800 fatal_error (input_location, "%<fopen%>: %s: %m", ltrans_output_file); 1801 1802 /* Parse the list of LTRANS inputs from the WPA stage. */ 1803 obstack_init (&env_obstack); 1804 nr = 0; 1805 for (;;) 1806 { 1807 const unsigned piece = 32; 1808 char *output_name = NULL; 1809 char *buf, *input_name = (char *)xmalloc (piece); 1810 size_t len; 1811 1812 buf = input_name; 1813 if (fscanf (stream, "%i\n", &priority) != 1) 1814 { 1815 if (!feof (stream)) 1816 fatal_error (input_location, 1817 "corrupted ltrans output file %s", 1818 ltrans_output_file); 1819 break; 1820 } 1821 cont: 1822 if (!fgets (buf, piece, stream)) 1823 break; 1824 len = strlen (input_name); 1825 if (input_name[len - 1] != '\n') 1826 { 1827 input_name = (char *)xrealloc (input_name, len + piece); 1828 buf = input_name + len; 1829 goto cont; 1830 } 1831 input_name[len - 1] = '\0'; 1832 1833 if (input_name[0] == '*') 1834 output_name = &input_name[1]; 1835 1836 nr++; 1837 ltrans_priorities 1838 = (int *)xrealloc (ltrans_priorities, nr * sizeof (int) * 2); 1839 input_names = (char **)xrealloc (input_names, nr * sizeof (char *)); 1840 output_names = (char **)xrealloc (output_names, nr * sizeof (char *)); 1841 ltrans_priorities[(nr-1)*2] = priority; 1842 ltrans_priorities[(nr-1)*2+1] = nr-1; 1843 input_names[nr-1] = input_name; 1844 output_names[nr-1] = output_name; 1845 } 1846 fclose (stream); 1847 maybe_unlink (ltrans_output_file); 1848 ltrans_output_file = NULL; 1849 1850 if (nr > 1) 1851 { 1852 jobserver_info jinfo; 1853 if (jobserver && !jinfo.is_active) 1854 warning (0, jinfo.error_msg.c_str ()); 1855 else if (parallel == 0) 1856 warning (0, "using serial compilation of %d LTRANS jobs", nr); 1857 } 1858 1859 if (parallel) 1860 { 1861 makefile = make_temp_file (".mk"); 1862 mstream = fopen (makefile, "w"); 1863 qsort (ltrans_priorities, nr, sizeof (int) * 2, cmp_priority); 1864 } 1865 1866 /* Execute the LTRANS stage for each input file (or prepare a 1867 makefile to invoke this in parallel). */ 1868 for (i = 0; i < nr; ++i) 1869 { 1870 char *output_name; 1871 char *input_name = input_names[i]; 1872 /* If it's a pass-through file do nothing. */ 1873 if (output_names[i]) 1874 continue; 1875 1876 /* Replace the .o suffix with a .ltrans.o suffix and write 1877 the resulting name to the LTRANS output list. */ 1878 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2); 1879 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o")); 1880 output_name = XOBFINISH (&env_obstack, char *); 1881 1882 /* Adjust the dumpbase if the linker output file was seen. */ 1883 if (linker_output) 1884 { 1885 char *dumpbase 1886 = (char *) xmalloc (strlen (linker_output) 1887 + sizeof (DUMPBASE_SUFFIX) + 1); 1888 snprintf (dumpbase, 1889 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX), 1890 "%s.ltrans%u", linker_output, i); 1891 argv_ptr[0] = dumpbase; 1892 } 1893 1894 argv_ptr[1] = "-fltrans"; 1895 argv_ptr[2] = "-o"; 1896 argv_ptr[3] = output_name; 1897 argv_ptr[4] = input_name; 1898 argv_ptr[5] = NULL; 1899 if (parallel) 1900 { 1901 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]); 1902 for (j = 1; new_argv[j] != NULL; ++j) 1903 fprintf (mstream, " '%s'", new_argv[j]); 1904 fprintf (mstream, "\n"); 1905 /* If we are not preserving the ltrans input files then 1906 truncate them as soon as we have processed it. This 1907 reduces temporary disk-space usage. */ 1908 if (! save_temps) 1909 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 " 1910 "&& mv %s.tem %s\n", 1911 input_name, input_name, input_name, input_name); 1912 } 1913 else 1914 { 1915 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), 1916 true); 1917 maybe_unlink (input_name); 1918 } 1919 1920 output_names[i] = output_name; 1921 } 1922 if (parallel) 1923 { 1924 struct pex_obj *pex; 1925 char jobs[32]; 1926 1927 fprintf (mstream, 1928 ".PHONY: all\n" 1929 "all:"); 1930 for (i = 0; i < nr; ++i) 1931 { 1932 int j = ltrans_priorities[i*2 + 1]; 1933 fprintf (mstream, " \\\n\t%s", output_names[j]); 1934 } 1935 fprintf (mstream, "\n"); 1936 fclose (mstream); 1937 if (!jobserver) 1938 { 1939 /* Avoid passing --jobserver-fd= and similar flags 1940 unless jobserver mode is explicitly enabled. */ 1941 putenv (xstrdup ("MAKEFLAGS=")); 1942 putenv (xstrdup ("MFLAGS=")); 1943 } 1944 new_argv[0] = getenv ("MAKE"); 1945 if (!new_argv[0]) 1946 new_argv[0] = "make"; 1947 new_argv[1] = "-f"; 1948 new_argv[2] = makefile; 1949 i = 3; 1950 if (!jobserver) 1951 { 1952 snprintf (jobs, 31, "-j%ld", 1953 auto_parallel ? nthreads_var : parallel); 1954 new_argv[i++] = jobs; 1955 } 1956 new_argv[i++] = "all"; 1957 new_argv[i++] = NULL; 1958 pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv), 1959 NULL, NULL, PEX_SEARCH, false); 1960 do_wait (new_argv[0], pex); 1961 maybe_unlink (makefile); 1962 makefile = NULL; 1963 for (i = 0; i < nr; ++i) 1964 maybe_unlink (input_names[i]); 1965 } 1966 for (i = 0; i < nr; ++i) 1967 { 1968 fputs (output_names[i], stdout); 1969 putc ('\n', stdout); 1970 free (input_names[i]); 1971 } 1972 if (!skip_debug) 1973 { 1974 for (i = 0; i < ltoobj_argc; ++i) 1975 if (early_debug_object_names[i] != NULL) 1976 printf ("%s\n", early_debug_object_names[i]); 1977 } 1978 nr = 0; 1979 free (ltrans_priorities); 1980 free (output_names); 1981 output_names = NULL; 1982 free (early_debug_object_names); 1983 early_debug_object_names = NULL; 1984 free (input_names); 1985 free (list_option_full); 1986 obstack_free (&env_obstack, NULL); 1987 } 1988 1989 finish: 1990 XDELETE (lto_argv); 1991 obstack_free (&argv_obstack, NULL); 1992 } 1993 1994 1995 /* Entry point. */ 1996 1997 int 1998 main (int argc, char *argv[]) 1999 { 2000 const char *p; 2001 2002 init_opts_obstack (); 2003 2004 p = argv[0] + strlen (argv[0]); 2005 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1])) 2006 --p; 2007 progname = p; 2008 2009 xmalloc_set_program_name (progname); 2010 2011 gcc_init_libintl (); 2012 2013 diagnostic_initialize (global_dc, 0); 2014 2015 if (atexit (lto_wrapper_cleanup) != 0) 2016 fatal_error (input_location, "%<atexit%> failed"); 2017 2018 if (signal (SIGINT, SIG_IGN) != SIG_IGN) 2019 signal (SIGINT, fatal_signal); 2020 #ifdef SIGHUP 2021 if (signal (SIGHUP, SIG_IGN) != SIG_IGN) 2022 signal (SIGHUP, fatal_signal); 2023 #endif 2024 if (signal (SIGTERM, SIG_IGN) != SIG_IGN) 2025 signal (SIGTERM, fatal_signal); 2026 #ifdef SIGPIPE 2027 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN) 2028 signal (SIGPIPE, fatal_signal); 2029 #endif 2030 #ifdef SIGCHLD 2031 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will 2032 receive the signal. A different setting is inheritable */ 2033 signal (SIGCHLD, SIG_DFL); 2034 #endif 2035 2036 /* We may be called with all the arguments stored in some file and 2037 passed with @file. Expand them into argv before processing. */ 2038 expandargv (&argc, &argv); 2039 2040 run_gcc (argc, argv); 2041 2042 return 0; 2043 } 2044