[compiler-rt] r325240 - Add Xray instrumentation support to FreeBSD

via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 15 16:26:31 PST 2018


Hi David,

I believe that this change is causing the test "XRay-x86_64-linux :: TestCases/Linux/quiet-start.cc" to fail on the build bot llvm-clang-lld-x86_64-debian-fast. You can see the test failure in the run at http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-debian-fast/builds/8008/. Can you take a look and fix the problem?

Douglas Yung

> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf Of
> Kamil Rytarowski via llvm-commits
> Sent: Thursday, February 15, 2018 6:17
> To: llvm-commits at lists.llvm.org
> Subject: [compiler-rt] r325240 - Add Xray instrumentation support to FreeBSD
> 
> Author: kamil
> Date: Thu Feb 15 06:17:15 2018
> New Revision: 325240
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=325240&view=rev
> Log:
> Add Xray instrumentation support to FreeBSD
> 
> Summary:
> - Enabling the build.
> - Using assembly for the cpuid parts.
> - Using thr_self FreeBSD call to get the thread id
> 
> Patch by: David CARLIER
> 
> Reviewers: dberris, rnk, krytarowski
> 
> Reviewed By: dberris, krytarowski
> 
> Subscribers: emaste, stevecheckoway, nglevin, srhines, kubamracek, dberris,
> mgorny, krytarowski, llvm-commits, #sanitizers
> 
> Differential Revision: https://reviews.llvm.org/D43278
> 
> Modified:
>     compiler-rt/trunk/cmake/config-ix.cmake
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h
>     compiler-rt/trunk/lib/xray/tests/CMakeLists.txt
>     compiler-rt/trunk/lib/xray/tests/unit/fdr_logging_test.cc
>     compiler-rt/trunk/lib/xray/xray_fdr_logging_impl.h
>     compiler-rt/trunk/lib/xray/xray_flags.inc
>     compiler-rt/trunk/lib/xray/xray_inmemory_log.cc
>     compiler-rt/trunk/lib/xray/xray_x86_64.cc
>     compiler-rt/trunk/lib/xray/xray_x86_64.inc
>     compiler-rt/trunk/test/xray/lit.cfg
> 
> Modified: compiler-rt/trunk/cmake/config-ix.cmake
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/config-
> ix.cmake?rev=325240&r1=325239&r2=325240&view=diff
> ==============================================================================
> --- compiler-rt/trunk/cmake/config-ix.cmake (original)
> +++ compiler-rt/trunk/cmake/config-ix.cmake Thu Feb 15 06:17:15 2018
> @@ -597,7 +597,7 @@ else()
>  endif()
> 
>  if (COMPILER_RT_HAS_SANITIZER_COMMON AND XRAY_SUPPORTED_ARCH AND
> -    OS_NAME MATCHES "Darwin|Linux")
> +    OS_NAME MATCHES "Darwin|Linux|FreeBSD")
>    set(COMPILER_RT_HAS_XRAY TRUE)
>  else()
>    set(COMPILER_RT_HAS_XRAY FALSE)
> 
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h?rev=325240&r1=325239&r
> 2=325240&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h Thu
> +++ Feb 15 06:17:15 2018
> @@ -98,7 +98,8 @@
>  // We can use .preinit_array section on Linux to call sanitizer
> initialization  // functions very early in the process startup (unless PIC
> macro is defined).
>  // FIXME: do we have anything like this on Mac?
> -#if SANITIZER_LINUX && !SANITIZER_ANDROID && !defined(PIC)
> +#if ((SANITIZER_LINUX && !SANITIZER_ANDROID) || \
> +  SANITIZER_FREEBSD) && !defined(PIC)
>  # define SANITIZER_CAN_USE_PREINIT_ARRAY 1  // Before Solaris 11.4,
> .preinit_array is fully supported only with GNU ld.
>  // FIXME: Check for those conditions.
> 
> Modified: compiler-rt/trunk/lib/xray/tests/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/xray/tests/CMakeLists.txt?rev=325240&r1=325239&r2=325240&view=dif
> f
> ==============================================================================
> --- compiler-rt/trunk/lib/xray/tests/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/xray/tests/CMakeLists.txt Thu Feb 15 06:17:15
> +++ 2018
> @@ -15,6 +15,10 @@ set(XRAY_TEST_ARCH ${XRAY_SUPPORTED_ARCH
> macro(add_xray_unittest testname)
>    cmake_parse_arguments(TEST "" "" "SOURCES;HEADERS" ${ARGN})
>    if(UNIX AND NOT APPLE)
> +    set(CMAKE_DL_LIBS_INIT "")
> +    foreach(lib ${CMAKE_DL_LIBS})
> +      list(APPEND CMAKE_DL_LIBS_INIT -l${lib})
> +    endforeach()
>      foreach(arch ${XRAY_TEST_ARCH})
>        set(TEST_OBJECTS)
>        generate_compiler_rt_tests(TEST_OBJECTS
> @@ -25,8 +29,7 @@ macro(add_xray_unittest testname)
>          LINK_FLAGS -fxray-instrument
>            ${TARGET_LINK_FLAGS}
>            -lstdc++ -lm ${CMAKE_THREAD_LIBS_INIT}
> -          -lpthread
> -          -ldl -lrt)
> +          ${CMAKE_DL_LIBS_INIT} -lrt)
>        set_target_properties(XRayUnitTests PROPERTIES RUNTIME_OUTPUT_DIRECTORY
> ${CMAKE_CURRENT_BINARY_DIR})
>      endforeach()
>    endif()
> 
> Modified: compiler-rt/trunk/lib/xray/tests/unit/fdr_logging_test.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/xray/tests/unit/fdr_logging_test.cc?rev=325240&r1=325239&r2=32524
> 0&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/xray/tests/unit/fdr_logging_test.cc (original)
> +++ compiler-rt/trunk/lib/xray/tests/unit/fdr_logging_test.cc Thu Feb 15
> +++ 06:17:15 2018
> @@ -10,6 +10,7 @@
>  // This file is a part of XRay, a function call tracing system.
>  //
>  //===----------------------------------------------------------------------
> ===//
> +#include "sanitizer_common/sanitizer_common.h"
>  #include "xray_fdr_logging.h"
>  #include "gtest/gtest.h"
> 
> @@ -154,12 +155,12 @@ TEST(FDRLoggingTest, MultiThreadedCyclin
>    // Now we want to create one thread, do some logging, then create another
> one,
>    // in succession and making sure that we're able to get thread records from
>    // the latest thread (effectively being able to recycle buffers).
> -  std::array<pid_t, 2> Threads;
> +  std::array<tid_t, 2> Threads;
>    for (uint64_t I = 0; I < 2; ++I) {
>      std::thread t{[I, &Threads] {
>        fdrLoggingHandleArg0(I + 1, XRayEntryType::ENTRY);
>        fdrLoggingHandleArg0(I + 1, XRayEntryType::EXIT);
> -      Threads[I] = syscall(SYS_gettid);
> +      Threads[I] = __sanitizer::GetTid();
>      }};
>      t.join();
>    }
> @@ -192,9 +193,9 @@ TEST(FDRLoggingTest, MultiThreadedCyclin
>    ASSERT_EQ(MDR0.RecordKind,
>              uint8_t(MetadataRecord::RecordKinds::BufferExtents));
>    ASSERT_EQ(MDR1.RecordKind,
> uint8_t(MetadataRecord::RecordKinds::NewBuffer));
> -  pid_t Latest = 0;
> -  memcpy(&Latest, MDR1.Data, sizeof(pid_t));
> -  ASSERT_EQ(Latest, Threads[1]);
> +  int32_t Latest = 0;
> +  memcpy(&Latest, MDR1.Data, sizeof(int32_t));  ASSERT_EQ(Latest,
> + static_cast<int32_t>(Threads[1]));
>  }
> 
>  } // namespace
> 
> Modified: compiler-rt/trunk/lib/xray/xray_fdr_logging_impl.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/xray/xray_fdr_logging_impl.h?rev=325240&r1=325239&r2=325240&view=
> diff
> ==============================================================================
> --- compiler-rt/trunk/lib/xray/xray_fdr_logging_impl.h (original)
> +++ compiler-rt/trunk/lib/xray/xray_fdr_logging_impl.h Thu Feb 15
> +++ 06:17:15 2018
> @@ -54,7 +54,7 @@ namespace __xray_fdr_internal {
> 
>  /// Writes the new buffer record and wallclock time that begin a buffer for
> the  /// current thread.
> -static void writeNewBufferPreamble(pid_t Tid, timespec TS);
> +static void writeNewBufferPreamble(tid_t Tid, timespec TS);
> 
>  /// Writes a Function Record to the buffer associated with the current
> thread.
>  static void writeFunctionRecord(int FuncId, uint32_t TSCDelta, @@ -185,7
> +185,7 @@ public:
> 
>  } // namespace
> 
> -static void writeNewBufferPreamble(pid_t Tid,
> +static void writeNewBufferPreamble(tid_t Tid,
>                                     timespec TS) XRAY_NEVER_INSTRUMENT {
>    static constexpr int InitRecordsCount = 2;
>    auto &TLD = getThreadLocalData();
> @@ -195,11 +195,12 @@ static void writeNewBufferPreamble(pid_t
>      // buffer, associated with a particular thread, with a new CPU.  For the
>      // data, we have 15 bytes to squeeze as much information as we can.  At
> this
>      // point we only write down the following bytes:
> -    //   - Thread ID (pid_t, 4 bytes)
> +    //   - Thread ID (tid_t, cast to 4 bytes type due to Darwin being 8
> bytes)
>      auto &NewBuffer = Metadata[0];
>      NewBuffer.Type = uint8_t(RecordType::Metadata);
>      NewBuffer.RecordKind = uint8_t(MetadataRecord::RecordKinds::NewBuffer);
> -    std::memcpy(&NewBuffer.Data, &Tid, sizeof(pid_t));
> +    int32_t tid = static_cast<int32_t>(Tid);
> +    std::memcpy(&NewBuffer.Data, &tid, sizeof(tid));
>    }
> 
>    // Also write the WalltimeMarker record.
> @@ -236,7 +237,7 @@ inline void setupNewBuffer(int (*wall_cl
>    auto &TLD = getThreadLocalData();
>    auto &B = TLD.Buffer;
>    TLD.RecordPtr = static_cast<char *>(B.Data);
> -  pid_t Tid = syscall(SYS_gettid);
> +  tid_t Tid = __sanitizer::GetTid();
>    timespec TS{0, 0};
>    // This is typically clock_gettime, but callers have injection ability.
>    wall_clock_reader(CLOCK_MONOTONIC, &TS);
> 
> Modified: compiler-rt/trunk/lib/xray/xray_flags.inc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/xray/xray_flags.inc?rev=325240&r1=325239&r2=325240&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/xray/xray_flags.inc (original)
> +++ compiler-rt/trunk/lib/xray/xray_flags.inc Thu Feb 15 06:17:15 2018
> @@ -31,7 +31,7 @@ XRAY_FLAG(int, xray_naive_log_func_durat
>            "microseconds than this threshold.")  XRAY_FLAG(int,
> xray_naive_log_max_stack_depth, 64,
>            "Naive logging will keep track of at most this deep a call stack, "
> -          "any more and the recordings will be droppped.")
> +          "any more and the recordings will be dropped.")
>  XRAY_FLAG(int, xray_naive_log_thread_buffer_size, 1024,
>            "The number of entries to keep on a per-thread buffer.")
> 
> 
> Modified: compiler-rt/trunk/lib/xray/xray_inmemory_log.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/xray/xray_inmemory_log.cc?rev=325240&r1=325239&r2=325240&view=dif
> f
> ==============================================================================
> --- compiler-rt/trunk/lib/xray/xray_inmemory_log.cc (original)
> +++ compiler-rt/trunk/lib/xray/xray_inmemory_log.cc Thu Feb 15 06:17:15
> +++ 2018
> @@ -60,7 +60,7 @@ struct alignas(64) ThreadLocalData {
>    size_t StackSize = 0;
>    size_t StackEntries = 0;
>    int Fd = -1;
> -  pid_t TID = 0;
> +  tid_t TID = 0;
>  };
> 
>  static pthread_key_t PThreadKey;
> 
> Modified: compiler-rt/trunk/lib/xray/xray_x86_64.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/xray/xray_x86_64.cc?rev=325240&r1=325239&r2=325240&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/xray/xray_x86_64.cc (original)
> +++ compiler-rt/trunk/lib/xray/xray_x86_64.cc Thu Feb 15 06:17:15 2018
> @@ -3,6 +3,10 @@
>  #include "xray_defs.h"
>  #include "xray_interface_internal.h"
> 
> +#if SANITIZER_FREEBSD
> +#include <sys/sysctl.h>
> +#endif
> +
>  #include <atomic>
>  #include <cstdint>
>  #include <errno.h>
> @@ -14,6 +18,7 @@
> 
>  namespace __xray {
> 
> +#if SANITIZER_LINUX
>  static std::pair<ssize_t, bool>
>  retryingReadSome(int Fd, char *Begin, char *End) XRAY_NEVER_INSTRUMENT {
>    auto BytesToRead = std::distance(Begin, End); @@ -71,6 +76,24 @@ uint64_t
> getTSCFrequency() XRAY_NEVER_IN
>    }
>    return TSCFrequency == -1 ? 0 : static_cast<uint64_t>(TSCFrequency);
>  }
> +#elif SANITIZER_FREEBSD
> +uint64_t getTSCFrequency() XRAY_NEVER_INSTRUMENT {
> +    long long TSCFrequency = -1;
> +    size_t tscfreqsz = sizeof(TSCFrequency);
> +
> +    if (sysctlbyname("machdep.tsc_freq", &TSCFrequency, &tscfreqsz,
> +        NULL, 0) != -1) {
> +        return static_cast<uint64_t>(TSCFrequency);
> +    } else {
> +      Report("Unable to determine CPU frequency for TSC accounting.\n");
> +    }
> +
> +    return 0;
> +
> +}
> +#else
> +#error "Platform not supported"
> +#endif
> 
>  static constexpr uint8_t CallOpCode = 0xe8;  static constexpr uint16_t
> MovR10Seq = 0xba41; @@ -259,7 +282,8 @@ bool probeRequiredCPUFeatures()
> XRAY_NEV
>    // We check whether rdtscp support is enabled. According to the x86_64
> manual,
>    // level should be set at 0x80000001, and we should have a look at bit 27
> in
>    // EDX. That's 0x8000000 (or 1u << 27).
> -  __get_cpuid(0x80000001, &EAX, &EBX, &ECX, &EDX);
> +  __asm__ __volatile__("cpuid" : "=a"(EAX), "=b"(EBX), "=c"(ECX), "=d"(EDX)
> +    : "0"(0x80000001));
>    if (!(EDX & (1u << 27))) {
>      Report("Missing rdtscp support.\n");
>      return false;
> 
> Modified: compiler-rt/trunk/lib/xray/xray_x86_64.inc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/xray/xray_x86_64.inc?rev=325240&r1=325239&r2=325240&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/xray/xray_x86_64.inc (original)
> +++ compiler-rt/trunk/lib/xray/xray_x86_64.inc Thu Feb 15 06:17:15 2018
> @@ -21,9 +21,10 @@ namespace __xray {
> 
>  ALWAYS_INLINE uint64_t readTSC(uint8_t &CPU) XRAY_NEVER_INSTRUMENT {
>    unsigned LongCPU;
> -  uint64_t TSC = __rdtscp(&LongCPU);
> +  unsigned long Rax, Rdx;
> +  __asm__ __volatile__("rdtscp\n" : "=a"(Rax), "=d"(Rdx), "=c"(LongCPU)
> + ::);
>    CPU = LongCPU;
> -  return TSC;
> +  return (Rdx << 32) + Rax;
>  }
> 
>  uint64_t getTSCFrequency();
> 
> Modified: compiler-rt/trunk/test/xray/lit.cfg
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/test/xray/lit.cfg?rev=325240&r1=325239&r2=325240&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/xray/lit.cfg (original)
> +++ compiler-rt/trunk/test/xray/lit.cfg Thu Feb 15 06:17:15 2018
> @@ -20,6 +20,13 @@ def build_invocation(compile_flags):
>  llvm_xray = os.path.join(config.llvm_tools_dir, 'llvm-xray')
> 
>  # Setup substitutions.
> +xraylib_flags = '-lm -pthread -lrt'
> +if config.host_os == 'Linux':
> +  xraylib_flags += ' -ldl'
> +
> +xraylib_flags += ' -L%s -Wl,-whole-archive -lclang_rt.xray-%s '
> +'-Wl,-no-whole-archive'
> +
>  config.substitutions.append(
>      ('%clang ', build_invocation([config.target_cflags])))
>  config.substitutions.append(
> @@ -33,14 +40,13 @@ config.substitutions.append(
>      ('%llvm_xray', llvm_xray))
>  config.substitutions.append(
>      ('%xraylib',
> -        ('-lm -lpthread -ldl -lrt -L%s '
> -         '-Wl,-whole-archive -lclang_rt.xray-%s -Wl,-no-whole-archive')
> +        (xraylib_flags)
>          % (config.compiler_rt_libdir, config.host_arch)))
> 
>  # Default test suffixes.
>  config.suffixes = ['.c', '.cc', '.cpp']
> 
> -if config.host_os not in ['Linux']:
> +if config.host_os not in ['Linux', 'FreeBSD']:
>    config.unsupported = True
>  elif '64' not in config.host_arch:
>    if 'arm' in config.host_arch:
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list