@@ -25,6 +25,7 @@ option(SNMALLOC_NO_REALLOCARRAY "Build without reallocarray exported" ON)
25
25
option (SNMALLOC_NO_REALLOCARR "Build without reallocarr exported" ON )
26
26
option (SNMALLOC_LINK_ICF "Link with Identical Code Folding" ON )
27
27
option (SNMALLOC_IPO "Link with IPO/LTO support" OFF )
28
+ option (SNMALLOC_BENCHMARK_INDIVIDUAL_MITIGATIONS "Build tests and ld_preload for individual mitigations" OFF )
28
29
# Options that apply only if we're not building the header-only library
29
30
cmake_dependent_option(SNMALLOC_RUST_SUPPORT "Build static library for rust" OFF "NOT SNMALLOC_HEADER_ONLY_LIBRARY" OFF )
30
31
cmake_dependent_option(SNMALLOC_STATIC_LIBRARY "Build static libraries" ON "NOT SNMALLOC_HEADER_ONLY_LIBRARY" OFF )
@@ -271,7 +272,6 @@ function(add_warning_flags name)
271
272
$<$<PLATFORM_ID:Windows>:$<${ci_or_debug} :/DEBUG>>)
272
273
endfunction ()
273
274
274
-
275
275
# To build with just the header library target define SNMALLOC_HEADER_ONLY_LIBRARY
276
276
if (NOT SNMALLOC_HEADER_ONLY_LIBRARY)
277
277
@@ -286,6 +286,78 @@ if(NOT SNMALLOC_HEADER_ONLY_LIBRARY)
286
286
set (${result} ${dirlist} PARENT_SCOPE)
287
287
endfunction ()
288
288
289
+ set (TESTDIR ${CMAKE_CURRENT_SOURCE_DIR} /src/test )
290
+
291
+ if (BUILD_TESTING)
292
+ enable_testing ()
293
+ subdirlist(TEST_CATEGORIES ${TESTDIR} )
294
+ else ()
295
+ set (TEST_CATEGORIES "" )
296
+ endif ()
297
+ list (REVERSE TEST_CATEGORIES)
298
+
299
+ if (${SNMALLOC_CLEANUP} STREQUAL THREAD_CLEANUP)
300
+ set (TEST_CLEANUP PTHREAD_DESTRUCTORS)
301
+ else ()
302
+ set (TEST_CLEANUP ${SNMALLOC_CLEANUP} )
303
+ endif ()
304
+
305
+ function (make_tests TAG DEFINES)
306
+ foreach (TEST_CATEGORY ${TEST_CATEGORIES} )
307
+ message (STATUS "Adding ${TAG} /${TEST_CATEGORY} tests" )
308
+ subdirlist(TESTS ${TESTDIR} /${TEST_CATEGORY} )
309
+ foreach (TEST ${TESTS} )
310
+ unset (SRC)
311
+ aux_source_directory (${TESTDIR} /${TEST_CATEGORY} /${TEST} SRC)
312
+ set (TESTNAME "${TEST_CATEGORY} -${TEST} -${TAG} " )
313
+
314
+ add_executable (${TESTNAME} ${SRC} )
315
+
316
+ if (SNMALLOC_SANITIZER)
317
+ target_compile_options (${TESTNAME} PRIVATE -g -fsanitize=${SNMALLOC_SANITIZER} -fno-omit-frame-pointer)
318
+ target_link_libraries (${TESTNAME} -fsanitize=${SNMALLOC_SANITIZER} )
319
+ endif ()
320
+
321
+ add_warning_flags(${TESTNAME} )
322
+
323
+ target_link_libraries (${TESTNAME} snmalloc)
324
+ target_compile_definitions (${TESTNAME} PRIVATE "SNMALLOC_USE_${TEST_CLEANUP} " )
325
+
326
+ if (NOT DEFINES STREQUAL " " )
327
+ target_compile_definitions (${TESTNAME} PRIVATE ${DEFINES} )
328
+ endif ()
329
+
330
+ if (${TEST} MATCHES "release-.*" )
331
+ message (VERBOSE "Adding test: ${TESTNAME} only for release configs" )
332
+ add_test (NAME ${TESTNAME} COMMAND ${TESTNAME} CONFIGURATIONS "Release" )
333
+ else ()
334
+ message (VERBOSE "Adding test: ${TESTNAME} " )
335
+ add_test (${TESTNAME} ${TESTNAME} )
336
+ endif ()
337
+ if (${TEST_CATEGORY} MATCHES "perf" )
338
+ message (VERBOSE "Single threaded test: ${TESTNAME} " )
339
+ set_tests_properties (${TESTNAME} PROPERTIES PROCESSORS 4)
340
+ endif ()
341
+ if (WIN32 )
342
+ # On Windows these tests use a lot of memory as it doesn't support
343
+ # lazy commit.
344
+ if (${TEST} MATCHES "two_alloc_types" )
345
+ message (VERBOSE "Single threaded test: ${TESTNAME} " )
346
+ set_tests_properties (${TESTNAME} PROPERTIES PROCESSORS 4)
347
+ endif ()
348
+ if (${TEST} MATCHES "fixed_region" )
349
+ message (VERBOSE "Single threaded test: ${TESTNAME} " )
350
+ set_tests_properties (${TESTNAME} PROPERTIES PROCESSORS 4)
351
+ endif ()
352
+ if (${TEST} MATCHES "memory" )
353
+ message (VERBOSE "Single threaded test: ${TESTNAME} " )
354
+ set_tests_properties (${TESTNAME} PROPERTIES PROCESSORS 4)
355
+ endif ()
356
+ endif ()
357
+ endforeach ()
358
+ endforeach ()
359
+ endfunction ()
360
+
289
361
if (NOT (DEFINED SNMALLOC_LINKER_FLAVOUR) OR ("${SNMALLOC_LINKER_FLAVOUR} " MATCHES "^$" ))
290
362
# Linker not specified externally; probe to see if we can make lld work
291
363
set (CMAKE_REQUIRED_LINK_OPTIONS -fuse-ld=lld -Wl,--icf=all )
@@ -376,89 +448,75 @@ if(NOT SNMALLOC_HEADER_ONLY_LIBRARY)
376
448
target_compile_definitions (snmallocshim-checks-rust PRIVATE SNMALLOC_CHECK_CLIENT)
377
449
endif ()
378
450
379
- set (TESTDIR ${CMAKE_CURRENT_SOURCE_DIR} /src/test )
380
-
381
- if (BUILD_TESTING)
382
- enable_testing ()
383
- subdirlist(TEST_CATEGORIES ${TESTDIR} )
384
- else ()
385
- set (TEST_CATEGORIES "" )
386
- endif ()
451
+ if (BUILD_TESTING)
452
+ if (WIN32
453
+ OR (CMAKE_SYSTEM_NAME STREQUAL NetBSD)
454
+ OR (CMAKE_SYSTEM_NAME STREQUAL OpenBSD)
455
+ OR (CMAKE_SYSTEM_NAME STREQUAL DragonFly)
456
+ OR (CMAKE_SYSTEM_NAME STREQUAL SunOS))
457
+ # Windows does not support aligned allocation well enough
458
+ # for pass through.
459
+ # NetBSD, OpenBSD and DragonFlyBSD do not support malloc*size calls.
460
+ set (FLAVOURS fast;check)
461
+ else ()
462
+ set (FLAVOURS fast;check;malloc)
463
+ endif ()
387
464
388
- list (REVERSE TEST_CATEGORIES)
389
- if (${SNMALLOC_CLEANUP} STREQUAL THREAD_CLEANUP)
390
- set (TEST_CLEANUP PTHREAD_DESTRUCTORS)
391
- else ()
392
- set (TEST_CLEANUP ${SNMALLOC_CLEANUP} )
393
- endif ()
394
- foreach (TEST_CATEGORY ${TEST_CATEGORIES} )
395
- message (STATUS "Adding ${TEST_CATEGORY} tests" )
396
- subdirlist(TESTS ${TESTDIR} /${TEST_CATEGORY} )
397
- foreach (TEST ${TESTS} )
398
- if (WIN32
399
- OR (CMAKE_SYSTEM_NAME STREQUAL NetBSD)
400
- OR (CMAKE_SYSTEM_NAME STREQUAL OpenBSD)
401
- OR (CMAKE_SYSTEM_NAME STREQUAL DragonFly)
402
- OR (CMAKE_SYSTEM_NAME STREQUAL SunOS))
403
- # Windows does not support aligned allocation well enough
404
- # for pass through.
405
- # NetBSD, OpenBSD and DragonFlyBSD do not support malloc*size calls.
406
- set (FLAVOURS fast;check)
407
- else ()
408
- set (FLAVOURS fast;check;malloc)
465
+ foreach (FLAVOUR ${FLAVOURS} )
466
+ if (${FLAVOUR} STREQUAL "malloc" )
467
+ set (DEFINES SNMALLOC_PASS_THROUGH)
468
+ endif ()
469
+ if (${FLAVOUR} STREQUAL "check" )
470
+ set (DEFINES SNMALLOC_CHECK_CLIENT)
471
+ endif ()
472
+ if (${FLAVOUR} STREQUAL "fast" )
473
+ set (DEFINES " " )
409
474
endif ()
410
- foreach (FLAVOUR ${FLAVOURS} )
411
- unset (SRC)
412
- aux_source_directory (${TESTDIR} /${TEST_CATEGORY} /${TEST} SRC)
413
- set (TESTNAME "${TEST_CATEGORY} -${TEST} -${FLAVOUR} " )
414
-
415
- add_executable (${TESTNAME} ${SRC} )
416
475
417
- if (SNMALLOC_SANITIZER)
418
- target_compile_options (${TESTNAME} PRIVATE -g -fsanitize=${SNMALLOC_SANITIZER} -fno-omit-frame-pointer)
419
- target_link_libraries (${TESTNAME} -fsanitize=${SNMALLOC_SANITIZER} )
420
- endif ()
476
+ make_tests(${FLAVOUR} ${DEFINES} )
477
+ endforeach ()
478
+ endif ()
421
479
422
- add_warning_flags(${TESTNAME} )
480
+ if (SNMALLOC_BENCHMARK_INDIVIDUAL_MITIGATIONS)
481
+ set (MITIGATIONS
482
+ metadata_protection;
483
+ pal_enforce_access;
484
+ random_pagemap;
485
+ sanity_checks;
486
+ freelist_forward_edge;
487
+ freelist_backward_edge;
488
+ freelist_teardown_validate;
489
+ reuse_LIFO;
490
+ random_larger_thresholds;
491
+ random_initial;
492
+ random_preserve;
493
+ random_extra_slab)
494
+
495
+
496
+ foreach (MITIGATION ${MITIGATIONS} )
497
+ set (DEFINES "SNMALLOC_CHECK_CLIENT_MITIGATIONS=${MITIGATION} " )
498
+ add_shim(snmallocshim-${MITIGATION} SHARED ${SHIM_FILES} )
499
+ target_compile_definitions (snmallocshim-${MITIGATION} PRIVATE ${DEFINES} )
500
+ if (BUILD_TESTING)
501
+ make_tests(${MITIGATION} ${DEFINES} )
502
+ endif ()
503
+ endforeach ()
423
504
424
- if (${FLAVOUR} STREQUAL "malloc" )
425
- target_compile_definitions (${TESTNAME} PRIVATE SNMALLOC_PASS_THROUGH)
426
- endif ()
427
- if (${FLAVOUR} STREQUAL "check" )
428
- target_compile_definitions (${TESTNAME} PRIVATE SNMALLOC_CHECK_CLIENT)
429
- endif ()
430
- target_link_libraries (${TESTNAME} snmalloc)
431
- target_compile_definitions (${TESTNAME} PRIVATE "SNMALLOC_USE_${TEST_CLEANUP} " )
432
- if (${TEST} MATCHES "release-.*" )
433
- message (VERBOSE "Adding test: ${TESTNAME} only for release configs" )
434
- add_test (NAME ${TESTNAME} COMMAND ${TESTNAME} CONFIGURATIONS "Release" )
435
- else ()
436
- message (VERBOSE "Adding test: ${TESTNAME} " )
437
- add_test (${TESTNAME} ${TESTNAME} )
438
- endif ()
439
- if (${TEST_CATEGORY} MATCHES "perf" )
440
- message (VERBOSE "Single threaded test: ${TESTNAME} " )
441
- set_tests_properties (${TESTNAME} PROPERTIES PROCESSORS 4)
442
- endif ()
443
- if (WIN32 )
444
- # On Windows these tests use a lot of memory as it doesn't support
445
- # lazy commit.
446
- if (${TEST} MATCHES "two_alloc_types" )
447
- message (VERBOSE "Single threaded test: ${TESTNAME} " )
448
- set_tests_properties (${TESTNAME} PROPERTIES PROCESSORS 4)
449
- endif ()
450
- if (${TEST} MATCHES "fixed_region" )
451
- message (VERBOSE "Single threaded test: ${TESTNAME} " )
452
- set_tests_properties (${TESTNAME} PROPERTIES PROCESSORS 4)
453
- endif ()
454
- if (${TEST} MATCHES "memory" )
455
- message (VERBOSE "Single threaded test: ${TESTNAME} " )
456
- set_tests_properties (${TESTNAME} PROPERTIES PROCESSORS 4)
457
- endif ()
458
- endif ()
459
- endforeach ()
505
+ set (MITIGATIONSET "no_checks" )
506
+ set (COUNT 0)
507
+ foreach (MITIGATION ${MITIGATIONS} )
508
+ MATH (EXPR COUNT "${COUNT} + 1" )
509
+ set (MITIGATIONNAME "mitigations-${COUNT} " )
510
+ set (MITIGATIONSET "${MITIGATIONSET} +${MITIGATION} " )
511
+ message (STATUS "MITIGATIONSET: ${COUNT} -> ${MITIGATIONSET} " )
512
+ set (DEFINES "-DSNMALLOC_CHECK_CLIENT_MITIGATIONS=${MITIGATIONSET} " )
513
+ add_shim(snmallocshim-${MITIGATIONNAME} SHARED ${SHIM_FILES} )
514
+ target_compile_definitions (snmallocshim-${MITIGATIONNAME} PRIVATE ${DEFINES} )
515
+ if (BUILD_TESTING)
516
+ make_tests(${MITIGATIONNAME} ${DEFINES} )
517
+ endif ()
460
518
endforeach ()
461
- endforeach ()
519
+ endif ()
462
520
463
521
clangformat_targets()
464
522
endif ()
0 commit comments