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