Add support for dumping multiple dump files under one name
Richard Biener
rguenther@suse.de
Fri Jun 29 08:47:00 GMT 2018
On Fri, 22 Jun 2018, Jan Hubicka wrote:
> Hi,
> this patch adds dumpfile support for dumps that come in multiple parts. This
> is needed for WPA stream-out dump since we stream partitions in parallel and
> the dumps would come up in random order. Parts are added by new parameter that
> is initialzed by default to -1 (no parts).
>
> One thing I skipped is any support for duplicated opening of file
> with parts since I do not need it.
>
> Bootstrapped/regtested x86_64-linux, OK?
Looks reasonable - David, anything you want to add / have changed?
Thanks,
Richard.
> Honza
>
> * dumpfile.c (gcc::dump_manager::get_dump_file_name): Add PART
> parameter.
> (gcc::dump_manager::get_dump_file_name): likewise.
> (dump_begin): Likewise.
> * dumpfile.h (dump_begin): Update prototype.
> (gcc::dump_manager::get_dump_file_name,
> gcc::dump_manager::get_dump_file_name): Update prototype.
> Index: dumpfile.c
> ===================================================================
> --- dumpfile.c (revision 261885)
> +++ dumpfile.c (working copy)
> @@ -269,7 +269,7 @@ get_dump_file_info_by_switch (const char
>
> char *
> gcc::dump_manager::
> -get_dump_file_name (int phase) const
> +get_dump_file_name (int phase, int part) const
> {
> struct dump_file_info *dfi;
>
> @@ -278,7 +278,7 @@ get_dump_file_name (int phase) const
>
> dfi = get_dump_file_info (phase);
>
> - return get_dump_file_name (dfi);
> + return get_dump_file_name (dfi, part);
> }
>
> /* Return the name of the dump file for the given dump_file_info.
> @@ -288,7 +288,7 @@ get_dump_file_name (int phase) const
>
> char *
> gcc::dump_manager::
> -get_dump_file_name (struct dump_file_info *dfi) const
> +get_dump_file_name (struct dump_file_info *dfi, int part) const
> {
> char dump_id[10];
>
> @@ -312,7 +312,14 @@ get_dump_file_name (struct dump_file_inf
> dump_id[0] = '\0';
> }
>
> - return concat (dump_base_name, dump_id, dfi->suffix, NULL);
> + if (part != -1)
> + {
> + char part_id[8];
> + snprintf (part_id, sizeof (part_id), ".%i", part);
> + return concat (dump_base_name, dump_id, part_id, dfi->suffix, NULL);
> + }
> + else
> + return concat (dump_base_name, dump_id, dfi->suffix, NULL);
> }
>
> /* Open a dump file called FILENAME. Some filenames are special and
> @@ -592,17 +599,19 @@ dump_finish (int phase)
> /* Begin a tree dump for PHASE. Stores any user supplied flag in
> *FLAG_PTR and returns a stream to write to. If the dump is not
> enabled, returns NULL.
> - Multiple calls will reopen and append to the dump file. */
> + PART can be used for dump files which should be split to multiple
> + parts. PART == -1 indicates dump file with no parts.
> + If PART is -1, multiple calls will reopen and append to the dump file. */
>
> FILE *
> -dump_begin (int phase, dump_flags_t *flag_ptr)
> +dump_begin (int phase, dump_flags_t *flag_ptr, int part)
> {
> - return g->get_dumps ()->dump_begin (phase, flag_ptr);
> + return g->get_dumps ()->dump_begin (phase, flag_ptr, part);
> }
>
> FILE *
> gcc::dump_manager::
> -dump_begin (int phase, dump_flags_t *flag_ptr)
> +dump_begin (int phase, dump_flags_t *flag_ptr, int part)
> {
> char *name;
> struct dump_file_info *dfi;
> @@ -611,12 +620,14 @@ dump_begin (int phase, dump_flags_t *fla
> if (phase == TDI_none || !dump_phase_enabled_p (phase))
> return NULL;
>
> - name = get_dump_file_name (phase);
> + name = get_dump_file_name (phase, part);
> if (!name)
> return NULL;
> dfi = get_dump_file_info (phase);
>
> - stream = dump_open (name, dfi->pstate < 0);
> + /* We do not support re-opening of dump files with parts. This would require
> + tracking pstate per part of the dump file. */
> + stream = dump_open (name, part != -1 || dfi->pstate < 0);
> if (stream)
> dfi->pstate = 1;
> free (name);
> Index: dumpfile.h
> ===================================================================
> --- dumpfile.h (revision 261885)
> +++ dumpfile.h (working copy)
> @@ -269,7 +269,7 @@ struct dump_file_info
> };
>
> /* In dumpfile.c */
> -extern FILE *dump_begin (int, dump_flags_t *);
> +extern FILE *dump_begin (int, dump_flags_t *, int part=-1);
> extern void dump_end (int, FILE *);
> extern int opt_info_switch_p (const char *);
> extern const char *dump_flag_name (int);
> @@ -343,10 +343,10 @@ public:
> /* Return the name of the dump file for the given phase.
> If the dump is not enabled, returns NULL. */
> char *
> - get_dump_file_name (int phase) const;
> + get_dump_file_name (int phase, int part = -1) const;
>
> char *
> - get_dump_file_name (struct dump_file_info *dfi) const;
> + get_dump_file_name (struct dump_file_info *dfi, int part = -1) const;
>
> int
> dump_switch_p (const char *arg);
> @@ -365,7 +365,7 @@ public:
> dump_finish (int phase);
>
> FILE *
> - dump_begin (int phase, dump_flags_t *flag_ptr);
> + dump_begin (int phase, dump_flags_t *flag_ptr, int part);
>
> /* Returns nonzero if tree dump PHASE has been initialized. */
> int
>
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)
More information about the Gcc-patches
mailing list