]> git.sur5r.net Git - cc65/commitdiff
Added .dbg statement generation for the assembler
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 22 May 2001 20:03:26 +0000 (20:03 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 22 May 2001 20:03:26 +0000 (20:03 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@744 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/codegen.c
src/cc65/codegen.h
src/cc65/codeseg.c
src/cc65/compile.c
src/cc65/compile.h
src/cc65/input.c
src/cc65/input.h
src/cc65/main.c

index ed60c9572a5b85ee6929770952e506adc47dde9f..add409b1d6e5de9f7bd87d9d99e025594cbf2df6 100644 (file)
@@ -143,32 +143,44 @@ void g_preamble (void)
     PushSegments (0);
 
     /* Identify the compiler version */
+    AddTextLine (";");
     AddTextLine ("; File generated by cc65 v %u.%u.%u",
                 VER_MAJOR, VER_MINOR, VER_PATCH);
+    AddTextLine (";");
 
     /* Insert some object file options */
-    AddTextLine (".fopt\t\tcompiler,\"cc65 v %u.%u.%u\"",
+    AddTextLine ("\t.fopt\t\tcompiler,\"cc65 v %u.%u.%u\"",
                    VER_MAJOR, VER_MINOR, VER_PATCH);
 
     /* If we're producing code for some other CPU, switch the command set */
     if (CPU == CPU_65C02) {
-       AddTextLine (".pc02");
+       AddTextLine ("\t.pc02");
     }
 
     /* Allow auto import for runtime library routines */
-    AddTextLine (".autoimport\ton");
+    AddTextLine ("\t.autoimport\ton");
 
     /* Switch the assembler into case sensitive mode */
-    AddTextLine (".case\t\ton");
+    AddTextLine ("\t.case\t\ton");
 
     /* Tell the assembler if we want to generate debug info */
-    AddTextLine (".debuginfo\t%s", (DebugInfo != 0)? "on" : "off");
+    AddTextLine ("\t.debuginfo\t%s", (DebugInfo != 0)? "on" : "off");
 
     /* Import the stack pointer for direct auto variable access */
-    AddTextLine (".importzp\tsp, sreg, regsave, regbank, tmp1, ptr1");
+    AddTextLine ("\t.importzp\tsp, sreg, regsave, regbank, tmp1, ptr1");
 
     /* Define long branch macros */
-    AddTextLine (".macpack\tlongbranch");
+    AddTextLine ("\t.macpack\tlongbranch");
+}
+
+
+
+void g_fileinfo (const char* Name, unsigned long Size, unsigned long MTime)
+/* If debug info is enabled, place a file info into the source */
+{
+    if (DebugInfo) {
+               AddTextLine ("\t.dbg\t\tfile, \"%s\", %lu, %lu", Name, Size, MTime);
+    }
 }
 
 
index a8253458066991ebd916710726512dc4e319fb1d..6bd016a232184247df307f46d5c9b8f66f20811c 100644 (file)
@@ -87,7 +87,7 @@ extern int oursp;
 
 
 /*****************************************************************************/
-/*                           Pre- and postamble                             */
+/*                        Files, pre- and postamble                         */
 /*****************************************************************************/
 
 
@@ -95,6 +95,9 @@ extern int oursp;
 void g_preamble (void);
 /* Generate the assembler code preamble */
 
+void g_fileinfo (const char* Name, unsigned long Size, unsigned long MTime);
+/* If debug info is enabled, place a file info into the source */
+
 
 
 /*****************************************************************************/
index 9371593d7bbc39a12aba40bde9ae3084c65c99bf..116b67b3027efd3032253490057b62c964fbf0c0 100644 (file)
@@ -944,13 +944,23 @@ void OutputCodeSeg (const CodeSeg* S, FILE* F)
        /* Get the next entry */
        const CodeEntry* E = CollConstAt (&S->Entries, I);
        /* Check if the line info has changed. If so, output the source line
-        * if the option is enabled.
+        * if the option is enabled and output debug line info if the debug
+        * option is enabled.
         */
        if (E->LI != LI) {
+           /* Line info has changed, remember the new line info */
            LI = E->LI;
+
+           /* Add the source line as a comment */
            if (AddSource) {
                fprintf (F, ";\n; %s\n;\n", LI->Line);
            }
+
+           /* Add line debug info */
+           if (DebugInfo) {
+               fprintf (F, "\t.dbg\tline, \"%s\", %u\n",
+                        GetInputName (LI), GetInputLine (LI));
+           }
        }
        /* Output the code */
        OutputCodeEntry (E, F);
index 6d0e88cebd934737028ea0870110bd150cf564af..99fdd24dbaec4d9777ccb3a4070bf6338a236a1d 100644 (file)
@@ -47,6 +47,7 @@
 #include "function.h"
 #include "global.h"
 #include "incpath.h"
+#include "input.h"
 #include "litpool.h"
 #include "macrotab.h"
 #include "pragma.h"
@@ -250,7 +251,7 @@ static void Parse (void)
 
 
 
-void Compile (void)
+void Compile (const char* FileName)
 /* Top level compile routine. Will setup things and call the parser. */
 {
     char* Path;
@@ -300,6 +301,9 @@ void Compile (void)
     /* Generate the code generator preamble */
     g_preamble ();
 
+    /* Open the input file */
+    OpenMainFile (FileName); 
+
     /* Ok, start the ball rolling... */
     Parse ();
 
index a6fc9f48655b1877fa1b89b945548b9e75ab282c..e1be3ee240464623127e2fd5d4135b3d351776de 100644 (file)
@@ -44,7 +44,7 @@
 
 
 
-void Compile (void);
+void Compile (const char* FileName);
 /* Top level compile routine. Will setup things and call the parser. */
 
 
index 307d3557ed533f7419961633e52479449a6ccc36..f650dac5e7eb41c2f750929179ab00e9146cdab6 100644 (file)
@@ -36,6 +36,8 @@
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
 /* common */
 #include "check.h"
@@ -43,7 +45,8 @@
 #include "xmalloc.h"
 
 /* cc65 */
-#include "asmcode.h"
+#include "asmcode.h" 
+#include "codegen.h"
 #include "error.h"
 #include "incpath.h"
 #include "lineinfo.h"
@@ -86,7 +89,53 @@ static Collection AFiles = STATIC_COLLECTION_INITIALIZER;
 
 
 /*****************************************************************************/
-/*                              struct IFile                                */
+/*                            Helper functions                              */
+/*****************************************************************************/
+
+
+
+static long GetFileSize (FILE* F)
+/* Calculate the size of the file F, return -1 on error. */
+{
+    long Size;
+    long CurPos = ftell (F);
+    if (CurPos < 0) {
+       /* Error */
+       return -1;
+    }
+    if (fseek (F, 0, SEEK_END) != 0) {
+       /* Error */
+       return -1;
+    }
+    Size = ftell (F);
+    if (Size < 0) {
+       /* Error */
+       return -1;
+    }
+    if (fseek (F, CurPos, SEEK_SET) != 0) {
+       /* Error */
+       return -1;
+    }
+    return Size;
+}
+
+
+
+static long GetFileTime (const char* Name)
+/* Get the time of last modification for the given file. Return -1 on errors. */
+{
+    struct stat Buf;
+    if (stat (Name, &Buf) != 0) {
+       /* Error */
+       return -1;
+    }
+    return (long) Buf.st_mtime;
+}
+
+
+
+/*****************************************************************************/
+/*                              struct IFile                                */
 /*****************************************************************************/
 
 
@@ -103,6 +152,8 @@ static IFile* NewIFile (const char* Name)
     /* Initialize the fields */
     IF->Index = CollCount (&IFiles) + 1;
     IF->Usage = 0;
+    IF->Size  = 0;
+    IF->MTime = 0;
     memcpy (IF->Name, Name, Len+1);
 
     /* Insert the new structure into the IFile collection */
@@ -131,8 +182,31 @@ static AFile* NewAFile (IFile* IF, FILE* F)
     AF->F     = F;
     AF->Input = IF;
 
-    /* Increment the usage counter of the corresponding IFile */
-    ++IF->Usage;
+    /* Increment the usage counter of the corresponding IFile. If this
+     * is the first use, set the file data and output debug info if
+     * requested.
+     */
+    if (IF->Usage++ == 0) {
+
+       long Val;
+
+       /* Get the file size */
+       Val = GetFileSize (AF->F);
+       if (Val < 0) {
+           Fatal ("Cannot seek on `%s': %s", IF->Name, strerror (errno));
+       }
+       IF->Size = Val;
+
+       /* Get the file modification time */
+               Val = GetFileTime (IF->Name);
+       if (Val < 0) {
+           Fatal ("Cannot stat `%s': %s", IF->Name, strerror (errno));
+       }
+       IF->MTime = Val;
+
+       /* Set the debug data */
+       g_fileinfo (IF->Name, IF->Size, IF->MTime);
+    }
 
     /* Insert the new structure into the AFile collection */
     CollAppend (&AFiles, AF);
index 873f05c010a92032c650983c8bcd7cd29fd96ef0..ad291c0f82648adec2d2ea022a9c50ede3196d85 100644 (file)
@@ -63,9 +63,11 @@ extern char NextC;
 /* Struct that describes an input file */
 typedef struct IFile IFile;
 struct IFile {
-    unsigned   Index;          /* File index                           */
-    unsigned   Usage;          /* Usage counter                        */
-    char               Name[1];        /* Name of file (dynamically allocated) */
+    unsigned       Index;      /* File index */
+    unsigned       Usage;      /* Usage counter */
+    unsigned long   Size;       /* File size */
+    unsigned long   MTime;      /* Time of last modification */
+    char                   Name[1];    /* Name of file (dynamically allocated) */
 };
 
 
@@ -84,7 +86,7 @@ void OpenIncludeFile (const char* Name, unsigned DirSpec);
 
 void ClearLine (void);
 /* Clear the current input line */
-
+                                                            
 void InitLine (const char* Buf);
 /* Initialize lptr from Buf and read CurC and NextC from the new input line */
 
index 28ed29066e49d03d8518d471bb9e68529e0a115d..9a7be501673b00eac460591b2c8d3426e90642a0 100644 (file)
@@ -57,7 +57,7 @@
 #include "error.h"
 #include "global.h"
 #include "incpath.h"
-#include "input.h"
+#include "input.h" 
 #include "macrotab.h"
 #include "scanner.h"
 #include "segments.h"
@@ -638,16 +638,13 @@ int main (int argc, char* argv[])
        AbEnd ("No input files");
     }
 
-    /* Open the input file */
-    OpenMainFile (InputFile);
-
     /* Create the output file name if it was not explicitly given */
     if (OutputFile == 0) {
        OutputFile = MakeFilename (InputFile, ".s");
     }
 
     /* Go! */
-    Compile ();
+    Compile (InputFile);
 
     /* Create the output file if we didn't had any errors */
     if (ErrorCount == 0 || Debug) {