public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH 1/2] Driver: Add new -truncate option
@ 2024-04-18  0:56 Peter Damianov
  2024-04-18  0:56 ` [PATCH 2/2] lto-wrapper: Truncate files using -truncate driver option [PR110710] Peter Damianov
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Peter Damianov @ 2024-04-18  0:56 UTC (permalink / raw)
  To: gcc-patches; +Cc: richard.guenther, Peter Damianov

This commit adds a new option to the driver that truncates one file after
linking.

Tested likeso:

$ gcc hello.c -c
$ du -h hello.o
4.0K  hello.o
$ gcc hello.o -truncate hello
$ ./a.out
Hello world
$ du -h hello.o
$ 0   hello.o

$ gcc hello.o -truncate
gcc: error: missing filename after '-truncate'

The motivation for adding this is PR110710. It is used by lto-wrapper to
truncate files in a shell-independent manner.

Signed-off-by: Peter Damianov <peter0x44@disroot.org>
---
 gcc/common.opt |  5 +++++
 gcc/gcc.cc     | 13 +++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/gcc/common.opt b/gcc/common.opt
index ad348844775..3ede2fa8552 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -422,6 +422,11 @@ Display target specific command line options (including assembler and linker opt
 -time
 Driver Alias(time)
 
+;; Truncate the file specified after linking.
+;; This option is used by lto-wrapper to reduce the peak disk when linking with
+;; many .LTRANS units.
+Driver Separate Undocumented MissingArgError(missing filename after %qs)
+
 -verbose
 Driver Alias(v)
 
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index 728332b8153..00017964295 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -2138,6 +2138,10 @@ static int have_E = 0;
 /* Pointer to output file name passed in with -o. */
 static const char *output_file = 0;
 
+/* Pointer to input file name passed in with -truncate.
+   This file should be truncated after linking. */
+static const char *totruncate_file = 0;
+
 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
    temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
    it here.  */
@@ -4607,6 +4611,10 @@ driver_handle_option (struct gcc_options *opts,
       save_switch ("-o", 1, &arg, validated, true);
       return true;
 
+    case OPT_truncate:
+      totruncate_file = arg;
+      break;
+
     case OPT_pie:
 #ifdef ENABLE_DEFAULT_PIE
       /* -pie is turned on by default.  */
@@ -9273,6 +9281,11 @@ driver::maybe_run_linker (const char *argv0) const
 	       option).  */
 	    error ("%s: linker input file not found: %m", outfiles[i]);
 	}
+
+  if (totruncate_file != NULL && linker_was_run && !seen_error ())
+    /* Truncate file specified by -truncate.
+       Used by lto-wrapper to reduce temporary disk-space usage. */
+    truncate(totruncate_file, 0);
 }
 
 /* The end of "main".  */
-- 
2.39.2


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/2] lto-wrapper: Truncate files using -truncate driver option [PR110710]
  2024-04-18  0:56 [PATCH 1/2] Driver: Add new -truncate option Peter Damianov
@ 2024-04-18  0:56 ` Peter Damianov
  2024-04-18  1:08 ` [PATCH 1/2] Driver: Add new -truncate option Andrew Pinski
  2024-04-18  2:43 ` Peter0x44
  2 siblings, 0 replies; 4+ messages in thread
From: Peter Damianov @ 2024-04-18  0:56 UTC (permalink / raw)
  To: gcc-patches; +Cc: richard.guenther, Peter Damianov

This commit changes the Makefiles generated by lto-wrapper to no longer use
the "mv" and "touch" shell commands. These don't exist on Windows, so when the
Makefile attempts to call them, it results in errors like:
The system cannot find the file specified.

This problem only manifested when calling gcc from cmd.exe, and having no
sh.exe present on the PATH. The Windows port of GNU Make searches the PATH for
an sh.exe, and uses it if present.

I have tested this in environments with and without sh.exe on the PATH and
confirmed it works as expected.

Signed-off-by: Peter Damianov <peter0x44@disroot.org>
---
 gcc/lto-wrapper.cc | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/gcc/lto-wrapper.cc b/gcc/lto-wrapper.cc
index 02579951569..a36a59e6fb8 100644
--- a/gcc/lto-wrapper.cc
+++ b/gcc/lto-wrapper.cc
@@ -2023,14 +2023,12 @@ cont:
 	      fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
 	      for (j = 1; new_argv[j] != NULL; ++j)
 		fprintf (mstream, " '%s'", new_argv[j]);
