]> git.sur5r.net Git - cc65/blobdiff - src/ld65/dbgsyms.c
Corrected indentation - no code change.
[cc65] / src / ld65 / dbgsyms.c
index 12d13a83d694baaa50ffdba2e347d62251b157e3..f52e082d75d99283e9a396c6f59f07c984bdda89 100644 (file)
@@ -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 <string.h>
 
-/* 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)
 
 
 
+