Skip to content

Commit 0033c9e

Browse files
authored
Fix build on FreeBSD/powerpc (#616)
* Fix build on FreeBSD/powerpc Only glibc has __ppc_get_timebase(), __ppc_get_timebase_freq() and sys/platform/ppc.h.
1 parent 0d5ce27 commit 0033c9e

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

absl/base/internal/unscaledcycleclock.cc

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@
2121
#endif
2222

2323
#if defined(__powerpc__) || defined(__ppc__)
24+
#ifdef __GLIBC__
2425
#include <sys/platform/ppc.h>
26+
#elif defined(__FreeBSD__)
27+
#include <sys/sysctl.h>
28+
#include <sys/types.h>
29+
#endif
2530
#endif
2631

2732
#include "absl/base/internal/sysinfo.h"
@@ -57,11 +62,43 @@ double UnscaledCycleClock::Frequency() {
5762
#elif defined(__powerpc__) || defined(__ppc__)
5863

5964
int64_t UnscaledCycleClock::Now() {
65+
#ifdef __GLIBC__
6066
return __ppc_get_timebase();
67+
#else
68+
#ifdef __powerpc64__
69+
int64_t tbr;
70+
asm volatile("mfspr %0, 268" : "=r"(tbr));
71+
return tbr;
72+
#else
73+
int32_t tbu, tbl, tmp;
74+
asm volatile(
75+
"0:\n"
76+
"mftbu %[hi32]\n"
77+
"mftb %[lo32]\n"
78+
"mftbu %[tmp]\n"
79+
"cmpw %[tmp],%[hi32]\n"
80+
"bne 0b\n"
81+
: [ hi32 ] "=r"(tbu), [ lo32 ] "=r"(tbl), [ tmp ] "=r"(tmp));
82+
return (static_cast<int64_t>(tbu) << 32) | tbl;
83+
#endif
84+
#endif
6185
}
6286

6387
double UnscaledCycleClock::Frequency() {
88+
#ifdef __GLIBC__
6489
return __ppc_get_timebase_freq();
90+
#elif defined(__FreeBSD__)
91+
static once_flag init_timebase_frequency_once;
92+
static double timebase_frequency = 0.0;
93+
base_internal::LowLevelCallOnce(&init_timebase_frequency_once, [&]() {
94+
size_t length = sizeof(timebase_frequency);
95+
sysctlbyname("kern.timecounter.tc.timebase.frequency", &timebase_frequency,
96+
&length, nullptr, 0);
97+
});
98+
return timebase_frequency;
99+
#else
100+
#error Must implement UnscaledCycleClock::Frequency()
101+
#endif
65102
}
66103

67104
#elif defined(__aarch64__)

0 commit comments

Comments
 (0)