-	      fprintf (mstream, "\n");
 	      /* If we are not preserving the ltrans input files then
 	         truncate them as soon as we have processed it.  This
 		 reduces temporary disk-space usage.  */
 	      if (! save_temps)
-		fprintf (mstream, "\t@-touch -r \"%s\" \"%s.tem\" > /dev/null "
-			 "2>&1 && mv \"%s.tem\" \"%s\"\n",
-			 input_name, input_name, input_name, input_name); 
+		fprintf (mstream, " '-truncate' '%s'", input_name);
+	      fprintf (mstream, "\n");
 	    }
 	  else
 	    {
-- 
2.39.2


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] Driver: Add new -truncate option
  2024-04-18  0:56 [PATCH 1/2] Driver: Add new -truncate option Peter Damianov
  2024-04-18  0:56 ` [PATCH 2/2] lto-wrapper: Truncate files using -truncate driver option [PR110710] Peter Damianov
@ 2024-04-18  1:08 ` Andrew Pinski
  2024-04-18  2:43 ` Peter0x44
  2 siblings, 0 replies; 4+ messages in thread
From: Andrew Pinski @ 2024-04-18  1:08 UTC (permalink / raw)
  To: Peter Damianov; +Cc: gcc-patches, richard.guenther

On Wed, Apr 17, 2024 at 5:57 PM Peter Damianov <peter0x44@disroot.org> wrote:
>
> This commit adds a new option to the driver that truncates one file after
> linking.
>
> Tested likeso:
>
> $ gcc hello.c -c
> $ du -h hello.o
> 4.0K  hello.o
> $ gcc hello.o -truncate hello
> $ ./a.out
> Hello world
> $ du -h hello.o
> $ 0   hello.o
>
> $ gcc hello.o -truncate
> gcc: error: missing filename after '-truncate'
>
> The motivation for adding this is PR110710. It is used by lto-wrapper to
> truncate files in a shell-independent manner.

I wonder if we should document this option or not. On one hand it is
only supposed to be used by lto but on the other hand, someone could
use it on accident from the command line and we would get a bug report
saying the file passed to it is now 0.

Thanks,
Andrew Pinski

>
> Signed-off-by: Peter Damianov <peter0x44@disroot.org>
> ---
>  gcc/common.opt |  5 +++++
>  gcc/gcc.cc     | 13 +++++++++++++
>  2 files changed, 18 insertions(+)
>
> diff --git a/gcc/common.opt b/gcc/common.opt
> index ad348844775..3ede2fa8552 100644
> --- a/gcc/common.opt
> +++ b/gcc/common.opt
> @@ -422,6 +422,11 @@ Display target specific command line options (including assembler and linker opt
>  -time
>  Driver Alias(time)
>
> +;; Truncate the file specified after linking.
> +;; This option is used by lto-wrapper to reduce the peak disk when linking with
> +;; many .LTRANS units.
> +Driver Separate Undocumented MissingArgError(missing filename after %qs)
> +
>  -verbose
>  Driver Alias(v)
>
> diff --git a/gcc/gcc.cc b/gcc/gcc.cc
> index 728332b8153..00017964295 100644
> --- a/gcc/gcc.cc
> +++ b/gcc/gcc.cc
> @@ -2138,6 +2138,10 @@ static int have_E = 0;
>  /* Pointer to output file name passed in with -o. */
>  static const char *output_file = 0;
>
> +/* Pointer to input file name passed in with -truncate.
> +   This file should be truncated after linking. */
> +static const char *totruncate_file = 0;
> +
>  /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
>     temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
>     it here.  */
> @@ -4607,6 +4611,10 @@ driver_handle_option (struct gcc_options *opts,
>        save_switch ("-o", 1, &arg, validated, true);
>        return true;
>
> +    case OPT_truncate:
> +      totruncate_file = arg;
> +      break;
> +
>      case OPT_pie:
>  #ifdef ENABLE_DEFAULT_PIE
>        /* -pie is turned on by default.  */
> @@ -9273,6 +9281,11 @@ driver::maybe_run_linker (const char *argv0) const
>                option).  */
>             error ("%s: linker input file not found: %m", outfiles[i]);
>         }
> +
> +  if (totruncate_file != NULL && linker_was_run && !seen_error ())
> +    /* Truncate file specified by -truncate.
> +       Used by lto-wrapper to reduce temporary disk-space usage. */
> +    truncate(totruncate_file, 0);
>  }
>
>  /* The end of "main".  */
> --
> 2.39.2
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] Driver: Add new -truncate option
  2024-04-18  0:56 [PATCH 1/2] Driver: Add new -truncate option Peter Damianov
  2024-04-18  0:56 ` [PATCH 2/2] lto-wrapper: Truncate files using -truncate driver option [PR110710] Peter Damianov
  2024-04-18  1:08 ` [PATCH 1/2] Driver: Add new -truncate option Andrew Pinski
@ 2024-04-18  2:43 ` Peter0x44
  2 siblings, 0 replies; 4+ messages in thread
