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.
This commit is contained in:
		
							parent
							
								
									0d5ce2797e
								
							
						
					
					
						commit
						0033c9ea91
					
				
					 1 changed files with 37 additions and 0 deletions
				
			
		| 
						 | 
					@ -21,7 +21,12 @@
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(__powerpc__) || defined(__ppc__)
 | 
					#if defined(__powerpc__) || defined(__ppc__)
 | 
				
			||||||
 | 
					#ifdef __GLIBC__
 | 
				
			||||||
#include <sys/platform/ppc.h>
 | 
					#include <sys/platform/ppc.h>
 | 
				
			||||||
 | 
					#elif defined(__FreeBSD__)
 | 
				
			||||||
 | 
					#include <sys/sysctl.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "absl/base/internal/sysinfo.h"
 | 
					#include "absl/base/internal/sysinfo.h"
 | 
				
			||||||
| 
						 | 
					@ -57,11 +62,43 @@ double UnscaledCycleClock::Frequency() {
 | 
				
			||||||
#elif defined(__powerpc__) || defined(__ppc__)
 | 
					#elif defined(__powerpc__) || defined(__ppc__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int64_t UnscaledCycleClock::Now() {
 | 
					int64_t UnscaledCycleClock::Now() {
 | 
				
			||||||
 | 
					#ifdef __GLIBC__
 | 
				
			||||||
  return __ppc_get_timebase();
 | 
					  return __ppc_get_timebase();
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#ifdef __powerpc64__
 | 
				
			||||||
 | 
					  int64_t tbr;
 | 
				
			||||||
 | 
					  asm volatile("mfspr %0, 268" : "=r"(tbr));
 | 
				
			||||||
 | 
					  return tbr;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  int32_t tbu, tbl, tmp;
 | 
				
			||||||
 | 
					  asm volatile(
 | 
				
			||||||
 | 
					      "0:\n"
 | 
				
			||||||
 | 
					      "mftbu %[hi32]\n"
 | 
				
			||||||
 | 
					      "mftb %[lo32]\n"
 | 
				
			||||||
 | 
					      "mftbu %[tmp]\n"
 | 
				
			||||||
 | 
					      "cmpw %[tmp],%[hi32]\n"
 | 
				
			||||||
 | 
					      "bne 0b\n"
 | 
				
			||||||
 | 
					      : [ hi32 ] "=r"(tbu), [ lo32 ] "=r"(tbl), [ tmp ] "=r"(tmp));
 | 
				
			||||||
 | 
					  return (static_cast<int64_t>(tbu) << 32) | tbl;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
double UnscaledCycleClock::Frequency() {
 | 
					double UnscaledCycleClock::Frequency() {
 | 
				
			||||||
 | 
					#ifdef __GLIBC__
 | 
				
			||||||
  return __ppc_get_timebase_freq();
 | 
					  return __ppc_get_timebase_freq();
 | 
				
			||||||
 | 
					#elif defined(__FreeBSD__)
 | 
				
			||||||
 | 
					  static once_flag init_timebase_frequency_once;
 | 
				
			||||||
 | 
					  static double timebase_frequency = 0.0;
 | 
				
			||||||
 | 
					  base_internal::LowLevelCallOnce(&init_timebase_frequency_once, [&]() {
 | 
				
			||||||
 | 
					    size_t length = sizeof(timebase_frequency);
 | 
				
			||||||
 | 
					    sysctlbyname("kern.timecounter.tc.timebase.frequency", &timebase_frequency,
 | 
				
			||||||
 | 
					                 &length, nullptr, 0);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  return timebase_frequency;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error Must implement UnscaledCycleClock::Frequency()
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#elif defined(__aarch64__)
 | 
					#elif defined(__aarch64__)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue