]> git.sur5r.net Git - cc65/commitdiff
Fragments and assertions reference LineInfo items instead of having separate
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 24 Jan 2011 22:39:07 +0000 (22:39 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 24 Jan 2011 22:39:07 +0000 (22:39 +0000)
embedded FilePos items.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4915 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/asserts.c
src/ld65/fragment.c
src/ld65/fragment.h
src/ld65/lineinfo.c
src/ld65/lineinfo.h
src/ld65/objdata.c
src/ld65/objdata.h
src/ld65/objfile.c
src/ld65/segments.c

index d0902e924ea3619c92611f78500d5983a78ffcec..67ecf28a40c1b85361b8e30a90a32a5929cede77 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2003-2009, Ullrich von Bassewitz                                      */
+/* (C) 2003-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -41,8 +41,9 @@
 /* ld65 */
 #include "asserts.h"
 #include "error.h"
-#include "expr.h"
+#include "expr.h"    
 #include "fileio.h"
+#include "lineinfo.h"
 #include "objdata.h"
 #include "spool.h"
 
@@ -56,7 +57,7 @@
 
 /* Assertion struct decl */
 struct Assertion {
-    FilePos             Pos;            /* File position of assertion */
+    Collection          LineInfos;      /* File position of assertion */
     ExprNode*           Expr;           /* Expression to evaluate */
     AssertAction        Action;         /* What to do */
     unsigned            Msg;            /* Message to print */
@@ -74,6 +75,30 @@ static Collection Assertions = STATIC_COLLECTION_INITIALIZER;
 
 
 
+static const char* GetAssertionSourceName (const Assertion* A)
+/* Return the name of the source file for this assertion */
+{
+    /* Each assertion has the basic info in line info #0 */
+    const LineInfo* LI = CollConstAt (&A->LineInfos, 0);
+
+    /* Return the source file name */
+    return GetSourceFileName (A->Obj, LI->Pos.Name);
+}
+
+
+
+static unsigned long GetAssertionSourceLine (const Assertion* A)
+/* Return the source file line for this fragment */
+{
+    /* Each assertion has the basic info in line info #0 */
+    const LineInfo* LI = CollConstAt (&A->LineInfos, 0);
+
+    /* Return the source file line */
+    return LI->Pos.Line;
+}
+
+
+
 Assertion* ReadAssertion (FILE* F, struct ObjData* O)
 /* Read an assertion from the given file */
 {
@@ -84,7 +109,7 @@ Assertion* ReadAssertion (FILE* F, struct ObjData* O)
     A->Expr = ReadExpr (F, O);
     A->Action = (AssertAction) ReadVar (F);
     A->Msg = MakeGlobalStringId (O, ReadVar (F));
-    ReadFilePos (F, &A->Pos);
+    ReadLineInfoList (F, O, &A->LineInfos);
 
     /* Set remaining fields */
     A->Obj = O;
@@ -106,6 +131,9 @@ void CheckAssertions (void)
     /* Walk over all assertions */
     for (I = 0; I < CollCount (&Assertions); ++I) {
 
+        const char* Module;
+        unsigned long Line;
+
         /* Get the assertion */
         Assertion* A = CollAtUnchecked (&Assertions, I);
 
@@ -114,32 +142,35 @@ void CheckAssertions (void)
             continue;
         }
 
+        /* Retrieve module name and line number */
+        Module  = GetAssertionSourceName (A);
+        Line    = GetAssertionSourceLine (A);
+
         /* If the expression is not constant, we're not able to handle it */
         if (!IsConstExpr (A->Expr)) {
             Warning ("Cannot evaluate assertion in module `%s', line %lu",
-                     GetSourceFileName (A->Obj, A->Pos.Name), A->Pos.Line);
+                     Module, Line);
         } else if (GetExprVal (A->Expr) == 0) {
 
             /* Assertion failed */
-            const char* Module  = GetSourceFileName (A->Obj, A->Pos.Name);
             const char* Message = GetString (A->Msg);
 
             switch (A->Action) {
 
                 case ASSERT_ACT_WARN:
                 case ASSERT_ACT_LDWARN:
-                    Warning ("%s(%lu): %s", Module, A->Pos.Line, Message);
+                    Warning ("%s(%lu): %s", Module, Line, Message);
                     break;
 
                 case ASSERT_ACT_ERROR:
                 case ASSERT_ACT_LDERROR:
-                    Error ("%s(%lu): %s", Module, A->Pos.Line, Message);
+                    Error ("%s(%lu): %s", Module, Line, Message);
                     break;
 
                 default:
                     Internal ("Invalid assertion action (%u) in module `%s', "
                               "line %lu (file corrupt?)",
-                              A->Action, Module, A->Pos.Line);
+                              A->Action, Module, Line);
                     break;
             }
         }
index 3dfbceb91879279a87855da5a7c7565c1564deab..55a9847d02ef9bc7fb94395a958e2313e7b6162d 100644 (file)
@@ -98,14 +98,19 @@ Fragment* NewFragment (unsigned char Type, unsigned Size, Section* S)
 
 
 
-void AddLineInfo (Fragment* F, LineInfo* LI)
-/* Add the line info to the given fragment */
+void FragResolveLineInfos (Fragment* F)
+/* Resolve the back pointers for the line infos */
 {
-    /* Point from the fragment to the line info ... */
-    CollAppend (&F->LineInfos, LI);
+    unsigned I;
 
-    /* ... and back from the line info to the fragment */
-    CollAppend (&LI->Fragments, F);
+    /* Walk over all line infos for this fragment */
+    for (I = 0; I < CollCount (&F->LineInfos); ++I) {
+        /* Get a pointer to this line info */
+        LineInfo* LI = CollAtUnchecked (&F->LineInfos, I);
+
+        /* Add the back pointer to the line info */
+        CollAppend (&LI->Fragments, F);
+    }
 }
 
 
index 24ebc3e196668750539531be9644aca7f8846eda..9146aa2720fbd2904bfb482f3212413cb9b7f447 100644 (file)
@@ -86,8 +86,8 @@ struct Fragment {
 Fragment* NewFragment (unsigned char Type, unsigned Size, struct Section* S);
 /* Create a new fragment and insert it into the section S */
 
-void AddLineInfo (Fragment* F, struct LineInfo* LI);
-/* Add the line info to the given fragment */
+void FragResolveLineInfos (Fragment* F);
+/* Resolve the back pointers for the line infos */
 
 const char* GetFragmentSourceName (const Fragment* F);
 /* Return the name of the source file for this fragment */
index bbdc3548eded866357f57a6f4971e9582dffd8e5..be087096bcfeab919563ae92a71df2feaaae1d18 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2001-2010, Ullrich von Bassewitz                                      */
+/* (C) 2001-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -69,7 +69,7 @@ static CodeRange* NewCodeRange (Segment* Seg, unsigned long Offs, unsigned long
 
 
 
-LineInfo* NewLineInfo (ObjData* O, const FilePos* Pos)
+static LineInfo* NewLineInfo (ObjData* O, const FilePos* Pos)
 /* Create and return a new LineInfo struct */
 {
     /* Allocate memory */
@@ -103,6 +103,36 @@ LineInfo* ReadLineInfo (FILE* F, ObjData* O)
 
 
 
+void ReadLineInfoList (FILE* F, ObjData* O, Collection* LineInfos)
+/* Read a list of line infos stored as a list of indices in the object file,
+ * make real line infos from them and place them into the passed collection.
+ */
+{
+    /* Read the number of line info indices that follow */
+    unsigned LineInfoCount = ReadVar (F);
+
+    /* Read the line infos and resolve them */
+    while (LineInfoCount--) {
+
+        /* Read an index */
+        unsigned LineInfoIndex = ReadVar (F);
+
+        /* The line info index was written by the assembler and must
+         * therefore be part of the line infos read from the object file.
+         */
+        if (LineInfoIndex >= CollCount (&O->LineInfos)) {
+            Internal ("Invalid line info index %u in module `%s'",
+                      LineInfoIndex,
+                      GetObjFileName (O));
+        }
+
+        /* Add the line info to the collection */
+        CollAppend (LineInfos, CollAt (&O->LineInfos, LineInfoIndex));
+    }
+}
+
+
+
 static void AddCodeRange (LineInfo* LI, Segment* Seg, unsigned long Offs,
                           unsigned long Size)
 /* Add a range of code to this line */
index f47fa44a9576d0d7549f8c188deb2285b98d5331..fb7da71933858be55d35811cde931b1a17581024 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2001-2010, Ullrich von Bassewitz                                      */
+/* (C) 2001-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -88,12 +88,14 @@ struct LineInfo {
 
 
 
-LineInfo* NewLineInfo (struct ObjData* O, const FilePos* Pos);
-/* Create and return a new LineInfo struct */
-
 LineInfo* ReadLineInfo (FILE* F, struct ObjData* O);
 /* Read a line info from a file and return it */
 
+void ReadLineInfoList (FILE* F, struct ObjData* O, Collection* LineInfos);
+/* Read a list of line infos stored as a list of indices in the object file,
+ * make real line infos from them and place them into the passed collection.
+ */
+
 void RelocLineInfo (struct Segment* S);
 /* Relocate the line info for a segment. */
 
index 03eb86043ff1f09db2a23ffce702f3d9070e13ae..6f7e28bc125fc0e93ac2df1a80b50cf24a551865 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/* (C) 1998-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -78,23 +78,15 @@ ObjData* NewObjData (void)
     O->MTime            = 0;
     O->Start           = 0;
     O->Flags                   = 0;
-    O->FileCount        = 0;
     O->Files            = EmptyCollection;
-    O->SectionCount     = 0;
     O->Sections         = EmptyCollection;
-    O->ExportCount     = 0;
     O->Exports         = EmptyCollection;
-    O->ImportCount     = 0;
     O->Imports         = EmptyCollection;
-    O->DbgSymCount     = 0;
     O->DbgSyms         = EmptyCollection;
-    O->LineInfoCount    = 0;
     O->LineInfos        = EmptyCollection;
     O->StringCount      = 0;
     O->Strings          = 0;
-    O->AssertionCount   = 0;
     O->Assertions       = EmptyCollection;
-    O->ScopeCount       = 0;
     O->Scopes           = EmptyCollection;
 
     /* Return the new entry */
index a6e785455c53f06d43f5192cbbfc47eab0548a15..9efbf85de4c423013f28977010d32878f410e1a5 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/* (C) 1998-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -64,23 +64,15 @@ struct ObjData {
     ObjHeader          Header;         /* Header of file */
     unsigned long      Start;          /* Start offset of data in library */
     unsigned           Flags;
-    unsigned           FileCount;      /* Input file count */
     Collection          Files;         /* List of input files */
-    unsigned           SectionCount;   /* Count of sections in this object */
     Collection          Sections;      /* List of all sections */
-    unsigned           ExportCount;    /* Count of exports */
     Collection          Exports;               /* List of all exports */
-    unsigned           ImportCount;    /* Count of imports */
     Collection          Imports;       /* List of all imports */
-    unsigned           DbgSymCount;    /* Count of debug symbols */
     Collection          DbgSyms;               /* List of debug symbols */
-    unsigned            LineInfoCount;  /* Count of additional line infos */
-    Collection          LineInfos;      /* List of additional line infos */
+    Collection          LineInfos;      /* List of line infos */
     unsigned            StringCount;    /* Count of strings */
     unsigned*           Strings;        /* List of global string indices */
-    unsigned            AssertionCount; /* Count of module assertions */
     Collection          Assertions;     /* List of module assertions */
-    unsigned            ScopeCount;     /* Count of scopes */
     Collection          Scopes;         /* List of scopes */
 };
 
index 0de4c70eecf03ec850dfa9eb4b8ab88f879a18be..a38497cb78d04771d81698dd14d36349409e4318 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                          */
 /*                                                                          */
 /*                                                                          */
-/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/* (C) 1998-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -114,14 +114,15 @@ void ObjReadFiles (FILE* F, unsigned long Pos, ObjData* O)
 /* Read the files list from a file at the given position */
 {
     unsigned I;
+    unsigned FileCount;
 
     /* Seek to the correct position */
     FileSetPos (F, Pos);
 
     /* Read the data */
-    O->FileCount  = ReadVar (F);
-    CollGrow (&O->Files, O->FileCount);
-    for (I = 0; I < O->FileCount; ++I) {
+    FileCount  = ReadVar (F);
+    CollGrow (&O->Files, FileCount);
+    for (I = 0; I < FileCount; ++I) {
                CollAppend (&O->Files, ReadFileInfo (F, O));
     }
 }
@@ -131,15 +132,16 @@ void ObjReadFiles (FILE* F, unsigned long Pos, ObjData* O)
 void ObjReadSections (FILE* F, unsigned long Pos, ObjData* O)
 /* Read the section data from a file at the given position */
 {
-    unsigned I;
+    unsigned I;     
+    unsigned SectionCount;
 
     /* Seek to the correct position */
     FileSetPos (F, Pos);
 
     /* Read the data */
-    O->SectionCount = ReadVar (F);
-    CollGrow (&O->Sections, O->SectionCount);
-    for (I = 0; I < O->SectionCount; ++I) {
+    SectionCount = ReadVar (F);
+    CollGrow (&O->Sections, SectionCount);
+    for (I = 0; I < SectionCount; ++I) {
                CollAppend (&O->Sections, ReadSection (F, O));
     }
 }
@@ -149,15 +151,16 @@ void ObjReadSections (FILE* F, unsigned long Pos, ObjData* O)
 void ObjReadImports (FILE* F, unsigned long Pos, ObjData* O)
 /* Read the imports from a file at the given position */
 {
-    unsigned I;
+    unsigned I;     
+    unsigned ImportCount;
 
     /* Seek to the correct position */
     FileSetPos (F, Pos);
 
     /* Read the data */
-    O->ImportCount = ReadVar (F);
-    CollGrow (&O->Imports, O->ImportCount);
-    for (I = 0; I < O->ImportCount; ++I) {
+    ImportCount = ReadVar (F);
+    CollGrow (&O->Imports, ImportCount);
+    for (I = 0; I < ImportCount; ++I) {
                CollAppend (&O->Imports, ReadImport (F, O));
     }
 }
@@ -167,15 +170,16 @@ void ObjReadImports (FILE* F, unsigned long Pos, ObjData* O)
 void ObjReadExports (FILE* F, unsigned long Pos, ObjData* O)
 /* Read the exports from a file at the given position */
 {
-    unsigned I;
+    unsigned I;     
+    unsigned ExportCount;
 
     /* Seek to the correct position */
     FileSetPos (F, Pos);
 
     /* Read the data */
-    O->ExportCount = ReadVar (F);
-    CollGrow (&O->Exports, O->ExportCount);
-    for (I = 0; I < O->ExportCount; ++I) {
+    ExportCount = ReadVar (F);
+    CollGrow (&O->Exports, ExportCount);
+    for (I = 0; I < ExportCount; ++I) {
                CollAppend (&O->Exports, ReadExport (F, O));
     }
 }
@@ -186,14 +190,15 @@ void ObjReadDbgSyms (FILE* F, unsigned long Pos, ObjData* O)
 /* Read the debug symbols from a file at the given position */
 {
     unsigned I;
+    unsigned DbgSymCount;
 
     /* Seek to the correct position */
     FileSetPos (F, Pos);
 
     /* Read the data */
-    O->DbgSymCount = ReadVar (F);
-    CollGrow (&O->DbgSyms, O->DbgSymCount);
-    for (I = 0; I < O->DbgSymCount; ++I) {
+    DbgSymCount = ReadVar (F);
+    CollGrow (&O->DbgSyms, DbgSymCount);
+    for (I = 0; I < DbgSymCount; ++I) {
        CollAppend (&O->DbgSyms, ReadDbgSym (F, O));
     }
 }
@@ -204,14 +209,15 @@ void ObjReadLineInfos (FILE* F, unsigned long Pos, ObjData* O)
 /* Read the line infos from a file at the given position */
 {
     unsigned I;
+    unsigned LineInfoCount;
 
     /* Seek to the correct position */
     FileSetPos (F, Pos);
 
     /* Read the data */
-    O->LineInfoCount = ReadVar (F);
-    CollGrow (&O->LineInfos, O->LineInfoCount);
-    for (I = 0; I < O->LineInfoCount; ++I) {
+    LineInfoCount = ReadVar (F);
+    CollGrow (&O->LineInfos, LineInfoCount);
+    for (I = 0; I < LineInfoCount; ++I) {
                CollAppend (&O->LineInfos, ReadLineInfo (F, O));
     }
 }
@@ -239,15 +245,16 @@ void ObjReadStrPool (FILE* F, unsigned long Pos, ObjData* O)
 void ObjReadAssertions (FILE* F, unsigned long Pos, ObjData* O)
 /* Read the assertions from a file at the given offset */
 {
-    unsigned I;
+    unsigned I;     
+    unsigned AssertionCount;
 
     /* Seek to the correct position */
     FileSetPos (F, Pos);
 
     /* Read the data */
-    O->AssertionCount = ReadVar (F);
-    CollGrow (&O->Assertions, O->AssertionCount);
-    for (I = 0; I < O->AssertionCount; ++I) {
+    AssertionCount = ReadVar (F);
+    CollGrow (&O->Assertions, AssertionCount);
+    for (I = 0; I < AssertionCount; ++I) {
         CollAppend (&O->Assertions, ReadAssertion (F, O));
     }
 }
@@ -257,15 +264,16 @@ void ObjReadAssertions (FILE* F, unsigned long Pos, ObjData* O)
 void ObjReadScopes (FILE* F, unsigned long Pos, ObjData* O)
 /* Read the scope table from a file at the given offset */
 {
-    unsigned I;
+    unsigned I;     
+    unsigned ScopeCount;
 
     /* Seek to the correct position */
     FileSetPos (F, Pos);
 
     /* Read the data */
-    O->ScopeCount = ReadVar (F);
-    CollGrow (&O->Scopes, O->ScopeCount);
-    for (I = 0; I < O->ScopeCount; ++I) {
+    ScopeCount = ReadVar (F);
+    CollGrow (&O->Scopes, ScopeCount);
+    for (I = 0; I < ScopeCount; ++I) {
         CollAppend (&O->Scopes, 0);     /* ReadScope (F, O); ### not implemented */
     }
 }
index 3d762cae1efb2743a8702d981f9d69c5d24c4260..e1153de8256fa109c8e2b5f46a7163757bb07a11 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/* (C) 1998-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -211,7 +211,6 @@ Section* ReadSection (FILE* F, ObjData* O)
     unsigned      FragCount;
     Segment*      S;
     Section*      Sec;
-    LineInfo*     LI;
 
     /* Read the segment data */
     (void) Read32 (F);            /* File size of data */
@@ -240,12 +239,9 @@ Section* ReadSection (FILE* F, ObjData* O)
     }
 
     /* Start reading fragments from the file and insert them into the section . */
-    LI = 0;
     while (FragCount--) {
 
        Fragment* Frag;
-        FilePos   Pos;
-       unsigned  LineInfoIndex;
 
        /* Read the fragment type */
        unsigned char Type = Read8 (F);
@@ -280,43 +276,11 @@ Section* ReadSection (FILE* F, ObjData* O)
                return 0;
                }
 
-       /* Read the file position of the fragment */
-       ReadFilePos (F, &Pos);
-
-        /* Generate a LineInfo for this fragment. First check if this fragment
-         * was generated by the same line than that before. If not, generate
-         * a new LineInfo.
-         */
-        if (LI == 0 || LI->Pos.Line != Pos.Line || LI->Pos.Col != Pos.Col ||
-            LI->Pos.Name != Pos.Name) {
-            /* We don't have a previous line info or this one is different */
-            LI = NewLineInfo (O, &Pos);
-            CollAppend (&O->LineInfos, LI);
-        }
-        AddLineInfo (Frag, LI);
-
-        /* Read additional line info and resolve it */
-       LineInfoIndex = ReadVar (F);
-       if (LineInfoIndex) {
-           --LineInfoIndex;
-            /* The line info index was written by the assembler and must
-             * therefore be part of the line infos read from the object file.
-             * To make sure this is true, don't compare against the count
-             * of line infos in the collection (which grows) but against the
-             * count initialized when reading from the file.
-             */
-           if (LineInfoIndex >= O->LineInfoCount) {
-                       Internal ("In module `%s', file `%s', line %lu: Invalid line "
-                         "info with index %u (max count %u)",
-                         GetObjFileName (O),
-                                 GetFragmentSourceName (Frag),
-                                 GetFragmentSourceLine (Frag),
-                          LineInfoIndex,
-                          O->LineInfoCount);
-           }
-            /* Add line info to the fragment */
-            AddLineInfo (Frag, CollAt (&O->LineInfos, LineInfoIndex));
-       }
+        /* Read the line infos into the list of the fragment */
+        ReadLineInfoList (F, O, &Frag->LineInfos);
+
+        /* Resolve the back pointers */
+        FragResolveLineInfos (Frag);
 
        /* Remember the module we had this fragment from */
        Frag->Obj = O;