dbghelp: Support UWOP_PUSH_MACHFRAME on x64.
Signed-off-by: Paul Gofman <pgofman@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
6bcde00566
commit
4005201922
|
@ -474,6 +474,7 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw,
|
||||||
DWORD64 newframe, prolog_offset, off, value;
|
DWORD64 newframe, prolog_offset, off, value;
|
||||||
M128A floatvalue;
|
M128A floatvalue;
|
||||||
union handler_data handler_data;
|
union handler_data handler_data;
|
||||||
|
BOOL mach_frame = FALSE;
|
||||||
|
|
||||||
/* FIXME: we have some assumptions here */
|
/* FIXME: we have some assumptions here */
|
||||||
assert(context);
|
assert(context);
|
||||||
|
@ -556,7 +557,23 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw,
|
||||||
set_float_reg(context, info->UnwindCode[i].u.OpInfo, floatvalue);
|
set_float_reg(context, info->UnwindCode[i].u.OpInfo, floatvalue);
|
||||||
break;
|
break;
|
||||||
case UWOP_PUSH_MACHFRAME:
|
case UWOP_PUSH_MACHFRAME:
|
||||||
FIXME("PUSH_MACHFRAME %u\n", info->UnwindCode[i].u.OpInfo);
|
if (info->Flags & UNW_FLAG_CHAININFO)
|
||||||
|
{
|
||||||
|
FIXME("PUSH_MACHFRAME with chained unwind info.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i + get_opcode_size(info->UnwindCode[i]) < info->CountOfCodes)
|
||||||
|
{
|
||||||
|
FIXME("PUSH_MACHFRAME is not the last opcode.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->UnwindCode[i].u.OpInfo)
|
||||||
|
context->Rsp += 0x8;
|
||||||
|
|
||||||
|
if (!sw_read_mem(csw, context->Rsp, &context->Rip, sizeof(DWORD64))) return FALSE;
|
||||||
|
if (!sw_read_mem(csw, context->Rsp + 24, &context->Rsp, sizeof(DWORD64))) return FALSE;
|
||||||
|
mach_frame = TRUE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("unknown code %u\n", info->UnwindCode[i].u.UnwindOp);
|
FIXME("unknown code %u\n", info->UnwindCode[i].u.UnwindOp);
|
||||||
|
@ -569,7 +586,7 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw,
|
||||||
&handler_data, sizeof(handler_data))) return FALSE;
|
&handler_data, sizeof(handler_data))) return FALSE;
|
||||||
function = &handler_data.chain; /* restart with the chained info */
|
function = &handler_data.chain; /* restart with the chained info */
|
||||||
}
|
}
|
||||||
return default_unwind(csw, context);
|
return mach_frame ? TRUE : default_unwind(csw, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fetch_next_frame()
|
/* fetch_next_frame()
|
||||||
|
|
Loading…
Reference in New Issue