1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-25 13:29:41 +00:00

Added an option to output the assembly after each transformation step of the

optimizer.


git-svn-id: svn://svn.cc65.org/cc65/trunk@5781 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2012-07-12 20:30:01 +00:00
parent 44f965c462
commit 49e5d19950
6 changed files with 112 additions and 20 deletions

View File

@ -35,6 +35,7 @@
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
/* common */
#include "abend.h"
@ -42,6 +43,7 @@
#include "cpu.h"
#include "debugflag.h"
#include "print.h"
#include "strbuf.h"
#include "xmalloc.h"
#include "xsprintf.h"
@ -49,6 +51,7 @@
#include "asmlabel.h"
#include "codeent.h"
#include "codeinfo.h"
#include "codeopt.h"
#include "coptadd.h"
#include "coptc02.h"
#include "coptcmp.h"
@ -65,7 +68,7 @@
#include "copttest.h"
#include "error.h"
#include "global.h"
#include "codeopt.h"
#include "output.h"
@ -1019,6 +1022,48 @@ static void WriteOptStats (const char* Name)
static void OpenDebugFile (const CodeSeg* S)
/* Open the debug file for the given segment if the flag is on */
{
if (DebugOptOutput) {
StrBuf Name = AUTO_STRBUF_INITIALIZER;
if (S->Func) {
SB_CopyStr (&Name, S->Func->Name);
} else {
SB_CopyStr (&Name, "global");
}
SB_AppendStr (&Name, ".opt");
SB_Terminate (&Name);
OpenDebugOutputFile (SB_GetConstBuf (&Name));
SB_Done (&Name);
}
}
static void WriteDebugOutput (CodeSeg* S, const char* Step)
/* Write a separator line into the debug file if the flag is on */
{
if (DebugOptOutput) {
/* Output a separator */
WriteOutput ("=========================================================================\n");
/* Output a header line */
if (Step == 0) {
/* Initial output */
WriteOutput ("Initial code for function `%s':\n",
S->Func? S->Func->Name : "<global>");
} else {
WriteOutput ("Code after applying `%s':\n", Step);
}
/* Output the code segment */
CS_Output (S);
}
}
static unsigned RunOptFunc (CodeSeg* S, OptFunc* F, unsigned Max)
/* Run one optimizer function Max times or until there are no more changes */
{
@ -1037,9 +1082,6 @@ static unsigned RunOptFunc (CodeSeg* S, OptFunc* F, unsigned Max)
/* Run the function */
C = F->Func (S);
if (Debug && C > 0) {
printf ("Applied %s: %u changes\n", F->Name, C);
}
Changes += C;
/* Do statistics */
@ -1048,8 +1090,12 @@ static unsigned RunOptFunc (CodeSeg* S, OptFunc* F, unsigned Max)
F->TotalChanges += C;
F->LastChanges += C;
/* If we had changes, regenerate register info */
/* If we had changes, output stuff and regenerate register info */
if (C) {
if (Debug) {
printf ("Applied %s: %u changes\n", F->Name, C);
}
WriteDebugOutput (S, F->Name);
CS_GenRegInfo (S);
}
@ -1352,6 +1398,10 @@ void RunOpt (CodeSeg* S)
Print (stdout, 1, "Running optimizer for global code segment\n");
}
/* If requested, open an output file */
OpenDebugFile (S);
WriteDebugOutput (S, 0);
/* Generate register info for all instructions */
CS_GenRegInfo (S);
@ -1367,9 +1417,14 @@ void RunOpt (CodeSeg* S)
/* Free register info */
CS_FreeRegInfo (S);
/* Close output file if necessary */
if (DebugOptOutput) {
CloseOutputFile ();
}
/* Write statistics */
if (StatFileName) {
WriteOptStats (StatFileName);
WriteOptStats (StatFileName);
}
}

View File

