aboutsummaryrefslogtreecommitdiff
blob: 7af27a9d7196d36c22ee734713a1a8949e906e98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
# A lot of unrelated work in one PR.
# - It changes some wrong autodetection to lower to amount of stuff being
# built.
# - It better supports compiler-rt-sanitizers by handling the way they
# are installed in Gentoo.
# - It adds some more fixes for upstream which I didn't take out of the
# the PR to keep it as is.
From 58550bbd27e572d1706b04f39132d60c5c2797ac Mon Sep 17 00:00:00 2001
From: Andrei Horodniceanu <a.horodniceanu@proton.me>
Date: Wed, 15 May 2024 18:33:46 +0300
Subject: [PATCH 1/6] utils/CMakeLists.txt: Fix typo split-filea => split-file

Signed-off-by: Andrei Horodniceanu <a.horodniceanu@proton.me>
---
 utils/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 6b61a068373..379edf2c1b4 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -68,7 +68,7 @@ set_target_properties(
 target_link_libraries(not  ${LLVM_LIBRARIES} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS})
 endif()
 
-if ((TARGET split-file) OR (EXISTS ${LLVM_ROOT_DIR}/bin/split-filea))
+if ((TARGET split-file) OR (EXISTS ${LLVM_ROOT_DIR}/bin/split-file))
   # already provided by LLVM
   message(STATUS "Skip building split-file, it is already provided by LLVM")
 else()

From 9b22e4a2b534fe4da54a02aadde486d9cc963574 Mon Sep 17 00:00:00 2001
From: Andrei Horodniceanu <a.horodniceanu@proton.me>
Date: Fri, 17 May 2024 23:12:58 +0300
Subject: [PATCH 2/6] cmake: Add option to disable bundling ldc-profdata and
 ldc-profgen

Add the configure option LDC_BUNDLE_LLVM_TOOLS that can be used to
disable packaging ldc-profdata and ldc-profgen. Since the users's llvm
installation may contain these programs there should be a way to
specify to ldc not to build them.

Move the definitions for LDCPROF(DATA|GEN)_BIN from tests/ to tools/
in order to handle this option.

Signed-off-by: Andrei Horodniceanu <a.horodniceanu@proton.me>
---
 tests/CMakeLists.txt |  3 --
 tools/CMakeLists.txt | 81 +++++++++++++++++++++++++-------------------
 2 files changed, 47 insertions(+), 37 deletions(-)

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index fc988f59560..f428d08b5de 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,6 +1,4 @@
 set( LDC2_BIN          ${PROJECT_BINARY_DIR}/bin/${LDC_EXE} )
-set( LDCPROFDATA_BIN   ${PROJECT_BINARY_DIR}/bin/ldc-profdata )
-set( LDCPROFGEN_BIN    ${PROJECT_BINARY_DIR}/bin/ldc-profgen )
 set( LDCPRUNECACHE_BIN ${PROJECT_BINARY_DIR}/bin/${LDCPRUNECACHE_EXE} )
 set( LDCBUILDPLUGIN_BIN ${PROJECT_BINARY_DIR}/bin/${LDC_BUILD_PLUGIN_EXE} )
 set( TIMETRACE2TXT_BIN ${PROJECT_BINARY_DIR}/bin/${TIMETRACE2TXT_EXE} )
@@ -25,4 +23,3 @@ configure_file(runlit.py       runlit.py    COPYONLY)
 add_test(NAME lit-tests
     COMMAND ${PYTHON_EXE} runlit.py -v .
 )
-
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index facb939472d..ab147a9d029 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -1,6 +1,8 @@
 # "tools" are supposed to be packaged with LDC.
 # (in contrast to "utils" which are only used for building / testing)
 
+option(LDC_BUNDLE_LLVM_TOOLS "Build and install ldc-profgen and ldc-profdata utilities instead of using their llvm counterparts" TRUE)
+
 #############################################################################
 # Build ldc-prune-cache
 set(LDCPRUNECACHE_EXE ldc-prune-cache)
@@ -23,47 +25,58 @@ build_d_executable(
 )
 install(PROGRAMS ${LDCPRUNECACHE_EXE_FULL} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
 
-#############################################################################
-# Build ldc-profdata for converting profile data formats (source version depends on LLVM version)
-set(LDCPROFDATA_SRC ldc-profdata/llvm-profdata-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.cpp)
-if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LDCPROFDATA_SRC})
-    add_executable(ldc-profdata ${LDCPROFDATA_SRC})
-    set_target_properties(
-        ldc-profdata PROPERTIES
+if(LDC_BUNDLE_LLVM_TOOLS)
+  #############################################################################
+  # Build ldc-profdata for converting profile data formats (source version depends on LLVM version)
+  set(LDCPROFDATA_SRC ldc-profdata/llvm-profdata-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.cpp)
+  if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LDCPROFDATA_SRC})
+      add_executable(ldc-profdata ${LDCPROFDATA_SRC})
+      set_target_properties(
+	ldc-profdata PROPERTIES
+	RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin
+	COMPILE_FLAGS "${LLVM_CXXFLAGS} ${LDC_CXXFLAGS}"
+	LINK_FLAGS "${SANITIZE_LDFLAGS}"
+      )
+      target_link_libraries(ldc-profdata ${LLVM_LIBRARIES} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS})
+      install(TARGETS ldc-profdata DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
+
+      # Set path to executable, used by the lit testsuite.
+      set(LDCPROFDATA_BIN ${PROJECT_BINARY_DIR}/bin/ldc-profdata PARENT_SCOPE)
+  else()
+      message(WARNING "ldc-profdata source (${LDCPROFDATA_SRC}) not found")
+  endif()
+
+  #############################################################################
+  # Build ldc-profgen utility that generates a profile data file from given perf script
+  # data files for sample-based profile guided optimization (-fprofile-sample-use).
+  # https://llvm.org/docs/CommandGuide/llvm-profgen.html
+  # The source in ldc-profgen/ldc-profgen-xx.x is an unmodified copy of llvm's llvm-profgen source dir.
+  if(LDC_LLVM_VER GREATER_EQUAL 1400)
+    macro(add_llvm_tool llvm_name)
+      string(REPLACE "llvm-" "ldc-" ldc_name ${llvm_name})
+      message(STATUS "Configuring ${ldc_name} build target")
+      add_executable(${ldc_name} ${ARGN})
+      set_target_properties(
+        ${ldc_name} PROPERTIES
         RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin
         COMPILE_FLAGS "${LLVM_CXXFLAGS} ${LDC_CXXFLAGS}"
         LINK_FLAGS "${SANITIZE_LDFLAGS}"
-    )
-    target_link_libraries(ldc-profdata ${LLVM_LIBRARIES} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS})
-    install(TARGETS ldc-profdata DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
-else()
-    message(WARNING "ldc-profdata source (${LDCPROFDATA_SRC}) not found")
-endif()
-
-#############################################################################
-# Build ldc-profgen utility that generates a profile data file from given perf script
-# data files for sample-based profile guided optimization (-fprofile-sample-use).
-# https://llvm.org/docs/CommandGuide/llvm-profgen.html
-# The source in ldc-profgen/ldc-profgen-xx.x is an unmodified copy of llvm's llvm-profgen source dir.
-if(LDC_LLVM_VER GREATER_EQUAL 1400)
-    macro(add_llvm_tool llvm_name)
-        string(REPLACE "llvm-" "ldc-" ldc_name ${llvm_name})
-        message(STATUS "Configuring ${ldc_name} build target")
-        add_executable(${ldc_name} ${ARGN})
-        set_target_properties(
-            ${ldc_name} PROPERTIES
-            RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin
-            COMPILE_FLAGS "${LLVM_CXXFLAGS} ${LDC_CXXFLAGS}"
-            LINK_FLAGS "${SANITIZE_LDFLAGS}"
-        )
-        target_link_libraries(${ldc_name} ${LLVM_LIBRARIES} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS})
-        install(TARGETS ${ldc_name} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
+      )
+      target_link_libraries(${ldc_name} ${LLVM_LIBRARIES} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS})
+      install(TARGETS ${ldc_name} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
     endmacro()
     if (IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ldc-profgen/ldc-profgen-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR})
-        add_subdirectory(ldc-profgen/ldc-profgen-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR})
+      add_subdirectory(ldc-profgen/ldc-profgen-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR})
+      # Set path to executable, potentially to be used by the lit tests in the future
+      set(LDCPROFGEN_BIN ${PROJECT_BINARY_DIR}/bin/ldc-profgen PARENT_SCOPE)
     else()
-        message(WARNING "ldc-profgen source not found (${CMAKE_CURRENT_SOURCE_DIR}/ldc-profgen/ldc-profgen-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR})")
+      message(WARNING "ldc-profgen source not found (${CMAKE_CURRENT_SOURCE_DIR}/ldc-profgen/ldc-profgen-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR})")
     endif()
