]> git.sur5r.net Git - cc65/commitdiff
Use the Span structure also for scopes.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 4 Aug 2011 13:14:26 +0000 (13:14 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 4 Aug 2011 13:14:26 +0000 (13:14 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5115 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/objdata.c
src/ld65/objdata.h
src/ld65/objfile.c
src/ld65/scopes.c
src/ld65/scopes.h
src/ld65/span.c
src/ld65/span.h

index 694940bd654047be29ff1cca0f5ced1a241240eb..ce22898c618dd357d52709017de3c9dbc0c8ff52 100644 (file)
@@ -186,3 +186,27 @@ const char* GetObjFileName (const ObjData* O)
 
 
 
+struct Section* GetObjSection (ObjData* O, unsigned Id)
+/* Get a section from an object file checking for a valid index */
+{
+    if (Id >= CollCount (&O->Sections)) {
+        Error ("Invalid section index (%u) in module `%s'",
+               Id, GetObjFileName (O));
+    }
+    return CollAtUnchecked (&O->Sections, Id);
+}
+
+
+
+struct Scope* GetObjScope (ObjData* O, unsigned Id)
+/* Get a scope from an object file checking for a valid index */
+{
+    if (Id >= CollCount (&O->Scopes)) {
+        Error ("Invalid scope index (%u) in module `%s'",
+               Id, GetObjFileName (O));
+    }
+    return CollAtUnchecked (&O->Scopes, Id);
+}
+
+
+
index 2ea3d418f6e0ed7b0f7d0ab96fd698214a6387e0..bd838cf3d09f5acf3f57ed0c7077b56ee096ad9a 100644 (file)
 
 
 
+/* Forwards */
+struct Scope;
+struct Section;
+
 /* Values for the Flags field */
 #define        OBJ_REF         0x0001          /* We have a reference to this file */
 
@@ -129,6 +133,12 @@ INLINE int ObjHasFiles (const ObjData* O)
 #  define ObjHasFiles(O)       ((O) != 0 && CollCount (&(O)->Files) != 0)
 #endif
 
+struct Section* GetObjSection (ObjData* Obj, unsigned Id);
+/* Get a section from an object file checking for a valid index */
+
+struct Scope* GetObjScope (ObjData* Obj, unsigned Id);   
+/* Get a scope from an object file checking for a valid index */
+
 
 
 /* End of objdata.h */
index 8f7fbe9d67f868e0c7432883cc4fe803afa65e1a..5eb60c5e7ef5143d95973527b83d19853ae98f07 100644 (file)
@@ -317,15 +317,17 @@ void ObjAdd (FILE* Obj, const char* Name)
     /* Read the assertions from the object file */
     ObjReadAssertions (Obj, O->Header.AssertOffs, O);
 
-    /* Read the scope table from the object file */
-    ObjReadScopes (Obj, O->Header.ScopeOffs, O);
-
-    /* Read the segment list from the object file. This must be last, since
+    /* Read the segment list from the object file. This must be late, since
      * the expressions stored in the code may reference segments or imported
      * symbols.
      */
     ObjReadSections (Obj, O->Header.SegOffs, O);
 
+    /* Read the scope table from the object file. Scopes reference segments, so
+     * we must read them after the sections.
+     */
+    ObjReadScopes (Obj, O->Header.ScopeOffs, O);
+
     /* Mark this object file as needed */
     O->Flags |= OBJ_REF;
 
index 994011f8b0bf9dcfffb0184dc68940d368c4cb01..106bd46a979293fa01e0051f6e1e9ccf8c5179f6 100644 (file)
 #include "error.h"
 #include "fileio.h"
 #include "scopes.h"
-
-
-
-/*****************************************************************************/
-/*                                          Data                                    */
-/*****************************************************************************/
-
-
-
-typedef struct SegRange SegRange;
-struct SegRange {
-    unsigned        SegId;              /* Id of segment */
-    unsigned long   Start;              /* Start of range */
-    unsigned long   End;                /* End of range */
-};
+#include "span.h"
 
 
 
@@ -71,10 +57,10 @@ static Scope* NewScope (ObjData* Obj, unsigned Id)
     Scope* S     = xmalloc (sizeof (Scope));
 
     /* Initialize the fields where necessary */
-    S->Id        = Id;
-    S->Obj       = Obj;
-    S->Size      = 0;
-    S->SegRanges = EmptyCollection;
+    S->Id       = Id;
+    S->Obj      = Obj;
+    S->Size     = 0;
+    S->Spans    = EmptyCollection;
 
     /* Return the new entry */
     return S;
@@ -82,37 +68,9 @@ static Scope* NewScope (ObjData* Obj, unsigned Id)
 
 
 
-static SegRange* NewSegRange (void)
-/* Create a new SegRange and return it */
-{
-    /* Allocate memory and return it */
-    return xmalloc (sizeof (SegRange));
-}
-
-
-
-static SegRange* ReadSegRange (FILE* F)
-/* Read a SegRange from a file and return it */
-{
-    /* Create a new SegRange */
-    SegRange* S = NewSegRange ();
-
-    /* Read data */
-    S->SegId    = ReadVar (F);
-    S->Start    = ReadVar (F);
-    S->End      = ReadVar (F);
-
-    /* Return the SegRange read */
-    return S;
-}
-
-
-
 Scope* ReadScope (FILE* F, ObjData* Obj, unsigned Id)
 /* Read a scope from a file and return it */
 {
-    unsigned Count;
-
     /* Create a new scope */
     Scope* S = NewScope (Obj, Id);
 
@@ -127,10 +85,7 @@ Scope* ReadScope (FILE* F, ObjData* Obj, unsigned Id)
     }
 
     /* Read the segment ranges for this scope */
-    Count = ReadVar (F);
-    while (Count--) {
-        CollAppend (&S->SegRanges, ReadSegRange (F));
-    }
+    ReadSpans (&S->Spans, F, Obj);
 
     /* Return the new Scope */
     return S;
@@ -154,13 +109,7 @@ void ResolveScopes (ObjData* Obj)
             /* Root scope */
             S->Parent.Scope = 0;
         } else {
-            /* Check the data */
-            unsigned ParentId = S->Parent.Id;
-            if (ParentId >= CollCount (&Obj->Scopes)) {
-                Error ("Invalid scope index (%u) in module `%s'",
-                       ParentId, GetObjFileName (Obj));
-            }
-            S->Parent.Scope = CollAtUnchecked (&Obj->Scopes, S->Parent.Id);
+            S->Parent.Scope = GetObjScope (Obj, S->Parent.Id);
         }
     }
 }
