From: Denys V. <dvl...@re...> - 2009-01-23 16:33:39
|
Hi Michal. On Tue, 2009-01-20 at 09:28 -0500, Michal Nowak wrote: > On i386 building strace from CVS emits following warning: > > if gcc -DHAVE_CONFIG_H -I. -I. -I. -Ilinux/i386 -I./linux/i386 -Ilinux -I./linux -Wall -g -O2 -MT syscall.o -MD -MP -MF ".deps/syscall.Tpo" -c -o syscall.o syscall.c; \ > then mv -f ".deps/syscall.Tpo" ".deps/syscall.Po"; else rm -f ".deps/syscall.Tpo"; exit 1; fi > syscall.c: In function ‘get_scno’: > syscall.c:788: warning: unused variable ‘pid’ > > Attached patch fixes it by disabling [1] for archs, which don't > actually use it. I successfully tested/compiled it on i386 and > IA-64. Oh no :( long scno = 0; #ifndef USE_PROCFS +#if defined(S390) || defined(S390X) || defined(X86_64) || defined(ARM) \ + || defined(LINUX_MIPSN32) || defined(LINUX_MIPSN64) || defined(SPARC) \ + || defined(SPARC64) || (defined(IA64) && defined(PTRACE_GETSIGINFO)) int pid = tcp->pid; -#endif /* !PROCFS */ +#endif /* + S390 || S390X || X86_64 || ARM || LINUX_MIPSN32 || LINUX_MIPSN64 + || SPARC || SPARC64 || (IA64 && PTRACE_GETSIGINFO) */ +#endif /* !USE_PROCFS */ #ifdef forest is a Bad Thing. Avoid it. It's far better to just move "int pid = tcp->pid;" into every arch block which needs it and/or use tcp->pid instead of pid. My version is below. I applied it ti cvs. Thanks for bugging me about this problem. -- vda diff -u -r1.107 syscall.c --- syscall.c 17 Jan 2009 01:06:18 -0000 1.107 +++ syscall.c 23 Jan 2009 16:26:07 -0000 @@ -780,13 +780,9 @@ #endif /* FREEBSD */ int -get_scno(tcp) -struct tcb *tcp; +get_scno(struct tcb *tcp) { long scno = 0; -#ifndef USE_PROCFS - int pid = tcp->pid; -#endif /* !PROCFS */ #ifdef LINUX #if defined(S390) || defined(S390X) @@ -833,7 +829,7 @@ if (upeek(tcp, PT_PSWADDR, &pc) < 0) return -1; errno = 0; - opcode = ptrace(PTRACE_PEEKTEXT, pid, (char *)(pc-sizeof(long)), 0); + opcode = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)(pc-sizeof(long)), 0); if (errno) { perror("peektext(pc-oneword)"); return -1; @@ -874,7 +870,7 @@ return -1; svc_addr += tmp; - scno = ptrace(PTRACE_PEEKTEXT, pid, svc_addr, 0); + scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, svc_addr, 0); if (errno) return -1; #if defined(S390X) @@ -916,6 +912,7 @@ if (!(tcp->flags & TCB_INSYSCALL)) { static int currpers = -1; long val; + int pid = tcp->pid; /* Check CS register value. On x86-64 linux it is: * 0x33 for long mode (64 bit) @@ -1004,7 +1001,7 @@ * magic SIGTRAP. Moot anyway, PTRACE_GETSIGINFO * doesn't fail. */ - ptrace(PTRACE_GETSIGINFO, pid, (void*) 0, (void*) &si); + ptrace(PTRACE_GETSIGINFO, tcp->pid, (void*) 0, (void*) &si); if (si.si_code == SI_USER) return 0; #else @@ -1023,7 +1020,7 @@ /* * Read complete register set in one go. */ - if (ptrace(PTRACE_GETREGS, pid, NULL, (void *)®s) == -1) + if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)®s) == -1) return -1; /* @@ -1051,7 +1048,7 @@ * Get the ARM-mode system call number */ errno = 0; - scno = ptrace(PTRACE_PEEKTEXT, pid, (void *)(regs.ARM_pc - 4), NULL); + scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *)(regs.ARM_pc - 4), NULL); if (errno) return -1; @@ -1105,7 +1102,7 @@ #elif defined (LINUX_MIPSN32) unsigned long long regs[38]; - if (ptrace (PTRACE_GETREGS, pid, NULL, (long) ®s) < 0) + if (ptrace (PTRACE_GETREGS, tcp->pid, NULL, (long) ®s) < 0) return -1; a3 = regs[REG_A3]; r2 = regs[REG_V0]; @@ -1183,14 +1180,14 @@ } #elif defined (SPARC) || defined (SPARC64) /* Everything we need is in the current register set. */ - if (ptrace(PTRACE_GETREGS,pid,(char *)®s,0) < 0) + if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) return -1; /* If we are entering, then disassemble the syscall trap. */ if (!(tcp->flags & TCB_INSYSCALL)) { /* Retrieve the syscall trap instruction. */ errno = 0; - trap = ptrace(PTRACE_PEEKTEXT,pid,(char *)regs.r_pc,0); + trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.r_pc, 0); #if defined(SPARC64) trap >>= 32; #endif |