+  endif()
+else()
+  message(STATUS "Using llvm provided llvm-profdata and llvm-profgen")
+  set(LDCPROFDATA_BIN ${LLVM_ROOT_DIR}/bin/llvm-profdata PARENT_SCOPE)
+  set(LDCPROFGEN_BIN ${LLVM_ROOT_DIR}/bin/llvm-profgen PARENT_SCOPE)
 endif()
 
 #############################################################################

From ddb6c8763c60261d88498a3a09ea8d62bde18ee6 Mon Sep 17 00:00:00 2001
From: Andrei Horodniceanu <a.horodniceanu@proton.me>
Date: Fri, 17 May 2024 23:19:03 +0300
Subject: [PATCH 3/6] Support out-of-llvm compiler-rt installations

Currently, the build systems assumes that the compiler-rt libraries
are under the ${LLVM_LIBRARY_DIRS} directory. This is not always true,
e.g on Gentoo they are installed in /usr/lib/clang/... This has been
fixed by adding the COMPILER_RT_BASE_DIR option.

Additionally the code for determining the os-specific compiler-rt
directory has been slightly refactored and the option
LDC_INSTALL_LLVM_RUNTIME_LIBS_OS has been renamed to
COMPILER_RT_LIBDIR_OS since this value can now be used outside of
LDC_INSTALL_LLVM_RUNTIME_LIBS.

The configuration files (ldc2*.conf) have been modified to optionally
embed a compiler-rt libdir in case the default search paths would not
find the libraries.

Signed-off-by: Andrei Horodniceanu <a.horodniceanu@proton.me>
---
 CMakeLists.txt       | 107 ++++++++++++++++++++++++++++---------------
 ldc2.conf.in         |   2 +-
 ldc2_install.conf.in |   2 +-
 ldc2_phobos.conf.in  |   2 +-
 4 files changed, 72 insertions(+), 41 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b1e41665c07..98bda6d8ce1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -798,9 +798,38 @@ else()
 endif()
 
 #
-# Locate ASan and other LLVM compiler-rt libraries, and copy them to our lib folder
-# Location is LLVM_LIBRARY_DIRS/clang/<version>/lib/<OS>/ , for example LLVM_LIBRARY_DIRS/clang/4.0.0/lib/darwin/
-#
+# Locate ASan and other LLVM compiler-rt libraries, and copy them to our lib
+# folder or save that folder in the config files. Location is typically
+# LLVM_LIBRARY_DIRS/clang/<version>/lib/<OS>/ , for example
+# LLVM_LIBRARY_DIRS/clang/4.0.0/lib/darwin/ , but we allow the user to specify
+# another directory.
+set(COMPILER_RT_BASE_DIR "${LLVM_LIBRARY_DIRS}" CACHE PATH "Base path of compiler-rt libraries. If they in are /usr/lib/clang/17/lib/linux/libclang_rt* you should set this value to /usr/lib")
+# If it's different than the default it will need to be added to the config files
+if(COMPILER_RT_BASE_DIR STREQUAL LLVM_LIBRARY_DIRS)
+    set(WANT_COMPILER_RT_LIBDIR_CONFIG FALSE)
+else()
+    set(WANT_COMPILER_RT_LIBDIR_CONFIG TRUE)
+endif()
+set(COMPILER_RT_LIBDIR "${COMPILER_RT_BASE_DIR}/clang")
+if(LDC_LLVM_VER LESS 1600)
+    set(COMPILER_RT_LIBDIR "${COMPILER_RT_LIBDIR}/${LLVM_VERSION_BASE_STRING}")
+else()
+    set(COMPILER_RT_LIBDIR "${COMPILER_RT_LIBDIR}/${LLVM_VERSION_MAJOR}")
+endif()
+set(COMPILER_RT_LIBDIR "${COMPILER_RT_LIBDIR}/lib")
+if(APPLE)
+    set(COMPILER_RT_LIBDIR "${COMPILER_RT_LIBDIR}/darwin")
+elseif(UNIX)
+    if(LDC_LLVM_VER LESS 1500)
+        set(COMPILER_RT_LIBDIR_OS_DEFAULT "linux")
+    else()
+        set(COMPILER_RT_LIBDIR_OS_DEFAULT "x86_64-unknown-linux-gnu")
+    endif()
+    set(COMPILER_RT_LIBDIR_OS "${COMPILER_RT_LIBDIR_OS_DEFAULT}"   CACHE STRING "Non-Mac Posix: OS used as directory name for the compiler-rt source libraries, e.g., 'freebsd'.")
+    set(COMPILER_RT_LIBDIR "${COMPILER_RT_LIBDIR}/${COMPILER_RT_LIBDIR_OS}")
+elseif(WIN32)
+    set(COMPILER_RT_LIBDIR "${COMPILER_RT_LIBDIR}/windows")
+endif()
 if(LLVM_IS_SHARED)
     set(LDC_INSTALL_LLVM_RUNTIME_LIBS_DEFAULT OFF)
 else()
