Module: wine Branch: stable Commit: cc97cd5df2eb5d942057b8ac8163f2e660d28f7c URL: http://source.winehq.org/git/wine.git/?a=commit;h=cc97cd5df2eb5d942057b8ac81...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Sep 7 01:43:27 2016 +0300
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 (cherry picked from commit ab27cb48fc6bc0a11bff05f0be49b8befc3718e4) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/dbghelp/dwarf.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index dcbcf0a..3fd1920 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -2641,7 +2641,7 @@ static BOOL parse_cie_details(dwarf2_traverse_context_t* ctx, struct frame_info*
/* parse the CIE first */ 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); return FALSE; @@ -2649,12 +2649,21 @@ static BOOL parse_cie_details(dwarf2_traverse_context_t* ctx, struct frame_info* augmentation = (const char*)ctx->data; ctx->data += strlen(augmentation) + 1;
- info->code_align = dwarf2_leb128_as_unsigned(ctx); - info->data_align = dwarf2_leb128_as_signed(ctx); - if (version == 1) - info->retaddr_reg = dwarf2_parse_byte(ctx); - else - info->retaddr_reg = dwarf2_leb128_as_unsigned(ctx); + switch (version) + { + case 4: + /* skip 'address_size' and 'segment_size' */ + ctx->data += 2; + /* 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;
end = NULL;