Unverified Commit 99bfd525 authored by Michael Kruse's avatar Michael Kruse Committed by GitHub
Browse files

Merge pull request #25 from RWTH-HPC/archer-improvements

Various improvements of data race analysis in Archer / ThreadSanitizer
parents f8575ff4 f8c968fe
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -5019,13 +5019,16 @@ llvm::Function *CGOpenMPRuntime::emitReductionFunction(
  Args.push_back(&RHSArg);
  const auto &CGFI =
      CGM.getTypes().arrangeBuiltinFunctionDeclaration(C.VoidTy, Args);
  CodeGenFunction CGF(CGM);
  std::string Name = getReductionFuncName(ReducerName);
  auto *Fn = llvm::Function::Create(CGM.getTypes().GetFunctionType(CGFI),
                                    llvm::GlobalValue::InternalLinkage, Name,
                                    &CGM.getModule());
  if (CGF.SanOpts.has(SanitizerKind::Thread)) {
    return Fn;
  }
  CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, CGFI);
  Fn->setDoesNotRecurse();
  CodeGenFunction CGF(CGM);
  CGF.StartFunction(GlobalDecl(), C.VoidTy, Fn, CGFI, Args, Loc, Loc);
  // Dst = (void*[n])(LHSArg);
@@ -5217,6 +5220,11 @@ void CGOpenMPRuntime::emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
  llvm::Function *ReductionFn = emitReductionFunction(
      CGF.CurFn->getName(), Loc, CGF.ConvertTypeForMem(ReductionArrayTy),
      Privates, LHSExprs, RHSExprs, ReductionOps);
  llvm::Value *ReductionFnP = ReductionFn;
  if (CGF.SanOpts.has(SanitizerKind::Thread)) {
    ReductionFnP = llvm::ConstantPointerNull::get(
        llvm::PointerType::get(ReductionFn->getFunctionType(), 0));
  }
  // 3. Create static kmp_critical_name lock = { 0 };
  std::string Name = getName({"reduction"});
