int eBBNum = 0;
set *graphEdges = NULL; /* list of edges in this flow graph */
+struct _dumpFiles dumpFiles[] = {
+ {DUMP_RAW0, ".dumpraw0", NULL},
+ {DUMP_RAW1, ".dumpraw1", NULL},
+ {DUMP_CSE, ".dumpcse", NULL},
+ {DUMP_DFLOW, ".dumpdflow", NULL},
+ {DUMP_GCSE, ".dumpgcse", NULL},
+ {DUMP_DEADCODE, ".dumpdeadcode", NULL},
+ {DUMP_LOOP, ".dumploop", NULL},
+ {DUMP_LOOPG, ".dumploopg", NULL},
+ {DUMP_LOOPD, ".dumploopd", NULL},
+ {DUMP_RANGE, ".dumprange", NULL},
+ {DUMP_PACK, ".dumppack", NULL},
+ {DUMP_RASSGN, ".dumprassgn", NULL},
+ {DUMP_LRANGE, ".dumplrange", NULL},
+ {0, NULL, NULL}
+};
+
/*-----------------------------------------------------------------*/
/* printEntryLabel - prints entry label of a ebblock */
/*-----------------------------------------------------------------*/
return ep;
}
+/*-----------------------------------------------------------------*/
+/* appendDumpFile - if not already created, create the dump file */
+/*-----------------------------------------------------------------*/
+FILE *appendDumpFile (int id) {
+ struct _dumpFiles *dumpFilesPtr=dumpFiles;
+
+ while (dumpFilesPtr->id) {
+ if (dumpFilesPtr->id==id)
+ break;
+ dumpFilesPtr++;
+ }
+
+ if (!dumpFilesPtr->id) {
+ fprintf (stdout, "internal error: appendDumpFile: unknown dump file.\n");
+ exit (1);
+ }
+
+ if (!dumpFilesPtr->filePtr) {
+ // not used before, create it
+ strcpy (buffer, srcFileName);
+ strcat (buffer, dumpFilesPtr->ext);
+ if (!(dumpFilesPtr->filePtr = fopen (buffer, "w"))) {
+ werror (E_FILE_OPEN_ERR, buffer);
+ exit (1);
+ }
+ //dprintf ("created: %s\n", buffer);
+ } else {
+ //dprintf ("appended: %s%s\n", srcFileName, dumpFilesPtr->ext);
+ }
+ return dumpFilesPtr->filePtr;
+}
+
+/*-----------------------------------------------------------------*/
+/* closeDumpFiles - close possible opened dumpfiles */
+/*-----------------------------------------------------------------*/
+void closeDumpFiles() {
+ struct _dumpFiles *dumpFilesPtr;
+
+ for (dumpFilesPtr=dumpFiles; dumpFilesPtr->id; dumpFilesPtr++) {
+ if (dumpFilesPtr->filePtr) {
+ fclose (dumpFilesPtr->filePtr);
+ //dprintf ("closed %s\n", dumpFilesPtr->ext);
+ }
+ }
+}
+
/*-----------------------------------------------------------------*/
/* dumpLiveRanges - dump liverange information into a file */
/*-----------------------------------------------------------------*/
void
-dumpLiveRanges (char *ext, hTab * liveRanges)
+dumpLiveRanges (int id, hTab * liveRanges)
{
FILE *file;
symbol *sym;
int k;
- if (ext)
- {
- /* create the file name */
- strcpy (buffer, srcFileName);
- strcat (buffer, ext);
-
- if (!(file = fopen (buffer, "a+")))
- {
- werror (E_FILE_OPEN_ERR, buffer);
- exit (1);
- }
- }
- else
+ if (id) {
+ file=appendDumpFile(id);
+ } else {
file = stdout;
+ }
for (sym = hTabFirstItem (liveRanges, &k); sym;
sym = hTabNextItem (liveRanges, &k))
fprintf (file, "\n");
}
- fclose (file);
+ fflush(file);
}
+
/*-----------------------------------------------------------------*/
/* dumpEbbsToFileExt - writeall the basic blocks to a file */
/*-----------------------------------------------------------------*/
void
-dumpEbbsToFileExt (char *ext, eBBlock ** ebbs, int count)
+dumpEbbsToFileExt (int id, eBBlock ** ebbs, int count)
{
FILE *of;
int i;
- if (ext)
- {
- /* create the file name */
- strcpy (buffer, srcFileName);
- strcat (buffer, ext);
-
- if (!(of = fopen (buffer, "w")))
- {
- werror (E_FILE_OPEN_ERR, buffer);
- exit (1);
- }
- }
- else
+ if (id) {
+ of=appendDumpFile(id);
+ } else {
of = stdout;
+ }
for (i = 0; i < count; i++)
{
fprintf (of, "\n----------------------------------------------------------------\n");
printiCChain (ebbs[i]->sch, of);
}
- fclose (of);
+ fflush(of);
}
/*-----------------------------------------------------------------*/
iCode *iCodeFromeBBlock (eBBlock **, int);
int otherPathsPresent (eBBlock **, eBBlock *);
void replaceLabel (eBBlock *, symbol *, symbol *);
-void dumpEbbsToFileExt (char *, eBBlock **, int);
-
-//#if defined(_MSC_VER)
-
-/*-----------------------------------------------------------------*/
-/* dumpLiveRanges - dump liverange information into a file */
-/*-----------------------------------------------------------------*/
-
-void dumpLiveRanges (char *ext, hTab * liveRanges);
-
-//#endif // _MSC_VER
+void dumpEbbsToFileExt (int, eBBlock **, int);
+void dumpLiveRanges (int, hTab * liveRanges);
+void closeDumpFiles();
#endif
#define wassert(a) wassertl(a,"code generator internal error")
+#define DUMP_RAW0 1
+#define DUMP_RAW1 DUMP_RAW0+1
+#define DUMP_CSE DUMP_RAW1+1
+#define DUMP_DFLOW DUMP_CSE+1
+#define DUMP_GCSE DUMP_DFLOW+1
+#define DUMP_DEADCODE DUMP_GCSE+1
+#define DUMP_LOOP DUMP_DEADCODE+1
+#define DUMP_LOOPG DUMP_LOOP+1
+#define DUMP_LOOPD DUMP_LOOPG+1
+#define DUMP_RANGE DUMP_LOOPD+1
+#define DUMP_PACK DUMP_RANGE+1
+#define DUMP_RASSGN DUMP_PACK+1
+#define DUMP_LRANGE DUMP_RASSGN+1
+
+struct _dumpFiles {
+ int id;
+ char *ext;
+ FILE *filePtr;
+};
+
+extern struct _dumpFiles dumpFiles[];
#endif
port->finaliseOptions ();
/* if no input then printUsage & exit */
- if ((!options.c1mode && !srcFileName && !nrelFiles) || (options.c1mode && !srcFileName && !options.out_name))
+ if ((!options.c1mode && !srcFileName && !nrelFiles) ||
+ (options.c1mode && !srcFileName && !options.out_name))
{
printUsage ();
exit (0);
}
+ closeDumpFiles();
+
if (cdbFile)
fclose (cdbFile);
/* dumpraw if asked for */
if (options.dump_raw)
- dumpEbbsToFileExt (".dumpraw0", ebbs, count);
+ dumpEbbsToFileExt (DUMP_RAW0, ebbs, count);
/* replace the local variables with their
register equivalents : the liveRange computation
/* dumpraw if asked for */
if (options.dump_raw)
- dumpEbbsToFileExt (".dumpraw1", ebbs, count);
+ dumpEbbsToFileExt (DUMP_RAW1, ebbs, count);
/* do common subexpression elimination for each block */
change = cseAllBlocks (ebbs, saveCount);
/* dumpraw if asked for */
if (options.dump_raw)
- dumpEbbsToFileExt (".dumpcse", ebbs, count);
+ dumpEbbsToFileExt (DUMP_CSE, ebbs, count);
/* compute the data flow */
computeDataFlow (ebbs, saveCount);
/* dumpraw if asked for */
if (options.dump_raw)
- dumpEbbsToFileExt (".dumpdflow", ebbs, count);
+ dumpEbbsToFileExt (DUMP_DFLOW, ebbs, count);
/* global common subexpression elimination */
if (optimize.global_cse)
{
change += cseAllBlocks (ebbs, saveCount);
if (options.dump_gcse)
- dumpEbbsToFileExt (".dumpgcse", ebbs, saveCount);
+ dumpEbbsToFileExt (DUMP_GCSE, ebbs, saveCount);
}
/* kill dead code */
kchange = killDeadCode (ebbs, saveCount);
if (options.dump_kill)
- dumpEbbsToFileExt (".dumpdeadcode", ebbs, count);
+ dumpEbbsToFileExt (DUMP_DEADCODE, ebbs, count);
/* do loop optimizations */
change += (lchange = loopOptimizations (loops, ebbs, count));
if (options.dump_loop)
- dumpEbbsToFileExt (".dumploop", ebbs, count);
+ dumpEbbsToFileExt (DUMP_LOOP, ebbs, count);
/* recompute the data flow and apply global cse again
if loops optimizations or dead code caused a change:
computeDataFlow (ebbs, saveCount);
change += cseAllBlocks (ebbs, saveCount);
if (options.dump_loop)
- dumpEbbsToFileExt (".dumploopg", ebbs, count);
+ dumpEbbsToFileExt (DUMP_LOOPG, ebbs, count);
/* if loop optimizations caused a change then do
dead code elimination once more : this will
killDeadCode (ebbs, saveCount);
if (options.dump_loop)
- dumpEbbsToFileExt (".dumploopd", ebbs, count);
+ dumpEbbsToFileExt (DUMP_LOOPD, ebbs, count);
}
computeLiveRanges (ebbs, count);
if (options.dump_range)
- dumpEbbsToFileExt (".dumprange", ebbs, count);
+ dumpEbbsToFileExt (DUMP_RANGE, ebbs, count);
/* Now that we have the live ranges, discard parameter
* receives for unused parameters.