aboutsummaryrefslogtreecommitdiff
path: root/gcc/tlink.c
diff options
context:
space:
mode:
authorAdam Nemet <anemet@lnxw.com>2004-08-25 20:51:19 +0000
committerAdam Nemet <nemet@gcc.gnu.org>2004-08-25 20:51:19 +0000
commit4185f1ce1a6cfa864c49caf8252934eea0762b1d (patch)
tree376e761c617dd59eb80c8d7976d9c89687cb92ad /gcc/tlink.c
parentd0c5c9b14da834ec8345a4aca53d45334cb5562a (diff)
downloadgcc-4185f1ce1a6cfa864c49caf8252934eea0762b1d.zip
gcc-4185f1ce1a6cfa864c49caf8252934eea0762b1d.tar.gz
gcc-4185f1ce1a6cfa864c49caf8252934eea0762b1d.tar.bz2
tlink.c (initial_cwd): New variable.
* tlink.c (initial_cwd): New variable. (tlink_init): Initialize it. (recompile_files): Use tlink_execute() instead of system(). Don't duplicate verbose output of collect_execute. Restore initial_cwd. Update comment before the function. From-SVN: r86577
Diffstat (limited to 'gcc/tlink.c')
-rw-r--r--gcc/tlink.c72
1 files changed, 57 insertions, 15 deletions
diff --git a/gcc/tlink.c b/gcc/tlink.c
index 2c5da90..935e309 100644
--- a/gcc/tlink.c
+++ b/gcc/tlink.c
@@ -38,6 +38,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
extern int prepends_underscore;
static int tlink_verbose;
+
+static char initial_cwd[MAXPATHLEN + 1];
/* Hash table boilerplate for working with htab_t. We have hash tables
for symbol names, file names, and demangled symbols. */
@@ -272,6 +274,8 @@ tlink_init (void)
if (debug)
tlink_verbose = 3;
}
+
+ getcwd (initial_cwd, sizeof (initial_cwd));
}
static int
@@ -432,9 +436,7 @@ maybe_tweak (char *line, file *f)
}
/* Update the repo files for each of the object files we have adjusted and
- recompile.
-
- XXX Should this use collect_execute instead of system? */
+ recompile. */
static int
recompile_files (void)
@@ -446,7 +448,10 @@ recompile_files (void)
while ((f = file_pop ()) != NULL)
{
- char *line, *command;
+ char *line;
+ const char *p, *q;
+ char **argv;
+ struct obstack arg_stack;
FILE *stream = fopen (f->key, "r");
const char *const outname = frob_extension (f->key, ".rnw");
FILE *output = fopen (outname, "w");
@@ -465,31 +470,68 @@ recompile_files (void)
fclose (output);
rename (outname, f->key);
- obstack_grow (&temporary_obstack, "cd ", 3);
- obstack_grow (&temporary_obstack, f->dir, strlen (f->dir));
- obstack_grow (&temporary_obstack, "; ", 2);
- obstack_grow (&temporary_obstack, c_file_name, strlen (c_file_name));
- obstack_1grow (&temporary_obstack, ' ');
if (!f->args)
{
error ("repository file `%s' does not contain command-line "
"arguments", f->key);
return 0;
}
- obstack_grow (&temporary_obstack, f->args, strlen (f->args));
- obstack_1grow (&temporary_obstack, ' ');
- command = obstack_copy0 (&temporary_obstack, f->main, strlen (f->main));
+
+ /* Build a null-terminated argv array suitable for
+ tlink_execute(). Manipulate arguments on the arg_stack while
+ building argv on the temporary_obstack. */
+
+ obstack_init (&arg_stack);
+ obstack_ptr_grow (&temporary_obstack, c_file_name);
+
+ for (p = f->args; *p != '\0'; p = q + 1)
+ {
+ /* Arguments are delimited by single-quotes. Find the
+ opening quote. */
+ p = strchr (p, '\'');
+ if (!p)
+ goto done;
+
+ /* Find the closing quote. */
+ q = strchr (p + 1, '\'');
+ if (!q)
+ goto done;
+
+ obstack_grow (&arg_stack, p + 1, q - (p + 1));
+
+ /* Replace '\'' with '. This is how set_collect_gcc_options
+ encodes a single-quote. */
+ while (q[1] == '\\' && q[2] == '\'' && q[3] == '\'')
+ {
+ const char *r;
+
+ r = strchr (q + 4, '\'');
+ if (!r)
+ goto done;
+
+ obstack_grow (&arg_stack, q + 3, r - (q + 3));
+ q = r;
+ }
+
+ obstack_1grow (&arg_stack, '\0');
+ obstack_ptr_grow (&temporary_obstack, obstack_finish (&arg_stack));
+ }
+ done:
+ obstack_ptr_grow (&temporary_obstack, f->main);
+ obstack_ptr_grow (&temporary_obstack, NULL);
+ argv = obstack_finish (&temporary_obstack);
if (tlink_verbose)
fprintf (stderr, _("collect: recompiling %s\n"), f->main);
- if (tlink_verbose >= 3)
- fprintf (stderr, "%s\n", command);
- if (system (command) != 0)
+ if (chdir (f->dir) != 0
+ || tlink_execute (c_file_name, argv, NULL) != 0
+ || chdir (initial_cwd) != 0)
return 0;
read_repo_file (f);
+ obstack_free (&arg_stack, NULL);
obstack_free (&temporary_obstack, temporary_firstobj);
}
return 1;