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);