From: uz Date: Thu, 18 Aug 2011 11:58:16 +0000 (+0000) Subject: Replace single linked list of sections in a segment by a collection. X-Git-Tag: V2.13.3~254 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=d3017665d2000e3664deb2029267ba3a6b9a565b;p=cc65 Replace single linked list of sections in a segment by a collection. git-svn-id: svn://svn.cc65.org/cc65/trunk@5208 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/src/ld65/segments.c b/src/ld65/segments.c index a097d9d03..84c80d085 100644 --- a/src/ld65/segments.c +++ b/src/ld65/segments.c @@ -92,8 +92,7 @@ static Segment* NewSegment (unsigned Name, unsigned char AddrSize) /* Initialize the fields */ S->Name = Name; S->Next = 0; - S->SecRoot = 0; - S->SecLast = 0; + S->Sections = EmptyCollection; S->PC = 0; S->Size = 0; S->AlignObj = 0; @@ -183,13 +182,7 @@ Section* NewSection (Segment* Seg, unsigned char Align, unsigned char AddrSize) S->Offs = Seg->Size; /* Current size is offset */ /* Insert the section into the segment */ - if (Seg->SecRoot == 0) { - /* First section in this segment */ - Seg->SecRoot = S; - } else { - Seg->SecLast->Next = S; - } - Seg->SecLast = S; + CollAppend (&Seg->Sections, S); /* Return the struct */ return S; @@ -311,8 +304,12 @@ int IsBSSType (Segment* S) */ { /* Loop over all sections */ - Section* Sec = S->SecRoot; - while (Sec) { + unsigned I; + for (I = 0; I < CollCount (&S->Sections); ++I) { + + /* Get the next section */ + Section* Sec = CollAtUnchecked (&S->Sections, I); + /* Loop over all fragments */ Fragment* F = Sec->FragRoot; while (F) { @@ -331,7 +328,6 @@ int IsBSSType (Segment* S) } F = F->Next; } - Sec = Sec->Next; } return 1; } @@ -341,15 +337,15 @@ int IsBSSType (Segment* S) void SegDump (void) /* Dump the segments and it's contents */ { - unsigned I; + unsigned I, J; unsigned long Count; unsigned char* Data; for (I = 0; I < CollCount (&SegmentList); ++I) { - const Segment* Seg = CollConstAt (&SegmentList, I); - Section* S = Seg->SecRoot; + Segment* Seg = CollAtUnchecked (&SegmentList, I); printf ("Segment: %s (%lu)\n", GetString (Seg->Name), Seg->Size); - while (S) { + for (J = 0; J < CollCount (&Seg->Sections); ++J) { + Section* S = CollAtUnchecked (&Seg->Sections, J); unsigned J; Fragment* F = S->FragRoot; printf (" Section:\n"); @@ -393,7 +389,6 @@ void SegDump (void) } F = F->Next; } - S = S->Next; } } } @@ -449,7 +444,7 @@ void SegWrite (const char* TgtName, FILE* Tgt, Segment* S, SegWriteFunc F, void* * called (see description of SegWriteFunc above). */ { - Section* Sec; + unsigned I; int Sign; unsigned long Offs = 0; @@ -459,8 +454,8 @@ void SegWrite (const char* TgtName, FILE* Tgt, Segment* S, SegWriteFunc F, void* S->OutputOffs = (unsigned long) ftell (Tgt); /* Loop over all sections in this segment */ - Sec = S->SecRoot; - while (Sec) { + for (I = 0; I < CollCount (&S->Sections); ++I) { + Section* Sec = CollAtUnchecked (&S->Sections, I); Fragment* Frag; /* Output were this section is from */ @@ -535,9 +530,6 @@ void SegWrite (const char* TgtName, FILE* Tgt, Segment* S, SegWriteFunc F, void* /* Next fragment */ Frag = Frag->Next; } - - /* Next section */ - Sec = Sec->Next; } } diff --git a/src/ld65/segments.h b/src/ld65/segments.h index 32d7ab114..40b06a961 100644 --- a/src/ld65/segments.h +++ b/src/ld65/segments.h @@ -40,7 +40,8 @@ #include -/* common */ +/* common */ +#include "coll.h" #include "exprdefs.h" @@ -56,9 +57,8 @@ typedef struct Segment Segment; struct Segment { unsigned Name; /* Name index of the segment */ unsigned Id; /* Segment id for debug info */ - Segment* Next; /* Hash list */ - struct Section* SecRoot; /* Section list */ - struct Section* SecLast; /* Pointer to last section */ + Segment* Next; /* Hash list */ + Collection Sections; /* Sections in this segment */ unsigned long PC; /* PC were this segment is located */ unsigned long Size; /* Size of data so far */ struct ObjData* AlignObj; /* Module that requested the alignment */