Thanks Diana -- am really sorry about that. I've CC'ed Martin who worked on the original patch, so he can have a go at this.<div><br></div><div>Cheers<br><br><div class="gmail_quote"><div dir="ltr">On Mon, Dec 19, 2016, 11:57 PM Diana Picus <<a href="mailto:diana.picus@linaro.org">diana.picus@linaro.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Dean,<br class="gmail_msg">
<br class="gmail_msg">
I reverted this and all related fixups in r290101 because the AArch64<br class="gmail_msg">
bots were still broken. AFAICT it was missing an include of<br class="gmail_msg">
sanitizer_common/sanitizer_common.h in xray_emulate_tsc.h, but I'd<br class="gmail_msg">
rather let you guys sort it out offline than continue this already too<br class="gmail_msg">
long series of fixups.<br class="gmail_msg">
<br class="gmail_msg">
Please let me know if you need any help testing this on AArch64 before<br class="gmail_msg">
committing again.<br class="gmail_msg">
<br class="gmail_msg">
Thanks,<br class="gmail_msg">
Diana<br class="gmail_msg">
<br class="gmail_msg">
On 19 December 2016 at 05:21, Dean Michael Berris via llvm-commits<br class="gmail_msg">
<<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg">
> Author: dberris<br class="gmail_msg">
> Date: Sun Dec 18 21:21:26 2016<br class="gmail_msg">
> New Revision: 290077<br class="gmail_msg">
><br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=290077&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=290077&view=rev</a><br class="gmail_msg">
> Log:<br class="gmail_msg">
> [XRay] [compiler-rt] Move machine-dependent code into machine-dependent files.<br class="gmail_msg">
><br class="gmail_msg">
> Summary: Include the necessary headers while there.<br class="gmail_msg">
><br class="gmail_msg">
> Reviewers: dberris<br class="gmail_msg">
><br class="gmail_msg">
> Subscribers: llvm-commits<br class="gmail_msg">
><br class="gmail_msg">
> Differential Revision: <a href="https://reviews.llvm.org/D25360" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D25360</a><br class="gmail_msg">
><br class="gmail_msg">
> Added:<br class="gmail_msg">
> compiler-rt/trunk/lib/xray/xray_emulate_tsc.h<br class="gmail_msg">
> compiler-rt/trunk/lib/xray/xray_x86_64.h<br class="gmail_msg">
> Modified:<br class="gmail_msg">
> compiler-rt/trunk/lib/xray/xray_AArch64.cc<br class="gmail_msg">
> compiler-rt/trunk/lib/xray/xray_arm.cc<br class="gmail_msg">
> compiler-rt/trunk/lib/xray/xray_inmemory_log.cc<br class="gmail_msg">
> compiler-rt/trunk/lib/xray/xray_interface_internal.h<br class="gmail_msg">
> compiler-rt/trunk/lib/xray/xray_x86_64.cc<br class="gmail_msg">
><br class="gmail_msg">
> Modified: compiler-rt/trunk/lib/xray/xray_AArch64.cc<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_AArch64.cc?rev=290077&r1=290076&r2=290077&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_AArch64.cc?rev=290077&r1=290076&r2=290077&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- compiler-rt/trunk/lib/xray/xray_AArch64.cc (original)<br class="gmail_msg">
> +++ compiler-rt/trunk/lib/xray/xray_AArch64.cc Sun Dec 18 21:21:26 2016<br class="gmail_msg">
> @@ -14,12 +14,26 @@<br class="gmail_msg">
> //===----------------------------------------------------------------------===//<br class="gmail_msg">
> #include "sanitizer_common/sanitizer_common.h"<br class="gmail_msg">
> #include "xray_defs.h"<br class="gmail_msg">
> +#include "xray_emulate_tsc.h"<br class="gmail_msg">
> #include "xray_interface_internal.h"<br class="gmail_msg">
> #include <atomic><br class="gmail_msg">
> #include <cassert><br class="gmail_msg">
><br class="gmail_msg">
> namespace __xray {<br class="gmail_msg">
><br class="gmail_msg">
> +uint64_t cycleFrequency() XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> + // There is no instruction like RDTSCP in user mode on ARM. ARM's CP15 does<br class="gmail_msg">
> + // not have a constant frequency like TSC on x86[_64]; it may go faster or<br class="gmail_msg">
> + // slower depending on CPU's turbo or power saving modes. Furthermore, to<br class="gmail_msg">
> + // read from CP15 on ARM a kernel modification or a driver is needed.<br class="gmail_msg">
> + // We can not require this from users of compiler-rt.<br class="gmail_msg">
> + // So on ARM we use clock_gettime(2) which gives the result in nanoseconds.<br class="gmail_msg">
> + // To get the measurements per second, we scale this by the number of<br class="gmail_msg">
> + // nanoseconds per second, pretending that the TSC frequency is 1GHz and<br class="gmail_msg">
> + // one TSC tick is 1 nanosecond.<br class="gmail_msg">
> + return NanosecondsPerSecond;<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> // The machine codes for some instructions used in runtime patching.<br class="gmail_msg">
> enum class PatchOpcodes : uint32_t {<br class="gmail_msg">
> PO_StpX0X30SP_m16e = 0xA9BF7BE0, // STP X0, X30, [SP, #-16]!<br class="gmail_msg">
><br class="gmail_msg">
> Modified: compiler-rt/trunk/lib/xray/xray_arm.cc<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_arm.cc?rev=290077&r1=290076&r2=290077&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_arm.cc?rev=290077&r1=290076&r2=290077&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- compiler-rt/trunk/lib/xray/xray_arm.cc (original)<br class="gmail_msg">
> +++ compiler-rt/trunk/lib/xray/xray_arm.cc Sun Dec 18 21:21:26 2016<br class="gmail_msg">
> @@ -14,12 +14,26 @@<br class="gmail_msg">
> //===----------------------------------------------------------------------===//<br class="gmail_msg">
> #include "sanitizer_common/sanitizer_common.h"<br class="gmail_msg">
> #include "xray_defs.h"<br class="gmail_msg">
> +#include "xray_emulate_tsc.h"<br class="gmail_msg">
> #include "xray_interface_internal.h"<br class="gmail_msg">
> #include <atomic><br class="gmail_msg">
> #include <cassert><br class="gmail_msg">
><br class="gmail_msg">
> namespace __xray {<br class="gmail_msg">
><br class="gmail_msg">
> +uint64_t cycleFrequency() XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> + // There is no instruction like RDTSCP in user mode on ARM. ARM's CP15 does<br class="gmail_msg">
> + // not have a constant frequency like TSC on x86[_64]; it may go faster or<br class="gmail_msg">
> + // slower depending on CPU's turbo or power saving modes. Furthermore, to<br class="gmail_msg">
> + // read from CP15 on ARM a kernel modification or a driver is needed.<br class="gmail_msg">
> + // We can not require this from users of compiler-rt.<br class="gmail_msg">
> + // So on ARM we use clock_gettime(2) which gives the result in nanoseconds.<br class="gmail_msg">
> + // To get the measurements per second, we scale this by the number of<br class="gmail_msg">
> + // nanoseconds per second, pretending that the TSC frequency is 1GHz and<br class="gmail_msg">
> + // one TSC tick is 1 nanosecond.<br class="gmail_msg">
> + return NanosecondsPerSecond;<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> // The machine codes for some instructions used in runtime patching.<br class="gmail_msg">
> enum class PatchOpcodes : uint32_t {<br class="gmail_msg">
> PO_PushR0Lr = 0xE92D4001, // PUSH {r0, lr}<br class="gmail_msg">
><br class="gmail_msg">
> Added: compiler-rt/trunk/lib/xray/xray_emulate_tsc.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_emulate_tsc.h?rev=290077&view=auto" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_emulate_tsc.h?rev=290077&view=auto</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- compiler-rt/trunk/lib/xray/xray_emulate_tsc.h (added)<br class="gmail_msg">
> +++ compiler-rt/trunk/lib/xray/xray_emulate_tsc.h Sun Dec 18 21:21:26 2016<br class="gmail_msg">
> @@ -0,0 +1,23 @@<br class="gmail_msg">
> +#pragma once<br class="gmail_msg">
> +#include <time.h><br class="gmail_msg">
> +<br class="gmail_msg">
> +#include "sanitizer_common/sanitizer_internal_defs.h"<br class="gmail_msg">
> +#include "xray_defs.h"<br class="gmail_msg">
> +<br class="gmail_msg">
> +namespace __xray {<br class="gmail_msg">
> +<br class="gmail_msg">
> +static constexpr uint64_t NanosecondsPerSecond = 1000ULL * 1000 * 1000;<br class="gmail_msg">
> +<br class="gmail_msg">
> +ALWAYS_INLINE uint64_t readTSC(uint8_t &CPU) XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> + timespec TS;<br class="gmail_msg">
> + int result = clock_gettime(CLOCK_REALTIME, &TS);<br class="gmail_msg">
> + if (result != 0) {<br class="gmail_msg">
> + Report("clock_gettime(2) returned %d, errno=%d.", result, int(errno));<br class="gmail_msg">
> + TS.tv_sec = 0;<br class="gmail_msg">
> + TS.tv_nsec = 0;<br class="gmail_msg">
> + }<br class="gmail_msg">
> + CPU = 0;<br class="gmail_msg">
> + return TS.tv_sec * NanosecondsPerSecond + TS.tv_nsec;<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +}<br class="gmail_msg">
><br class="gmail_msg">
> Modified: compiler-rt/trunk/lib/xray/xray_inmemory_log.cc<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_inmemory_log.cc?rev=290077&r1=290076&r2=290077&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_inmemory_log.cc?rev=290077&r1=290076&r2=290077&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- compiler-rt/trunk/lib/xray/xray_inmemory_log.cc (original)<br class="gmail_msg">
> +++ compiler-rt/trunk/lib/xray/xray_inmemory_log.cc Sun Dec 18 21:21:26 2016<br class="gmail_msg">
> @@ -26,12 +26,12 @@<br class="gmail_msg">
> #include <unistd.h><br class="gmail_msg">
><br class="gmail_msg">
> #if defined(__x86_64__)<br class="gmail_msg">
> -#include <x86intrin.h><br class="gmail_msg">
> +#include "xray_x86_64.h"<br class="gmail_msg">
> #elif defined(__arm__) || defined(__aarch64__)<br class="gmail_msg">
> -static const int64_t NanosecondsPerSecond = 1000LL * 1000 * 1000;<br class="gmail_msg">
> +#include "xray_emulate_tsc.h"<br class="gmail_msg">
> #else<br class="gmail_msg">
> #error "Unsupported CPU Architecture"<br class="gmail_msg">
> -#endif /* CPU architecture */<br class="gmail_msg">
> +#endif /* Architecture-specific inline intrinsics */<br class="gmail_msg">
><br class="gmail_msg">
> #include "sanitizer_common/sanitizer_libc.h"<br class="gmail_msg">
> #include "xray/xray_records.h"<br class="gmail_msg">
> @@ -71,52 +71,6 @@ static void retryingWriteAll(int Fd, cha<br class="gmail_msg">
> }<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> -#if defined(__x86_64__)<br class="gmail_msg">
> -static std::pair<ssize_t, bool><br class="gmail_msg">
> -retryingReadSome(int Fd, char *Begin, char *End) XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> - auto BytesToRead = std::distance(Begin, End);<br class="gmail_msg">
> - ssize_t BytesRead;<br class="gmail_msg">
> - ssize_t TotalBytesRead = 0;<br class="gmail_msg">
> - while (BytesToRead && (BytesRead = read(Fd, Begin, BytesToRead))) {<br class="gmail_msg">
> - if (BytesRead == -1) {<br class="gmail_msg">
> - if (errno == EINTR)<br class="gmail_msg">
> - continue;<br class="gmail_msg">
> - Report("Read error; errno = %d\n", errno);<br class="gmail_msg">
> - return std::make_pair(TotalBytesRead, false);<br class="gmail_msg">
> - }<br class="gmail_msg">
> -<br class="gmail_msg">
> - TotalBytesRead += BytesRead;<br class="gmail_msg">
> - BytesToRead -= BytesRead;<br class="gmail_msg">
> - Begin += BytesRead;<br class="gmail_msg">
> - }<br class="gmail_msg">
> - return std::make_pair(TotalBytesRead, true);<br class="gmail_msg">
> -}<br class="gmail_msg">
> -<br class="gmail_msg">
> -static bool readValueFromFile(const char *Filename,<br class="gmail_msg">
> - long long *Value) XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> - int Fd = open(Filename, O_RDONLY | O_CLOEXEC);<br class="gmail_msg">
> - if (Fd == -1)<br class="gmail_msg">
> - return false;<br class="gmail_msg">
> - static constexpr size_t BufSize = 256;<br class="gmail_msg">
> - char Line[BufSize] = {};<br class="gmail_msg">
> - ssize_t BytesRead;<br class="gmail_msg">
> - bool Success;<br class="gmail_msg">
> - std::tie(BytesRead, Success) = retryingReadSome(Fd, Line, Line + BufSize);<br class="gmail_msg">
> - if (!Success)<br class="gmail_msg">
> - return false;<br class="gmail_msg">
> - close(Fd);<br class="gmail_msg">
> - char *End = nullptr;<br class="gmail_msg">
> - long long Tmp = internal_simple_strtoll(Line, &End, 10);<br class="gmail_msg">
> - bool Result = false;<br class="gmail_msg">
> - if (Line[0] != '\0' && (*End == '\n' || *End == '\0')) {<br class="gmail_msg">
> - *Value = Tmp;<br class="gmail_msg">
> - Result = true;<br class="gmail_msg">
> - }<br class="gmail_msg">
> - return Result;<br class="gmail_msg">
> -}<br class="gmail_msg">
> -<br class="gmail_msg">
> -#endif /* CPU architecture */<br class="gmail_msg">
> -<br class="gmail_msg">
> class ThreadExitFlusher {<br class="gmail_msg">
> int Fd;<br class="gmail_msg">
> XRayRecord *Start;<br class="gmail_msg">
> @@ -151,6 +105,47 @@ void PrintToStdErr(const char *Buffer) X<br class="gmail_msg">
> fprintf(stderr, "%s", Buffer);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> +static int __xray_OpenLogFile() XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> + // FIXME: Figure out how to make this less stderr-dependent.<br class="gmail_msg">
> + SetPrintfAndReportCallback(PrintToStdErr);<br class="gmail_msg">
> + // Open a temporary file once for the log.<br class="gmail_msg">
> + static char TmpFilename[256] = {};<br class="gmail_msg">
> + static char TmpWildcardPattern[] = "XXXXXX";<br class="gmail_msg">
> + auto E = internal_strncat(TmpFilename, flags()->xray_logfile_base,<br class="gmail_msg">
> + sizeof(TmpFilename) - 10);<br class="gmail_msg">
> + if (static_cast<size_t>((E + 6) - TmpFilename) ><br class="gmail_msg">
> + (sizeof(TmpFilename) - 1)) {<br class="gmail_msg">
> + Report("XRay log file base too long: %s\n", flags()->xray_logfile_base);<br class="gmail_msg">
> + return -1;<br class="gmail_msg">
> + }<br class="gmail_msg">
> + internal_strncat(TmpFilename, TmpWildcardPattern,<br class="gmail_msg">
> + sizeof(TmpWildcardPattern) - 1);<br class="gmail_msg">
> + int Fd = mkstemp(TmpFilename);<br class="gmail_msg">
> + if (Fd == -1) {<br class="gmail_msg">
> + Report("XRay: Failed opening temporary file '%s'; not logging events.\n",<br class="gmail_msg">
> + TmpFilename);<br class="gmail_msg">
> + return -1;<br class="gmail_msg">
> + }<br class="gmail_msg">
> + if (Verbosity())<br class="gmail_msg">
> + fprintf(stderr, "XRay: Log file in '%s'\n", TmpFilename);<br class="gmail_msg">
> +<br class="gmail_msg">
> + // Since we're here, we get to write the header. We set it up so that the<br class="gmail_msg">
> + // header will only be written once, at the start, and let the threads<br class="gmail_msg">
> + // logging do writes which just append.<br class="gmail_msg">
> + XRayFileHeader Header;<br class="gmail_msg">
> + Header.Version = 1;<br class="gmail_msg">
> + Header.Type = FileTypes::NAIVE_LOG;<br class="gmail_msg">
> + Header.CycleFrequency = __xray::cycleFrequency();<br class="gmail_msg">
> +<br class="gmail_msg">
> + // FIXME: Actually check whether we have 'constant_tsc' and 'nonstop_tsc'<br class="gmail_msg">
> + // before setting the values in the header.<br class="gmail_msg">
> + Header.ConstantTSC = 1;<br class="gmail_msg">
> + Header.NonstopTSC = 1;<br class="gmail_msg">
> + retryingWriteAll(Fd, reinterpret_cast<char *>(&Header),<br class="gmail_msg">
> + reinterpret_cast<char *>(&Header) + sizeof(Header));<br class="gmail_msg">
> + return Fd;<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> void __xray_InMemoryRawLog(int32_t FuncId,<br class="gmail_msg">
> XRayEntryType Type) XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> using Buffer =<br class="gmail_msg">
> @@ -158,75 +153,7 @@ void __xray_InMemoryRawLog(int32_t FuncI<br class="gmail_msg">
> static constexpr size_t BuffLen = 1024;<br class="gmail_msg">
> thread_local static Buffer InMemoryBuffer[BuffLen] = {};<br class="gmail_msg">
> thread_local static size_t Offset = 0;<br class="gmail_msg">
> - static int Fd = [] {<br class="gmail_msg">
> - // FIXME: Figure out how to make this less stderr-dependent.<br class="gmail_msg">
> - SetPrintfAndReportCallback(PrintToStdErr);<br class="gmail_msg">
> - // Open a temporary file once for the log.<br class="gmail_msg">
> - static char TmpFilename[256] = {};<br class="gmail_msg">
> - static char TmpWildcardPattern[] = "XXXXXX";<br class="gmail_msg">
> - auto E = internal_strncat(TmpFilename, flags()->xray_logfile_base,<br class="gmail_msg">
> - sizeof(TmpFilename) - 10);<br class="gmail_msg">
> - if (static_cast<size_t>((E + 6) - TmpFilename) ><br class="gmail_msg">
> - (sizeof(TmpFilename) - 1)) {<br class="gmail_msg">
> - Report("XRay log file base too long: %s\n", flags()->xray_logfile_base);<br class="gmail_msg">
> - return -1;<br class="gmail_msg">
> - }<br class="gmail_msg">
> - internal_strncat(TmpFilename, TmpWildcardPattern,<br class="gmail_msg">
> - sizeof(TmpWildcardPattern) - 1);<br class="gmail_msg">
> - int Fd = mkstemp(TmpFilename);<br class="gmail_msg">
> - if (Fd == -1) {<br class="gmail_msg">
> - Report("XRay: Failed opening temporary file '%s'; not logging events.\n",<br class="gmail_msg">
> - TmpFilename);<br class="gmail_msg">
> - return -1;<br class="gmail_msg">
> - }<br class="gmail_msg">
> - if (Verbosity())<br class="gmail_msg">
> - fprintf(stderr, "XRay: Log file in '%s'\n", TmpFilename);<br class="gmail_msg">
> -<br class="gmail_msg">
> - // Get the cycle frequency from SysFS on Linux.<br class="gmail_msg">
> - long long CPUFrequency = -1;<br class="gmail_msg">
> -#if defined(__x86_64__)<br class="gmail_msg">
> - if (readValueFromFile("/sys/devices/system/cpu/cpu0/tsc_freq_khz",<br class="gmail_msg">
> - &CPUFrequency)) {<br class="gmail_msg">
> - CPUFrequency *= 1000;<br class="gmail_msg">
> - } else if (readValueFromFile(<br class="gmail_msg">
> - "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq",<br class="gmail_msg">
> - &CPUFrequency)) {<br class="gmail_msg">
> - CPUFrequency *= 1000;<br class="gmail_msg">
> - } else {<br class="gmail_msg">
> - Report("Unable to determine CPU frequency for TSC accounting.\n");<br class="gmail_msg">
> - }<br class="gmail_msg">
> -#elif defined(__arm__) || defined(__aarch64__)<br class="gmail_msg">
> - // There is no instruction like RDTSCP in user mode on ARM. ARM's CP15 does<br class="gmail_msg">
> - // not have a constant frequency like TSC on x86(_64), it may go faster<br class="gmail_msg">
> - // or slower depending on CPU turbo or power saving mode. Furthermore,<br class="gmail_msg">
> - // to read from CP15 on ARM a kernel modification or a driver is needed.<br class="gmail_msg">
> - // We can not require this from users of compiler-rt.<br class="gmail_msg">
> - // So on ARM we use clock_gettime() which gives the result in nanoseconds.<br class="gmail_msg">
> - // To get the measurements per second, we scale this by the number of<br class="gmail_msg">
> - // nanoseconds per second, pretending that the TSC frequency is 1GHz and<br class="gmail_msg">
> - // one TSC tick is 1 nanosecond.<br class="gmail_msg">
> - CPUFrequency = NanosecondsPerSecond;<br class="gmail_msg">
> -#else<br class="gmail_msg">
> -#error "Unsupported CPU Architecture"<br class="gmail_msg">
> -#endif /* CPU architecture */<br class="gmail_msg">
> -<br class="gmail_msg">
> - // Since we're here, we get to write the header. We set it up so that the<br class="gmail_msg">
> - // header will only be written once, at the start, and let the threads<br class="gmail_msg">
> - // logging do writes which just append.<br class="gmail_msg">
> - XRayFileHeader Header;<br class="gmail_msg">
> - Header.Version = 1;<br class="gmail_msg">
> - Header.Type = FileTypes::NAIVE_LOG;<br class="gmail_msg">
> - Header.CycleFrequency =<br class="gmail_msg">
> - CPUFrequency == -1 ? 0 : static_cast<uint64_t>(CPUFrequency);<br class="gmail_msg">
> -<br class="gmail_msg">
> - // FIXME: Actually check whether we have 'constant_tsc' and 'nonstop_tsc'<br class="gmail_msg">
> - // before setting the values in the header.<br class="gmail_msg">
> - Header.ConstantTSC = 1;<br class="gmail_msg">
> - Header.NonstopTSC = 1;<br class="gmail_msg">
> - retryingWriteAll(Fd, reinterpret_cast<char *>(&Header),<br class="gmail_msg">
> - reinterpret_cast<char *>(&Header) + sizeof(Header));<br class="gmail_msg">
> - return Fd;<br class="gmail_msg">
> - }();<br class="gmail_msg">
> + static int Fd = __xray_OpenLogFile();<br class="gmail_msg">
> if (Fd == -1)<br class="gmail_msg">
> return;<br class="gmail_msg">
> thread_local __xray::ThreadExitFlusher Flusher(<br class="gmail_msg">
> @@ -237,27 +164,7 @@ void __xray_InMemoryRawLog(int32_t FuncI<br class="gmail_msg">
> // through a pointer offset.<br class="gmail_msg">
> auto &R = reinterpret_cast<__xray::XRayRecord *>(InMemoryBuffer)[Offset];<br class="gmail_msg">
> R.RecordType = RecordTypes::NORMAL;<br class="gmail_msg">
> -#if defined(__x86_64__)<br class="gmail_msg">
> - {<br class="gmail_msg">
> - unsigned CPU;<br class="gmail_msg">
> - R.TSC = __rdtscp(&CPU);<br class="gmail_msg">
> - R.CPU = CPU;<br class="gmail_msg">
> - }<br class="gmail_msg">
> -#elif defined(__arm__) || defined(__aarch64__)<br class="gmail_msg">
> - {<br class="gmail_msg">
> - timespec TS;<br class="gmail_msg">
> - int result = clock_gettime(CLOCK_REALTIME, &TS);<br class="gmail_msg">
> - if (result != 0) {<br class="gmail_msg">
> - Report("clock_gettime() returned %d, errno=%d.\n", result, int(errno));<br class="gmail_msg">
> - TS.tv_sec = 0;<br class="gmail_msg">
> - TS.tv_nsec = 0;<br class="gmail_msg">
> - }<br class="gmail_msg">
> - R.TSC = TS.tv_sec * NanosecondsPerSecond + TS.tv_nsec;<br class="gmail_msg">
> - R.CPU = 0;<br class="gmail_msg">
> - }<br class="gmail_msg">
> -#else<br class="gmail_msg">
> -#error "Unsupported CPU Architecture"<br class="gmail_msg">
> -#endif /* CPU architecture */<br class="gmail_msg">
> + R.TSC = __xray::readTSC(R.CPU);<br class="gmail_msg">
> R.TId = TId;<br class="gmail_msg">
> R.Type = Type;<br class="gmail_msg">
> R.FuncId = FuncId;<br class="gmail_msg">
><br class="gmail_msg">
> Modified: compiler-rt/trunk/lib/xray/xray_interface_internal.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_interface_internal.h?rev=290077&r1=290076&r2=290077&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_interface_internal.h?rev=290077&r1=290076&r2=290077&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- compiler-rt/trunk/lib/xray/xray_interface_internal.h (original)<br class="gmail_msg">
> +++ compiler-rt/trunk/lib/xray/xray_interface_internal.h Sun Dec 18 21:21:26 2016<br class="gmail_msg">
> @@ -48,6 +48,8 @@ struct XRaySledMap {<br class="gmail_msg">
> size_t Entries;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> +uint64_t cycleFrequency();<br class="gmail_msg">
> +<br class="gmail_msg">
> bool patchFunctionEntry(bool Enable, uint32_t FuncId,<br class="gmail_msg">
> const XRaySledEntry &Sled);<br class="gmail_msg">
> bool patchFunctionExit(bool Enable, uint32_t FuncId, const XRaySledEntry &Sled);<br class="gmail_msg">
><br class="gmail_msg">
> Modified: compiler-rt/trunk/lib/xray/xray_x86_64.cc<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_x86_64.cc?rev=290077&r1=290076&r2=290077&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_x86_64.cc?rev=290077&r1=290076&r2=290077&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- compiler-rt/trunk/lib/xray/xray_x86_64.cc (original)<br class="gmail_msg">
> +++ compiler-rt/trunk/lib/xray/xray_x86_64.cc Sun Dec 18 21:21:26 2016<br class="gmail_msg">
> @@ -3,10 +3,71 @@<br class="gmail_msg">
> #include "xray_interface_internal.h"<br class="gmail_msg">
> #include <atomic><br class="gmail_msg">
> #include <cstdint><br class="gmail_msg">
> +#include <fcntl.h><br class="gmail_msg">
> #include <limits><br class="gmail_msg">
> +#include <tuple><br class="gmail_msg">
> +#include <unistd.h><br class="gmail_msg">
><br class="gmail_msg">
> namespace __xray {<br class="gmail_msg">
><br class="gmail_msg">
> +static std::pair<ssize_t, bool><br class="gmail_msg">
> +retryingReadSome(int Fd, char *Begin, char *End) XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> + auto BytesToRead = std::distance(Begin, End);<br class="gmail_msg">
> + ssize_t BytesRead;<br class="gmail_msg">
> + ssize_t TotalBytesRead = 0;<br class="gmail_msg">
> + while (BytesToRead && (BytesRead = read(Fd, Begin, BytesToRead))) {<br class="gmail_msg">
> + if (BytesRead == -1) {<br class="gmail_msg">
> + if (errno == EINTR)<br class="gmail_msg">
> + continue;<br class="gmail_msg">
> + Report("Read error; errno = %d\n", errno);<br class="gmail_msg">
> + return std::make_pair(TotalBytesRead, false);<br class="gmail_msg">
> + }<br class="gmail_msg">
> +<br class="gmail_msg">
> + TotalBytesRead += BytesRead;<br class="gmail_msg">
> + BytesToRead -= BytesRead;<br class="gmail_msg">
> + Begin += BytesRead;<br class="gmail_msg">
> + }<br class="gmail_msg">
> + return std::make_pair(TotalBytesRead, true);<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +static bool readValueFromFile(const char *Filename,<br class="gmail_msg">
> + long long *Value) XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> + int Fd = open(Filename, O_RDONLY | O_CLOEXEC);<br class="gmail_msg">
> + if (Fd == -1)<br class="gmail_msg">
> + return false;<br class="gmail_msg">
> + static constexpr size_t BufSize = 256;<br class="gmail_msg">
> + char Line[BufSize] = {};<br class="gmail_msg">
> + ssize_t BytesRead;<br class="gmail_msg">
> + bool Success;<br class="gmail_msg">
> + std::tie(BytesRead, Success) = retryingReadSome(Fd, Line, Line + BufSize);<br class="gmail_msg">
> + if (!Success)<br class="gmail_msg">
> + return false;<br class="gmail_msg">
> + close(Fd);<br class="gmail_msg">
> + char *End = nullptr;<br class="gmail_msg">
> + long long Tmp = internal_simple_strtoll(Line, &End, 10);<br class="gmail_msg">
> + bool Result = false;<br class="gmail_msg">
> + if (Line[0] != '\0' && (*End == '\n' || *End == '\0')) {<br class="gmail_msg">
> + *Value = Tmp;<br class="gmail_msg">
> + Result = true;<br class="gmail_msg">
> + }<br class="gmail_msg">
> + return Result;<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +uint64_t cycleFrequency() XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> + long long CPUFrequency = -1;<br class="gmail_msg">
> + if (readValueFromFile("/sys/devices/system/cpu/cpu0/tsc_freq_khz",<br class="gmail_msg">
> + &CPUFrequency)) {<br class="gmail_msg">
> + CPUFrequency *= 1000;<br class="gmail_msg">
> + } else if (readValueFromFile(<br class="gmail_msg">
> + "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq",<br class="gmail_msg">
> + &CPUFrequency)) {<br class="gmail_msg">
> + CPUFrequency *= 1000;<br class="gmail_msg">
> + } else {<br class="gmail_msg">
> + Report("Unable to determine CPU frequency for TSC accounting.\n");<br class="gmail_msg">
> + }<br class="gmail_msg">
> + return CPUFrequency == -1 ? 0 : static_cast<uint64_t>(CPUFrequency);<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> static constexpr uint8_t CallOpCode = 0xe8;<br class="gmail_msg">
> static constexpr uint16_t MovR10Seq = 0xba41;<br class="gmail_msg">
> static constexpr uint16_t Jmp9Seq = 0x09eb;<br class="gmail_msg">
><br class="gmail_msg">
> Added: compiler-rt/trunk/lib/xray/xray_x86_64.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_x86_64.h?rev=290077&view=auto" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_x86_64.h?rev=290077&view=auto</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- compiler-rt/trunk/lib/xray/xray_x86_64.h (added)<br class="gmail_msg">
> +++ compiler-rt/trunk/lib/xray/xray_x86_64.h Sun Dec 18 21:21:26 2016<br class="gmail_msg">
> @@ -0,0 +1,16 @@<br class="gmail_msg">
> +#pragma once<br class="gmail_msg">
> +#include <x86intrin.h><br class="gmail_msg">
> +<br class="gmail_msg">
> +#include "sanitizer_common/sanitizer_internal_defs.h"<br class="gmail_msg">
> +#include "xray_defs.h"<br class="gmail_msg">
> +<br class="gmail_msg">
> +namespace __xray {<br class="gmail_msg">
> +<br class="gmail_msg">
> +ALWAYS_INLINE uint64_t readTSC(uint8_t &CPU) XRAY_NEVER_INSTRUMENT {<br class="gmail_msg">
> + unsigned LongCPU;<br class="gmail_msg">
> + uint64_t TSC = __rdtscp(&LongCPU);<br class="gmail_msg">
> + CPU = LongCPU;<br class="gmail_msg">
> + return TSC;<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +}<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> _______________________________________________<br class="gmail_msg">
> llvm-commits mailing list<br class="gmail_msg">
> <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div></div>