@@ -808,11 +837,7 @@ else()
 endif()
 set(LDC_INSTALL_LLVM_RUNTIME_LIBS ${LDC_INSTALL_LLVM_RUNTIME_LIBS_DEFAULT} CACHE BOOL "Copy/install LLVM compiler-rt libraries (ASan, libFuzzer, ...) from LLVM/Clang into LDC lib dir when available.")
 function(copy_compilerrt_lib llvm_lib_name ldc_lib_name fixup_dylib)
-    if(LDC_LLVM_VER LESS 1600)
-        set(llvm_lib_path ${LLVM_LIBRARY_DIRS}/clang/${LLVM_VERSION_BASE_STRING}/lib/${llvm_lib_name})
-    else()
-        set(llvm_lib_path ${LLVM_LIBRARY_DIRS}/clang/${LLVM_VERSION_MAJOR}/lib/${llvm_lib_name})
-    endif()
+    set(llvm_lib_path ${COMPILER_RT_LIBDIR}/${llvm_lib_name})
     if(EXISTS ${llvm_lib_path})
         message(STATUS "--  - ${llvm_lib_path} --> ${ldc_lib_name}")
         copy_and_install_llvm_library(${llvm_lib_path} ${ldc_lib_name} ${fixup_dylib})
@@ -824,57 +849,63 @@ message(STATUS "-- Including LLVM compiler-rt libraries (LDC_INSTALL_LLVM_RUNTIM
 if (LDC_INSTALL_LLVM_RUNTIME_LIBS)
     # Locate LLVM sanitizer runtime libraries, and copy them to our lib folder
 
+    # No need to add another libdir, the default ldc one will have the libraries
+    set(WANT_COMPILER_RT_LIBDIR_CONFIG FALSE)
+
     if(APPLE)
-        copy_compilerrt_lib("darwin/libclang_rt.asan_osx_dynamic.dylib" "libldc_rt.asan.dylib" TRUE)
-        copy_compilerrt_lib("darwin/libclang_rt.lsan_osx_dynamic.dylib" "libldc_rt.lsan.dylib" TRUE)
-        copy_compilerrt_lib("darwin/libclang_rt.tsan_osx_dynamic.dylib" "libldc_rt.tsan.dylib" TRUE)
-        copy_compilerrt_lib("darwin/libclang_rt.osx.a"                  "libldc_rt.builtins.a" FALSE)
-        copy_compilerrt_lib("darwin/libclang_rt.profile_osx.a"          "libldc_rt.profile.a"  FALSE)
-        copy_compilerrt_lib("darwin/libclang_rt.fuzzer_osx.a"           "libldc_rt.fuzzer.a"   FALSE)
-        copy_compilerrt_lib("darwin/libclang_rt.xray_osx.a"             "libldc_rt.xray.a"     FALSE)
-        copy_compilerrt_lib("darwin/libclang_rt.xray-basic_osx.a"      "libldc_rt.xray-basic.a"     FALSE)
-        copy_compilerrt_lib("darwin/libclang_rt.xray-fdr_osx.a"        "libldc_rt.xray-fdr.a"       FALSE)
-        copy_compilerrt_lib("darwin/libclang_rt.xray-profiling_osx.a"  "libldc_rt.xray-profiling.a" FALSE)
+        copy_compilerrt_lib("libclang_rt.asan_osx_dynamic.dylib" "libldc_rt.asan.dylib" TRUE)
+        copy_compilerrt_lib("libclang_rt.lsan_osx_dynamic.dylib" "libldc_rt.lsan.dylib" TRUE)
+        copy_compilerrt_lib("libclang_rt.tsan_osx_dynamic.dylib" "libldc_rt.tsan.dylib" TRUE)
+        copy_compilerrt_lib("libclang_rt.osx.a"                  "libldc_rt.builtins.a" FALSE)
+        copy_compilerrt_lib("libclang_rt.profile_osx.a"          "libldc_rt.profile.a"  FALSE)
+        copy_compilerrt_lib("libclang_rt.fuzzer_osx.a"           "libldc_rt.fuzzer.a"   FALSE)
+        copy_compilerrt_lib("libclang_rt.xray_osx.a"             "libldc_rt.xray.a"     FALSE)
+        copy_compilerrt_lib("libclang_rt.xray-basic_osx.a"      "libldc_rt.xray-basic.a"     FALSE)
+        copy_compilerrt_lib("libclang_rt.xray-fdr_osx.a"        "libldc_rt.xray-fdr.a"       FALSE)
+        copy_compilerrt_lib("libclang_rt.xray-profiling_osx.a"  "libldc_rt.xray-profiling.a" FALSE)
     elseif(UNIX)
         if(LDC_LLVM_VER LESS 1500)
-            set(LDC_INSTALL_LLVM_RUNTIME_LIBS_OS_DEFAULT "linux")
             set(LDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH_DEFAULT "x86_64")
         else()
-            set(LDC_INSTALL_LLVM_RUNTIME_LIBS_OS_DEFAULT "x86_64-unknown-linux-gnu")
             set(LDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH_DEFAULT "")
         endif()
-        set(LDC_INSTALL_LLVM_RUNTIME_LIBS_OS   "${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS_DEFAULT}"   CACHE STRING "Non-Mac Posix: OS used as directory name for the compiler-rt source libraries, e.g., 'freebsd'.")
-        set(LDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH "${LDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH_DEFAULT}" CACHE STRING "Non-Mac Posix: architecture used as libname suffix for the compiler-rt source libraries, e.g., 'aarch64'.")
+        set(LDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH "${LDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH_DEFAULT}" CACHE STRING
+	    "Non-Mac Posix: architecture used as libname suffix for the compiler-rt source libraries, e.g., 'aarch64'.")
         if(LDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH STREQUAL "")
             set(compilerrt_suffix "")
         else()
             set(compilerrt_suffix "-${LDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH}")
         endif()
 
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.asan${compilerrt_suffix}.a"       "libldc_rt.asan.a"     FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.lsan${compilerrt_suffix}.a"       "libldc_rt.lsan.a"     FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.msan${compilerrt_suffix}.a"       "libldc_rt.msan.a"     FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.tsan${compilerrt_suffix}.a"       "libldc_rt.tsan.a"     FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.builtins${compilerrt_suffix}.a"   "libldc_rt.builtins.a" FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.profile${compilerrt_suffix}.a"    "libldc_rt.profile.a"  FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.xray${compilerrt_suffix}.a"       "libldc_rt.xray.a"     FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.fuzzer${compilerrt_suffix}.a"     "libldc_rt.fuzzer.a"   FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.xray-basic${compilerrt_suffix}.a"      "libldc_rt.xray-basic.a"     FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.xray-fdr${compilerrt_suffix}.a"        "libldc_rt.xray-fdr.a"       FALSE)
-        copy_compilerrt_lib("${LDC_INSTALL_LLVM_RUNTIME_LIBS_OS}/libclang_rt.xray-profiling${compilerrt_suffix}.a"  "libldc_rt.xray-profiling.a" FALSE)
+        copy_compilerrt_lib("libclang_rt.asan${compilerrt_suffix}.a"           "libldc_rt.asan.a"     FALSE)
+        copy_compilerrt_lib("libclang_rt.lsan${compilerrt_suffix}.a"           "libldc_rt.lsan.a"     FALSE)
+        copy_compilerrt_lib("libclang_rt.msan${compilerrt_suffix}.a"           "libldc_rt.msan.a"     FALSE)
+        copy_compilerrt_lib("libclang_rt.tsan${compilerrt_suffix}.a"           "libldc_rt.tsan.a"     FALSE)
+        copy_compilerrt_lib("libclang_rt.builtins${compilerrt_suffix}.a"       "libldc_rt.builtins.a" FALSE)
+        copy_compilerrt_lib("libclang_rt.profile${compilerrt_suffix}.a"        "libldc_rt.profile.a"  FALSE)
+        copy_compilerrt_lib("libclang_rt.xray${compilerrt_suffix}.a"           "libldc_rt.xray.a"     FALSE)
+        copy_compilerrt_lib("libclang_rt.fuzzer${compilerrt_suffix}.a"         "libldc_rt.fuzzer.a"   FALSE)
+        copy_compilerrt_lib("libclang_rt.xray-basic${compilerrt_suffix}.a"     "libldc_rt.xray-basic.a"     FALSE)
+        copy_compilerrt_lib("libclang_rt.xray-fdr${compilerrt_suffix}.a"       "libldc_rt.xray-fdr.a"       FALSE)
+        copy_compilerrt_lib("libclang_rt.xray-profiling${compilerrt_suffix}.a" "libldc_rt.xray-profiling.a" FALSE)
     elseif(WIN32)
         set(compilerrt_arch_suffix "x86_64")
         if(CMAKE_SIZEOF_VOID_P EQUAL 4)
             set(compilerrt_arch_suffix "i386")
         endif()
