Skip to content

Commit 6bb0ff2

Browse files
committed
ldc: add support for realtime sanitizer for LLVM 20+
1 parent 1ae8018 commit 6bb0ff2

6 files changed

+32
-3
lines changed

CMakeLists.txt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -859,9 +859,10 @@ if (LDC_INSTALL_LLVM_RUNTIME_LIBS)
859859
# Locate LLVM sanitizer runtime libraries, and copy them to our lib folder
860860

861861
if(APPLE)
862-
copy_compilerrt_lib("libclang_rt.asan_osx_dynamic.dylib" "libldc_rt.asan.dylib" TRUE)
863-
copy_compilerrt_lib("libclang_rt.lsan_osx_dynamic.dylib" "libldc_rt.lsan.dylib" TRUE)
864-
copy_compilerrt_lib("libclang_rt.tsan_osx_dynamic.dylib" "libldc_rt.tsan.dylib" TRUE)
862+
copy_compilerrt_lib("libclang_rt.asan_osx_dynamic.dylib" "libldc_rt.asan.dylib" TRUE)
863+
copy_compilerrt_lib("libclang_rt.lsan_osx_dynamic.dylib" "libldc_rt.lsan.dylib" TRUE)
864+
copy_compilerrt_lib("libclang_rt.tsan_osx_dynamic.dylib" "libldc_rt.tsan.dylib" TRUE)
865+
copy_compilerrt_lib("libclang_rt.rtsan_osx_dynamic.dylib" "libldc_rt.rtsan.dylib" TRUE)
865866
copy_compilerrt_lib("libclang_rt.osx.a" "libldc_rt.builtins.a" FALSE)
866867
copy_compilerrt_lib("libclang_rt.profile_osx.a" "libldc_rt.profile.a" FALSE)
867868
copy_compilerrt_lib("libclang_rt.fuzzer_osx.a" "libldc_rt.fuzzer.a" FALSE)
@@ -882,6 +883,7 @@ if (LDC_INSTALL_LLVM_RUNTIME_LIBS)
882883
copy_compilerrt_lib("libclang_rt.lsan${compilerrt_suffix}.a" "libldc_rt.lsan.a" FALSE)
883884
copy_compilerrt_lib("libclang_rt.msan${compilerrt_suffix}.a" "libldc_rt.msan.a" FALSE)
884885
copy_compilerrt_lib("libclang_rt.tsan${compilerrt_suffix}.a" "libldc_rt.tsan.a" FALSE)
886+
copy_compilerrt_lib("libclang_rt.rtsan${compilerrt_suffix}.a" "libldc_rt.rtsan.a" FALSE)
885887
copy_compilerrt_lib("libclang_rt.builtins${compilerrt_suffix}.a" "libldc_rt.builtins.a" FALSE)
886888
copy_compilerrt_lib("libclang_rt.profile${compilerrt_suffix}.a" "libldc_rt.profile.a" FALSE)
887889
copy_compilerrt_lib("libclang_rt.xray${compilerrt_suffix}.a" "libldc_rt.xray.a" FALSE)

driver/cl_options_sanitizers.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ SanitizerCheck parseSanitizerName(llvm::StringRef name,
185185
.Case("leak", LeakSanitizer)
186186
.Case("memory", MemorySanitizer)
187187
.Case("thread", ThreadSanitizer)
188+
#if LDC_LLVM_VER >= 2000
189+
.Case("realtime", RealTimeSanitizer)
190+
#endif
188191
.Default(NoneSanitizer);
189192

190193
if (parsedValue == NoneSanitizer) {

driver/cl_options_sanitizers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ enum SanitizerCheck : SanitizerBits {
3939
ThreadSanitizer = 1 << 3,
4040
CoverageSanitizer = 1 << 4,
4141
LeakSanitizer = 1 << 5,
42+
RealTimeSanitizer = 1 << 6,
4243
};
4344
extern SanitizerBits enabledSanitizers;
4445
extern SanitizerBits enabledSanitizerRecoveries;

driver/linker-gcc.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,12 @@ void ArgsBuilder::addSanitizers(const llvm::Triple &triple) {
512512
addSanitizerLinkFlags(triple, "tsan", "-fsanitize=thread");
513513
}
514514

515+
#if LDC_LLVM_VER >= 2000
516+
if (opts::isSanitizerEnabled(opts::RealTimeSanitizer)) {
517+
addSanitizerLinkFlags(triple, "rtsan", "-fsanitize=realtime");
518+
}
519+
#endif
520+
515521
if (opts::isSanitizerRecoveryEnabled(opts::AddressSanitizer)) {
516522
args.push_back("-fsanitize-recover=address");
517523
}

gen/functions.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,6 +1175,12 @@ void DtoDefineFunction(FuncDeclaration *fd, bool linkageAvailableExternally) {
11751175
if (opts::isSanitizerEnabled(opts::ThreadSanitizer & noSanitizeMask)) {
11761176
func->addFnAttr(LLAttribute::SanitizeThread);
11771177
}
1178+
1179+
#if LDC_LLVM_VER >= 2000
1180+
if (opts::isSanitizerEnabled(opts::RealTimeSanitizer & noSanitizeMask)) {
1181+
func->addFnAttr(LLAttribute::SanitizeRealtime);
1182+
}
1183+
#endif
11781184
}
11791185
applyXRayAttributes(*fd, *func);
11801186
if (opts::fNullPointerIsValid) {

gen/optimizer.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@
7474
#include "llvm/Transforms/Scalar/LICM.h"
7575
#include "llvm/Transforms/Scalar/Reassociate.h"
7676
#include "llvm/Transforms/Instrumentation/SanitizerCoverage.h"
77+
#if LDC_LLVM_VER >= 2000
78+
#include "llvm/Transforms/Instrumentation/RealtimeSanitizer.h"
79+
#endif
7780

7881
using namespace llvm;
7982

@@ -522,6 +525,14 @@ void runOptimizationPasses(llvm::Module *M, llvm::TargetMachine *TM) {
522525
if (opts::isSanitizerEnabled(opts::CoverageSanitizer)) {
523526
pb.registerOptimizerLastEPCallback(addSanitizerCoveragePass);
524527
}
528+
529+
#if LDC_LLVM_VER >= 2000
530+
if (opts::isSanitizerEnabled(opts::RealTimeSanitizer)) {
531+
pb.registerOptimizerLastEPCallback(
532+
[](ModulePassManager &mpm, OptimizationLevel level,
533+
ThinOrFullLTOPhase) { mpm.addPass(RealtimeSanitizerPass()); });
534+
}
535+
#endif // !LDC_LLVM_VER >= 2000
525536
#endif // !IN_JITRT
526537

527538
if (!disableLangSpecificPasses) {

0 commit comments

Comments
 (0)