[PATCH 10/13] [DbgHelp]: type parsing refactoring
Eric Pouech
eric.pouech at wanadoo.fr
Sat Mar 18 06:33:06 CST 2006
- seperate types' table handling from a single type handling
by adding codeview_parse_one_type function
- factored all calls for caching symt
- make type parsing helpers return the symt instead of a
simple error status
A+
---
dlls/dbghelp/msc.c | 404 ++++++++++++++++++++++++++--------------------------
1 files changed, 205 insertions(+), 199 deletions(-)
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index db08dfb..d586eb4 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -375,20 +375,19 @@ static void codeview_clear_type_table(vo
cv_current_module = NULL;
}
-static int codeview_add_type_pointer(struct module* module, unsigned int typeno,
- unsigned int datatype)
+static struct symt* codeview_add_type_pointer(struct module* module,
+ unsigned int datatype)
{
- struct symt* symt = &symt_new_pointer(module,
- codeview_get_type(datatype, FALSE))->symt;
- return codeview_add_type(typeno, symt);
+ return &symt_new_pointer(module,
+ codeview_get_type(datatype, FALSE))->symt;
}
-static int codeview_add_type_array(struct module* module,
- unsigned int typeno, const char* name,
- unsigned int elemtype, unsigned int indextype,
- unsigned int arr_len)
+static struct symt* codeview_add_type_array(struct module* module,
+ const char* name,
+ 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;
@@ -399,8 +398,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, index)->symt;
- return codeview_add_type(typeno, symt);
+ return &symt_new_array(module, 0, arr_max, elem, index)->symt;
}
static int codeview_add_type_enum_field_list(struct module* module,
@@ -664,29 +662,31 @@ static int codeview_add_type_struct_fiel
return TRUE;
}
-static int codeview_add_type_enum(struct module* module, unsigned int typeno,
- const char* name, const union codeview_reftype* fieldlist)
+static struct symt* codeview_add_type_enum(struct module* module,
+ const char* name,
+ const union codeview_reftype* fieldlist)
{
struct symt_enum* symt = symt_new_enum(module, name);
if (fieldlist) codeview_add_type_enum_field_list(module, symt, fieldlist);
- return codeview_add_type(typeno, &symt->symt);
+ return &symt->symt;
}
-static int codeview_add_type_struct(struct codeview_type_parse* ctp, unsigned int typeno,
- const char* name, int structlen,
- const union codeview_reftype* fieldlist,
- enum UdtKind kind)
+static struct symt* codeview_add_type_struct(struct codeview_type_parse* ctp,
+ const char* name, int structlen,
+ const union codeview_reftype* fieldlist,
+ enum UdtKind kind)
{
struct symt_udt* symt = symt_new_udt(ctp->module, name, structlen, kind);
if (fieldlist) codeview_add_type_struct_field_list(ctp, symt, fieldlist);
- return codeview_add_type(typeno, &symt->symt);
+ return &symt->symt;
}
-static int codeview_new_func_signature(struct codeview_type_parse* ctp,
- unsigned typeno, unsigned ret_type,
- unsigned args_list, enum CV_call_e call_conv)
+static struct symt* codeview_add_func_signature(struct codeview_type_parse* ctp,
+ unsigned ret_type,
+ unsigned args_list,
+ enum CV_call_e call_conv)
{
struct symt_function_signature* sym;
const union codeview_reftype* reftype;
@@ -716,22 +716,195 @@ static int codeview_new_func_signature(s
}
}
- return codeview_add_type(typeno, &sym->symt);
+ return &sym->symt;
}
-static int codeview_parse_type_table(struct codeview_type_parse* ctp)
+static struct symt* codeview_parse_one_type(struct codeview_type_parse* ctp,
+ unsigned curr_type,
+ const union codeview_type* type)
{
- unsigned int curr_type = FIRST_DEFINABLE_TYPE;
- int retv = TRUE;
- const union codeview_type* type;
const union codeview_reftype*type_ref;
int value, leaf_len;
const struct p_string* p_name;
const char* c_name;
+ struct symt* symt;
- for (curr_type = FIRST_DEFINABLE_TYPE; retv && curr_type < FIRST_DEFINABLE_TYPE + ctp->num; curr_type++)
+ switch (type->generic.id)
+ {
+ case LF_MODIFIER_V1:
+ /* FIXME: we don't handle modifiers,
+ * but readd previous type on the curr_type
+ */
+ WARN("Modifier on %x: %s%s%s%s\n",
+ type->modifier_v1.type,
+ type->modifier_v1.attribute & 0x01 ? "const " : "",
+ type->modifier_v1.attribute & 0x02 ? "volatile " : "",
+ type->modifier_v1.attribute & 0x04 ? "unaligned " : "",
+ type->modifier_v1.attribute & ~0x07 ? "unknown " : "");
+ symt = codeview_get_type(type->modifier_v1.type, FALSE);
+ break;
+ case LF_MODIFIER_V2:
+ /* FIXME: we don't handle modifiers, but readd previous type on the curr_type */
+ WARN("Modifier on %x: %s%s%s%s\n",
+ type->modifier_v2.type,
+ type->modifier_v2.attribute & 0x01 ? "const " : "",
+ type->modifier_v2.attribute & 0x02 ? "volatile " : "",
+ type->modifier_v2.attribute & 0x04 ? "unaligned " : "",
+ type->modifier_v2.attribute & ~0x07 ? "unknown " : "");
+ symt = codeview_get_type(type->modifier_v2.type, FALSE);
+ break;
+
+ case LF_POINTER_V1:
+ symt = codeview_add_type_pointer(ctp->module,
+ type->pointer_v1.datatype);
+ break;
+ case LF_POINTER_V2:
+ symt = codeview_add_type_pointer(ctp->module,
+ type->pointer_v2.datatype);
+ break;
+
+ case LF_ARRAY_V1:
+ leaf_len = numeric_leaf(&value, &type->array_v1.arrlen);
+ p_name = (const struct p_string*)((const unsigned char*)&type->array_v1.arrlen + leaf_len);
+
+ symt = codeview_add_type_array(ctp->module, terminate_string(p_name),
+ 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);
+
+ symt = codeview_add_type_array(ctp->module, terminate_string(p_name),
+ 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;
+
+ symt = codeview_add_type_array(ctp->module, c_name,
+ type->array_v3.elemtype, type->array_v3.idxtype, value);
+ break;
+
+ case LF_STRUCTURE_V1:
+ case LF_CLASS_V1:
+ leaf_len = numeric_leaf(&value, &type->struct_v1.structlen);
+ p_name = (const struct p_string*)((const unsigned char*)&type->struct_v1.structlen + leaf_len);
+ type_ref = codeview_jump_to_type(ctp, type->struct_v1.fieldlist);
+ symt = codeview_add_type_struct(ctp, terminate_string(p_name),
+ value, type_ref,
+ type->generic.id == LF_CLASS_V1 ? UdtClass : UdtStruct);
+ break;
+
+ case LF_STRUCTURE_V2:
+ case LF_CLASS_V2:
+ leaf_len = numeric_leaf(&value, &type->struct_v2.structlen);
+ p_name = (const struct p_string*)((const unsigned char*)&type->struct_v2.structlen + leaf_len);
+ type_ref = codeview_jump_to_type(ctp, type->struct_v2.fieldlist);
+ symt = codeview_add_type_struct(ctp, terminate_string(p_name),
+ value, type_ref,
+ type->generic.id == LF_CLASS_V2 ? UdtClass : UdtStruct);
+ break;
+
+ case LF_STRUCTURE_V3:
+ case LF_CLASS_V3:
+ leaf_len = numeric_leaf(&value, &type->struct_v3.structlen);
+ c_name = (const char*)&type->struct_v3.structlen + leaf_len;
+ type_ref = codeview_jump_to_type(ctp, type->struct_v3.fieldlist);
+ symt = codeview_add_type_struct(ctp, c_name,
+ value, type_ref,
+ type->generic.id == LF_CLASS_V3 ? UdtClass : UdtStruct);
+ break;
+
+ case LF_UNION_V1:
+ leaf_len = numeric_leaf(&value, &type->union_v1.un_len);
+ p_name = (const struct p_string*)((const unsigned char*)&type->union_v1.un_len + leaf_len);
+ type_ref = codeview_jump_to_type(ctp, type->union_v1.fieldlist);
+ symt = codeview_add_type_struct(ctp, terminate_string(p_name),
+ value, type_ref, UdtUnion);
+ break;
+
+ case LF_UNION_V2:
+ leaf_len = numeric_leaf(&value, &type->union_v2.un_len);
+ p_name = (const struct p_string*)((const unsigned char*)&type->union_v2.un_len + leaf_len);
+ type_ref = codeview_jump_to_type(ctp, type->union_v2.fieldlist);
+ symt = codeview_add_type_struct(ctp, terminate_string(p_name),
+ value, type_ref, UdtUnion);
+ break;
+ case LF_UNION_V3:
+ leaf_len = numeric_leaf(&value, &type->union_v3.un_len);
+ c_name = (const char*)&type->union_v3.un_len + leaf_len;
+ type_ref = codeview_jump_to_type(ctp, type->union_v3.fieldlist);
+ symt = codeview_add_type_struct(ctp, c_name,
+ value, type_ref, UdtUnion);
+ break;
+
+ case LF_ENUM_V1:
+ type_ref = codeview_jump_to_type(ctp, type->enumeration_v1.fieldlist);
+ symt = codeview_add_type_enum(ctp->module,
+ terminate_string(&type->enumeration_v1.p_name),
+ type_ref);
+ break;
+
+ case LF_ENUM_V2:
+ type_ref = codeview_jump_to_type(ctp, type->enumeration_v2.fieldlist);
+ symt = codeview_add_type_enum(ctp->module,
+ terminate_string(&type->enumeration_v2.p_name),
+ type_ref);
+ break;
+
+ case LF_ENUM_V3:
+ type_ref = codeview_jump_to_type(ctp, type->enumeration_v3.fieldlist);
+ symt = codeview_add_type_enum(ctp->module, type->enumeration_v3.name,
+ type_ref);
+ break;
+
+ case LF_PROCEDURE_V1:
+ symt = codeview_add_func_signature(ctp,
+ type->procedure_v1.rvtype,
+ type->procedure_v1.arglist,
+ type->procedure_v1.call);
+ break;
+ case LF_PROCEDURE_V2:
+ symt = codeview_add_func_signature(ctp,
+ type->procedure_v2.rvtype,
+ type->procedure_v2.arglist,
+ type->procedure_v2.call);
+ break;
+ case LF_MFUNCTION_V1:
+ /* FIXME: for C++, this is plain wrong, but as we don't use arg types
+ * nor class information, this would just do for now
+ */
+ symt = codeview_add_func_signature(ctp,
+ type->mfunction_v1.rvtype,
+ type->mfunction_v1.arglist,
+ type->mfunction_v1.call);
+ break;
+ case LF_MFUNCTION_V2:
+ /* FIXME: for C++, this is plain wrong, but as we don't use arg types
+ * nor class information, this would just do for now
+ */
+ symt = codeview_add_func_signature(ctp,
+ type->mfunction_v2.rvtype,
+ type->mfunction_v2.arglist,
+ type->mfunction_v2.call);
+ break;
+
+ default:
+ FIXME("Unsupported type-id leaf %x\n", type->generic.id);
+ dump(type, 2 + type->generic.len);
+ symt = NULL;
+ break;
+ }
+ return (symt && codeview_add_type(curr_type, symt)) ? symt : NULL;
+}
+
+static int codeview_parse_type_table(struct codeview_type_parse* ctp)
+{
+ unsigned int curr_type = FIRST_DEFINABLE_TYPE;
+ const union codeview_type* type;
+
+ for (curr_type = FIRST_DEFINABLE_TYPE; curr_type < FIRST_DEFINABLE_TYPE + ctp->num; curr_type++)
{
- retv = TRUE;
type = codeview_jump_to_type(ctp, curr_type);
/* type records we're interested in are the ones referenced by symbols
@@ -746,177 +919,10 @@ static int codeview_parse_type_table(str
* 8000-8010 for numeric leafes
*/
if (type->generic.id & 0x8600) continue;
-
- switch (type->generic.id)
- {
- case LF_MODIFIER_V1:
- /* FIXME: we don't handle modifiers,
- * but readd previous type on the curr_type
- */
- WARN("Modifier on %x: %s%s%s%s\n",
- type->modifier_v1.type,
- type->modifier_v1.attribute & 0x01 ? "const " : "",
- type->modifier_v1.attribute & 0x02 ? "volatile " : "",
- type->modifier_v1.attribute & 0x04 ? "unaligned " : "",
- type->modifier_v1.attribute & ~0x07 ? "unknown " : "");
- codeview_add_type(curr_type,
- codeview_get_type(type->modifier_v1.type, FALSE));
- break;
- case LF_MODIFIER_V2:
- /* FIXME: we don't handle modifiers, but readd previous type on the curr_type */
- WARN("Modifier on %x: %s%s%s%s\n",
- type->modifier_v2.type,
- type->modifier_v2.attribute & 0x01 ? "const " : "",
- type->modifier_v2.attribute & 0x02 ? "volatile " : "",
- type->modifier_v2.attribute & 0x04 ? "unaligned " : "",
- type->modifier_v2.attribute & ~0x07 ? "unknown " : "");
- codeview_add_type(curr_type,
- codeview_get_type(type->modifier_v2.type, FALSE));
- break;
-
- case LF_POINTER_V1:
- retv = codeview_add_type_pointer(ctp->module, curr_type,
- type->pointer_v1.datatype);
- break;
- case LF_POINTER_V2:
- retv = codeview_add_type_pointer(ctp->module, curr_type,
- type->pointer_v2.datatype);
- break;
-
- case LF_ARRAY_V1:
- leaf_len = numeric_leaf(&value, &type->array_v1.arrlen);
- p_name = (const struct p_string*)((const unsigned char*)&type->array_v1.arrlen + leaf_len);
-
- retv = codeview_add_type_array(ctp->module, curr_type, terminate_string(p_name),
- 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(ctp->module, curr_type, terminate_string(p_name),
- 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(ctp->module, curr_type, c_name,
- type->array_v3.elemtype, type->array_v3.idxtype, value);
- break;
-
- case LF_STRUCTURE_V1:
- case LF_CLASS_V1:
- leaf_len = numeric_leaf(&value, &type->struct_v1.structlen);
- p_name = (const struct p_string*)((const unsigned char*)&type->struct_v1.structlen + leaf_len);
- type_ref = codeview_jump_to_type(ctp, type->struct_v1.fieldlist);
- retv = codeview_add_type_struct(ctp, curr_type, terminate_string(p_name),
- value, type_ref,
- type->generic.id == LF_CLASS_V1 ? UdtClass : UdtStruct);
- break;
-
- case LF_STRUCTURE_V2:
- case LF_CLASS_V2:
- leaf_len = numeric_leaf(&value, &type->struct_v2.structlen);
- p_name = (const struct p_string*)((const unsigned char*)&type->struct_v2.structlen + leaf_len);
- type_ref = codeview_jump_to_type(ctp, type->struct_v2.fieldlist);
- retv = codeview_add_type_struct(ctp, curr_type, terminate_string(p_name),
- value, type_ref,
- type->generic.id == LF_CLASS_V2 ? UdtClass : UdtStruct);
- break;
-
- case LF_STRUCTURE_V3:
- case LF_CLASS_V3:
- leaf_len = numeric_leaf(&value, &type->struct_v3.structlen);
- c_name = (const char*)&type->struct_v3.structlen + leaf_len;
- type_ref = codeview_jump_to_type(ctp, type->struct_v3.fieldlist);
- retv = codeview_add_type_struct(ctp, curr_type, c_name,
- value, type_ref,
- type->generic.id == LF_CLASS_V3 ? UdtClass : UdtStruct);
- break;
-
- case LF_UNION_V1:
- leaf_len = numeric_leaf(&value, &type->union_v1.un_len);
- p_name = (const struct p_string*)((const unsigned char*)&type->union_v1.un_len + leaf_len);
- type_ref = codeview_jump_to_type(ctp, type->union_v1.fieldlist);
- retv = codeview_add_type_struct(ctp, curr_type, terminate_string(p_name),
- value, type_ref, UdtUnion);
- break;
-
- case LF_UNION_V2:
- leaf_len = numeric_leaf(&value, &type->union_v2.un_len);
- p_name = (const struct p_string*)((const unsigned char*)&type->union_v2.un_len + leaf_len);
- type_ref = codeview_jump_to_type(ctp, type->union_v2.fieldlist);
- retv = codeview_add_type_struct(ctp, curr_type, terminate_string(p_name),
- value, type_ref, UdtUnion);
- break;
- case LF_UNION_V3:
- leaf_len = numeric_leaf(&value, &type->union_v3.un_len);
- c_name = (const char*)&type->union_v3.un_len + leaf_len;
- type_ref = codeview_jump_to_type(ctp, type->union_v3.fieldlist);
- retv = codeview_add_type_struct(ctp, curr_type, c_name,
- value, type_ref, UdtUnion);
- break;
-
- case LF_ENUM_V1:
- type_ref = codeview_jump_to_type(ctp, type->enumeration_v1.fieldlist);
- retv = codeview_add_type_enum(ctp->module, curr_type,
- terminate_string(&type->enumeration_v1.p_name),
- type_ref);
- break;
-
- case LF_ENUM_V2:
- type_ref = codeview_jump_to_type(ctp, type->enumeration_v2.fieldlist);
- retv = codeview_add_type_enum(ctp->module, curr_type,
- terminate_string(&type->enumeration_v2.p_name),
- type_ref);
- break;
-
- case LF_ENUM_V3:
- type_ref = codeview_jump_to_type(ctp, type->enumeration_v3.fieldlist);
- retv = codeview_add_type_enum(ctp->module, curr_type, type->enumeration_v3.name,
- type_ref);
- break;
-
- case LF_PROCEDURE_V1:
- retv = codeview_new_func_signature(ctp, curr_type,
- type->procedure_v1.rvtype,
- type->procedure_v1.arglist,
- type->procedure_v1.call);
- break;
- case LF_PROCEDURE_V2:
- retv = codeview_new_func_signature(ctp, curr_type,
- type->procedure_v2.rvtype,
- type->procedure_v2.arglist,
- type->procedure_v2.call);
- break;
- case LF_MFUNCTION_V1:
- /* FIXME: for C++, this is plain wrong, but as we don't use arg types
- * nor class information, this would just do for now
- */
- retv = codeview_new_func_signature(ctp, curr_type,
- type->mfunction_v1.rvtype,
- type->mfunction_v1.arglist,
- type->mfunction_v1.call);
- break;
- case LF_MFUNCTION_V2:
- /* FIXME: for C++, this is plain wrong, but as we don't use arg types
- * nor class information, this would just do for now
- */
- retv = codeview_new_func_signature(ctp, curr_type,
- type->mfunction_v2.rvtype,
- type->mfunction_v2.arglist,
- type->mfunction_v2.call);
- break;
-
- default:
- FIXME("Unsupported type-id leaf %x\n", type->generic.id);
- dump(type, 2 + type->generic.len);
- break;
- }
+ codeview_parse_one_type(ctp, curr_type, type);
}
- return retv;
+ return TRUE;
}
/*========================================================================
More information about the wine-patches
mailing list