X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fld65%2Fdbgsyms.c;h=f52e082d75d99283e9a396c6f59f07c984bdda89;hb=0807da74bd7c3ebe3e6e75129a07a810b17174b2;hp=12d13a83d694baaa50ffdba2e347d62251b157e3;hpb=edde7a3f453ae863d958d6b8db0a95e1062bfe77;p=cc65 diff --git a/src/ld65/dbgsyms.c b/src/ld65/dbgsyms.c index 12d13a83d..f52e082d7 100644 --- a/src/ld65/dbgsyms.c +++ b/src/ld65/dbgsyms.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2003 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 1998-2010, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -35,7 +35,8 @@ #include -/* common */ +/* common */ +#include "addrsize.h" #include "check.h" #include "symdefs.h" #include "xmalloc.h" @@ -60,7 +61,7 @@ /* We will collect all debug symbols in the following array and remove * duplicates before outputing them. */ -static DbgSym* DbgSymPool [256]; +static DbgSym* DbgSymPool[256]; @@ -70,7 +71,7 @@ static DbgSym* DbgSymPool [256]; -static DbgSym* NewDbgSym (unsigned char Type, ObjData* O) +static DbgSym* NewDbgSym (unsigned char Type, unsigned char AddrSize, ObjData* O) /* Create a new DbgSym and return it */ { /* Allocate memory */ @@ -81,8 +82,9 @@ static DbgSym* NewDbgSym (unsigned char Type, ObjData* O) D->Flags = 0; D->Obj = O; D->Expr = 0; - D->Name = 0; + D->Name = 0; D->Type = Type; + D->AddrSize = AddrSize; /* Return the new entry */ return D; @@ -97,9 +99,9 @@ static DbgSym* GetDbgSym (DbgSym* D, long Val) { /* Create the hash. We hash over the symbol value */ unsigned Hash = ((Val >> 24) & 0xFF) ^ - ((Val >> 16) & 0xFF) ^ - ((Val >> 8) & 0xFF) ^ - ((Val >> 0) & 0xFF); + ((Val >> 16) & 0xFF) ^ + ((Val >> 8) & 0xFF) ^ + ((Val >> 0) & 0xFF); /* Check for this symbol */ DbgSym* Sym = DbgSymPool[Hash]; @@ -139,20 +141,18 @@ static void InsertDbgSym (DbgSym* D, long Val) DbgSym* ReadDbgSym (FILE* F, ObjData* O) /* Read a debug symbol from a file, insert and return it */ { - unsigned char Type; - DbgSym* D; - - /* Read the type */ - Type = Read8 (F); + /* Read the type and address size */ + unsigned char Type = Read8 (F); + unsigned char AddrSize = Read8 (F); /* Create a new debug symbol */ - D = NewDbgSym (Type, O); + DbgSym* D = NewDbgSym (Type, AddrSize, O); /* Read and assign the name */ D->Name = MakeGlobalStringId (O, ReadVar (F)); /* Read the value */ - if (IS_EXP_EXPR (Type)) { + if (IS_EXP_EXPR (D->Type)) { D->Expr = ReadExpr (F, O); } else { D->Expr = LiteralExpr (Read32 (F), O); @@ -167,7 +167,24 @@ DbgSym* ReadDbgSym (FILE* F, ObjData* O) -long GetDbgSymVal (DbgSym* D) +void ClearDbgSymTable (void) +/* Clear the debug symbol table */ +{ + unsigned I; + for (I = 0; I < sizeof (DbgSymPool) / sizeof (DbgSymPool[0]); ++I) { + DbgSym* Sym = DbgSymPool[I]; + DbgSymPool[I] = 0; + while (Sym) { + DbgSym* NextSym = Sym->Next; + Sym->Next = 0; + Sym = NextSym; + } + } +} + + + +long GetDbgSymVal (const DbgSym* D) /* Get the value of this symbol */ { CHECK (D->Expr != 0); @@ -176,19 +193,64 @@ long GetDbgSymVal (DbgSym* D) +void PrintDbgSyms (ObjData* O, FILE* F) +/* Print the debug symbols in a debug file */ +{ + unsigned I; + + /* Walk through all debug symbols in this module */ + for (I = 0; I < CollCount (&O->DbgSyms); ++I) { + + long Val; + + /* Get the next debug symbol */ + DbgSym* D = CollAt (&O->DbgSyms, I); + + /* Get the symbol value */ + Val = GetDbgSymVal (D); + + /* Lookup this symbol in the table. If it is found in the table, it was + * already written to the file, so don't emit it twice. If it is not in + * the table, insert and output it. + */ + if (GetDbgSym (D, Val) == 0) { + + /* Emit the debug file line */ + fprintf (F, + "sym\t\"%s\",value=0x%08lX,addrsize=%s,type=%s\n", + GetString (D->Name), + Val, + AddrSizeToStr (D->AddrSize), + IS_EXP_LABEL (D->Type)? "label" : "equate"); + + /* Insert the symbol into the table */ + InsertDbgSym (D, Val); + } + } +} + + + void PrintDbgSymLabels (ObjData* O, FILE* F) /* Print the debug symbols in a VICE label file */ { unsigned I; /* Walk through all debug symbols in this module */ - for (I = 0; I < O->DbgSymCount; ++I) { + for (I = 0; I < CollCount (&O->DbgSyms); ++I) { + + long Val; /* Get the next debug symbol */ - DbgSym* D = O->DbgSyms [I]; + DbgSym* D = CollAt (&O->DbgSyms, I); + + /* Emit this symbol only if it is a label (ignore equates) */ + if (IS_EXP_EQUATE (D->Type)) { + continue; + } /* Get the symbol value */ - long Val = GetDbgSymVal (D); + Val = GetDbgSymVal (D); /* Lookup this symbol in the table. If it is found in the table, it was * already written to the file, so don't emit it twice. If it is not in @@ -207,3 +269,4 @@ void PrintDbgSymLabels (ObjData* O, FILE* F) +