Loading clang/lib/CodeGen/CGOpenMPRuntime.cpp +11 −3 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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"}); Loading @@ -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( Loading compiler-rt/cmake/config-ix.cmake +2 −0 Original line number Diff line number Diff line Loading @@ -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) Loading compiler-rt/lib/tsan/rtl/CMakeLists.txt +15 −0 Original line number Diff line number Diff line Loading @@ -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} Loading @@ -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) Loading @@ -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 Loading compiler-rt/lib/tsan/rtl/tsan_interface.cpp +31 −6 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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" { Loading compiler-rt/lib/tsan/rtl/tsan_interface.h +4 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
clang/lib/CodeGen/CGOpenMPRuntime.cpp +11 −3 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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"}); Loading @@ -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( Loading
compiler-rt/cmake/config-ix.cmake +2 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
compiler-rt/lib/tsan/rtl/CMakeLists.txt +15 −0 Original line number Diff line number Diff line Loading @@ -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} Loading @@ -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) Loading @@ -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 Loading
compiler-rt/lib/tsan/rtl/tsan_interface.cpp +31 −6 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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" { Loading
compiler-rt/lib/tsan/rtl/tsan_interface.h +4 −0 Original line number Diff line number Diff line Loading @@ -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