From: Julian Seward Date: Mon, 4 Jan 2010 01:01:02 +0000 (+0000) Subject: Don't assume that va_list can be casted to an unsigned word. Fixes X-Git-Tag: svn/VALGRIND_3_6_0~418 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a72ca7473064e783c9fb75237200ff4e430d2167;p=thirdparty%2Fvalgrind.git Don't assume that va_list can be casted to an unsigned word. Fixes the build on arm-linux with gcc-4.4 or later. Patch from Dmitry Zhurikhin. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11006 --- diff --git a/coregrind/m_scheduler/scheduler.c b/coregrind/m_scheduler/scheduler.c index 63d38a1836..67fb7bf0e3 100644 --- a/coregrind/m_scheduler/scheduler.c +++ b/coregrind/m_scheduler/scheduler.c @@ -1408,15 +1408,27 @@ void do_client_request ( ThreadId tid ) break; case VG_USERREQ__PRINTF: { - Int count = - VG_(vmessage)( Vg_ClientMsg, (char *)arg[1], (void*)arg[2] ); + union { + va_list vargs; + unsigned long ul; + } args; + Int count; + args.ul = (unsigned long)arg[2]; + count = + VG_(vmessage)( Vg_ClientMsg, (char *)arg[1], args.vargs ); VG_(message_flush)(); SET_CLREQ_RETVAL( tid, count ); break; } case VG_USERREQ__INTERNAL_PRINTF: { - Int count = - VG_(vmessage)( Vg_DebugMsg, (char *)arg[1], (void*)arg[2] ); + union { + va_list vargs; + unsigned long ul; + } args; + Int count; + args.ul = (unsigned long)arg[2]; + count = + VG_(vmessage)( Vg_DebugMsg, (char *)arg[1], args.vargs ); VG_(message_flush)(); SET_CLREQ_RETVAL( tid, count ); break; } @@ -1427,8 +1439,14 @@ void do_client_request ( ThreadId tid ) break; } case VG_USERREQ__PRINTF_BACKTRACE: { - Int count = - VG_(vmessage)( Vg_ClientMsg, (char *)arg[1], (void*)arg[2] ); + union { + va_list vargs; + unsigned long ul; + } args; + Int count; + args.ul = (unsigned long)arg[2]; + count = + VG_(vmessage)( Vg_ClientMsg, (char *)arg[1], args.vargs ); VG_(message_flush)(); VG_(get_and_pp_StackTrace)( tid, VG_(clo_backtrace_size) ); SET_CLREQ_RETVAL( tid, count ); diff --git a/coregrind/pub_core_clreq.h b/coregrind/pub_core_clreq.h index 412f89e1cf..d99802188f 100644 --- a/coregrind/pub_core_clreq.h +++ b/coregrind/pub_core_clreq.h @@ -64,13 +64,16 @@ static int VALGRIND_INTERNAL_PRINTF(const char *format, ...) static int VALGRIND_INTERNAL_PRINTF(const char *format, ...) { unsigned long _qzz_res = 0; - va_list vargs; - va_start(vargs, format); + union { + va_list vargs; + unsigned long ul; + } args; + va_start(args.vargs, format); VALGRIND_DO_CLIENT_REQUEST( _qzz_res, 0, VG_USERREQ__INTERNAL_PRINTF, - (unsigned long)format, (unsigned long)vargs, 0, 0, 0 + (unsigned long)format, (unsigned long)(args.ul), 0, 0, 0 ); - va_end(vargs); + va_end(args.vargs); return _qzz_res; } diff --git a/include/valgrind.h b/include/valgrind.h index fc46465e61..e311f66acd 100644 --- a/include/valgrind.h +++ b/include/valgrind.h @@ -4183,12 +4183,16 @@ static int VALGRIND_PRINTF(const char *format, ...) { unsigned long _qzz_res; - va_list vargs; - va_start(vargs, format); + union { + va_list vargs; + unsigned long ul; + } args; + va_start(args.vargs, format); VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF, - (unsigned long)format, (unsigned long)vargs, + (unsigned long)format, + (unsigned long)(args.ul), 0, 0, 0); - va_end(vargs); + va_end(args.vargs); return (int)_qzz_res; } @@ -4198,12 +4202,16 @@ static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...) { unsigned long _qzz_res; - va_list vargs; - va_start(vargs, format); + union { + va_list vargs; + unsigned long ul; + } args; + va_start(args.vargs, format); VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF_BACKTRACE, - (unsigned long)format, (unsigned long)vargs, + (unsigned long)format, + (unsigned long)(args.ul), 0, 0, 0); - va_end(vargs); + va_end(args.vargs); return (int)_qzz_res; }