[compiler-rt] [XRay][SystemZ] Use stckf for non-clang compilers (PR #125289)
Kai Nacke via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 31 12:39:56 PST 2025
https://github.com/redstar created https://github.com/llvm/llvm-project/pull/125289
Turns out there are users who use gcc to compile compiler-rt. Using the clang-specific builtin function `__builtin_readcyclecounter()` does not work in this case.
Solution is to use inline assembly using the stckf instruction in case the compiler is not clang.
>From f73b34410cbc59212f4d99724523a728670f2327 Mon Sep 17 00:00:00 2001
From: Kai Nacke <kai.peter.nacke at ibm.com>
Date: Fri, 31 Jan 2025 15:38:48 -0500
Subject: [PATCH] [XRay][SystemZ] Use stckf for non-clang compilers
Turns out there are users who use gcc to compile compiler-rt. Using the clang-specific builtin function `__builtin_readcyclecounter()` does not work in this case.
Solution is to use inline assembly using the stckf instruction in case the compiler is not clang.
---
compiler-rt/lib/xray/xray_tsc.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/compiler-rt/lib/xray/xray_tsc.h b/compiler-rt/lib/xray/xray_tsc.h
index 17e06c7035d85c..06f509cd1b09b9 100644
--- a/compiler-rt/lib/xray/xray_tsc.h
+++ b/compiler-rt/lib/xray/xray_tsc.h
@@ -96,7 +96,13 @@ namespace __xray {
inline bool probeRequiredCPUFeatures() XRAY_NEVER_INSTRUMENT { return true; }
ALWAYS_INLINE uint64_t readTSC(uint8_t &CPU) XRAY_NEVER_INSTRUMENT {
+#if defined(__clang__)
return __builtin_readcyclecounter();
+#else
+ uint64_t Cycles;
+ asm volatile("stckf %0" : /* No output. */ : "Q"(Cycles) : "cc");
+ return Cycles;
+#endif
}
inline uint64_t getTSCFrequency() XRAY_NEVER_INSTRUMENT {
More information about the llvm-commits
mailing list