@@ -25,6 +25,7 @@ option(SNMALLOC_NO_REALLOCARRAY "Build without reallocarray exported" ON)
2525option (SNMALLOC_NO_REALLOCARR "Build without reallocarr exported" ON )
2626option (SNMALLOC_LINK_ICF "Link with Identical Code Folding" ON )
2727option (SNMALLOC_IPO "Link with IPO/LTO support" OFF )
28+ option (SNMALLOC_BENCHMARK_INDIVIDUAL_MITIGATIONS "Build tests and ld_preload for individual mitigations" OFF )
2829# Options that apply only if we're not building the header-only library
2930cmake_dependent_option(SNMALLOC_RUST_SUPPORT "Build static library for rust" OFF "NOT SNMALLOC_HEADER_ONLY_LIBRARY" OFF )
3031cmake_dependent_option(SNMALLOC_STATIC_LIBRARY "Build static libraries" ON "NOT SNMALLOC_HEADER_ONLY_LIBRARY" OFF )
@@ -271,7 +272,6 @@ function(add_warning_flags name)
271272 $<$<PLATFORM_ID:Windows>:$<${ci_or_debug} :/DEBUG>>)
272273endfunction ()
273274
274-
275275# To build with just the header library target define SNMALLOC_HEADER_ONLY_LIBRARY
276276if (NOT SNMALLOC_HEADER_ONLY_LIBRARY)
277277
@@ -286,6 +286,78 @@ if(NOT SNMALLOC_HEADER_ONLY_LIBRARY)
286286 set (${result} ${dirlist} PARENT_SCOPE)
287287 endfunction ()
288288
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+
289361 if (NOT (DEFINED SNMALLOC_LINKER_FLAVOUR) OR ("${SNMALLOC_LINKER_FLAVOUR} " MATCHES "^$" ))
290362 # Linker not specified externally; probe to see if we can make lld work
291363 set (CMAKE_REQUIRED_LINK_OPTIONS -fuse-ld=lld -Wl,--icf=all )
@@ -376,89 +448,75 @@ if(NOT SNMALLOC_HEADER_ONLY_LIBRARY)
376448 target_compile_definitions (snmallocshim-checks-rust PRIVATE SNMALLOC_CHECK_CLIENT)
377449 endif ()
378450
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 ()
387464
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 " " )
409474 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} )
416475
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 ()
421479
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 ()
423504
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 ()
460518 endforeach ()
461- endforeach ()
519+ endif ()
462520
463521 clangformat_targets()
464522endif ()
0 commit comments