]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Also work around clang bctrl issue in get_clockfreq.c
authorStan Shebs <stanshebs@google.com>
Mon, 25 Mar 2019 21:03:24 +0000 (14:03 -0700)
committerFangrui Song <i@maskray.me>
Sat, 28 Aug 2021 00:26:00 +0000 (17:26 -0700)
sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c

index 3a2216021bfb5408feb430f00cd7b1209460c37c..8821218ece9e5e14cf55b8e62a51f25b2318cf4a 100644 (file)
 #include <libc-vdso.h>
 #include <not-cancel.h>
 
+#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);