index 2217a8d1b5fa369b3ca5fdc9ec1e2785bc167cc6..82f1da00ed23fa83c07718adc35fc344113e8e52 100644 (file)
@@ -69,7 +69,7 @@ struct Scope {
     unsigned            Type;           /* Type of scope */
     unsigned            Name;           /* Name of scope */
     unsigned long       Size;           /* Size of scope */
-    Collection          SegRanges;      /* Segment ranges for this scope */
+    Collection          Spans;          /* Spans for this scope */
 };
 
 
@@ -93,4 +93,4 @@ void ResolveScopes (ObjData* Obj);
 #endif
 
 
-
+                                                 
index aa6ceda877fa29d87ddf5727b07c8b394d21dd8f..f1bf280c3e20218f5cd32bb89f346200fe058cef 100644 (file)
 
 /* common */
 #include "xmalloc.h"
-                   
-/* ld65 */       
+
+/* ld65 */           
+#include "fileio.h"
+#include "objdata.h"
+#include "segments.h"
 #include "span.h"
 
 
@@ -48,7 +51,7 @@
 
 
 Span* NewSpan (struct Segment* Seg, unsigned long Offs, unsigned long Size)
-/* Create and return a new span */                                         
+/* Create and return a new span */
 {
     /* Allocate memory */
     Span* S = xmalloc (sizeof (*S));
@@ -64,6 +67,38 @@ Span* NewSpan (struct Segment* Seg, unsigned long Offs, unsigned long Size)
 
 
 
+Span* ReadSpan (FILE* F, ObjData* O)
+/* Read a Span from a file and return it */
+{
+    /* Read the section id and translate it to a section pointer */
+    Section* Sec = GetObjSection (O, ReadVar (F));
+
+    /* Read the offset and relocate it */
+    unsigned long Offs = ReadVar (F) + Sec->Offs;
+
+    /* Create and return a new Span */
+    return NewSpan (Sec->Seg, Offs, ReadVar (F));
+}
+
+
+
+void ReadSpans (Collection* Spans, FILE* F, ObjData* O)
+/* Read a list of Spans from a file and return it */
+{
+    /* First is number of Spans */
+    unsigned Count = ReadVar (F);
+
+    /* Preallocate enough entries in the collection */
+    CollGrow (Spans, Count);
+
+    /* Read the spans and add them */
+    while (Count--) {
+        CollAppend (Spans, ReadSpan (F, O));
+    }
+}
+
+
+
 void FreeSpan (Span* S)
 /* Free a span structure */
 {
@@ -77,7 +112,7 @@ void AddSpan (Collection* Spans, struct Segment* Seg, unsigned long Offs,
               unsigned long Size)
 /* Either add a new span to the ones already in the given collection, or - if
  * possible - merge it with adjacent ones that already exist.
- */                              
+ */
 {
     unsigned I;
 
index cae1cfd73afb8f8eb3b4442f6a3b8bb67b93ee56..82c7cf81bd57726c9bd62e20ea3f8e77a93fd941 100644 (file)
@@ -38,6 +38,8 @@
 
 
 
+#include <stdio.h>
+
 /* common */
 #include "coll.h"
 
@@ -49,6 +51,7 @@
 
 
 
+struct ObjData;
 struct Segment;
 
 
@@ -77,6 +80,12 @@ struct Span {
 Span* NewSpan (struct Segment* Seg, unsigned long Offs, unsigned long Size);
 /* Create and return a new span */
 
+Span* ReadSpan (FILE* F, struct ObjData* O);
+/* Read a Span from a file and return it */
+
+void ReadSpans (Collection* Spans, FILE* F, struct ObjData* O);
+/* Read a list of Spans from a file and return it */
+
 void FreeSpan (Span* S);
 /* Free a span structure */