ntdll: Support both HP-UX-like libunwind and LLVM libunwind error codes.
HP-UX libunwind uses the sign of error code to indicate whether the operation was successful; however, LLVM always returns positive error codes. Normalise the sign of the error code so that it handles all flavours of libunwind. Signed-off-by: Jinoh Kang <jinoh.kang.kr@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d8ba473208
commit
f37b953e07
|
@ -248,12 +248,13 @@ NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispa
|
||||||
return STATUS_INVALID_DISPOSITION;
|
return STATUS_INVALID_DISPOSITION;
|
||||||
}
|
}
|
||||||
rc = unw_get_proc_info( &cursor, &info );
|
rc = unw_get_proc_info( &cursor, &info );
|
||||||
if (rc != UNW_ESUCCESS && rc != -UNW_ENOINFO)
|
if (rc < 0) rc = -rc; /* libunwind may return negative error codes */
|
||||||
|
if (rc != UNW_ESUCCESS && rc != UNW_ENOINFO)
|
||||||
{
|
{
|
||||||
WARN( "failed to get info: %d\n", rc );
|
WARN( "failed to get info: %d\n", rc );
|
||||||
return STATUS_INVALID_DISPOSITION;
|
return STATUS_INVALID_DISPOSITION;
|
||||||
}
|
}
|
||||||
if (rc == -UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip)
|
if (rc == UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip)
|
||||||
{
|
{
|
||||||
NTSTATUS status = context->Pc != context->Lr ?
|
NTSTATUS status = context->Pc != context->Lr ?
|
||||||
STATUS_SUCCESS : STATUS_INVALID_DISPOSITION;
|
STATUS_SUCCESS : STATUS_INVALID_DISPOSITION;
|
||||||
|
|
|
@ -212,12 +212,13 @@ NTSTATUS CDECL unwind_builtin_dll( ULONG type, DISPATCHER_CONTEXT *dispatch, CON
|
||||||
return STATUS_INVALID_DISPOSITION;
|
return STATUS_INVALID_DISPOSITION;
|
||||||
}
|
}
|
||||||
rc = unw_get_proc_info( &cursor, &info );
|
rc = unw_get_proc_info( &cursor, &info );
|
||||||
if (rc != UNW_ESUCCESS && rc != -UNW_ENOINFO)
|
if (rc < 0) rc = -rc; /* libunwind may return negative error codes */
|
||||||
|
if (rc != UNW_ESUCCESS && rc != UNW_ENOINFO)
|
||||||
{
|
{
|
||||||
WARN( "failed to get info: %d\n", rc );
|
WARN( "failed to get info: %d\n", rc );
|
||||||
return STATUS_INVALID_DISPOSITION;
|
return STATUS_INVALID_DISPOSITION;
|
||||||
}
|
}
|
||||||
if (rc == -UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip)
|
if (rc == UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip)
|
||||||
{
|
{
|
||||||
TRACE( "no info found for %lx ip %lx-%lx, assuming leaf function\n",
|
TRACE( "no info found for %lx ip %lx-%lx, assuming leaf function\n",
|
||||||
ip, info.start_ip, info.end_ip );
|
ip, info.start_ip, info.end_ip );
|
||||||
|
|
|
@ -1415,6 +1415,7 @@ static NTSTATUS libunwind_virtual_unwind( ULONG64 ip, ULONG64 *frame, CONTEXT *c
|
||||||
*frame = context->Rsp;
|
*frame = context->Rsp;
|
||||||
|
|
||||||
rc = unw_get_proc_info(&cursor, &info);
|
rc = unw_get_proc_info(&cursor, &info);
|
||||||
|
if (rc < 0) rc = -rc; /* libunwind may return negative error codes */
|
||||||
if (rc != UNW_ESUCCESS && rc != UNW_ENOINFO)
|
if (rc != UNW_ESUCCESS && rc != UNW_ENOINFO)
|
||||||
{
|
{
|
||||||
WARN( "failed to get info: %d\n", rc );
|
WARN( "failed to get info: %d\n", rc );
|
||||||
|
|
Loading…
Reference in New Issue