-        copy_compilerrt_lib("windows/clang_rt.asan-${compilerrt_arch_suffix}.lib"       "ldc_rt.asan.lib"     FALSE)
-        copy_compilerrt_lib("windows/clang_rt.lsan-${compilerrt_arch_suffix}.lib"       "ldc_rt.lsan.lib"     FALSE)
-        copy_compilerrt_lib("windows/clang_rt.builtins-${compilerrt_arch_suffix}.lib"   "ldc_rt.builtins.lib" FALSE)
-        copy_compilerrt_lib("windows/clang_rt.profile-${compilerrt_arch_suffix}.lib"    "ldc_rt.profile.lib"  FALSE)
-        copy_compilerrt_lib("windows/clang_rt.fuzzer-${compilerrt_arch_suffix}.lib"     "ldc_rt.fuzzer.lib"   FALSE)
+        copy_compilerrt_lib("clang_rt.asan-${compilerrt_arch_suffix}.lib"     "ldc_rt.asan.lib"     FALSE)
+        copy_compilerrt_lib("clang_rt.lsan-${compilerrt_arch_suffix}.lib"     "ldc_rt.lsan.lib"     FALSE)
+        copy_compilerrt_lib("clang_rt.builtins-${compilerrt_arch_suffix}.lib" "ldc_rt.builtins.lib" FALSE)
+        copy_compilerrt_lib("clang_rt.profile-${compilerrt_arch_suffix}.lib"  "ldc_rt.profile.lib"  FALSE)
+        copy_compilerrt_lib("clang_rt.fuzzer-${compilerrt_arch_suffix}.lib"   "ldc_rt.fuzzer.lib"   FALSE)
     endif()
 endif()
 
