From: uz Date: Sun, 21 Aug 2011 19:44:02 +0000 (+0000) Subject: Add an optional type to a span. X-Git-Tag: V2.13.3~209 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=913db7901786550b7eea61ed3128982a42347c9d;p=cc65 Add an optional type to a span. git-svn-id: svn://svn.cc65.org/cc65/trunk@5253 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/src/ca65/span.c b/src/ca65/span.c index 2fa823a8b..217e27149 100644 --- a/src/ca65/span.c +++ b/src/ca65/span.c @@ -43,6 +43,7 @@ #include "objfile.h" #include "segment.h" #include "span.h" +#include "spool.h" @@ -155,7 +156,7 @@ static Span* NewSpan (Segment* Seg, unsigned long Start, unsigned long End) S->Seg = Seg; S->Start = Start; S->End = End; - S->Type = 0; + S->Type = EMPTY_STRING_ID; /* Return the new struct */ return S; @@ -183,9 +184,11 @@ static Span* MergeSpan (Span* S) Span* E = HT_Find (&SpanTab, S); if (E) { /* If S has a type and E not, move the type */ - CHECK (E->Type == 0); - E->Type = S->Type; - S->Type = 0; + if (S->Type != EMPTY_STRING_ID) { + CHECK (E->Type == EMPTY_STRING_ID); + E->Type = S->Type; + } + /* Free S and return E */ FreeSpan (S); return E; @@ -199,6 +202,14 @@ static Span* MergeSpan (Span* S) +void SetSpanType (Span* S, const StrBuf* Type) +/* Set the generic type of the span to Type */ +{ + S->Type = GetStrBufId (Type); +} + + + Span* OpenSpan (void) /* Open a span for the active segment and return it. */ { @@ -377,6 +388,7 @@ void WriteSpans (void) ObjWriteVar (S->Seg->Num); ObjWriteVar (S->Start); ObjWriteVar (S->End - S->Start); + ObjWriteVar (S->Type); } /* Free the collection with the spans */ diff --git a/src/ca65/span.h b/src/ca65/span.h index a1b85b2dc..621267ad3 100644 --- a/src/ca65/span.h +++ b/src/ca65/span.h @@ -43,6 +43,7 @@ #include "gentype.h" #include "hashtab.h" #include "inline.h" +#include "strbuf.h" @@ -84,6 +85,9 @@ INLINE unsigned long GetSpanSize (const Span* R) # define GetSpanSize(R) ((R)->End - (R)->Start) #endif +void SetSpanType (Span* S, const StrBuf* Type); +/* Set the generic type of the span to Type */ + Span* OpenSpan (void); /* Open a span for the active segment and return it. */ diff --git a/src/ld65/span.c b/src/ld65/span.c index da8cd83dd..03765b97e 100644 --- a/src/ld65/span.c +++ b/src/ld65/span.c @@ -42,6 +42,7 @@ #include "objdata.h" #include "segments.h" #include "span.h" +#include "spool.h" @@ -57,6 +58,7 @@ struct Span { unsigned Sec; /* Section id of this span */ unsigned long Offs; /* Offset of span within segment */ unsigned long Size; /* Size of span */ + unsigned Type; /* Generic type of the data */ }; @@ -67,17 +69,14 @@ struct Span { -static Span* NewSpan (unsigned Id, unsigned Sec, unsigned long Offs, unsigned long Size) +static Span* NewSpan (unsigned Id) /* Create and return a new span */ { /* Allocate memory */ - Span* S = xmalloc (sizeof (*S)); + Span* S = xmalloc (sizeof (Span)); - /* Initialize the fields */ + /* Initialize the fields as necessary */ S->Id = Id; - S->Sec = Sec; - S->Offs = Offs; - S->Size = Size; /* Return the result */ return S; @@ -85,14 +84,18 @@ static Span* NewSpan (unsigned Id, unsigned Sec, unsigned long Offs, unsigned lo -Span* ReadSpan (FILE* F, ObjData* O attribute ((unused)), unsigned Id) +Span* ReadSpan (FILE* F, ObjData* O, unsigned Id) /* Read a Span from a file and return it */ { - /* Create a new Span and return it */ - unsigned SecId = ReadVar (F); - unsigned long Offs = ReadVar (F); - unsigned Size = ReadVar (F); - return NewSpan (Id, SecId, Offs, Size); + /* Create a new Span and initialize it */ + Span* S = NewSpan (Id); + S->Sec = ReadVar (F); + S->Offs = ReadVar (F); + S->Size = ReadVar (F); + S->Type = MakeGlobalStringId (O, ReadVar (F)); + + /* Return the new span */ + return S; }