72aba2be32
Move is_negated_errno() to a separate new header file negated_errno.h and include it just for architectures which require it. is_negated_errno() is not used on those architectures that have a dedicated register to signal a syscall error. The issue was raised when compiling with clang, which is more strict regarding semantics of unused static inline functions defined in C files and will issue a -Wunused-function warrning if they are not used anywhere. * syscall.c (is_negated_errno): Move to ... * negated_errno.h: ... new file. * Makefile.am (strace_SOURCES): Add it. * linux/aarch64/get_error.c: Include it. * linux/arc/get_error.c: Likewise. * linux/arm/get_error.c: Likewise. * linux/avr32/get_error.c: Likewise. * linux/bfin/get_error.c: Likewise. * linux/crisv10/get_error.c: Likewise. * linux/hppa/get_error.c: Likewise. * linux/i386/get_error.c: Likewise. * linux/ia64/get_error.c: Likewise. * linux/m68k/get_error.c: Likewise. * linux/metag/get_error.c: Likewise. * linux/microblaze/get_error.c: Likewise. * linux/or1k/get_error.c: Likewise. * linux/riscv/get_error.c: Likewise. * linux/s390/get_error.c: Likewise. * linux/sh/get_error.c: Likewise. * linux/sh64/get_error.c: Likewise. * linux/tile/get_error.c: Likewise. * linux/x86_64/get_error.c: Likewise. * linux/xtensa/get_error.c: Likewise.
26 lines
490 B
C
26 lines
490 B
C
#include "negated_errno.h"
|
|
|
|
static void
|
|
get_error(struct tcb *tcp, const bool check_errno)
|
|
{
|
|
/*
|
|
* In X32, return value is 64-bit (llseek uses one).
|
|
* Using merely "long rax" would not work.
|
|
*/
|
|
long long rax;
|
|
|
|
if (x86_io.iov_len == sizeof(i386_regs)) {
|
|
/* Sign extend from 32 bits */
|
|
rax = (int32_t) i386_regs.eax;
|
|
} else {
|
|
rax = x86_64_regs.rax;
|
|
}
|
|
|
|
if (check_errno && is_negated_errno(rax)) {
|
|
tcp->u_rval = -1;
|
|
tcp->u_error = -rax;
|
|
} else {
|
|
tcp->u_rval = rax;
|
|
}
|
|
}
|