Message ID | 20240428231612.25802-1-peter0x44@disroot.org |
---|---|
State | New |
Headers | show |
Series | [v3,1/2] Driver: Add new -truncate option | expand |
29 Apr 2024 12:16:26 am Peter Damianov <peter0x44@disroot.org>: > 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.o > $ ./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 | 6 ++++++ > gcc/gcc.cc | 14 ++++++++++++++ > 2 files changed, 20 insertions(+) > > diff --git a/gcc/common.opt b/gcc/common.opt > index ad348844775..40cab3cb36a 100644 > --- a/gcc/common.opt > +++ b/gcc/common.opt > @@ -422,6 +422,12 @@ 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-usage > when > +;; linking with many .LTRANS units. > +truncate > +Driver Separate Undocumented MissingArgError(missing filename after > %qs) > + > -verbose > Driver Alias(v) > > diff --git a/gcc/gcc.cc b/gcc/gcc.cc > index 728332b8153..830a4700a87 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. */ > @@ -4538,6 +4542,11 @@ driver_handle_option (struct gcc_options *opts, > do_save = false; > break; > > + case OPT_truncate: > + totruncate_file = arg; > + do_save = false; > + break; > + > case OPT____: > /* "-###" > This is similar to -v except that there is no execution > @@ -9286,6 +9295,11 @@ driver::final_actions () const > delete_failure_queue (); > delete_temp_files (); > > + if (totruncate_file != NULL && !seen_error ()) > + /* Truncate file specified by -truncate. > + Used by lto-wrapper to reduce temporary disk-space usage. */ > + truncate(totruncate_file, 0); > + > if (print_help_list) > { > printf (("\nFor bug reporting instructions, please see:\n")); > -- > 2.39.2 I resubmitted the patch because the previous one had a mistake. It didn't set "do_save" to false, so it resulted in problems like this: ./gcc/xgcc -truncate xgcc: error: missing filename after ‘-truncate’ xgcc: fatal error: no input files ./gcc/xgcc -truncate ?? xgcc: error: unrecognized command-line option ‘-truncate’ xgcc: fatal error: no input files Therefore regressing some tests, and not working properly. After fixing this, I ran all of the LTO tests again and observed no failures. I'm not sure how I ever observed it working before, but I'm reasonably confident this is correct now.
On Mon, Apr 29, 2024 at 1:27 AM Peter0x44 <peter0x44@disroot.org> wrote: > > 29 Apr 2024 12:16:26 am Peter Damianov <peter0x44@disroot.org>: > > > 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.o > > $ ./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 | 6 ++++++ > > gcc/gcc.cc | 14 ++++++++++++++ > > 2 files changed, 20 insertions(+) > > > > diff --git a/gcc/common.opt b/gcc/common.opt > > index ad348844775..40cab3cb36a 100644 > > --- a/gcc/common.opt > > +++ b/gcc/common.opt > > @@ -422,6 +422,12 @@ 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-usage > > when > > +;; linking with many .LTRANS units. > > +truncate > > +Driver Separate Undocumented MissingArgError(missing filename after > > %qs) > > + > > -verbose > > Driver Alias(v) > > > > diff --git a/gcc/gcc.cc b/gcc/gcc.cc > > index 728332b8153..830a4700a87 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. */ > > @@ -4538,6 +4542,11 @@ driver_handle_option (struct gcc_options *opts, > > do_save = false; > > break; > > > > + case OPT_truncate: > > + totruncate_file = arg; > > + do_save = false; > > + break; > > + > > case OPT____: > > /* "-###" > > This is similar to -v except that there is no execution > > @@ -9286,6 +9295,11 @@ driver::final_actions () const > > delete_failure_queue (); > > delete_temp_files (); > > > > + if (totruncate_file != NULL && !seen_error ()) > > + /* Truncate file specified by -truncate. > > + Used by lto-wrapper to reduce temporary disk-space usage. */ > > + truncate(totruncate_file, 0); > > + > > if (print_help_list) > > { > > printf (("\nFor bug reporting instructions, please see:\n")); > > -- > > 2.39.2 > I resubmitted the patch because the previous one had a mistake. > > It didn't set "do_save" to false, so it resulted in problems like this: > > ./gcc/xgcc -truncate > xgcc: error: missing filename after ‘-truncate’ > xgcc: fatal error: no input files > > ./gcc/xgcc -truncate ?? > xgcc: error: unrecognized command-line option ‘-truncate’ > xgcc: fatal error: no input files > > Therefore regressing some tests, and not working properly. > After fixing this, I ran all of the LTO tests again and observed no > failures. > > I'm not sure how I ever observed it working before, but I'm reasonably > confident this is correct now. The series is still OK. I suppose you do not have git write access so I am testing the series with a LTO bootstrap and will push it once that's successful. Thanks, Richard.
diff --git a/gcc/common.opt b/gcc/common.opt index ad348844775..40cab3cb36a 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -422,6 +422,12 @@ 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-usage when +;; linking with many .LTRANS units. +truncate +Driver Separate Undocumented MissingArgError(missing filename after %qs) + -verbose Driver Alias(v) diff --git a/gcc/gcc.cc b/gcc/gcc.cc index 728332b8153..830a4700a87 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. */ @@ -4538,6 +4542,11 @@ driver_handle_option (struct gcc_options *opts, do_save = false; break; + case OPT_truncate: + totruncate_file = arg; + do_save = false; + break; + case OPT____: /* "-###" This is similar to -v except that there is no execution @@ -9286,6 +9295,11 @@ driver::final_actions () const delete_failure_queue (); delete_temp_files (); + if (totruncate_file != NULL && !seen_error ()) + /* Truncate file specified by -truncate. + Used by lto-wrapper to reduce temporary disk-space usage. */ + truncate(totruncate_file, 0); + if (print_help_list) { printf (("\nFor bug reporting instructions, please see:\n"));
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.o $ ./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 | 6 ++++++ gcc/gcc.cc | 14 ++++++++++++++ 2 files changed, 20 insertions(+)