From 895947a3cadfcffe12f108738f42855aff7a32b8 Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Mon, 25 Mar 2019 14:03:24 -0700 Subject: [PATCH] Also work around clang bctrl issue in get_clockfreq.c --- .../unix/sysv/linux/powerpc/get_clockfreq.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c b/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c index 3a2216021b..8821218ece 100644 --- a/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c +++ b/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c @@ -25,11 +25,29 @@ #include #include +#if defined __clang__ && defined __powerpc64__ +/* On ppc, __get_clockfreq's body eventually expands into asm code + that does a bctrl, but clang does not recognize the need to save + the link register, so calls loop infinitely instead of returning. + As workaround, make a dummy function call that forces a link + register save. */ +volatile int get_clockfreq_dummy_glob; + +void __attribute__((noinline)) get_clockfreq_dummy () +{ + get_clockfreq_dummy_glob = 45; +} +#endif + hp_timing_t __get_clockfreq (void) { hp_timing_t result = 0L; +#if defined __clang__ && defined __powerpc64__ + get_clockfreq_dummy (); +#endif + #ifdef SHARED /* The vDSO does not return an error (it clear cr0.so on returning). */ INTERNAL_SYSCALL_DECL (err);