[PATCH 5/9] dbghelp: improved handling of SymGetTypeInfo()
Eric Pouech
eric.pouech at gmail.com
Tue Oct 5 07:25:29 CDT 2021
- matches what native does
- will silence a bunch of FIXME:s
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
dlls/dbghelp/type.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 73 insertions(+), 7 deletions(-)
diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c
index bff31bc2546..a73bf8dca14 100644
--- a/dlls/dbghelp/type.c
+++ b/dlls/dbghelp/type.c
@@ -111,6 +111,10 @@ const char* symt_get_name(const struct symt* sym)
case SymTagArrayType:
case SymTagPointerType:
case SymTagFunctionType:
+ case SymTagFunctionArgType:
+ case SymTagBlock:
+ case SymTagFuncDebugStart:
+ case SymTagFuncDebugEnd:
return NULL;
}
}
@@ -165,7 +169,16 @@ BOOL symt_get_address(const struct symt* type, ULONG64* addr)
default:
FIXME("Unsupported sym-tag %s for get-address\n", symt_get_tag_str(type->tag));
/* fall through */
+ case SymTagExe:
case SymTagCompiland:
+ case SymTagFunctionType:
+ case SymTagFunctionArgType:
+ case SymTagBaseType:
+ case SymTagUDT:
+ case SymTagEnum:
+ case SymTagTypedef:
+ case SymTagPointerType:
+ case SymTagArrayType:
return FALSE;
}
return TRUE;
@@ -558,6 +571,17 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
case SymTagFunctionType: v = &((const struct symt_function_signature*)type)->vchildren; break;
case SymTagFunction: v = &((const struct symt_function*)type)->vchildren; break;
case SymTagBlock: v = &((const struct symt_block*)type)->vchildren; break;
+ case SymTagPointerType:
+ case SymTagArrayType:
+ case SymTagFunctionArgType:
+ case SymTagThunk:
+ case SymTagLabel:
+ case SymTagFuncDebugStart:
+ case SymTagFuncDebugEnd:
+ case SymTagTypedef:
+ case SymTagBaseType:
+ /* for those, CHILDRENCOUNT returns 0 */
+ return tifp->Count == 0;
default:
FIXME("Unsupported sym-tag %s for find-children\n",
symt_get_tag_str(type->tag));
@@ -620,18 +644,25 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
case SymTagBlock:
X(DWORD) = vector_length(&((const struct symt_block*)type)->vchildren);
break;
- case SymTagPointerType: /* MS does it that way */
- case SymTagArrayType: /* MS does it that way */
- case SymTagThunk: /* MS does it that way */
+ /* some SymTag:s return 0 */
+ case SymTagPointerType:
+ case SymTagArrayType:
+ case SymTagFunctionArgType:
+ case SymTagThunk:
+ case SymTagFuncDebugStart:
+ case SymTagFuncDebugEnd:
+ case SymTagLabel:
+ case SymTagTypedef:
+ case SymTagBaseType:
X(DWORD) = 0;
break;
default:
FIXME("Unsupported sym-tag %s for get-children-count\n",
symt_get_tag_str(type->tag));
/* fall through */
+ /* some others return error */
case SymTagData:
case SymTagPublicSymbol:
- case SymTagBaseType:
return FALSE;
}
break;
@@ -699,14 +730,15 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
case SymTagThunk:
X(DWORD64) = ((const struct symt_thunk*)type)->size;
break;
- case SymTagLabel:
- X(DWORD64) = 0;
- break;
default:
FIXME("Unsupported sym-tag %s for get-length\n",
symt_get_tag_str(type->tag));
/* fall through */
+ case SymTagExe:
+ case SymTagCompiland:
case SymTagFunctionType:
+ case SymTagFunctionArgType:
+ case SymTagLabel:
return FALSE;
}
break;
@@ -729,11 +761,25 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
case SymTagThunk:
X(DWORD) = symt_ptr2index(module, ((const struct symt_thunk*)type)->container);
break;
+ case SymTagFuncDebugStart:
+ case SymTagFuncDebugEnd:
+ case SymTagLabel:
+ X(DWORD) = symt_ptr2index(module, ((const struct symt_hierarchy_point*)type)->parent);
+ break;
case SymTagUDT:
case SymTagEnum:
+ case SymTagFunctionType:
case SymTagFunctionArgType:
+ case SymTagPointerType:
+ case SymTagArrayType:
+ case SymTagBaseType:
+ case SymTagTypedef:
+ case SymTagBaseClass:
+ case SymTagPublicSymbol:
X(DWORD) = symt_ptr2index(module, &module->top->symt);
break;
+ case SymTagExe:
+ return FALSE;
default:
FIXME("Unsupported sym-tag %s for get-lexical-parent\n",
symt_get_tag_str(type->tag));
@@ -775,6 +821,19 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
default:
FIXME("Unsupported sym-tag %s for get-offset\n",
symt_get_tag_str(type->tag));
+ case SymTagExe:
+ case SymTagCompiland:
+ case SymTagUDT:
+ case SymTagFunctionType:
+ case SymTagFunctionArgType:
+ case SymTagPointerType:
+ case SymTagArrayType:
+ case SymTagBaseType:
+ case SymTagTypedef:
+ case SymTagBlock:
+ case SymTagFuncDebugStart:
+ case SymTagFuncDebugEnd:
+ case SymTagLabel:
return FALSE;
}
break;
@@ -839,7 +898,14 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
/* fall through */
case SymTagPublicSymbol:
case SymTagThunk:
+ case SymTagBlock:
+ case SymTagFuncDebugStart:
+ case SymTagFuncDebugEnd:
case SymTagLabel:
+ case SymTagExe:
+ case SymTagCompiland:
+ case SymTagUDT:
+ case SymTagBaseType:
return FALSE;
}
break;
More information about the wine-devel
mailing list