]> git.sur5r.net Git - cc65/commitdiff
More work on scope suport.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 4 Aug 2011 18:47:01 +0000 (18:47 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 4 Aug 2011 18:47:01 +0000 (18:47 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5119 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/dbgsyms.c
src/ld65/dbgsyms.h
src/ld65/scopes.c
src/ld65/scopes.h

index cf68714c8370d6268fde71a472e6fabdc967ffcf..de17a61d3b4cfa716e6f6c79d2a56d6aa8898dcf 100644 (file)
@@ -85,7 +85,7 @@ static DbgSym* NewDbgSym (unsigned char Type, unsigned char AddrSize, ObjData* O
     D->LineInfos = EmptyCollection;
     D->Expr             = 0;
     D->Size      = 0;
-    D->Parent.Id = ~0UL;
+    D->OwnerId   = ~0U;
     D->Name     = 0;
     D->Type             = Type;
     D->AddrSize  = AddrSize;
@@ -153,7 +153,7 @@ DbgSym* ReadDbgSym (FILE* F, ObjData* O)
     DbgSym* D = NewDbgSym (Type, AddrSize, O);
 
     /* Read the id of the owner scope/symbol */
-    D->Parent.Id = ReadVar (F);
+    D->OwnerId = ReadVar (F);
 
     /* Read and assign the name */
     D->Name = MakeGlobalStringId (O, ReadVar (F));
@@ -210,6 +210,7 @@ void PrintDbgSyms (FILE* F)
 {
     unsigned I, J;
 
+    unsigned BaseId = 0;
     for (I = 0; I < CollCount (&ObjDataList); ++I) {
 
         /* Get the object file */
@@ -229,7 +230,8 @@ void PrintDbgSyms (FILE* F)
 
             /* Emit the base data for the entry */
             fprintf (F,
-                     "sym\tname=\"%s\",value=0x%lX,addrsize=%s,type=%s",
+                     "sym\tid=%u,name=\"%s\",value=0x%lX,addrsize=%s,type=%s",
+                     BaseId + J,
                      GetString (S->Name),
                      Val,
                      AddrSizeToStr (S->AddrSize),
@@ -248,9 +250,21 @@ void PrintDbgSyms (FILE* F)
                 fprintf (F, ",segment=%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);
+            } else {
+                fprintf (F, ",parent=%u", S->OwnerId);
+            }
+
             /* Terminate the output line */
             fputc ('\n', F);
         }
+
+        /* Increment base id */
+        BaseId += CollCount (&O->DbgSyms);
     }
 }
 
index 18027e6ff5a2be9f1da722462393b27f32807649..ad84fd9be0f6f62e0ae45327f6bdf1a929d93685 100644 (file)
@@ -67,11 +67,7 @@ struct DbgSym {
     Collection          LineInfos;      /* Line infos of definition */
     ExprNode*                  Expr;           /* Expression (0 if not def'd) */
     unsigned long       Size;           /* Symbol size if any */
-    union {
-        unsigned long   Id;             /* Id of parent while not resolved */
-        struct Scope*   Scope;          /* Parent scope */
-        struct DbgSym*  Sym;            /* Parent symbol  for cheap locals */
-    } Parent;
+    unsigned            OwnerId;        /* Id of parent/owner */
     unsigned            Name;                  /* Name */
     unsigned char      Type;           /* Type of symbol */
     unsigned char       AddrSize;       /* Address size of symbol */
index 0bf3f881b4cbcd4740fe1cb87b2050209e56f3a0..93e3d6b0d24bc16250c08dab7f35b25582469ea5 100644 (file)
@@ -76,7 +76,7 @@ Scope* ReadScope (FILE* F, ObjData* Obj, unsigned Id)
     Scope* S = NewScope (Obj, Id);
 
     /* Read the data from file */
-    S->Parent.Id    = ReadVar (F);
+    S->ParentId     = ReadVar (F);
     S->LexicalLevel = ReadVar (F);
     S->Flags        = ReadVar (F);
     S->Type         = ReadVar (F);
@@ -94,29 +94,6 @@ Scope* ReadScope (FILE* F, ObjData* Obj, unsigned Id)
 
 
 
-void ResolveScopes (ObjData* Obj)
-/* Resolve a scope list. */
-{
-    unsigned I;
-
-    /* Walk over the list and resolve the parent ids. */
-    for (I = 0; I < CollCount (&Obj->Scopes); ++I) {
-
-        /* Get the scope */
-        Scope* S = CollAtUnchecked (&Obj->Scopes, I);
-
-        /* Resolve the parent id. The root scope doesn't have a parent */
-        if (S->Id == 0) {
-            /* Root scope */
-            S->Parent.Scope = 0;
-        } else {
-            S->Parent.Scope = GetObjScope (Obj, S->Parent.Id);
-        }
-    }
-}
-
-
-
 void PrintDbgScopes (FILE* F)
 /* Output the scopes to a debug info file */
 {
@@ -144,8 +121,8 @@ void PrintDbgScopes (FILE* F)
                 fprintf (F, ",size=%lu", S->Size);
             }
             /* Print parent if available */
-            if (S->Parent.Scope) {
-                fprintf (F, ",parent=%u", BaseId + S->Parent.Scope->Id);
+            if (S->Id != S->ParentId) {
+                fprintf (F, ",parent=%u", BaseId + S->ParentId);
             }
 
             /* Terminate the output line */
index 82f1da00ed23fa83c07718adc35fc344113e8e52..1af33fa4c2d3de9cbc492412ce88d112f8238d07 100644 (file)
@@ -60,10 +60,7 @@ typedef struct Scope Scope;
 struct Scope {
     unsigned            Id;             /* Id of scope */
     ObjData*                   Obj;            /* Object file that exports the name */
-    union {
-        unsigned        Id;             /* Id of parent scope */
-        Scope*          Scope;          /* Pointer to parent scope */
-    } Parent;
+    unsigned            ParentId;       /* Id of parent scope */
     unsigned            LexicalLevel;   /* Lexical level */
     unsigned            Flags;
     unsigned            Type;           /* Type of scope */
@@ -83,8 +80,8 @@ struct Scope {
 Scope* ReadScope (FILE* F, ObjData* Obj, unsigned Id);
 /* Read a scope from a file, insert and return it */
 
-void ResolveScopes (ObjData* Obj);
-/* Resolve a scope list. */
+void PrintDbgScopes (FILE* F);
+/* Output the scopes to a debug info file */
 
 
 
@@ -93,4 +90,4 @@ void ResolveScopes (ObjData* Obj);
 #endif
 
 
-                                                 
+