1/* Wrapper to call lto. Used by collect2 and the linker plugin. 2 Copyright (C) 2009-2015 Free Software Foundation, Inc. 3 4 Factored out of collect2 by Rafael Espindola <espindola@google.com> 5 6This file is part of GCC. 7 8GCC is free software; you can redistribute it and/or modify it under 9the terms of the GNU General Public License as published by the Free 10Software Foundation; either version 3, or (at your option) any later 11version. 12 13GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14WARRANTY; without even the implied warranty of MERCHANTABILITY or 15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16for more details. 17 18You should have received a copy of the GNU General Public License 19along 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#include "config.h" 41#include "system.h" 42#include "coretypes.h" 43#include "intl.h" 44#include "diagnostic.h" 45#include "obstack.h" 46#include "opts.h" 47#include "options.h" 48#include "simple-object.h" 49#include "lto-section-names.h" 50#include "collect-utils.h" 51 52/* Environment variable, used for passing the names of offload targets from GCC 53 driver to lto-wrapper. */ 54#define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES" 55 56enum lto_mode_d { 57 LTO_MODE_NONE, /* Not doing LTO. */ 58 LTO_MODE_LTO, /* Normal LTO. */ 59 LTO_MODE_WHOPR /* WHOPR. */ 60}; 61 62/* Current LTO mode. */ 63static enum lto_mode_d lto_mode = LTO_MODE_NONE; 64 65static char *ltrans_output_file; 66static char *flto_out; 67static unsigned int nr; 68static char **input_names; 69static char **output_names; 70static char **offload_names; 71static const char *offloadbegin, *offloadend; 72static char *makefile; 73 74const char tool_name[] = "lto-wrapper"; 75 76/* Delete tempfiles. Called from utils_cleanup. */ 77 78void 79tool_cleanup (bool) 80{ 81 unsigned int i; 82 83 if (ltrans_output_file) 84 maybe_unlink (ltrans_output_file); 85 if (flto_out) 86 maybe_unlink (flto_out); 87 if (makefile) 88 maybe_unlink (makefile); 89 for (i = 0; i < nr; ++i) 90 { 91 maybe_unlink (input_names[i]); 92 if (output_names[i]) 93 maybe_unlink (output_names[i]); 94 } 95} 96 97static void 98lto_wrapper_cleanup (void) 99{ 100 utils_cleanup (false); 101} 102 103/* Unlink a temporary LTRANS file unless requested otherwise. */ 104 105void 106maybe_unlink (const char *file) 107{ 108 if (!save_temps) 109 { 110 if (unlink_if_ordinary (file) 111 && errno != ENOENT) 112 fatal_error (input_location, "deleting LTRANS file %s: %m", file); 113 } 114 else if (verbose) 115 fprintf (stderr, "[Leaving LTRANS %s]\n", file); 116} 117 118/* Template of LTRANS dumpbase suffix. */ 119#define DUMPBASE_SUFFIX ".ltrans18446744073709551615" 120 121/* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS 122 environment according to LANG_MASK. */ 123 124static void 125get_options_from_collect_gcc_options (const char *collect_gcc, 126 const char *collect_gcc_options, 127 unsigned int lang_mask, 128 struct cl_decoded_option **decoded_options, 129 unsigned int *decoded_options_count) 130{ 131 struct obstack argv_obstack; 132 char *argv_storage; 133 const char **argv; 134 int j, k, argc; 135 136 argv_storage = xstrdup (collect_gcc_options); 137 obstack_init (&argv_obstack); 138 obstack_ptr_grow (&argv_obstack, collect_gcc); 139 140 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j) 141 { 142 if (argv_storage[j] == '\'') 143 { 144 obstack_ptr_grow (&argv_obstack, &argv_storage[k]); 145 ++j; 146 do 147 { 148 if (argv_storage[j] == '\0') 149 fatal_error (input_location, "malformed COLLECT_GCC_OPTIONS"); 150 else if (strncmp (&argv_storage[j], "'\\''", 4) == 0) 151 { 152 argv_storage[k++] = '\''; 153 j += 4; 154 } 155 else if (argv_storage[j] == '\'') 156 break; 157 else 158 argv_storage[k++] = argv_storage[j++]; 159 } 160 while (1); 161 argv_storage[k++] = '\0'; 162 } 163 } 164 165 obstack_ptr_grow (&argv_obstack, NULL); 166 argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1; 167 argv = XOBFINISH (&argv_obstack, const char **); 168 169 decode_cmdline_options_to_array (argc, (const char **)argv, 170 lang_mask, 171 decoded_options, decoded_options_count); 172 obstack_free (&argv_obstack, NULL); 173} 174 175/* Append OPTION to the options array DECODED_OPTIONS with size 176 DECODED_OPTIONS_COUNT. */ 177 178static void 179append_option (struct cl_decoded_option **decoded_options, 180 unsigned int *decoded_options_count, 181 struct cl_decoded_option *option) 182{ 183 ++*decoded_options_count; 184 *decoded_options 185 = (struct cl_decoded_option *) 186 xrealloc (*decoded_options, 187 (*decoded_options_count 188 * sizeof (struct cl_decoded_option))); 189 memcpy (&(*decoded_options)[*decoded_options_count - 1], option, 190 sizeof (struct cl_decoded_option)); 191} 192 193/* Try to merge and complain about options FDECODED_OPTIONS when applied 194 ontop of DECODED_OPTIONS. */ 195 196static void 197merge_and_complain (struct cl_decoded_option **decoded_options, 198 unsigned int *decoded_options_count, 199 struct cl_decoded_option *fdecoded_options, 200 unsigned int fdecoded_options_count) 201{ 202 unsigned int i, j; 203 204 /* ??? Merge options from files. Most cases can be 205 handled by either unioning or intersecting 206 (for example -fwrapv is a case for unioning, 207 -ffast-math is for intersection). Most complaints 208 about real conflicts between different options can 209 be deferred to the compiler proper. Options that 210 we can neither safely handle by intersection nor 211 unioning would need to be complained about here. 212 Ideally we'd have a flag in the opt files that 213 tells whether to union or intersect or reject. 214 In absence of that it's unclear what a good default is. 215 It's also difficult to get positional handling correct. */ 216 217 /* The following does what the old LTO option code did, 218 union all target and a selected set of common options. */ 219 for (i = 0; i < fdecoded_options_count; ++i) 220 { 221 struct cl_decoded_option *foption = &fdecoded_options[i]; 222 switch (foption->opt_index) 223 { 224 case OPT_SPECIAL_unknown: 225 case OPT_SPECIAL_ignore: 226 case OPT_SPECIAL_program_name: 227 case OPT_SPECIAL_input_file: 228 break; 229 230 default: 231 if (!(cl_options[foption->opt_index].flags & CL_TARGET)) 232 break; 233 234 /* Fallthru. */ 235 case OPT_fPIC: 236 case OPT_fpic: 237 case OPT_fPIE: 238 case OPT_fpie: 239 case OPT_fcommon: 240 case OPT_fexceptions: 241 case OPT_fnon_call_exceptions: 242 case OPT_fgnu_tm: 243 /* Do what the old LTO code did - collect exactly one option 244 setting per OPT code, we pick the first we encounter. 245 ??? This doesn't make too much sense, but when it doesn't 246 then we should complain. */ 247 for (j = 0; j < *decoded_options_count; ++j) 248 if ((*decoded_options)[j].opt_index == foption->opt_index) 249 break; 250 if (j == *decoded_options_count) 251 append_option (decoded_options, decoded_options_count, foption); 252 break; 253 254 case OPT_ftrapv: 255 case OPT_fstrict_overflow: 256 case OPT_ffp_contract_: 257 /* For selected options we can merge conservatively. */ 258 for (j = 0; j < *decoded_options_count; ++j) 259 if ((*decoded_options)[j].opt_index == foption->opt_index) 260 break; 261 if (j == *decoded_options_count) 262 append_option (decoded_options, decoded_options_count, foption); 263 /* FP_CONTRACT_OFF < FP_CONTRACT_ON < FP_CONTRACT_FAST, 264 -fno-trapv < -ftrapv, 265 -fno-strict-overflow < -fstrict-overflow */ 266 else if (foption->value < (*decoded_options)[j].value) 267 (*decoded_options)[j] = *foption; 268 break; 269 270 case OPT_fmath_errno: 271 case OPT_fsigned_zeros: 272 case OPT_ftrapping_math: 273 case OPT_fwrapv: 274 case OPT_fopenmp: 275 case OPT_fopenacc: 276 case OPT_fcheck_pointer_bounds: 277 /* For selected options we can merge conservatively. */ 278 for (j = 0; j < *decoded_options_count; ++j) 279 if ((*decoded_options)[j].opt_index == foption->opt_index) 280 break; 281 if (j == *decoded_options_count) 282 append_option (decoded_options, decoded_options_count, foption); 283 /* -fmath-errno > -fno-math-errno, 284 -fsigned-zeros > -fno-signed-zeros, 285 -ftrapping-math -> -fno-trapping-math, 286 -fwrapv > -fno-wrapv. */ 287 else if (foption->value > (*decoded_options)[j].value) 288 (*decoded_options)[j] = *foption; 289 break; 290 291 case OPT_freg_struct_return: 292 case OPT_fpcc_struct_return: 293 case OPT_fshort_double: 294 for (j = 0; j < *decoded_options_count; ++j) 295 if ((*decoded_options)[j].opt_index == foption->opt_index) 296 break; 297 if (j == *decoded_options_count) 298 fatal_error (input_location, 299 "Option %s not used consistently in all LTO input" 300 " files", foption->orig_option_with_args_text); 301 break; 302 303 case OPT_foffload_abi_: 304 for (j = 0; j < *decoded_options_count; ++j) 305 if ((*decoded_options)[j].opt_index == foption->opt_index) 306 break; 307 if (j == *decoded_options_count) 308 append_option (decoded_options, decoded_options_count, foption); 309 else if (foption->value != (*decoded_options)[j].value) 310 fatal_error (input_location, 311 "Option %s not used consistently in all LTO input" 312 " files", foption->orig_option_with_args_text); 313 break; 314 315 case OPT_O: 316 case OPT_Ofast: 317 case OPT_Og: 318 case OPT_Os: 319 for (j = 0; j < *decoded_options_count; ++j) 320 if ((*decoded_options)[j].opt_index == OPT_O 321 || (*decoded_options)[j].opt_index == OPT_Ofast 322 || (*decoded_options)[j].opt_index == OPT_Og 323 || (*decoded_options)[j].opt_index == OPT_Os) 324 break; 325 if (j == *decoded_options_count) 326 append_option (decoded_options, decoded_options_count, foption); 327 else if ((*decoded_options)[j].opt_index == foption->opt_index 328 && foption->opt_index != OPT_O) 329 /* Exact same options get merged. */ 330 ; 331 else 332 { 333 /* For mismatched option kinds preserve the optimization 334 level only, thus merge it as -On. This also handles 335 merging of same optimization level -On. */ 336 int level = 0; 337 switch (foption->opt_index) 338 { 339 case OPT_O: 340 if (foption->arg[0] == '\0') 341 level = MAX (level, 1); 342 else 343 level = MAX (level, atoi (foption->arg)); 344 break; 345 case OPT_Ofast: 346 level = MAX (level, 3); 347 break; 348 case OPT_Og: 349 level = MAX (level, 1); 350 break; 351 case OPT_Os: 352 level = MAX (level, 2); 353 break; 354 default: 355 gcc_unreachable (); 356 } 357 switch ((*decoded_options)[j].opt_index) 358 { 359 case OPT_O: 360 if ((*decoded_options)[j].arg[0] == '\0') 361 level = MAX (level, 1); 362 else 363 level = MAX (level, atoi ((*decoded_options)[j].arg)); 364 break; 365 case OPT_Ofast: 366 level = MAX (level, 3); 367 break; 368 case OPT_Og: 369 level = MAX (level, 1); 370 break; 371 case OPT_Os: 372 level = MAX (level, 2); 373 break; 374 default: 375 gcc_unreachable (); 376 } 377 (*decoded_options)[j].opt_index = OPT_O; 378 char *tem; 379 tem = xasprintf ("-O%d", level); 380 (*decoded_options)[j].arg = &tem[2]; 381 (*decoded_options)[j].canonical_option[0] = tem; 382 (*decoded_options)[j].value = 1; 383 } 384 break; 385 386 case OPT_foffload_: 387 append_option (decoded_options, decoded_options_count, foption); 388 break; 389 } 390 } 391} 392 393/* Auxiliary function that frees elements of PTR and PTR itself. 394 N is number of elements to be freed. If PTR is NULL, nothing is freed. 395 If an element is NULL, subsequent elements are not freed. */ 396 397static void ** 398free_array_of_ptrs (void **ptr, unsigned n) 399{ 400 if (!ptr) 401 return NULL; 402 for (unsigned i = 0; i < n; i++) 403 { 404 if (!ptr[i]) 405 break; 406 free (ptr[i]); 407 } 408 free (ptr); 409 return NULL; 410} 411 412/* Parse STR, saving found tokens into PVALUES and return their number. 413 Tokens are assumed to be delimited by ':'. If APPEND is non-null, 414 append it to every token we find. */ 415 416static unsigned 417parse_env_var (const char *str, char ***pvalues, const char *append) 418{ 419 const char *curval, *nextval; 420 char **values; 421 unsigned num = 1, i; 422 423 curval = strchr (str, ':'); 424 while (curval) 425 { 426 num++; 427 curval = strchr (curval + 1, ':'); 428 } 429 430 values = (char**) xmalloc (num * sizeof (char*)); 431 curval = str; 432 nextval = strchr (curval, ':'); 433 if (nextval == NULL) 434 nextval = strchr (curval, '\0'); 435 436 int append_len = append ? strlen (append) : 0; 437 for (i = 0; i < num; i++) 438 { 439 int l = nextval - curval; 440 values[i] = (char*) xmalloc (l + 1 + append_len); 441 memcpy (values[i], curval, l); 442 values[i][l] = 0; 443 if (append) 444 strcat (values[i], append); 445 curval = nextval + 1; 446 nextval = strchr (curval, ':'); 447 if (nextval == NULL) 448 nextval = strchr (curval, '\0'); 449 } 450 *pvalues = values; 451 return num; 452} 453 454/* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */ 455 456static void 457append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts, 458 unsigned int count) 459{ 460 /* Append compiler driver arguments as far as they were merged. */ 461 for (unsigned int j = 1; j < count; ++j) 462 { 463 struct cl_decoded_option *option = &opts[j]; 464 465 /* File options have been properly filtered by lto-opts.c. */ 466 switch (option->opt_index) 467 { 468 /* Drop arguments that we want to take from the link line. */ 469 case OPT_flto_: 470 case OPT_flto: 471 case OPT_flto_partition_: 472 continue; 473 474 default: 475 break; 476 } 477 478 /* For now do what the original LTO option code was doing - pass 479 on any CL_TARGET flag and a few selected others. */ 480 switch (option->opt_index) 481 { 482 case OPT_fPIC: 483 case OPT_fpic: 484 case OPT_fPIE: 485 case OPT_fpie: 486 case OPT_fcommon: 487 case OPT_fexceptions: 488 case OPT_fnon_call_exceptions: 489 case OPT_fgnu_tm: 490 case OPT_freg_struct_return: 491 case OPT_fpcc_struct_return: 492 case OPT_fshort_double: 493 case OPT_ffp_contract_: 494 case OPT_fmath_errno: 495 case OPT_fsigned_zeros: 496 case OPT_ftrapping_math: 497 case OPT_fwrapv: 498 case OPT_fopenmp: 499 case OPT_fopenacc: 500 case OPT_ftrapv: 501 case OPT_fstrict_overflow: 502 case OPT_foffload_abi_: 503 case OPT_O: 504 case OPT_Ofast: 505 case OPT_Og: 506 case OPT_Os: 507 case OPT_fcheck_pointer_bounds: 508 break; 509 510 default: 511 if (!(cl_options[option->opt_index].flags & CL_TARGET)) 512 continue; 513 } 514 515 /* Pass the option on. */ 516 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i) 517 obstack_ptr_grow (argv_obstack, option->canonical_option[i]); 518 } 519} 520 521/* Append linker options OPTS to ARGV_OBSTACK. */ 522 523static void 524append_linker_options (obstack *argv_obstack, struct cl_decoded_option *opts, 525 unsigned int count) 526{ 527 /* Append linker driver arguments. Compiler options from the linker 528 driver arguments will override / merge with those from the compiler. */ 529 for (unsigned int j = 1; j < count; ++j) 530 { 531 struct cl_decoded_option *option = &opts[j]; 532 533 /* Do not pass on frontend specific flags not suitable for lto. */ 534 if (!(cl_options[option->opt_index].flags 535 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO))) 536 continue; 537 538 switch (option->opt_index) 539 { 540 case OPT_o: 541 case OPT_flto_: 542 case OPT_flto: 543 /* We've handled these LTO options, do not pass them on. */ 544 continue; 545 546 case OPT_freg_struct_return: 547 case OPT_fpcc_struct_return: 548 case OPT_fshort_double: 549 /* Ignore these, they are determined by the input files. 550 ??? We fail to diagnose a possible mismatch here. */ 551 continue; 552 553 default: 554 break; 555 } 556 557 /* Pass the option on. */ 558 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i) 559 obstack_ptr_grow (argv_obstack, option->canonical_option[i]); 560 } 561} 562 563/* Extract options for TARGET offload compiler from OPTIONS and append 564 them to ARGV_OBSTACK. */ 565 566static void 567append_offload_options (obstack *argv_obstack, const char *target, 568 struct cl_decoded_option *options, 569 unsigned int options_count) 570{ 571 for (unsigned i = 0; i < options_count; i++) 572 { 573 const char *cur, *next, *opts; 574 char **argv; 575 unsigned argc; 576 struct cl_decoded_option *option = &options[i]; 577 578 if (option->opt_index != OPT_foffload_) 579 continue; 580 581 /* If option argument starts with '-' then no target is specified. That 582 means offload options are specified for all targets, so we need to 583 append them. */ 584 if (option->arg[0] == '-') 585 opts = option->arg; 586 else 587 { 588 opts = strchr (option->arg, '='); 589 if (!opts) 590 continue; 591 592 cur = option->arg; 593 594 while (cur < opts) 595 { 596 next = strchr (cur, ','); 597 if (next == NULL) 598 next = opts; 599 next = (next > opts) ? opts : next; 600 601 if (strlen (target) == (size_t) (next - cur) 602 && strncmp (target, cur, next - cur) == 0) 603 break; 604 605 cur = next + 1; 606 } 607 608 if (cur >= opts) 609 continue; 610 611 opts++; 612 } 613 614 argv = buildargv (opts); 615 for (argc = 0; argv[argc]; argc++) 616 obstack_ptr_grow (argv_obstack, argv[argc]); 617 } 618} 619 620/* Check whether NAME can be accessed in MODE. This is like access, 621 except that it never considers directories to be executable. */ 622 623static int 624access_check (const char *name, int mode) 625{ 626 if (mode == X_OK) 627 { 628 struct stat st; 629 630 if (stat (name, &st) < 0 631 || S_ISDIR (st.st_mode)) 632 return -1; 633 } 634 635 return access (name, mode); 636} 637 638/* Prepare a target image for offload TARGET, using mkoffload tool from 639 COMPILER_PATH. Return the name of the resultant object file. */ 640 641static char * 642compile_offload_image (const char *target, const char *compiler_path, 643 unsigned in_argc, char *in_argv[], 644 struct cl_decoded_option *compiler_opts, 645 unsigned int compiler_opt_count, 646 struct cl_decoded_option *linker_opts, 647 unsigned int linker_opt_count) 648{ 649 char *filename = NULL; 650 char **argv; 651 char *suffix 652 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target)); 653 strcpy (suffix, "/accel/"); 654 strcat (suffix, target); 655 strcat (suffix, "/mkoffload"); 656 657 char **paths = NULL; 658 unsigned n_paths = parse_env_var (compiler_path, &paths, suffix); 659 660 const char *compiler = NULL; 661 for (unsigned i = 0; i < n_paths; i++) 662 if (access_check (paths[i], X_OK) == 0) 663 { 664 compiler = paths[i]; 665 break; 666 } 667 668 if (compiler) 669 { 670 /* Generate temporary output file name. */ 671 filename = make_temp_file (".target.o"); 672 673 struct obstack argv_obstack; 674 obstack_init (&argv_obstack); 675 obstack_ptr_grow (&argv_obstack, compiler); 676 obstack_ptr_grow (&argv_obstack, "-o"); 677 obstack_ptr_grow (&argv_obstack, filename); 678 679 /* Append names of input object files. */ 680 for (unsigned i = 0; i < in_argc; i++) 681 obstack_ptr_grow (&argv_obstack, in_argv[i]); 682 683 /* Append options from offload_lto sections. */ 684 append_compiler_options (&argv_obstack, compiler_opts, 685 compiler_opt_count); 686 687 /* Append options specified by -foffload last. In case of conflicting 688 options we expect offload compiler to choose the latest. */ 689 append_offload_options (&argv_obstack, target, compiler_opts, 690 compiler_opt_count); 691 append_offload_options (&argv_obstack, target, linker_opts, 692 linker_opt_count); 693 694 obstack_ptr_grow (&argv_obstack, NULL); 695 argv = XOBFINISH (&argv_obstack, char **); 696 fork_execute (argv[0], argv, true); 697 obstack_free (&argv_obstack, NULL); 698 } 699 700 free_array_of_ptrs ((void **) paths, n_paths); 701 return filename; 702} 703 704 705/* The main routine dealing with offloading. 706 The routine builds a target image for each offload target. IN_ARGC and 707 IN_ARGV specify options and input object files. As all of them could contain 708 target sections, we pass them all to target compilers. */ 709 710static void 711compile_images_for_offload_targets (unsigned in_argc, char *in_argv[], 712 struct cl_decoded_option *compiler_opts, 713 unsigned int compiler_opt_count, 714 struct cl_decoded_option *linker_opts, 715 unsigned int linker_opt_count) 716{ 717 char **names = NULL; 718 const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV); 719 if (!target_names) 720 return; 721 unsigned num_targets = parse_env_var (target_names, &names, NULL); 722 723 const char *compiler_path = getenv ("COMPILER_PATH"); 724 if (!compiler_path) 725 goto out; 726 727 /* Prepare an image for each target and save the name of the resultant object 728 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */ 729 offload_names = XCNEWVEC (char *, num_targets + 1); 730 for (unsigned i = 0; i < num_targets; i++) 731 { 732 offload_names[i] 733 = compile_offload_image (names[i], compiler_path, in_argc, in_argv, 734 compiler_opts, compiler_opt_count, 735 linker_opts, linker_opt_count); 736 if (!offload_names[i]) 737 fatal_error (input_location, 738 "problem with building target image for %s\n", names[i]); 739 } 740 741 out: 742 free_array_of_ptrs ((void **) names, num_targets); 743} 744 745/* Copy a file from SRC to DEST. */ 746 747static void 748copy_file (const char *dest, const char *src) 749{ 750 FILE *d = fopen (dest, "wb"); 751 FILE *s = fopen (src, "rb"); 752 char buffer[512]; 753 while (!feof (s)) 754 { 755 size_t len = fread (buffer, 1, 512, s); 756 if (ferror (s) != 0) 757 fatal_error (input_location, "reading input file"); 758 if (len > 0) 759 { 760 fwrite (buffer, 1, len, d); 761 if (ferror (d) != 0) 762 fatal_error (input_location, "writing output file"); 763 } 764 } 765} 766 767/* Find the crtoffloadbegin.o and crtoffloadend.o files in LIBRARY_PATH, make 768 copies and store the names of the copies in offloadbegin and offloadend. */ 769 770static void 771find_offloadbeginend (void) 772{ 773 char **paths = NULL; 774 const char *library_path = getenv ("LIBRARY_PATH"); 775 if (!library_path) 776 return; 777 unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadbegin.o"); 778 779 unsigned i; 780 for (i = 0; i < n_paths; i++) 781 if (access_check (paths[i], R_OK) == 0) 782 { 783 size_t len = strlen (paths[i]); 784 char *tmp = xstrdup (paths[i]); 785 strcpy (paths[i] + len - strlen ("begin.o"), "end.o"); 786 if (access_check (paths[i], R_OK) != 0) 787 fatal_error (input_location, 788 "installation error, can't find crtoffloadend.o"); 789 /* The linker will delete the filenames we give it, so make 790 copies. */ 791 offloadbegin = make_temp_file (".o"); 792 offloadend = make_temp_file (".o"); 793 copy_file (offloadbegin, tmp); 794 copy_file (offloadend, paths[i]); 795 free (tmp); 796 break; 797 } 798 if (i == n_paths) 799 fatal_error (input_location, 800 "installation error, can't find crtoffloadbegin.o"); 801 802 free_array_of_ptrs ((void **) paths, n_paths); 803} 804 805/* A subroutine of run_gcc. Examine the open file FD for lto sections with 806 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS 807 and OPT_COUNT. Return true if we found a matchingn section, false 808 otherwise. COLLECT_GCC holds the value of the environment variable with 809 the same name. */ 810 811static bool 812find_and_merge_options (int fd, off_t file_offset, const char *prefix, 813 struct cl_decoded_option **opts, 814 unsigned int *opt_count, const char *collect_gcc) 815{ 816 off_t offset, length; 817 char *data; 818 char *fopts; 819 const char *errmsg; 820 int err; 821 struct cl_decoded_option *fdecoded_options = *opts; 822 unsigned int fdecoded_options_count = *opt_count; 823 824 simple_object_read *sobj; 825 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO", 826 &errmsg, &err); 827 if (!sobj) 828 return false; 829 830 char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts")); 831 strcpy (secname, prefix); 832 strcat (secname, ".opts"); 833 if (!simple_object_find_section (sobj, secname, &offset, &length, 834 &errmsg, &err)) 835 { 836 simple_object_release_read (sobj); 837 return false; 838 } 839 840 lseek (fd, file_offset + offset, SEEK_SET); 841 data = (char *)xmalloc (length); 842 read (fd, data, length); 843 fopts = data; 844 do 845 { 846 struct cl_decoded_option *f2decoded_options; 847 unsigned int f2decoded_options_count; 848 get_options_from_collect_gcc_options (collect_gcc, 849 fopts, CL_LANG_ALL, 850 &f2decoded_options, 851 &f2decoded_options_count); 852 if (!fdecoded_options) 853 { 854 fdecoded_options = f2decoded_options; 855 fdecoded_options_count = f2decoded_options_count; 856 } 857 else 858 merge_and_complain (&fdecoded_options, 859 &fdecoded_options_count, 860 f2decoded_options, f2decoded_options_count); 861 862 fopts += strlen (fopts) + 1; 863 } 864 while (fopts - data < length); 865 866 free (data); 867 simple_object_release_read (sobj); 868 *opts = fdecoded_options; 869 *opt_count = fdecoded_options_count; 870 return true; 871} 872 873/* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */ 874 875static void 876run_gcc (unsigned argc, char *argv[]) 877{ 878 unsigned i, j; 879 const char **new_argv; 880 const char **argv_ptr; 881 char *list_option_full = NULL; 882 const char *linker_output = NULL; 883 const char *collect_gcc, *collect_gcc_options; 884 int parallel = 0; 885 int jobserver = 0; 886 bool no_partition = false; 887 struct cl_decoded_option *fdecoded_options = NULL; 888 struct cl_decoded_option *offload_fdecoded_options = NULL; 889 unsigned int fdecoded_options_count = 0; 890 unsigned int offload_fdecoded_options_count = 0; 891 struct cl_decoded_option *decoded_options; 892 unsigned int decoded_options_count; 893 struct obstack argv_obstack; 894 int new_head_argc; 895 bool have_lto = false; 896 bool have_offload = false; 897 unsigned lto_argc = 0, offload_argc = 0; 898 char **lto_argv, **offload_argv; 899 900 /* Get the driver and options. */ 901 collect_gcc = getenv ("COLLECT_GCC"); 902 if (!collect_gcc) 903 fatal_error (input_location, 904 "environment variable COLLECT_GCC must be set"); 905 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS"); 906 if (!collect_gcc_options) 907 fatal_error (input_location, 908 "environment variable COLLECT_GCC_OPTIONS must be set"); 909 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options, 910 CL_LANG_ALL, 911 &decoded_options, 912 &decoded_options_count); 913 914 /* Allocate arrays for input object files with LTO or offload IL, 915 and for possible preceding arguments. */ 916 lto_argv = XNEWVEC (char *, argc); 917 offload_argv = XNEWVEC (char *, argc); 918 919 /* Look at saved options in the IL files. */ 920 for (i = 1; i < argc; ++i) 921 { 922 char *p; 923 int fd; 924 off_t file_offset = 0; 925 long loffset; 926 int consumed; 927 char *filename = argv[i]; 928 929 if ((p = strrchr (argv[i], '@')) 930 && p != argv[i] 931 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1 932 && strlen (p) == (unsigned int) consumed) 933 { 934 filename = XNEWVEC (char, p - argv[i] + 1); 935 memcpy (filename, argv[i], p - argv[i]); 936 filename[p - argv[i]] = '\0'; 937 file_offset = (off_t) loffset; 938 } 939 fd = open (filename, O_RDONLY | O_BINARY); 940 if (fd == -1) 941 { 942 lto_argv[lto_argc++] = argv[i]; 943 continue; 944 } 945 946 if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX, 947 &fdecoded_options, &fdecoded_options_count, 948 collect_gcc)) 949 { 950 have_lto = true; 951 lto_argv[lto_argc++] = argv[i]; 952 } 953 954 if (find_and_merge_options (fd, file_offset, OFFLOAD_SECTION_NAME_PREFIX, 955 &offload_fdecoded_options, 956 &offload_fdecoded_options_count, collect_gcc)) 957 { 958 have_offload = true; 959 offload_argv[offload_argc++] = argv[i]; 960 } 961 962 close (fd); 963 } 964 965 /* Initalize the common arguments for the driver. */ 966 obstack_init (&argv_obstack); 967 obstack_ptr_grow (&argv_obstack, collect_gcc); 968 obstack_ptr_grow (&argv_obstack, "-xlto"); 969 obstack_ptr_grow (&argv_obstack, "-c"); 970 971 append_compiler_options (&argv_obstack, fdecoded_options, 972 fdecoded_options_count); 973 append_linker_options (&argv_obstack, decoded_options, decoded_options_count); 974 975 /* Scan linker driver arguments for things that are of relevance to us. */ 976 for (j = 1; j < decoded_options_count; ++j) 977 { 978 struct cl_decoded_option *option = &decoded_options[j]; 979 switch (option->opt_index) 980 { 981 case OPT_o: 982 linker_output = option->arg; 983 break; 984 985 case OPT_save_temps: 986 save_temps = 1; 987 break; 988 989 case OPT_v: 990 verbose = 1; 991 break; 992 993 case OPT_flto_partition_: 994 if (strcmp (option->arg, "none") == 0) 995 no_partition = true; 996 break; 997 998 case OPT_flto_: 999 if (strcmp (option->arg, "jobserver") == 0) 1000 { 1001 jobserver = 1; 1002 parallel = 1; 1003 } 1004 else 1005 { 1006 parallel = atoi (option->arg); 1007 if (parallel <= 1) 1008 parallel = 0; 1009 } 1010 /* Fallthru. */ 1011 1012 case OPT_flto: 1013 lto_mode = LTO_MODE_WHOPR; 1014 break; 1015 1016 default: 1017 break; 1018 } 1019 } 1020 1021 if (no_partition) 1022 { 1023 lto_mode = LTO_MODE_LTO; 1024 jobserver = 0; 1025 parallel = 0; 1026 } 1027 1028 if (linker_output) 1029 { 1030 char *output_dir, *base, *name; 1031 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0; 1032 1033 output_dir = xstrdup (linker_output); 1034 base = output_dir; 1035 for (name = base; *name; name++) 1036 if (IS_DIR_SEPARATOR (*name)) 1037 base = name + 1; 1038 *base = '\0'; 1039 1040 linker_output = &linker_output[base - output_dir]; 1041 if (*output_dir == '\0') 1042 { 1043 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' }; 1044 output_dir = current_dir; 1045 } 1046 if (!bit_bucket) 1047 { 1048 obstack_ptr_grow (&argv_obstack, "-dumpdir"); 1049 obstack_ptr_grow (&argv_obstack, output_dir); 1050 } 1051 1052 obstack_ptr_grow (&argv_obstack, "-dumpbase"); 1053 } 1054 1055 /* Remember at which point we can scrub args to re-use the commons. */ 1056 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *); 1057 1058 if (have_offload) 1059 { 1060 compile_images_for_offload_targets (offload_argc, offload_argv, 1061 offload_fdecoded_options, 1062 offload_fdecoded_options_count, 1063 decoded_options, 1064 decoded_options_count); 1065 if (offload_names) 1066 { 1067 find_offloadbeginend (); 1068 for (i = 0; offload_names[i]; i++) 1069 printf ("%s\n", offload_names[i]); 1070 free_array_of_ptrs ((void **) offload_names, i); 1071 } 1072 } 1073 1074 if (offloadbegin) 1075 printf ("%s\n", offloadbegin); 1076 1077 /* If object files contain offload sections, but do not contain LTO sections, 1078 then there is no need to perform a link-time recompilation, i.e. 1079 lto-wrapper is used only for a compilation of offload images. */ 1080 if (have_offload && !have_lto) 1081 { 1082 for (i = 1; i < argc; ++i) 1083 if (strncmp (argv[i], "-fresolution=", sizeof ("-fresolution=") - 1)) 1084 { 1085 char *out_file; 1086 /* Can be ".o" or ".so". */ 1087 char *ext = strrchr (argv[i], '.'); 1088 if (ext == NULL) 1089 out_file = make_temp_file (""); 1090 else 1091 out_file = make_temp_file (ext); 1092 /* The linker will delete the files we give it, so make copies. */ 1093 copy_file (out_file, argv[i]); 1094 printf ("%s\n", out_file); 1095 } 1096 goto finish; 1097 } 1098 1099 if (lto_mode == LTO_MODE_LTO) 1100 { 1101 flto_out = make_temp_file (".lto.o"); 1102 if (linker_output) 1103 obstack_ptr_grow (&argv_obstack, linker_output); 1104 obstack_ptr_grow (&argv_obstack, "-o"); 1105 obstack_ptr_grow (&argv_obstack, flto_out); 1106 } 1107 else 1108 { 1109 const char *list_option = "-fltrans-output-list="; 1110 size_t list_option_len = strlen (list_option); 1111 char *tmp; 1112 1113 if (linker_output) 1114 { 1115 char *dumpbase = (char *) xmalloc (strlen (linker_output) 1116 + sizeof (".wpa") + 1); 1117 strcpy (dumpbase, linker_output); 1118 strcat (dumpbase, ".wpa"); 1119 obstack_ptr_grow (&argv_obstack, dumpbase); 1120 } 1121 1122 if (linker_output && save_temps) 1123 { 1124 ltrans_output_file = (char *) xmalloc (strlen (linker_output) 1125 + sizeof (".ltrans.out") + 1); 1126 strcpy (ltrans_output_file, linker_output); 1127 strcat (ltrans_output_file, ".ltrans.out"); 1128 } 1129 else 1130 ltrans_output_file = make_temp_file (".ltrans.out"); 1131 list_option_full = (char *) xmalloc (sizeof (char) * 1132 (strlen (ltrans_output_file) + list_option_len + 1)); 1133 tmp = list_option_full; 1134 1135 obstack_ptr_grow (&argv_obstack, tmp); 1136 strcpy (tmp, list_option); 1137 tmp += list_option_len; 1138 strcpy (tmp, ltrans_output_file); 1139 1140 if (jobserver) 1141 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver")); 1142 else if (parallel > 1) 1143 { 1144 char buf[256]; 1145 sprintf (buf, "-fwpa=%i", parallel); 1146 obstack_ptr_grow (&argv_obstack, xstrdup (buf)); 1147 } 1148 else 1149 obstack_ptr_grow (&argv_obstack, "-fwpa"); 1150 } 1151 1152 /* Append the input objects and possible preceding arguments. */ 1153 for (i = 0; i < lto_argc; ++i) 1154 obstack_ptr_grow (&argv_obstack, lto_argv[i]); 1155 obstack_ptr_grow (&argv_obstack, NULL); 1156 1157 new_argv = XOBFINISH (&argv_obstack, const char **); 1158 argv_ptr = &new_argv[new_head_argc]; 1159 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true); 1160 1161 if (lto_mode == LTO_MODE_LTO) 1162 { 1163 printf ("%s\n", flto_out); 1164 free (flto_out); 1165 flto_out = NULL; 1166 } 1167 else 1168 { 1169 FILE *stream = fopen (ltrans_output_file, "r"); 1170 FILE *mstream = NULL; 1171 struct obstack env_obstack; 1172 1173 if (!stream) 1174 fatal_error (input_location, "fopen: %s: %m", ltrans_output_file); 1175 1176 /* Parse the list of LTRANS inputs from the WPA stage. */ 1177 obstack_init (&env_obstack); 1178 nr = 0; 1179 for (;;) 1180 { 1181 const unsigned piece = 32; 1182 char *output_name = NULL; 1183 char *buf, *input_name = (char *)xmalloc (piece); 1184 size_t len; 1185 1186 buf = input_name; 1187cont: 1188 if (!fgets (buf, piece, stream)) 1189 break; 1190 len = strlen (input_name); 1191 if (input_name[len - 1] != '\n') 1192 { 1193 input_name = (char *)xrealloc (input_name, len + piece); 1194 buf = input_name + len; 1195 goto cont; 1196 } 1197 input_name[len - 1] = '\0'; 1198 1199 if (input_name[0] == '*') 1200 output_name = &input_name[1]; 1201 1202 nr++; 1203 input_names = (char **)xrealloc (input_names, nr * sizeof (char *)); 1204 output_names = (char **)xrealloc (output_names, nr * sizeof (char *)); 1205 input_names[nr-1] = input_name; 1206 output_names[nr-1] = output_name; 1207 } 1208 fclose (stream); 1209 maybe_unlink (ltrans_output_file); 1210 ltrans_output_file = NULL; 1211 1212 if (parallel) 1213 { 1214 makefile = make_temp_file (".mk"); 1215 mstream = fopen (makefile, "w"); 1216 } 1217 1218 /* Execute the LTRANS stage for each input file (or prepare a 1219 makefile to invoke this in parallel). */ 1220 for (i = 0; i < nr; ++i) 1221 { 1222 char *output_name; 1223 char *input_name = input_names[i]; 1224 /* If it's a pass-through file do nothing. */ 1225 if (output_names[i]) 1226 continue; 1227 1228 /* Replace the .o suffix with a .ltrans.o suffix and write 1229 the resulting name to the LTRANS output list. */ 1230 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2); 1231 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o")); 1232 output_name = XOBFINISH (&env_obstack, char *); 1233 1234 /* Adjust the dumpbase if the linker output file was seen. */ 1235 if (linker_output) 1236 { 1237 char *dumpbase 1238 = (char *) xmalloc (strlen (linker_output) 1239 + sizeof (DUMPBASE_SUFFIX) + 1); 1240 snprintf (dumpbase, 1241 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX), 1242 "%s.ltrans%u", linker_output, i); 1243 argv_ptr[0] = dumpbase; 1244 } 1245 1246 argv_ptr[1] = "-fltrans"; 1247 argv_ptr[2] = "-o"; 1248 argv_ptr[3] = output_name; 1249 argv_ptr[4] = input_name; 1250 argv_ptr[5] = NULL; 1251 if (parallel) 1252 { 1253 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]); 1254 for (j = 1; new_argv[j] != NULL; ++j) 1255 fprintf (mstream, " '%s'", new_argv[j]); 1256 fprintf (mstream, "\n"); 1257 /* If we are not preserving the ltrans input files then 1258 truncate them as soon as we have processed it. This 1259 reduces temporary disk-space usage. */ 1260 if (! save_temps) 1261 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 " 1262 "&& mv %s.tem %s\n", 1263 input_name, input_name, input_name, input_name); 1264 } 1265 else 1266 { 1267 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), 1268 true); 1269 maybe_unlink (input_name); 1270 } 1271 1272 output_names[i] = output_name; 1273 } 1274 if (parallel) 1275 { 1276 struct pex_obj *pex; 1277 char jobs[32]; 1278 1279 fprintf (mstream, "all:"); 1280 for (i = 0; i < nr; ++i) 1281 fprintf (mstream, " \\\n\t%s", output_names[i]); 1282 fprintf (mstream, "\n"); 1283 fclose (mstream); 1284 if (!jobserver) 1285 { 1286 /* Avoid passing --jobserver-fd= and similar flags 1287 unless jobserver mode is explicitly enabled. */ 1288 putenv (xstrdup ("MAKEFLAGS=")); 1289 putenv (xstrdup ("MFLAGS=")); 1290 } 1291 new_argv[0] = getenv ("MAKE"); 1292 if (!new_argv[0]) 1293 new_argv[0] = "make"; 1294 new_argv[1] = "-f"; 1295 new_argv[2] = makefile; 1296 i = 3; 1297 if (!jobserver) 1298 { 1299 snprintf (jobs, 31, "-j%d", parallel); 1300 new_argv[i++] = jobs; 1301 } 1302 new_argv[i++] = "all"; 1303 new_argv[i++] = NULL; 1304 pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv), 1305 NULL, NULL, PEX_SEARCH, false); 1306 do_wait (new_argv[0], pex); 1307 maybe_unlink (makefile); 1308 makefile = NULL; 1309 for (i = 0; i < nr; ++i) 1310 maybe_unlink (input_names[i]); 1311 } 1312 for (i = 0; i < nr; ++i) 1313 { 1314 fputs (output_names[i], stdout); 1315 putc ('\n', stdout); 1316 free (input_names[i]); 1317 } 1318 nr = 0; 1319 free (output_names); 1320 free (input_names); 1321 free (list_option_full); 1322 obstack_free (&env_obstack, NULL); 1323 } 1324 1325 finish: 1326 if (offloadend) 1327 printf ("%s\n", offloadend); 1328 1329 XDELETE (lto_argv); 1330 XDELETE (offload_argv); 1331 obstack_free (&argv_obstack, NULL); 1332} 1333 1334 1335/* Entry point. */ 1336 1337int 1338main (int argc, char *argv[]) 1339{ 1340 const char *p; 1341 1342 gcc_obstack_init (&opts_obstack); 1343 1344 p = argv[0] + strlen (argv[0]); 1345 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1])) 1346 --p; 1347 progname = p; 1348 1349 xmalloc_set_program_name (progname); 1350 1351 gcc_init_libintl (); 1352 1353 diagnostic_initialize (global_dc, 0); 1354 1355 if (atexit (lto_wrapper_cleanup) != 0) 1356 fatal_error (input_location, "atexit failed"); 1357 1358 if (signal (SIGINT, SIG_IGN) != SIG_IGN) 1359 signal (SIGINT, fatal_signal); 1360#ifdef SIGHUP 1361 if (signal (SIGHUP, SIG_IGN) != SIG_IGN) 1362 signal (SIGHUP, fatal_signal); 1363#endif 1364 if (signal (SIGTERM, SIG_IGN) != SIG_IGN) 1365 signal (SIGTERM, fatal_signal); 1366#ifdef SIGPIPE 1367 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN) 1368 signal (SIGPIPE, fatal_signal); 1369#endif 1370#ifdef SIGCHLD 1371 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will 1372 receive the signal. A different setting is inheritable */ 1373 signal (SIGCHLD, SIG_DFL); 1374#endif 1375 1376 /* We may be called with all the arguments stored in some file and 1377 passed with @file. Expand them into argv before processing. */ 1378 expandargv (&argc, &argv); 1379 1380 run_gcc (argc, argv); 1381 1382 return 0; 1383} 1384