+if(WANT_COMPILER_RT_LIBDIR_CONFIG)
+    message(STATUS "Adding ${COMPILER_RT_LIBDIR} to libdir in configuration files")
+    set(OPTIONAL_COMPILER_RT_DIR "\n        \"${COMPILER_RT_LIBDIR}\",")
+endif()
+
 #
 # Auxiliary build and test utils.
 #
diff --git a/ldc2.conf.in b/ldc2.conf.in
index 1ec4ce854c4..0ef4caa07a2 100644
--- a/ldc2.conf.in
+++ b/ldc2.conf.in
@@ -28,7 +28,7 @@ default:
     ];
     // default directories to be searched for libraries when linking
     lib-dirs = [
-        "@CMAKE_BINARY_DIR@/lib@LIB_SUFFIX@",
+        "@CMAKE_BINARY_DIR@/lib@LIB_SUFFIX@",@OPTIONAL_COMPILER_RT_DIR@
     ];
     // default rpath when linking against the shared default libs
     rpath = "@SHARED_LIBS_RPATH@";
diff --git a/ldc2_install.conf.in b/ldc2_install.conf.in
index 7536f8f0d4f..f8afa42613c 100644
--- a/ldc2_install.conf.in
+++ b/ldc2_install.conf.in
@@ -26,7 +26,7 @@ default:
     ];
     // default directories to be searched for libraries when linking
     lib-dirs = [
-        "@CMAKE_INSTALL_LIBDIR@",
+        "@CMAKE_INSTALL_LIBDIR@",@OPTIONAL_COMPILER_RT_DIR@
     ];
     // default rpath when linking against the shared default libs
     rpath = "@SHARED_LIBS_INSTALL_RPATH@";
diff --git a/ldc2_phobos.conf.in b/ldc2_phobos.conf.in
index 9bc5b1aa484..f2c00634f16 100644
--- a/ldc2_phobos.conf.in
+++ b/ldc2_phobos.conf.in
@@ -29,7 +29,7 @@ default:
     ];
     // default directories to be searched for libraries when linking
     lib-dirs = [
-        "@CMAKE_BINARY_DIR@/lib@LIB_SUFFIX@",
+        "@CMAKE_BINARY_DIR@/lib@LIB_SUFFIX@",@OPTIONAL_COMPILER_RT_DIR@
     ];
     // default rpath when linking against the shared default libs
     rpath = "@SHARED_LIBS_RPATH@";

From 25d3243a35761bd520a31732913923c366fdfa1a Mon Sep 17 00:00:00 2001
From: Andrei Horodniceanu <a.horodniceanu@proton.me>
Date: Sat, 18 May 2024 00:58:03 +0300
Subject: [PATCH 4/6] tests/CMakeLists.txt: Add option for controlling
 compiler-rt tests

