* collect2.c (may_unlink_output_file): New global.
(maybe_unlink): Honor it.
* collect2.h: Add extern for it.
* tlink.c (do_tlink): Set it to true if the link succeeded.
From-SVN: r187148
2012-05-04 Olivier Hainque <hainque@adacore.com>
+ * collect2.c (may_unlink_output_file): New global.
+ (maybe_unlink): Honor it.
+ * collect2.h: Add extern for it.
+ * tlink.c (do_tlink): Set it to true if the link succeeded.
+
+2012-05-04 Olivier Hainque <hainque@adacore.com>
+
* gcc.c (eval_spec_function): Finalize/restore the current string
obstack state as part of the context push/pop operations.
static const char *target_system_root = "";
#endif
+/* Whether we may unlink the output file, which should be set as soon as we
+ know we have successfully produced it. This is typically useful to prevent
+ blindly attempting to unlink a read-only output that the target linker
+ would leave untouched. */
+bool may_unlink_output_file = false;
+
/* Structure to hold all the directories in which to search for files to
execute. */
do_wait (prog, pex);
}
\f
-/* Unlink a file unless we are debugging. */
+/* Unlink FILE unless we are debugging or this is the output_file
+ and we may not unlink it. */
static void
maybe_unlink (const char *file)
{
- if (!debug)
- unlink_if_ordinary (file);
- else
- notice ("[Leaving %s]\n", file);
+ if (debug)
+ {
+ notice ("[Leaving %s]\n", file);
+ return;
+ }
+
+ if (file == output_file && !may_unlink_output_file)
+ return;
+
+ unlink_if_ordinary (file);
}
/* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */
extern struct obstack temporary_obstack;
extern char *temporary_firstobj;
extern bool vflag, debug;
+extern bool may_unlink_output_file;
extern void notice_translated (const char *, ...) ATTRIBUTE_PRINTF_1;
extern void notice (const char *, ...) ATTRIBUTE_PRINTF_1;
error ("ld returned %d exit status", exit);
collect_exit (exit);
}
+ else
+ {
+ /* We have just successfully produced an output file, so assume that we
+ may unlink it if need be for now on. */
+ may_unlink_output_file = true;
+ }
}