@@ -5235,7 +5243,7 @@ void CGOpenMPRuntime::emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
      CGF.Builder.getInt32(RHSExprs.size()), // i32 <n>
      ReductionArrayTySize,                  // size_type sizeof(RedList)
      RL,                                    // void *RedList
      ReductionFn, // void (*) (void *, void *) <reduce_func>
      ReductionFnP, // void (*) (void *, void *) <reduce_func>
      Lock          // kmp_critical_name *&<lock>
  };
  llvm::Value *Res = CGF.EmitRuntimeCall(
+2 −0
Original line number Diff line number Diff line
@@ -89,6 +89,8 @@ check_cxx_compiler_flag(-fno-profile-instr-use COMPILER_RT_HAS_FNO_PROFILE_INSTR
check_cxx_compiler_flag(-fno-coverage-mapping COMPILER_RT_HAS_FNO_COVERAGE_MAPPING_FLAG)
check_cxx_compiler_flag("-Werror -mcrc32"    COMPILER_RT_HAS_MCRC32_FLAG)
check_cxx_compiler_flag("-Werror -msse4.2"   COMPILER_RT_HAS_MSSE4_2_FLAG)
check_cxx_compiler_flag("-Werror -mavx2"   COMPILER_RT_HAS_MAVX2_FLAG)
check_cxx_compiler_flag("-Werror -mavx512f"   COMPILER_RT_HAS_MAVX512F_FLAG)
check_cxx_compiler_flag(--sysroot=.          COMPILER_RT_HAS_SYSROOT_FLAG)
check_cxx_compiler_flag("-Werror -mcrc"      COMPILER_RT_HAS_MCRC_FLAG)
check_cxx_compiler_flag(-fno-partial-inlining COMPILER_RT_HAS_FNO_PARTIAL_INLINING_FLAG)
+15 −0
Original line number Diff line number Diff line
@@ -237,6 +237,17 @@ else()
    else()
      set(TSAN_ASM_SOURCES)
    endif()
    add_compiler_rt_object_libraries(RTTSanAVX2
        ARCHS ${arch}
        SOURCES tsan_interface_avx2.cpp
        ADDITIONAL_HEADERS tsan_interface_avx2.h 
        #CFLAGS ${TSAN_RTL_CFLAGS} $<IF:"$COMPILER_RT_HAS_MAVX2_FLAG","-mavx2","">)
        CFLAGS ${TSAN_RTL_CFLAGS} $<IF:$<BOOL:${COMPILER_RT_HAS_MAVX2_FLAG}>,-mavx2,"">)
    add_compiler_rt_object_libraries(RTTSanAVX512
        ARCHS ${arch}
        SOURCES tsan_interface_avx512.cpp
        ADDITIONAL_HEADERS tsan_interface_avx512.h 
        CFLAGS ${TSAN_RTL_CFLAGS} $<IF:$<BOOL:${COMPILER_RT_HAS_MAVX512F_FLAG}>,-mavx512f,"">)
    add_compiler_rt_runtime(clang_rt.tsan
      STATIC
      ARCHS ${arch}
@@ -247,6 +258,8 @@ else()
              $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>
              $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>
              $<TARGET_OBJECTS:RTUbsan.${arch}>
              $<TARGET_OBJECTS:RTTSanAVX2.${arch}>
              $<TARGET_OBJECTS:RTTSanAVX512.${arch}>
      ADDITIONAL_HEADERS ${TSAN_HEADERS}
      CFLAGS ${TSAN_RTL_CFLAGS}
      PARENT_TARGET tsan)
@@ -270,6 +283,8 @@ else()
              $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>
              $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>
              $<TARGET_OBJECTS:RTUbsan.${arch}>
              $<TARGET_OBJECTS:RTTSanAVX2.${arch}>
              $<TARGET_OBJECTS:RTTSanAVX512.${arch}>
      ADDITIONAL_HEADERS ${TSAN_HEADERS}
      CFLAGS ${TSAN_RTL_DYNAMIC_CFLAGS}
      DEFS SANITIZER_SHARED
+31 −6
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#include "tsan_interface.h"
#include "tsan_interface_ann.h"
#include "tsan_rtl.h"

#include "sanitizer_common/sanitizer_internal_defs.h"
#include "sanitizer_common/sanitizer_ptrauth.h"

@@ -42,18 +43,42 @@ void __tsan_write16_pc(void *addr, void *pc) {

// __tsan_unaligned_read/write calls are emitted by compiler.

void __tsan_unaligned_read16(const void *addr) {
template <unsigned int N>
void __tsan_unaligned_readx(const void *addr) {
  uptr pc = CALLERPC;
  ThreadState *thr = cur_thread();
  UnalignedMemoryAccess(thr, pc, (uptr)addr, 8, kAccessRead);
  UnalignedMemoryAccess(thr, pc, (uptr)addr + 8, 8, kAccessRead);
  for (unsigned int i = 0; i < N / 8; i++)
    UnalignedMemoryAccess(thr, pc, (uptr)addr + (i * 8), 8, kAccessRead);
}

void __tsan_unaligned_write16(void *addr) {
template <unsigned int N>
void __tsan_unaligned_writex(void *addr) {
  uptr pc = CALLERPC;
  ThreadState *thr = cur_thread();
  UnalignedMemoryAccess(thr, pc, (uptr)addr, 8, kAccessWrite);
  UnalignedMemoryAccess(thr, pc, (uptr)addr + 8, 8, kAccessWrite);
  for (unsigned int i = 0; i < N / 8; i++)
    UnalignedMemoryAccess(thr, pc, (uptr)addr + (i * 8), 8, kAccessWrite);
}

void __tsan_unaligned_read16(const void *addr) {
  __tsan_unaligned_readx<16>(addr);
}

void __tsan_unaligned_write16(void *addr) { __tsan_unaligned_writex<16>(addr); }

extern "C" void __tsan_unaligned_read32(const void *addr) {
  __tsan_unaligned_readx<32>(addr);
}

extern "C" void __tsan_unaligned_write32(void *addr) {
  __tsan_unaligned_writex<32>(addr);
}

extern "C" void __tsan_unaligned_read64(const void *addr) {
  __tsan_unaligned_readx<64>(addr);
}

extern "C" void __tsan_unaligned_write64(void *addr) {
  __tsan_unaligned_writex<64>(addr);
}

extern "C" {
+4 −0
Original line number Diff line number Diff line
@@ -53,11 +53,15 @@ SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read2(const void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read4(const void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read8(const void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read16(const void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read32(const void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read64(const void *addr);

SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write2(void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write4(void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write8(void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write16(void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write32(void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write64(void *addr);

SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2_pc(void *addr, void *pc);
Loading