https://github.com/ldc-developers/ldc/pull/4636 and
https://github.com/ldc-developers/ldc/pull/4638 added some checks when
deciding if tests that require certain compiler-rt libraries will be
run. They uses globbing to determine if the library files exist. This
is insufficient as the compiler-rt libs can be in directories other
than the ldc2 libdir. Globbing also has the downside of tests being
silently skipped when the failure to find the libraries should have
been vocal.

To solve this the TEST_COMPILER_RT_LIBRARIES option has been added to
control which compiler-rt dependent tests will be run.

Signed-off-by: Andrei Horodniceanu <a.horodniceanu@proton.me>
---
 tests/CMakeLists.txt           |  7 +++++++
 tests/PGO/lit.local.cfg        |  6 ++----
 tests/instrument/lit.local.cfg |  6 ++----
 tests/lit.site.cfg.in          |  1 +
 tests/sanitizers/lit.local.cfg | 15 +++++++--------
 5 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index f428d08b5de..39be385f5d6 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -11,6 +11,13 @@ if(WIN32)
     set(PYTHON_EXE python)
 endif()
 
+set(TEST_COMPILER_RT_LIBRARIES "all" CACHE STRING "List of compiler-rt libraries to test, separated by ';'. Can be set to 'all' and 'none'")
+if(TEST_COMPILER_RT_LIBRARIES STREQUAL "all")
+    set(TEST_COMPILER_RT_LIBRARIES "profile;xray;lsan;tsan;asan;msan;fuzzer")
+elseif(TEST_COMPILER_RT_LIBRARIES STREQUAL "none")
+    set(TEST_COMPILER_RT_LIBRARIES "")
+endif()
+
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
     set( DEFAULT_TARGET_BITS 64 )
 else()
diff --git a/tests/PGO/lit.local.cfg b/tests/PGO/lit.local.cfg
index d63318065a8..466a9bad6da 100644
--- a/tests/PGO/lit.local.cfg
+++ b/tests/PGO/lit.local.cfg
@@ -1,5 +1,3 @@
-from glob import glob
-
-# Add "PGO_RT" feature, if the `profile` compiler-rt library is available
-if glob(os.path.join(config.ldc2_lib_dir, "*profile*")):
+# Add "PGO_RT" feature
+if 'profile' in config.enabled_rt_libs:
     config.available_features.add('PGO_RT')
diff --git a/tests/instrument/lit.local.cfg b/tests/instrument/lit.local.cfg
index e97afbfa4bc..71968d9cd78 100644
--- a/tests/instrument/lit.local.cfg
+++ b/tests/instrument/lit.local.cfg
@@ -1,7 +1,5 @@
 import platform
-from glob import glob
-
-# Add "XRay_RT" feature on non-Windows, if the compiler-rt libraries are available
+# Add "XRay_RT" feature on non-Windows
 if (platform.system() != 'Windows'):
-    if glob(os.path.join(config.ldc2_lib_dir, "*xray*")):
+    if 'xray' in config.enabled_rt_libs:
         config.available_features.add('XRay_RT')
diff --git a/tests/lit.site.cfg.in b/tests/lit.site.cfg.in
index 1e966a78805..4aa1a8294cc 100644
--- a/tests/lit.site.cfg.in
+++ b/tests/lit.site.cfg.in
@@ -37,6 +37,7 @@ config.ldc_host_arch       = "@LLVM_NATIVE_ARCH@"
 config.ldc_with_lld        = @LDC_WITH_LLD@
 config.spirv_enabled       = @LLVM_SPIRV_FOUND@
 config.rt_supports_sanitizers = @RT_SUPPORT_SANITIZERS@
+config.enabled_rt_libs        = set("@TEST_COMPILER_RT_LIBRARIES@".split(';'))
 config.shared_rt_libs_only = "@BUILD_SHARED_LIBS@" == "ON"
 
 config.name = 'LDC'
diff --git a/tests/sanitizers/lit.local.cfg b/tests/sanitizers/lit.local.cfg
index 82e35e28dd0..bdac8304b84 100644
--- a/tests/sanitizers/lit.local.cfg
+++ b/tests/sanitizers/lit.local.cfg
@@ -1,32 +1,31 @@
 import os
 import platform
-from glob import glob
 
 sys = platform.system()
 
-# Add "LSan" feature, if the compiler-rt library is available
-if glob(os.path.join(config.ldc2_lib_dir, "*lsan*")):
+# Add "LSan" feature
+if 'lsan' in config.enabled_rt_libs:
     config.available_features.add('LSan')
 
 # FreeBSD TSan doesn't seem to work,
 # Linux TSan currently only works with static druntime,
 # and there's no Windows TSan (yet?).
 if (sys != 'FreeBSD') and (sys != 'Windows') and not (sys == 'Linux' and config.shared_rt_libs_only):
