dbghelp: Support CIE version 4 in parse_cie_details().

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2016-09-07 01:43:27 +03:00 committed by Alexandre Julliard
parent f85e7d1716
commit ab27cb48fc

View File

@ -2641,7 +2641,7 @@ static BOOL parse_cie_details(dwarf2_traverse_context_t* ctx, struct frame_info*
/* parse the CIE first */ /* parse the CIE first */
version = dwarf2_parse_byte(ctx); version = dwarf2_parse_byte(ctx);
if (version != 1 && version != 3) if (version != 1 && version != 3 && version != 4)
{ {
FIXME("unknown CIE version %u at %p\n", version, ctx->data - 1); FIXME("unknown CIE version %u at %p\n", version, ctx->data - 1);
return FALSE; return FALSE;
@ -2649,12 +2649,21 @@ static BOOL parse_cie_details(dwarf2_traverse_context_t* ctx, struct frame_info*
augmentation = (const char*)ctx->data; augmentation = (const char*)ctx->data;
ctx->data += strlen(augmentation) + 1; ctx->data += strlen(augmentation) + 1;
info->code_align = dwarf2_leb128_as_unsigned(ctx); switch (version)
info->data_align = dwarf2_leb128_as_signed(ctx); {
if (version == 1) case 4:
info->retaddr_reg = dwarf2_parse_byte(ctx); /* skip 'address_size' and 'segment_size' */
else ctx->data += 2;
info->retaddr_reg = dwarf2_leb128_as_unsigned(ctx); /* fallthrough */
case 1:
case 3:
info->code_align = dwarf2_leb128_as_unsigned(ctx);
info->data_align = dwarf2_leb128_as_signed(ctx);
info->retaddr_reg = version == 1 ? dwarf2_parse_byte(ctx) :dwarf2_leb128_as_unsigned(ctx);
break;
default:
;
}
info->state.cfa_rule = RULE_CFA_OFFSET; info->state.cfa_rule = RULE_CFA_OFFSET;
end = NULL; end = NULL;