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>