]> git.sur5r.net Git - cc65/commitdiff
Central management of the debug info base ids.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 5 Aug 2011 13:09:13 +0000 (13:09 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 5 Aug 2011 13:09:13 +0000 (13:09 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5123 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/dbgfile.c
src/ld65/dbgsyms.c
src/ld65/objdata.c
src/ld65/objdata.h
src/ld65/scopes.c
src/ld65/segments.c

index 4aa64c953e6bb08322b495ee626c2be767928810..a4f8216a4a4c8e6f74452247e6c8254624322939 100644 (file)
 
 
 /*****************************************************************************/
-/*                                  Code                                    */
+/*                                  Code                                    */
 /*****************************************************************************/
 
 
 
+static void AssignBaseIds (void)
+/* Assign the base ids for debug info output. Within each module, many of the
+ * items are addressed by ids which are actually the indices of the items in
+ * the collections. To make them unique, we must assign a unique base to each
+ * range.
+ */
+{
+    unsigned I;
+
+    /* Walk over all modules */
+    unsigned FileBaseId  = 0;
+    unsigned SymBaseId   = 0;
+    unsigned ScopeBaseId = 0;
+    for (I = 0; I < CollCount (&ObjDataList); ++I) {
+
+        /* Get this module */
+        ObjData* O = CollAt (&ObjDataList, I);
+
+        /* Assign ids */
+        O->FileBaseId  = FileBaseId;
+        O->SymBaseId   = SymBaseId;
+        O->ScopeBaseId = ScopeBaseId;
+
+        /* Bump the base ids */
+        FileBaseId    += CollCount (&O->Files);
+        SymBaseId     += CollCount (&O->DbgSyms);
+        ScopeBaseId   += CollCount (&O->Scopes);
+    }
+}
+
+
+
 void CreateDbgFile (void)
 /* Create a debug info file */
 {
@@ -69,7 +101,10 @@ void CreateDbgFile (void)
     /* Output version information */
     fprintf (F, "version\tmajor=1,minor=2\n");
 
-    /* Output modules */
+    /* Assign the base ids to the modules */
+    AssignBaseIds ();
+
+    /* Output modules */             
     for (I = 0; I < CollCount (&ObjDataList); ++I) {
 
         /* Get this object file */
@@ -80,7 +115,7 @@ void CreateDbgFile (void)
 
         /* Output the module line */
         fprintf (F,
-                 "module\tid=%u,name=\"%s\",file=%u",
+                 "mod\tid=%u,name=\"%s\",file=%u",
                  I,
                  GetObjFileName (O),
                  Source->Id);
index de17a61d3b4cfa716e6f6c79d2a56d6aa8898dcf..090520adf5e845bd3e7651c8d56e8673b864c08a 100644 (file)
@@ -207,10 +207,9 @@ long GetDbgSymVal (const DbgSym* D)
 
 void PrintDbgSyms (FILE* F)
 /* Print the debug symbols in a debug file */
-{
+{                   
     unsigned I, J;
 
-    unsigned BaseId = 0;
     for (I = 0; I < CollCount (&ObjDataList); ++I) {
 
         /* Get the object file */
@@ -230,12 +229,12 @@ void PrintDbgSyms (FILE* F)
 
             /* Emit the base data for the entry */
             fprintf (F,
-                     "sym\tid=%u,name=\"%s\",value=0x%lX,addrsize=%s,type=%s",
-                     BaseId + J,
+                     "sym\tid=%u,name=\"%s\",val=0x%lX,addrsize=%s,type=%s",
+                     O->SymBaseId + J,
                      GetString (S->Name),
                      Val,
                      AddrSizeToStr (S->AddrSize),
-                     SYM_IS_LABEL (S->Type)? "label" : "equate");
+                     SYM_IS_LABEL (S->Type)? "lab" : "equ");
 
             /* Emit the size only if we know it */
             if (S->Size != 0) {
@@ -247,24 +246,21 @@ void PrintDbgSyms (FILE* F)
              */
             GetSegExprVal (S->Expr, &D);
             if (!D.TooComplex && D.Seg != 0) {
-                fprintf (F, ",segment=%u", D.Seg->Id);
+                fprintf (F, ",seg=%u", D.Seg->Id);
             }
 
             /* For cheap local symbols, add the owner symbol, for others,
              * add the owner scope.
              */
             if (SYM_IS_STD (S->Type)) {
-                fprintf (F, ",scope=%u", S->OwnerId);
+                fprintf (F, ",scope=%u", O->ScopeBaseId + S->OwnerId);
             } else {
-                fprintf (F, ",parent=%u", S->OwnerId);
+                fprintf (F, ",parent=%u", O->SymBaseId + S->OwnerId);
             }
 
             /* Terminate the output line */
             fputc ('\n', F);
         }
-
-        /* Increment base id */
-        BaseId += CollCount (&O->DbgSyms);
     }
 }
 
index ce22898c618dd357d52709017de3c9dbc0c8ff52..e12fd65bbf4b780b745bf7958383c7bacb3113ae 100644 (file)
@@ -78,6 +78,9 @@ ObjData* NewObjData (void)
     O->MTime            = 0;
     O->Start           = 0;
     O->Flags                   = 0;
+    O->FileBaseId       = 0;
+    O->SymBaseId        = 0;
+    O->ScopeBaseId      = 0;
     O->Files            = EmptyCollection;
     O->Sections         = EmptyCollection;
     O->Exports         = EmptyCollection;
index bd838cf3d09f5acf3f57ed0c7077b56ee096ad9a..9cab25092222db2533858c4c90c42d128c887c78 100644 (file)
@@ -68,6 +68,11 @@ struct ObjData {
     ObjHeader          Header;         /* Header of file */
     unsigned long      Start;          /* Start offset of data in library */
     unsigned           Flags;
+
+    unsigned            FileBaseId;     /* Debug info base id for files */
+    unsigned            SymBaseId;      /* Debug info base id for symbols */
+    unsigned            ScopeBaseId;    /* Debug info base if for scopes */
+
     Collection          Files;         /* List of input files */
     Collection          Sections;      /* List of all sections */
     Collection          Exports;               /* List of all exports */
@@ -136,7 +141,7 @@ INLINE int ObjHasFiles (const ObjData* O)
 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);   
+struct Scope* GetObjScope (ObjData* Obj, unsigned Id);
 /* Get a scope from an object file checking for a valid index */
 
 
index 561a555de8aa62ca898418141ea9a28f0dc074d2..a6832f46a73c92c0639097242618f346fdefb33b 100644 (file)
@@ -100,7 +100,6 @@ void PrintDbgScopes (FILE* F)
     unsigned I, J;
 
     /* Print scopes from all modules we have linked into the output file */
-    unsigned BaseId = 0;
     for (I = 0; I < CollCount (&ObjDataList); ++I) {
 
         /* Get the object file */
@@ -111,8 +110,8 @@ void PrintDbgScopes (FILE* F)
             const Scope* S = CollConstAt (&O->Scopes, J);
 
             fprintf (F,
-                     "scope\tid=%u,name=\"%s\",module=%u,type=%u",
-                     BaseId + S->Id,
+                     "scope\tid=%u,name=\"%s\",mod=%u,type=%u",
+                     O->ScopeBaseId + S->Id,
                      GetString (S->Name),
                      I,
                      S->Type);
@@ -123,15 +122,12 @@ void PrintDbgScopes (FILE* F)
             }
             /* Print parent if available */
             if (S->Id != S->ParentId) {
-                fprintf (F, ",parent=%u", BaseId + S->ParentId);
+                fprintf (F, ",parent=%u", O->ScopeBaseId + S->ParentId);
             }
 
             /* Terminate the output line */
             fputc ('\n', F);
         }
-
-        /* Increment scope base id */
-        BaseId += CollCount (&O->Scopes);
     }
 }
 
index 518288eea964f8f9de91dfaff43a1ff176f2ea56..75a2427b0e3328a98cf42c3733d3b96a4bb31201 100644 (file)
@@ -641,19 +641,19 @@ void PrintDbgSegments (FILE* F)
 
         /* Print the segment data */
         fprintf (F,
-                 "segment\tid=%u,name=\"%s\",start=0x%06lX,size=0x%04lX,addrsize=%s,type=%s",
+                 "seg\tid=%u,name=\"%s\",start=0x%06lX,size=0x%04lX,addrsize=%s,type=%s",
                  S->Id, GetString (S->Name), S->PC, S->Size,
                  AddrSizeToStr (S->AddrSize),
                  S->ReadOnly? "ro" : "rw");
         if (S->OutputName) {
-            fprintf (F, ",outputname=\"%s\",outputoffs=%lu",
+            fprintf (F, ",oname=\"%s\",ooffs=%lu",
                      S->OutputName, S->OutputOffs);
         }
         fputc ('\n', F);
 
        /* Follow the linked list */
        S = S->List;
-    }
+    }                                   
 }