-    if glob(os.path.join(config.ldc2_lib_dir, "*tsan*")):
+    if 'tsan' in config.enabled_rt_libs:
         config.available_features.add('TSan')
 
 # FreeBSD ASan and MSan don't cope well with ASLR (might do with FreeBSD 14 according to https://github.com/llvm/llvm-project/pull/73439)
 if sys != 'FreeBSD':
-    if glob(os.path.join(config.ldc2_lib_dir, "*asan*")):
+    if 'asan' in config.enabled_rt_libs:
         config.available_features.add('ASan')
 
 # MSan is supported on Linux, FreeBSD (modulo ASLR issue), and OpenBSD: https://clang.llvm.org/docs/MemorySanitizer.html#supported-platforms
 if (sys == 'Linux') or (sys == 'OpenBSD'):
-    if glob(os.path.join(config.ldc2_lib_dir, "*msan*")):
+    if 'msan' in config.enabled_rt_libs:
         config.available_features.add('MSan')
 
-# Add "Fuzzer" feature, assuming the compiler-rt library is available
-if glob(os.path.join(config.ldc2_lib_dir, "*fuzzer*")):
+# Add "Fuzzer" feature
+if 'fuzzer' in config.enabled_rt_libs:
     config.available_features.add('Fuzzer')
 
 if 'ASan' in config.available_features:

From 46e41aebfec7d5657a9824e05acaa97f87bafa58 Mon Sep 17 00:00:00 2001
From: Andrei Horodniceanu <a.horodniceanu@proton.me>
Date: Sat, 18 May 2024 04:25:28 +0300
Subject: [PATCH 5/6] utils/CMakeLists.txt: Build split-file if llvm is too old

Signed-off-by: Andrei Horodniceanu <a.horodniceanu@proton.me>
---
 utils/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 379edf2c1b4..abb6312f5b7 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -68,7 +68,7 @@ set_target_properties(
 target_link_libraries(not  ${LLVM_LIBRARIES} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS})
 endif()
 
-if ((TARGET split-file) OR (EXISTS ${LLVM_ROOT_DIR}/bin/split-file))
+if ((TARGET split-file) OR (EXISTS ${LLVM_ROOT_DIR}/bin/split-file AND ${LLVM_VERSION_MAJOR} GREATER_EQUAL 14))
   # already provided by LLVM
   message(STATUS "Skip building split-file, it is already provided by LLVM")
 else()

From cff48ff2b462f2fe4004e6f2dea29744f8b5fa26 Mon Sep 17 00:00:00 2001
From: Andrei Horodniceanu <a.horodniceanu@proton.me>
Date: Sat, 18 May 2024 04:27:33 +0300
Subject: [PATCH 6/6] ci: rename LDC_INSTALL_LLVM_RUNTIME_LIBS_OS to
 COMPILER_RT_LIBDIR_OS

Signed-off-by: Andrei Horodniceanu <a.horodniceanu@proton.me>
---
 .cirrus.yml                | 2 +-
 .github/workflows/main.yml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.cirrus.yml b/.cirrus.yml
index c2263856d93..4b4d0689c51 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -248,7 +248,7 @@ task:
       -DEXTRA_CXXFLAGS=-flto=full
       -DCMAKE_EXE_LINKER_FLAGS=-static-libstdc++
       -DJITRT_EXTRA_LDFLAGS=-static-libstdc++
-      -DLDC_INSTALL_LLVM_RUNTIME_LIBS_OS=aarch64-unknown-linux-gnu
+      -DCOMPILER_RT_LIBDIR_OS=aarch64-unknown-linux-gnu
       -DLLVM_ROOT_DIR=$CIRRUS_WORKING_DIR/../llvm
       -DD_COMPILER=$CIRRUS_WORKING_DIR/../bootstrap-ldc/bin/ldmd2
     PARALLELISM: 4
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index bb2474f1fa3..166f00739f1 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -188,7 +188,7 @@ jobs:
             arch: aarch64
             android_x86_arch: x86_64
             extra_cmake_flags: >-
-              -DLDC_INSTALL_LLVM_RUNTIME_LIBS_OS=linux
+              -DCOMPILER_RT_LIBDIR_OS=linux
               -DLDC_INSTALL_LLVM_RUNTIME_LIBS_ARCH=aarch64-android
 
     name: ${{ matrix.job_name }}