This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Add support for dumping multiple dump files under one name
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org, rguenther at suse dot de, dmalcolm at redhat dot com
- Date: Fri, 22 Jun 2018 13:16:14 +0200
- Subject: Add support for dumping multiple dump files under one name
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?
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