From: Peter0x44 @ 2024-04-18  2:43 UTC (permalink / raw)
  To: gcc-patches; +Cc: richard.guenther

On 2024-04-17 17:56, Peter Damianov wrote:
> This commit adds a new option to the driver that truncates one file 
> after
> linking.
> 
> Tested likeso:
> 
> $ gcc hello.c -c
> $ du -h hello.o
> 4.0K  hello.o
> $ gcc hello.o -truncate hello
> $ ./a.out
> Hello world
> $ du -h hello.o
> $ 0   hello.o
> 
> $ gcc hello.o -truncate
> gcc: error: missing filename after '-truncate'
> 
> The motivation for adding this is PR110710. It is used by lto-wrapper 
> to
> truncate files in a shell-independent manner.
> 
> Signed-off-by: Peter Damianov <peter0x44@disroot.org>
> ---
>  gcc/common.opt |  5 +++++
>  gcc/gcc.cc     | 13 +++++++++++++
>  2 files changed, 18 insertions(+)
> 
> diff --git a/gcc/common.opt b/gcc/common.opt
> index ad348844775..3ede2fa8552 100644
> --- a/gcc/common.opt
> +++ b/gcc/common.opt
> @@ -422,6 +422,11 @@ Display target specific command line options 
> (including assembler and linker opt
>  -time
>  Driver Alias(time)
> 
> +;; Truncate the file specified after linking.
> +;; This option is used by lto-wrapper to reduce the peak disk when 
> linking with
> +;; many .LTRANS units.
> +Driver Separate Undocumented MissingArgError(missing filename after 
> %qs)
> +
>  -verbose
>  Driver Alias(v)
> 
> diff --git a/gcc/gcc.cc b/gcc/gcc.cc
> index 728332b8153..00017964295 100644
> --- a/gcc/gcc.cc
> +++ b/gcc/gcc.cc
> @@ -2138,6 +2138,10 @@ static int have_E = 0;
>  /* Pointer to output file name passed in with -o. */
>  static const char *output_file = 0;
> 
> +/* Pointer to input file name passed in with -truncate.
> +   This file should be truncated after linking. */
> +static const char *totruncate_file = 0;
> +
>  /* This is the list of suffixes and codes (%g/%u/%U/%j) and the 
> associated
>     temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made 
> for
>     it here.  */
> @@ -4607,6 +4611,10 @@ driver_handle_option (struct gcc_options *opts,
>        save_switch ("-o", 1, &arg, validated, true);
>        return true;
> 
> +    case OPT_truncate:
> +      totruncate_file = arg;
> +      break;
> +
>      case OPT_pie:
>  #ifdef ENABLE_DEFAULT_PIE
>        /* -pie is turned on by default.  */
> @@ -9273,6 +9281,11 @@ driver::maybe_run_linker (const char *argv0) 
> const
>  	       option).  */
>  	    error ("%s: linker input file not found: %m", outfiles[i]);
>  	}
> +
> +  if (totruncate_file != NULL && linker_was_run && !seen_error ())
> +    /* Truncate file specified by -truncate.
> +       Used by lto-wrapper to reduce temporary disk-space usage. */
> +    truncate(totruncate_file, 0);
On second thought, doing the truncation in driver::maybe_run_linker() 
seems wrong.
driver::final_actions seems like the better place to put this code.
Will resubmit.
>  }
> 
>  /* The end of "main".  */

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-04-18  2:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-18  0:56 [PATCH 1/2] Driver: Add new -truncate option Peter Damianov
2024-04-18  0:56 ` [PATCH 2/2] lto-wrapper: Truncate files using -truncate driver option [PR110710] Peter Damianov
2024-04-18  1:08 ` [PATCH 1/2] Driver: Add new -truncate option Andrew Pinski
2024-04-18  2:43 ` Peter0x44

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).