Module: wine Branch: refs/heads/master Commit: 34636b026bf62968a0c66e95b021010145e12341 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=34636b026bf62968a0c66e95...
Author: Eric Pouech eric.pouech@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: