summaryrefslogtreecommitdiff
path: root/gcc/collect2.c
diff options
context:
space:
mode:
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-08 20:11:05 +0000
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-08 20:11:05 +0000
commit3f5e90a33b72b9b0cb3c955ca5c28e82db033136 (patch)
tree547569b1d1a28e530e730a8288aa2cc1a6d6fbb2 /gcc/collect2.c
parented2deec6f4667bd99b80bac2fe31450e1f4ad30d (diff)
downloadgcc-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.c81
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