From 584b7cf801f98d58aefe5a9bbc4a163aba4c1b74 Mon Sep 17 00:00:00 2001 From: Sergey Vlasov Date: Sun, 12 Feb 2023 09:14:34 +0300 Subject: [PATCH] Fix build failures with `OPT = 0` due to inline functions (#19767) Co-authored-by: Joel Challis --- platforms/common.mk | 2 ++ platforms/synchronization_util.c | 17 +++++++++++++++++ platforms/synchronization_util.h | 6 ++++++ platforms/timer.c | 8 ++++++++ quantum/mousekey.c | 2 +- 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 platforms/synchronization_util.c create mode 100644 platforms/timer.c diff --git a/platforms/common.mk b/platforms/common.mk index 693bdc8cf0e..da0697e3b09 100644 --- a/platforms/common.mk +++ b/platforms/common.mk @@ -2,6 +2,8 @@ PLATFORM_COMMON_DIR = $(PLATFORM_PATH)/$(PLATFORM_KEY) TMK_COMMON_SRC += \ $(PLATFORM_PATH)/suspend.c \ + $(PLATFORM_PATH)/synchronization_util.c \ + $(PLATFORM_PATH)/timer.c \ $(PLATFORM_COMMON_DIR)/hardware_id.c \ $(PLATFORM_COMMON_DIR)/platform.c \ $(PLATFORM_COMMON_DIR)/suspend.c \ diff --git a/platforms/synchronization_util.c b/platforms/synchronization_util.c new file mode 100644 index 00000000000..26cf7dccf19 --- /dev/null +++ b/platforms/synchronization_util.c @@ -0,0 +1,17 @@ +// Copyright 2023 Sergey Vlasov (@sigprof) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "synchronization_util.h" + +// Generate out-of-line copies for inline functions defined in synchronization_util.h. + +#if !defined(PLATFORM_SUPPORTS_SYNCHRONIZATION) +# if defined(SPLIT_KEYBOARD) +extern inline void split_shared_memory_lock(void); +extern inline void split_shared_memory_unlock(void); +# endif +#endif + +#if defined(SPLIT_KEYBOARD) +QMK_IMPLEMENT_AUTOUNLOCK_HELPERS(split_shared_memory) +#endif diff --git a/platforms/synchronization_util.h b/platforms/synchronization_util.h index 59933945c3b..4969eff478e 100644 --- a/platforms/synchronization_util.h +++ b/platforms/synchronization_util.h @@ -29,6 +29,12 @@ inline void split_shared_memory_unlock(void){}; prefix##_unlock(); \ } +/* Generate an out-of-line implementation in case the inline functions defined + * by the above macro don't actually get inlined. */ +#define QMK_IMPLEMENT_AUTOUNLOCK_HELPERS(prefix) \ + extern inline unsigned prefix##_autounlock_lock_helper(void); \ + extern inline void prefix##_autounlock_unlock_helper(unsigned* unused_guard); + /* Convinience macro the automatically generate the correct RAII-style * lock_autounlock function macro */ #define QMK_DECLARE_AUTOUNLOCK_CALL(prefix) unsigned prefix##_guard __attribute__((unused, cleanup(prefix##_autounlock_unlock_helper))) = prefix##_autounlock_lock_helper diff --git a/platforms/timer.c b/platforms/timer.c new file mode 100644 index 00000000000..26038dcda32 --- /dev/null +++ b/platforms/timer.c @@ -0,0 +1,8 @@ +// Copyright 2023 Sergey Vlasov (@sigprof) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "timer.h" + +// Generate out-of-line copies for inline functions defined in timer.h. +extern inline fast_timer_t timer_read_fast(void); +extern inline fast_timer_t timer_elapsed_fast(fast_timer_t last); diff --git a/quantum/mousekey.c b/quantum/mousekey.c index 703fb39fa6e..df8aa613bea 100644 --- a/quantum/mousekey.c +++ b/quantum/mousekey.c @@ -24,7 +24,7 @@ #include "debug.h" #include "mousekey.h" -inline int8_t times_inv_sqrt2(int8_t x) { +static inline int8_t times_inv_sqrt2(int8_t x) { // 181/256 is pretty close to 1/sqrt(2) // 0.70703125 0.707106781 // 1 too small for x=99 and x=198