fprintf (file, "#include \"target.h\"\n\n");
}
-auto_vec<const char *, 10> output_files;
+auto_vec<FILE *, 10> output_files;
static bool
handle_arg (const char *arg)
{
if (arg[1] == 'O')
{
- output_files.safe_push (&arg[2]);
+ FILE *file = fopen (&arg[2], "w");
+ output_files.safe_push (file);
return true;
}
return false;
/* Assign sequential codes to all entries in the machine description
in parallel with the tables in insn-output.cc. */
- int npatterns = count_patterns ();
md_rtx_info info;
- bool to_stdout = false;
- int npatterns_per_file = npatterns;
- if (!output_files.is_empty ())
- npatterns_per_file = npatterns / output_files.length () + 1;
- else
- to_stdout = true;
-
- gcc_assert (npatterns_per_file > 1);
+ if (output_files.is_empty ())
+ output_files.safe_push (stdout);
- /* Reverse so we can pop the first-added element. */
- output_files.reverse ();
+ for (auto f : output_files)
+ print_header (f);
- int count = 0;
FILE *file = NULL;
+ unsigned file_idx;
/* Read the machine description. */
while (read_md_rtx (&info))
{
- if (count == 0 || count == npatterns_per_file)
- {
- bool is_last = !to_stdout && output_files.is_empty ();
- if (file && !is_last)
- if (fclose (file) != 0)
- return FATAL_EXIT_CODE;
-
- if (!output_files.is_empty ())
- {
- const char *const filename = output_files.pop ();
- file = fopen (filename, "w");
- }
- else if (to_stdout)
- file = stdout;
- else
- break;
-
- print_header (file);
- count = 0;
- }
+ file = choose_output (output_files, file_idx);
switch (GET_CODE (info.def))
{
default:
break;
}
-
- count++;
}
+ file = choose_output (output_files, file_idx);
+
/* Write out the routines to add CLOBBERs to a pattern and say whether they
clobber a hard reg. */
output_add_clobbers (&info, file);
handle_overloaded_gen (oname, file);
}
- return (fclose (file) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
+ int ret = SUCCESS_EXIT_CODE;
+ for (FILE *f : output_files)
+ if (fclose (f) != 0)
+ ret = FATAL_EXIT_CODE;
+
+ return ret;
}
}
return false;
}
+
+/* Find the file to write into next. We try to evenly distribute the contents
+ over the different files. */
+
+#define SIZED_BASED_CHUNKS 1
+
+FILE *
+choose_output (const vec<FILE *> &parts, unsigned &idx)
+{
+ if (parts.length () == 0)
+ gcc_unreachable ();
+#ifdef SIZED_BASED_CHUNKS
+ FILE *shortest = NULL;
+ long min = 0;
+ idx = 0;
+ for (unsigned i = 0; i < parts.length (); i++)
+ {
+ FILE *part = parts[i];
+ long len = ftell (part);
+ if (!shortest || min > len)
+ {
+ shortest = part;
+ min = len;
+ idx = i;
+ }
+ }
+ return shortest;
+#else
+ static int current_file;
+ idx = current_file++ % parts.length ();
+ return parts[idx];
+#endif
+}