From 4d5eea673230596c84e57182753f4e41ab0f6bb8 Mon Sep 17 00:00:00 2001 From: Jonathan Gray Date: Tue, 4 Aug 2020 18:48:34 +1000 Subject: [PATCH] util: fix build with clang 10 on mips64 On mips64, the compiler does not allow use of non-zero argument with __builtin_frame_address(). However, the returned frame address is only used when PIPE_ARCH_X86 is defined. The compile error can be avoided by making #ifdef PIPE_ARCH_X86 cover the getting of frame address too. The argument checking of __builtin_frame_address() has been present as a debug assert in clang 8. In clang 10, there is a proper runtime check for the argument. This is why the build has not failed before. Fixes: dc94a0506f1 ("gallium: Do not add -Wframe-address option for gcc <= 4.4.") from Visa Hankala Signed-off-by: Jonathan Gray Reviewed-by: Ilia Mirkin Part-of: (cherry picked from commit 0536b691338f2759b850f9ec94634033a5d1f9e1) --- .pick_status.json | 2 +- src/util/u_debug_stack.c | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 6ab35005209..ebc7c80f6fc 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1048,7 +1048,7 @@ "description": "util: fix build with clang 10 on mips64", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "dc94a0506f1d267a761961d3ac905d77de3dae2e" }, diff --git a/src/util/u_debug_stack.c b/src/util/u_debug_stack.c index 01f69e14442..86bfb2fb64b 100644 --- a/src/util/u_debug_stack.c +++ b/src/util/u_debug_stack.c @@ -199,7 +199,6 @@ debug_backtrace_capture(struct debug_stack_frame *backtrace, unsigned start_frame, unsigned nr_frames) { - const void **frame_pointer = NULL; unsigned i = 0; if (!nr_frames) { @@ -250,21 +249,21 @@ debug_backtrace_capture(struct debug_stack_frame *backtrace, } #endif +#ifdef PIPE_ARCH_X86 #if defined(PIPE_CC_GCC) && (PIPE_CC_GCC_VERSION > 404) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wframe-address" - frame_pointer = ((const void **)__builtin_frame_address(1)); + const void **frame_pointer = ((const void **)__builtin_frame_address(1)); #pragma GCC diagnostic pop -#elif defined(PIPE_CC_MSVC) && defined(PIPE_ARCH_X86) +#elif defined(PIPE_CC_MSVC) __asm { mov frame_pointer, ebp } - frame_pointer = (const void **)frame_pointer[0]; + const void **frame_pointer = (const void **)frame_pointer[0]; #else - frame_pointer = NULL; + const void **frame_pointer = NULL; #endif -#ifdef PIPE_ARCH_X86 while (nr_frames) { const void **next_frame_pointer; @@ -287,8 +286,6 @@ debug_backtrace_capture(struct debug_stack_frame *backtrace, frame_pointer = next_frame_pointer; } -#else - (void) frame_pointer; #endif while (nr_frames) {