Eric Pouech : dbghelp: Added type for array index.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 6 04:51:07 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 34636b026bf62968a0c66e95b021010145e12341
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=34636b026bf62968a0c66e95b021010145e12341

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Sun Mar  5 21:48:18 2006 +0100

dbghelp: Added type for array index.

- added type for array index
- correctly parsing array index type in stabs, Dwarf2 and MSC formats
- fixed SyGetTypeInfo accordingly

---

 dlls/dbghelp/dbghelp_private.h |    5 +++--
 dlls/dbghelp/dwarf.c           |    4 +++-
 dlls/dbghelp/msc.c             |   12 +++++++-----
 dlls/dbghelp/stabs.c           |   11 ++++++-----
 dlls/dbghelp/type.c            |   20 ++++++++++++--------
 5 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index d7371a2..97bfd9d 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -197,7 +197,8 @@ struct symt_array
     struct symt                 symt;
     int		                start;
     int		                end;
-    struct symt*                basetype;
+    struct symt*                base_type;
+    struct symt*                index_type;
 };
 
 struct symt_basic
@@ -475,7 +476,7 @@ extern BOOL         symt_add_enum_elemen
                                           const char* name, int value);
 extern struct symt_array*
                     symt_new_array(struct module* module, int min, int max, 
-                                   struct symt* base);
+                                   struct symt* base, struct symt* index);
 extern struct symt_function_signature*
                     symt_new_function_signature(struct module* module, 
                                                 struct symt* ret_type,
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index 946852e..5a882cd 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -1050,6 +1050,7 @@ static void dwarf2_parse_array_subrange_
   }
   parent->start = min;
   parent->end = max;
+  parent->index_type = idx_type;
 
   TRACE("found min:%u max:%u\n", min, max);   
 
@@ -1087,7 +1088,8 @@ static struct symt_array* dwarf2_parse_a
     }
   }
 
-  symt = symt_new_array(module, min, max, ref_type);
+  /* FIXME: ugly as hell */
+  symt = symt_new_array(module, min, max, ref_type, NULL);
 
   if (entry->have_child) { /** any interest to not have child ? */
     ++ctx->level;
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 66b07b5..64bd903 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -388,10 +388,12 @@ static int codeview_add_type_pointer(str
 
 static int codeview_add_type_array(struct module* module, 
                                    unsigned int typeno, const char* name,
-                                   unsigned int elemtype, unsigned int arr_len)
+                                   unsigned int elemtype, unsigned int indextype,
+                                   unsigned int arr_len)
 {
     struct symt*        symt;
     struct symt*        elem = codeview_get_type(elemtype, FALSE);
+    struct symt*        index = codeview_get_type(indextype, FALSE);
     DWORD               arr_max = 0;
 
     if (elem)
@@ -400,7 +402,7 @@ static int codeview_add_type_array(struc
         symt_get_info(elem, TI_GET_LENGTH, &elem_size);
         if (elem_size) arr_max = arr_len / (DWORD)elem_size;
     }
-    symt = &symt_new_array(module, 0, arr_max, elem)->symt;
+    symt = &symt_new_array(module, 0, arr_max, elem, index)->symt;
     return codeview_add_type(typeno, symt);
 }
 
@@ -792,21 +794,21 @@ static int codeview_parse_type_table(str
             p_name = (const struct p_string*)((const unsigned char*)&type->array_v1.arrlen + leaf_len);
 
             retv = codeview_add_type_array(module, curr_type, terminate_string(p_name),
-                                           type->array_v1.elemtype, value);
+                                           type->array_v1.elemtype, type->array_v1.idxtype, value);
             break;
         case LF_ARRAY_V2:
             leaf_len = numeric_leaf(&value, &type->array_v2.arrlen);
             p_name = (const struct p_string*)((const unsigned char*)&type->array_v2.arrlen + leaf_len);
 
             retv = codeview_add_type_array(module, curr_type, terminate_string(p_name),
-                                           type->array_v2.elemtype, value);
+                                           type->array_v2.elemtype, type->array_v2.idxtype, value);
             break;
         case LF_ARRAY_V3:
             leaf_len = numeric_leaf(&value, &type->array_v3.arrlen);
             c_name = (const char*)&type->array_v3.arrlen + leaf_len;
 
             retv = codeview_add_type_array(module, curr_type, c_name,
-                                           type->array_v3.elemtype, value);
+                                           type->array_v3.elemtype, type->array_v3.idxtype, value);
             break;
 
         case LF_BITFIELD_V1:
diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c
index 7f1714f..f3d6e35 100644
--- a/dlls/dbghelp/stabs.c
+++ b/dlls/dbghelp/stabs.c
@@ -765,22 +765,23 @@ static inline int stabs_pts_read_array(s
                                        struct symt** adt)
 {
     long                lo, hi;
-    struct symt*        rdt;
+    struct symt*        range_dt;
+    struct symt*        base_dt;
 
     /* ar<typeinfo_nodef>;<int>;<int>;<typeinfo> */
 
     PTS_ABORTIF(ptd, *ptd->ptr++ != 'r');
-    /* FIXME: range type is lost, always assume int */
-    PTS_ABORTIF(ptd, stabs_pts_read_type_def(ptd, NULL, &rdt) == -1);
+
+    PTS_ABORTIF(ptd, stabs_pts_read_type_def(ptd, NULL, &range_dt) == -1);
     PTS_ABORTIF(ptd, *ptd->ptr++ != ';');	/* ';' */
     PTS_ABORTIF(ptd, stabs_pts_read_number(ptd, &lo) == -1);
     PTS_ABORTIF(ptd, *ptd->ptr++ != ';');	/* ';' */
     PTS_ABORTIF(ptd, stabs_pts_read_number(ptd, &hi) == -1);
     PTS_ABORTIF(ptd, *ptd->ptr++ != ';');	/* ';' */
 
-    PTS_ABORTIF(ptd, stabs_pts_read_type_def(ptd, NULL, &rdt) == -1);
+    PTS_ABORTIF(ptd, stabs_pts_read_type_def(ptd, NULL, &base_dt) == -1);
 
-    *adt = &symt_new_array(ptd->module, lo, hi, rdt)->symt;
+    *adt = &symt_new_array(ptd->module, lo, hi, base_dt, range_dt)->symt;
     return 0;
 }
 
diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c
index 4177aaa..54be69b 100644
--- a/dlls/dbghelp/type.c
+++ b/dlls/dbghelp/type.c
@@ -282,16 +282,17 @@ BOOL symt_add_enum_element(struct module
 }
 
 struct symt_array* symt_new_array(struct module* module, int min, int max, 
-                                  struct symt* base)
+                                  struct symt* base, struct symt* index)
 {
     struct symt_array*  sym;
 
     if ((sym = pool_alloc(&module->pool, sizeof(*sym))))
     {
-        sym->symt.tag  = SymTagArrayType;
-        sym->start     = min;
-        sym->end       = max;
-        sym->basetype  = base;
+        sym->symt.tag   = SymTagArrayType;
+        sym->start      = min;
+        sym->end        = max;
+        sym->base_type  = base;
+        sym->index_type = index;
         symt_add_type(module, &sym->symt);
     }
     return sym;
@@ -597,7 +598,7 @@ BOOL symt_get_info(const struct symt* ty
             X(DWORD64) = ((const struct symt_data*)type)->u.s.length;
             break;
         case SymTagArrayType:   
-            if (!symt_get_info(((const struct symt_array*)type)->basetype, 
+            if (!symt_get_info(((const struct symt_array*)type)->base_type, 
                                TI_GET_LENGTH, pInfo))
                 return FALSE;
             X(DWORD64) *= ((const struct symt_array*)type)->end - 
@@ -702,7 +703,7 @@ BOOL symt_get_info(const struct symt* ty
         {
             /* hierarchical => hierarchical */
         case SymTagArrayType:
-            X(DWORD) = (DWORD)((const struct symt_array*)type)->basetype;
+            X(DWORD) = (DWORD)((const struct symt_array*)type)->base_type;
             break;
         case SymTagPointerType:
             X(DWORD) = (DWORD)((const struct symt_pointer*)type)->pointsto;
@@ -753,11 +754,14 @@ BOOL symt_get_info(const struct symt* ty
         }
         else X(DWORD) = ((const struct symt_function_signature*)type)->call_conv;
         break;
+    case TI_GET_ARRAYINDEXTYPEID:
+        if (type->tag != SymTagArrayType) return FALSE;
+        X(DWORD) = (DWORD)((const struct symt_array*)type)->index_type;
+        break;
 
 #undef X
 
     case TI_GET_ADDRESSOFFSET:
-    case TI_GET_ARRAYINDEXTYPEID:
     case TI_GET_CLASSPARENTID:
     case TI_GET_SYMINDEX:
     case TI_GET_THISADJUST:




More information about the wine-cvs mailing list