From f5cf70d9d1dc7f4cbeffb7fb75cbbe08720e3873 Mon Sep 17 00:00:00 2001 From: Gustavo Romero Date: Sun, 26 Mar 2017 15:08:15 +0000 Subject: [PATCH] Remove dependency on glibc on PPC Remove dependency on glibc by using gcc builtin function and no glibc wrappers. Currently there are no surrogates in musl for: __ppc_get_timebase() __ppc_set_ppr_low() __ppc_set_ppr_med() however glibc __ppc_get_timebase() is just a wrapper for GCC builtin __builtin_get_timebase() available since GCC 4.8 [1], so assuming that aports on ppc64le will never be built using GCC < 4.8 we can just switch directly to the GCC builtin function. Also __ppc_set_ppr_{low,med}() are not available on musl but both are simple glibc wrappers on a single asm instruction, hence there is no harm in using asm directly instead. Actually, using asm directly was the first solution adopted in MariaDB [2]. [1] https://goo.gl/jxLV6O [2] https://goo.gl/9bjuVC --- a/storage/xtradb/include/ut0ut.h +++ b/storage/xtradb/include/ut0ut.h @@ -85,9 +85,8 @@ private: the YieldProcessor macro defined in WinNT.h. It is a CPU architecture- independent way by using YieldProcessor. */ # define UT_RELAX_CPU() YieldProcessor() -# elif defined(__powerpc__) && defined __GLIBC__ -#include -# define UT_RELAX_CPU() __ppc_get_timebase() +# elif defined(__powerpc__) +# define UT_RELAX_CPU() __builtin_ppc_get_timebase() # else # define UT_RELAX_CPU() ((void)0) /* avoid warning for an empty statement */ # endif @@ -101,9 +100,8 @@ private: #endif # if defined(HAVE_HMT_PRIORITY_INSTRUCTION) -#include -# define UT_LOW_PRIORITY_CPU() __ppc_set_ppr_low() -# define UT_RESUME_PRIORITY_CPU() __ppc_set_ppr_med() +# define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1") +# define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2") # else # define UT_LOW_PRIORITY_CPU() ((void)0) # define UT_RESUME_PRIORITY_CPU() ((void)0) --- a/storage/innobase/include/ut0ut.h +++ b/storage/innobase/include/ut0ut.h @@ -71,9 +71,8 @@ typedef time_t ib_time_t; the YieldProcessor macro defined in WinNT.h. It is a CPU architecture- independent way by using YieldProcessor. */ # define UT_RELAX_CPU() YieldProcessor() -#elif defined(__powerpc__) && defined __GLIBC__ -# include -# define UT_RELAX_CPU() __ppc_get_timebase() +#elif defined(__powerpc__) +# define UT_RELAX_CPU() __builtin_ppc_get_timebase() #else # define UT_RELAX_CPU() do { \ volatile int32 volatile_var; \ @@ -91,9 +90,8 @@ typedef time_t ib_time_t; #endif #if defined(HAVE_HMT_PRIORITY_INSTRUCTION) -# include -# define UT_LOW_PRIORITY_CPU() __ppc_set_ppr_low() -# define UT_RESUME_PRIORITY_CPU() __ppc_set_ppr_med() +# define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1") +# define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2") #else # define UT_LOW_PRIORITY_CPU() ((void)0) # define UT_RESUME_PRIORITY_CPU() ((void)0)