Ken Thomases : dbghelp/stabs: Allow pending list to include line numbers as well as variables.

Alexandre Julliard julliard at winehq.org
Thu Mar 12 09:54:32 CDT 2009


Module: wine
Branch: master
Commit: 65d929079cb85b222c72c595b4d0a9ee2fb868ed
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=65d929079cb85b222c72c595b4d0a9ee2fb868ed

Author: Ken Thomases <ken at codeweavers.com>
Date:   Wed Mar 11 09:08:45 2009 -0500

dbghelp/stabs: Allow pending list to include line numbers as well as variables.

On Darwin, line numbers usually precede the associated function.

---

 dlls/dbghelp/stabs.c |   90 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 68 insertions(+), 22 deletions(-)

diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c
index 91b85fe..e12fcfa 100644
--- a/dlls/dbghelp/stabs.c
+++ b/dlls/dbghelp/stabs.c
@@ -1112,6 +1112,12 @@ static struct symt* stabs_parse_type(const char* stab)
     return *stabs_read_type_enum(&c);
 }
 
+enum pending_obj_kind
+{
+    PENDING_VAR,
+    PENDING_LINE,
+};
+
 struct pending_loc_var
 {
     char                name[256];
@@ -1120,9 +1126,25 @@ struct pending_loc_var
     struct location     loc;
 };
 
-struct pending_block
+struct pending_line
+{
+    int                 source_idx;
+    int                 line_num;
+    unsigned long       offset;
+};
+
+struct pending_object
 {
-    struct pending_loc_var*     vars;
+    enum pending_obj_kind               tag;
+    union {
+        struct pending_loc_var  var;
+        struct pending_line     line;
+    }                                   u;
+};
+
+struct pending_list
+{
+    struct pending_object*      objs;
     unsigned                    num;
     unsigned                    allocated;
 };
@@ -1132,37 +1154,61 @@ static inline void pending_make_room(struct pending_list* pending)
     if (pending->num == pending->allocated)
     {
         pending->allocated += 8;
-        if (!pending->vars)
-            pending->vars = HeapAlloc(GetProcessHeap(), 0, 
-                                     pending->allocated * sizeof(pending->vars[0]));
+        if (!pending->objs)
+            pending->objs = HeapAlloc(GetProcessHeap(), 0,
+                                     pending->allocated * sizeof(pending->objs[0]));
         else    
-            pending->vars = HeapReAlloc(GetProcessHeap(), 0, pending->vars,
-                                       pending->allocated * sizeof(pending->vars[0]));
+            pending->objs = HeapReAlloc(GetProcessHeap(), 0, pending->objs,
+                                       pending->allocated * sizeof(pending->objs[0]));
     }
 }
 
-static inline void pending_add(struct pending_block* pending, const char* name,
-                               enum DataKind dt, const struct location* loc)
+static inline void pending_add_var(struct pending_list* pending, const char* name,
+                                   enum DataKind dt, const struct location* loc)
+{
+    pending_make_room(pending);
+    pending->objs[pending->num].tag = PENDING_VAR;
+    stab_strcpy(pending->objs[pending->num].u.var.name,
+                sizeof(pending->objs[pending->num].u.var.name), name);
+    pending->objs[pending->num].u.var.type  = stabs_parse_type(name);
+    pending->objs[pending->num].u.var.kind  = dt;
+    pending->objs[pending->num].u.var.loc   = *loc;
+    pending->num++;
+}
+
+static inline void pending_add_line(struct pending_list* pending, int source_idx,
+                                    int line_num, unsigned long offset)
 {
     pending_make_room(pending);
-    stab_strcpy(pending->vars[pending->num].name, 
-                sizeof(pending->vars[pending->num].name), name);
-    pending->vars[pending->num].type   = stabs_parse_type(name);
-    pending->vars[pending->num].kind   = dt;
-    pending->vars[pending->num].loc    = *loc;
+    pending->objs[pending->num].tag = PENDING_LINE;
+    pending->objs[pending->num].u.line.source_idx   = source_idx;
+    pending->objs[pending->num].u.line.line_num     = line_num;
+    pending->objs[pending->num].u.line.offset       = offset;
     pending->num++;
 }
 
-static void pending_flush(struct pending_block* pending, struct module* module, 
+static void pending_flush(struct pending_list* pending, struct module* module,
                           struct symt_function* func, struct symt_block* block)
 {
     unsigned int i;
 
     for (i = 0; i < pending->num; i++)
     {
-        symt_add_func_local(module, func, 
-                            pending->vars[i].kind, &pending->vars[i].loc,
-                            block, pending->vars[i].type, pending->vars[i].name);
+        switch (pending->objs[i].tag)
+        {
+        case PENDING_VAR:
+            symt_add_func_local(module, func,
+                                pending->objs[i].u.var.kind, &pending->objs[i].u.var.loc,
+                                block, pending->objs[i].u.var.type, pending->objs[i].u.var.name);
+            break;
+        case PENDING_LINE:
+            symt_add_func_line(module, func, pending->objs[i].u.line.source_idx,
+                               pending->objs[i].u.line.line_num, pending->objs[i].u.line.offset);
+            break;
+        default:
+            ERR("Unknown pending object tag %u\n", (unsigned)pending->objs[i].tag);
+            break;
+        }
     }
     pending->num = 0;
 }
@@ -1219,7 +1265,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
     unsigned                    incl[32];
     int                         incl_stk = -1;
     int                         source_idx = -1;
-    struct pending_block        pending;
+    struct pending_list         pending;
     BOOL                        ret = TRUE;
     struct location             loc;
     unsigned char               type;
@@ -1419,7 +1465,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
                                                           param_type);
                 }
                 else
-                    pending_add(&pending, ptr, DataIsLocal, &loc);
+                    pending_add_var(&pending, ptr, DataIsLocal, &loc);
             }
             break;
         case N_LSYM:
@@ -1427,7 +1473,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
             loc.kind = loc_regrel;
             loc.reg = 0; /* FIXME */
             loc.offset = stab_ptr->n_value;
-            if (curr_func != NULL) pending_add(&pending, ptr, DataIsLocal, &loc);
+            if (curr_func != NULL) pending_add_var(&pending, ptr, DataIsLocal, &loc);
             break;
         case N_SLINE:
             /*
@@ -1603,7 +1649,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
 done:
     HeapFree(GetProcessHeap(), 0, stabbuff);
     stabs_free_includes();
-    HeapFree(GetProcessHeap(), 0, pending.vars);
+    HeapFree(GetProcessHeap(), 0, pending.objs);
 
     return ret;
 }




More information about the wine-cvs mailing list