diff options
author | Olivier Hainque <hainque@adacore.com> | 2012-05-04 08:05:52 +0000 |
---|---|---|
committer | Olivier Hainque <hainque@gcc.gnu.org> | 2012-05-04 08:05:52 +0000 |
commit | 9178a345850d1c35cc1fe2bed529a8a0029c4251 (patch) | |
tree | 9b72ad775413c2a0a25e1d2594e350d5480b8620 /gcc/collect2.c | |
parent | b50ff8bbb379d7be46b3e516e02e4c9ed08d3c14 (diff) | |
download | gcc-9178a345850d1c35cc1fe2bed529a8a0029c4251.tar.gz |
collect2.c (may_unlink_output_file): New global.
* 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
Diffstat (limited to 'gcc/collect2.c')
-rw-r--r-- | gcc/collect2.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c index a52e95a64e2..d0166a5b5af 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -237,6 +237,12 @@ static const char *target_system_root = TARGET_SYSTEM_ROOT; 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. */ @@ -2095,15 +2101,22 @@ fork_execute (const char *prog, char **argv) do_wait (prog, pex); } -/* 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. */ |