From: Julian Seward Date: Wed, 5 Oct 2011 07:39:07 +0000 (+0000) Subject: ppc64-linux only: fix incorrect line number reports in client requests X-Git-Tag: svn/VALGRIND_3_7_0~136 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0eef127a307a8cb89a539bfd2d8c67c3faf5bfd9;p=thirdparty%2Fvalgrind.git ppc64-linux only: fix incorrect line number reports in client requests that create stack traces. Fixes #283243. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12101 --- diff --git a/include/valgrind.h b/include/valgrind.h index 0603aeea15..7bce103e65 100644 --- a/include/valgrind.h +++ b/include/valgrind.h @@ -474,8 +474,8 @@ typedef \ __extension__ \ ({ unsigned long long int _zzq_args[6]; \ - register unsigned long long int _zzq_result __asm__("r3"); \ - register unsigned long long int* _zzq_ptr __asm__("r4"); \ + unsigned long long int _zzq_result; \ + unsigned long long int* _zzq_ptr; \ _zzq_args[0] = (unsigned long long int)(_zzq_request); \ _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ @@ -483,32 +483,37 @@ typedef _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ _zzq_ptr = _zzq_args; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + __asm__ volatile("mr 3,%1\n\t" /*default*/ \ + "mr 4,%2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ /* %R3 = client_request ( %R4 ) */ \ - "or 1,1,1" \ - : "=r" (_zzq_result) \ - : "0" (_zzq_default), "r" (_zzq_ptr) \ - : "cc", "memory"); \ + "or 1,1,1\n\t" \ + "mr %0,3" /*result*/ \ + : "=b" (_zzq_result) \ + : "b" (_zzq_default), "b" (_zzq_ptr) \ + : "cc", "memory", "r3", "r4"); \ _zzq_result; \ }) #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - register unsigned long long int __addr __asm__("r3"); \ + unsigned long long int __addr; \ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ /* %R3 = guest_NRADDR */ \ - "or 2,2,2" \ - : "=r" (__addr) \ + "or 2,2,2\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ : \ - : "cc", "memory" \ + : "cc", "memory", "r3" \ ); \ _zzq_orig->nraddr = __addr; \ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ /* %R3 = guest_NRADDR_GPR2 */ \ - "or 4,4,4" \ - : "=r" (__addr) \ + "or 4,4,4\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ : \ - : "cc", "memory" \ + : "cc", "memory", "r3" \ ); \ _zzq_orig->r2 = __addr; \ }