diff options
author | mrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-08 20:11:05 +0000 |
---|---|---|
committer | mrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-08 20:11:05 +0000 |
commit | 3f5e90a33b72b9b0cb3c955ca5c28e82db033136 (patch) | |
tree | 547569b1d1a28e530e730a8288aa2cc1a6d6fbb2 /gcc/collect2.c | |
parent | ed2deec6f4667bd99b80bac2fe31450e1f4ad30d (diff) | |
download | gcc-3f5e90a33b72b9b0cb3c955ca5c28e82db033136.tar.gz |
PR debug/46749
* config/darwin.h (COLLECT_RUN_DSYMUTIL): Add.
(DSYMUTIL_SPEC): Use `linker' flags instead to handle lto
better.
* config/darwin9.h (COLLECT_RUN_DSYMUTIL): Add.
(DSYMUTIL_SPEC): Use `linker' flags instead to handle lto
better.
* collect2.c (post_ld_pass): Add.
(process_args): Add.
(maybe_run_lto_and_relink): Call post_ld_pass after ld.
(main): Likewise. Call process_args.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167603 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/collect2.c')
-rw-r--r-- | gcc/collect2.c | 81 |
1 files changed, 79 insertions, 2 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c index 0b470271e4a..89b21d5eb50 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -333,6 +333,8 @@ static void write_aix_file (FILE *, struct id *); static char *resolve_lib_name (const char *); #endif static char *extract_string (const char **); +static void post_ld_pass (bool); +static void process_args (int *argcp, char **argv); /* Enumerations describing which pass this is for scanning the program file ... */ @@ -1054,6 +1056,7 @@ maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst, /* Run the linker again, this time replacing the object files optimized by the LTO with the temporary file generated by the LTO. */ fork_execute ("ld", out_lto_ld_argv); + post_ld_pass (true); free (lto_ld_argv); maybe_unlink_list (lto_o_files); @@ -1062,7 +1065,8 @@ maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst, { /* Our caller is relying on us to do the link even though there is no LTO back end work to be done. */ - fork_execute ("ld", lto_ld_argv); + fork_execute ("ld", lto_ld_argv); + post_ld_pass (false); } } @@ -1151,6 +1155,8 @@ main (int argc, char **argv) if (argv != old_argv) at_file_supplied = 1; + process_args (&argc, argv); + num_c_args = argc + 9; no_demangle = !! getenv ("COLLECT_NO_DEMANGLE"); @@ -1764,6 +1770,8 @@ main (int argc, char **argv) #endif if (lto_mode != LTO_MODE_NONE) maybe_run_lto_and_relink (ld1_argv, object_lst, object, false); + else + post_ld_pass (false); maybe_unlink (c_file); maybe_unlink (o_file); @@ -1835,6 +1843,8 @@ main (int argc, char **argv) #ifdef COLLECT_EXPORT_LIST maybe_unlink (export_file); #endif + post_ld_pass (false); + maybe_unlink (c_file); maybe_unlink (o_file); return 0; @@ -1920,7 +1930,10 @@ main (int argc, char **argv) if (lto_mode) maybe_run_lto_and_relink (ld2_argv, object_lst, object, true); else - fork_execute ("ld", ld2_argv); + { + fork_execute ("ld", ld2_argv); + post_ld_pass (false); + } /* Let scan_prog_file do any final mods (OSF/rose needs this for constructors/destructors in shared libraries. */ @@ -3203,3 +3216,67 @@ resolve_lib_name (const char *name) return (NULL); } #endif /* COLLECT_EXPORT_LIST */ + +#ifdef COLLECT_RUN_DSYMUTIL +static int flag_dsym = false; +static int flag_idsym = false; + +static void +process_args (int *argcp, char **argv) { + int i, j; + int argc = *argcp; + for (i=0; i<argc; ++i) + { + if (strcmp (argv[i], "-dsym") == 0) + { + flag_dsym = true; + /* Remove the flag, as we handle all processing for it. */ + j = i; + do + argv[j] = argv[j+1]; + while (++j < argc); + --i; + argc = --(*argcp); + } + else if (strcmp (argv[i], "-idsym") == 0) + { + flag_idsym = true; + /* Remove the flag, as we handle all processing for it. */ + j = i; + do + argv[j] = argv[j+1]; + while (++j < argc); + --i; + argc = --(*argcp); + } + } +} + +static void +do_dsymutil (const char *output_file) { + const char *dsymutil = DSYMUTIL + 1; + struct pex_obj *pex; + char **real_argv = XCNEWVEC (char *, 3); + const char ** argv = CONST_CAST2 (const char **, char **, + real_argv); + + argv[0] = dsymutil; + argv[1] = output_file; + argv[2] = (char *) 0; + + pex = collect_execute (dsymutil, real_argv, NULL, NULL, PEX_LAST | PEX_SEARCH); + do_wait (dsymutil, pex); +} + +static void +post_ld_pass (bool temp_file) { + if (!(temp_file && flag_idsym) && !flag_dsym) + return; + + do_dsymutil (output_file); +} +#else +static void +process_args (int *argcp ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { } +static void post_ld_pass (bool temp_file ATTRIBUTE_UNUSED) { } +#endif |