@ -6,7 +6,7 @@
/* */
/* */
/* */
/* (C) 1998-2011, Ullrich von Bassewitz */
/* (C) 1998-2012, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
@ -46,6 +46,7 @@
unsigned char AddSource = 0; /* Add source lines as comments */
unsigned char DebugInfo = 0; /* Add debug info to the obj */
unsigned char PreprocessOnly = 0; /* Just preprocess the input */
unsigned char DebugOptOutput = 0; /* Output debug stuff */
unsigned RegisterSpace = 6; /* Space available for register vars */
/* Stackable options */
@ -61,7 +62,7 @@ IntStack CheckStack = INTSTACK(0); /* Generate stack overflow checks */
IntStack Optimize = INTSTACK(0); /* Optimize flag */
IntStack CodeSizeFactor = INTSTACK(100);/* Size factor for generated code */
IntStack DataAlignment = INTSTACK(1); /* Alignment for data */
/* File names */
StrBuf DepName = STATIC_STRBUF_INITIALIZER; /* Name of dependencies file */
StrBuf FullDepName = STATIC_STRBUF_INITIALIZER; /* Name of full dependencies file */

View File

@ -6,7 +6,7 @@
/* */
/* */
/* */
/* (C) 1998-2011, Ullrich von Bassewitz */
/* (C) 1998-2012, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
@ -54,6 +54,7 @@
extern unsigned char AddSource; /* Add source lines as comments */
extern unsigned char DebugInfo; /* Add debug info to the obj */
extern unsigned char PreprocessOnly; /* Just preprocess the input */
extern unsigned char DebugOptOutput; /* Output debug stuff */
extern unsigned RegisterSpace; /* Space available for register vars */
/* Stackable options */

View File

@ -6,7 +6,7 @@
/* */
/* */
/* */
/* (C) 2000-2011, Ullrich von Bassewitz */
/* (C) 2000-2012, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
@ -505,6 +505,15 @@ static void OptDebugOpt (const char* Opt attribute ((unused)), const char* Arg)
static void OptDebugOptOutput (const char* Opt attribute ((unused)),
const char* Arg attribute ((unused)))
/* Output optimization steps */
{
DebugOptOutput = 1;
}
static void OptDepTarget (const char* Opt attribute ((unused)), const char* Arg)
/* Handle the --dep-target option */
{
@ -782,6 +791,7 @@ int main (int argc, char* argv[])
{ "--debug", 0, OptDebug },
{ "--debug-info", 0, OptDebugInfo },
{ "--debug-opt", 1, OptDebugOpt },
{ "--debug-opt-output", 0, OptDebugOptOutput },
{ "--dep-target", 1, OptDepTarget },
{ "--disable-opt", 1, OptDisableOpt },
{ "--enable-opt", 1, OptEnableOpt },

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 2009, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 2009-2012, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -109,6 +109,24 @@ void OpenOutputFile ()
void OpenDebugOutputFile (const char* Name)
/* Open an output file for debugging purposes. Will call Fatal() in case of
* failures.
*/
{
/* Output file must not be open and we must have a name*/
PRECONDITION (OutputFile == 0);
/* Open the file */
OutputFile = fopen (Name, "w");
if (OutputFile == 0) {
Fatal ("Cannot open debug output file `%s': %s", Name, strerror (errno));
}
Print (stdout, 1, "Opened debug output file `%s'\n", Name);
}
void CloseOutputFile ()
/* Close the output file. Will call Fatal() in case of failures. */
{
@ -121,6 +139,8 @@ void CloseOutputFile ()
Fatal ("Cannot write to output file (disk full?)");
}
Print (stdout, 1, "Closed output file `%s'\n", OutputFilename);
OutputFile = 0;
}

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 2009, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 2009-2012, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -46,7 +46,7 @@
/*****************************************************************************/
/* Data */
/* Data */
/*****************************************************************************/
@ -60,7 +60,7 @@ extern FILE* OutputFile;
/*****************************************************************************/
/* Code */
/* Code */
/*****************************************************************************/
@ -76,6 +76,11 @@ void MakeDefaultOutputName (const char* InputFilename);
void OpenOutputFile ();
/* Open the output file. Will call Fatal() in case of failures. */
void OpenDebugOutputFile (const char* Name);
/* Open an output file for debugging purposes. Will call Fatal() in case of
* failures.
*/
void CloseOutputFile ();
/* Close the output file. Will call Fatal() in case of failures. */