| # ********************************************************** |
| # Copyright (c) 2010-2024 Google, Inc. All rights reserved. |
| # Copyright (c) 2009-2010 VMware, Inc. All rights reserved. |
| # Copyright (c) 2016-2023 ARM Limited. All rights reserved. |
| # ********************************************************** |
| |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are met: |
| # |
| # * Redistributions of source code must retain the above copyright notice, |
| # this list of conditions and the following disclaimer. |
| # |
| # * Redistributions in binary form must reproduce the above copyright notice, |
| # this list of conditions and the following disclaimer in the documentation |
| # and/or other materials provided with the distribution. |
| # |
| # * Neither the name of VMware, Inc. nor the names of its contributors may be |
| # used to endorse or promote products derived from this software without |
| # specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| # ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE |
| # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
| # DAMAGE. |
| |
| # Plan: |
| # * LONG vs SHORT is configure-time |
| # * We build all tests at general build time: in future can try |
| # ctest --build-and-test |
| # * "make test" runs the suite of tests for each of a set of runtime options |
| # for the current build. If not running a test suite of multiple builds |
| # it runs a full set of tests; otherwise it eliminates some overlapping |
| # tests on release or external builds that were run on debug internal. |
| # * The set of runs is in a list form with qualifiers very similar to the |
| # list in suite/runregression, making it easy to change what tests are run |
| # and for which builds by each option set. |
| # * Can set additional options at configure time via TEST_OPTIONS: |
| # these are added to every options run. |
| # * We'll use ctest -S to build each target build config and run tests for each, |
| # and optionally submit to dashboard. Use w/o submit as "make runregression". |
| |
| # We use target_include_directories() which was added in 2.8.11 |
| cmake_minimum_required(VERSION 3.7) |
| |
| include(../../make/policies.cmake NO_POLICY_SCOPE) |
| include(../runsuite_common_pre.cmake) # For _DR_set_VS_bitwidth_env_vars. |
| |
| option(RUN_LONG_SUITE "run long set of tests") |
| # We have some tests that need sudo, which is problematic if it requires |
| # an interactive password. Thus, we disable unless explicitly turned on. |
| option(RUN_SUDO_TESTS "run tests that require sudo") |
| option(SKIP_FLAKY_TESTS "do not run tests named *_FLAKY") |
| # if TEST_SUITE is off, we disable some flaky tests in order to have all |
| # tests succeed (i#389). TEST_SUITE is now a top-level option. |
| set(TEST_SECONDS "90" CACHE STRING "Test time limit in seconds") |
| set(TEST_OPTIONS "" CACHE STRING "Extra DynamoRIO options when running tests") |
| set(TEST_32BIT_PATH "" CACHE STRING "32-bit test bin dir for cross-arch tests") |
| |
| # FIXME: i#120: .runall support |
| # FIXME: i#65: add command to run natively |
| # FIXME: i#111: get .runall tests to run in parallel |
| # and use latest cmake for "ctest -j" (and "ctest -W 60") |
| |
| ########################################################################### |
| # RUNTIME OPTIONS TO TEST |
| |
| # We embed the set of runs for each test in here as separate tests. |
| # I considered having this CMakeLists.txt only do one runtime option |
| # setting, and externally invoke repeatedly, perhaps via an add_test() |
| # that starts w/ "xx" and runs "ctest -E ^xx" (and could use further |
| # regexps to select subsets of tests for certain options), but in |
| # cmake script to set DYNAMORIO_OPTIONS env var: but the sub-ctest's |
| # results aren't reported at the top level. Better to have all |
| # the tests be peers. |
| |
| if (UNIX) |
| set(osname "linux") |
| else (UNIX) |
| set(osname "win32") |
| endif (UNIX) |
| |
| # Syntax: |
| # [SHORT::][DEBUG::][WIN::|LIN::][ONLY::<regex>::]<DR runtime options>" |
| # SHORT = perform run for NOT TEST_LONG |
| # DEBUG = debug-build-only |
| # WIN = Windows-only |
| # LIN = Linux-only |
| # ONLY = only run tests that match regex |
| |
| # N.B.: if short-suite tests are added to other than the debug-internal-{32,64} |
| # builds, update runsuite.cmake to build the tests for those builds! |
| |
| # FIXME i#1807: below, we convert all long suite test subsets to ^common |
| |
| set(main_run_list |
| # our main configuration |
| "SHORT::-code_api" |
| # no_intercept_all_signals tests. |
| # TODO i#5261: Remove this suite when -intercept_all_signals is deprecated. |
| "SHORT::LIN::ONLY::sigaction$::-no_code_api -no_intercept_all_signals" |
| # sanity check: run single app to make sure these options aren't totally broken |
| # i#1575: ARM doesn't yet support -coarse_units |
| "SHORT::X86::ONLY::client.events$::-code_api -opt_memory" |
| # i#1551: ARM doesn't yet support indcall2direct |
| "SHORT::X86::ONLY::client.events$::-code_api -opt_speed" |
| # i#1884: ARM doesn't yet support thread_private |
| "SHORT::X86::ONLY::client.events$::-code_api -thread_private" |
| "SHORT::ONLY::client.events$::-code_api -disable_traces" |
| "SHORT::X86::ONLY::client.events$::-code_api -thread_private -disable_traces" |
| "SHORT::X86::LIN::ONLY::client.events$::-code_api -no_early_inject" # only early on ARM |
| # XXX i#3556: NYI on Windows and Mac (and not supported on 32-bit). |
| "SHORT::X64::LIN::ONLY::drcache.*\\.simple$|selfmod2|racesys|reachability|linux.*fork|file_io|loglevel$::-code_api -satisfy_w_xor_x" |
| # maybe this should be SHORT as -coarse_units will eventually be the default? |
| "X86::-code_api -opt_memory" # i#1575: ARM -coarse_units NYI |
| "X86::-code_api -opt_speed" # i#1551: ARM indcall2direct NYI |
| "X86::-code_api -thread_private" # i#1884: ARM thread_private NYI |
| "-code_api -disable_traces" |
| "X86::-code_api -thread_private -disable_traces" # i#1884: ARM thread_private NYI |
| # i#1807: -prof_pcs fails on Windows currently. |
| "LIN::-prof_pcs" |
| "X86::LIN::-prof_pcs -thread_private" # i#1884: ARM thread_private NYI |
| "X86::LIN::ONLY::^common::-code_api -no_early_inject" # ARM only supports early |
| "DEBUG::ONLY::^common::-code_api -loglevel 1" |
| "ONLY::^common::-code_api -stack_size 128k" |
| "WIN::ONLY::^(runall|client)::-enable_full_api" |
| "DEBUG::WIN::ONLY::^(common|client)::-code_api -stack_size 128K -loglevel 1 -no_hide" |
| "DEBUG::LIN::ONLY::^(common|client)::-code_api -stack_size 128K -loglevel 1" |
| "ONLY::^common::" |
| "X86::LIN::ONLY::^${osname}::-code_api -sysenter_is_int80" |
| "X86::LIN::ONLY::^${osname}.sig::-max_pending_signals 1" |
| |
| # cover -tracedump_* options, just a couple combinations |
| # XXX: how up time limit? Used to have TEST_MINS=5 for tracedump runs. |
| "ONLY::^common::-code_api -tracedump_text -tracedump_origins" |
| "ONLY::^common::-code_api -tracedump_text -tracedump_origins -syntax_intel" |
| "X86::ONLY::^common::-code_api -thread_private -tracedump_binary" # i#1884: ARM NYI |
| "ONLY::^common::-code_api -bbdump_tags" |
| |
| # make sure we at least sometimes exercise non-default -checklevel |
| "DEBUG::ONLY::^common::-checklevel 4" |
| |
| # pcache tests: per-user so each app will merge w/ previous, plus merge |
| # w/ at-unload persists from earlier -desktop run |
| # i#1807: This Windows suite fails currently. |
| # "WIN::ONLY::^runall::-desktop -coarse_freeze_at_exit" |
| # run again so each must use the merged pcaches |
| # FIXME: order is alpha: need unique name sorted next |
| # i#1807: This Windows suite fails currently. |
| # "WIN::ONLY::^runall::-desktop -coarse_freeze_at_exit" |
| |
| # limit on shared cache size |
| "ONLY::^(runall|${osname})::-finite_shared_bb_cache -cache_shared_bb_regen 80" |
| "ONLY::^(runall|${osname})::-finite_shared_trace_cache -cache_shared_trace_regen 80" |
| ) |
| |
| if (CALLPROF AND TEST_SUITE) |
| set(run_list "ONLY::^common::") |
| else () |
| if (TEST_SUITE) |
| # We don't redo all tests for internal vs external, but we do for debug vs release |
| if (DEBUG OR NOT INTERNAL) |
| set(run_list ${main_run_list}) |
| else () |
| set(run_list "ONLY::^client::-code_api") |
| endif () |
| else (TEST_SUITE) |
| set(run_list ${main_run_list}) |
| endif (TEST_SUITE) |
| endif (CALLPROF AND TEST_SUITE) |
| |
| # i#4059: Reduce Appveyor time by reducing the # of tests run for 32-bit. |
| # This assumes that 32-bit Windows is not as important these days. |
| # We remove some of the less differentiated tests. |
| # We still run the full set for merges to master. |
| if (WIN32 AND NOT X64 AND "$ENV{CI_TRIGGER}" STREQUAL "pull_request") |
| set(SKIP_LESS_DIFFERENTIATED_TESTS_FOR_PULL_REQUEST ON) |
| else () |
| set(SKIP_LESS_DIFFERENTIATED_TESTS_FOR_PULL_REQUEST OFF) |
| endif () |
| |
| # i#4800: Run long test suite on push-to-master events. |
| if (RUN_LONG_SUITE OR ("$ENV{CI_TRIGGER}" STREQUAL "push" AND |
| "$ENV{CI_BRANCH}" STREQUAL "refs/heads/master")) |
| set(TEST_LONG ON) |
| endif () |
| |
| ########################################################################### |
| # BUILDING |
| |
| if (WIN32) |
| find_program(BIND_EXECUTABLE bind.exe DOC "path to bind.exe") |
| if (BIND_EXECUTABLE) |
| message(STATUS "Found bind.exe: ${BIND_EXECUTABLE}") |
| else (BIND_EXECUTABLE) |
| # else we'll use editbin via link.exe |
| endif (BIND_EXECUTABLE) |
| mark_as_advanced(BIND_EXECUTABLE) |
| |
| # If we up our cmake minimum to 3.8.2 we can use enable_language(CSharp). |
| find_program(CSC csc.exe DOC "Path to CSharp compiler csc.exe") |
| if (NOT CSC) |
| message(STATUS "csc not found: .NET Windows tests will be disabled") |
| endif () |
| |
| # if cygwin or mingw gcc is available, we do some extra tests |
| find_program(GCC gcc.exe DOC "path to gcc.exe") |
| if (NOT GCC) |
| message(STATUS "gcc not found: some Windows tests will be disabled") |
| else (NOT GCC) |
| # check gcc target architecture |
| execute_process(COMMAND ${GCC} -dumpmachine |
| RESULT_VARIABLE cmd_result |
| ERROR_VARIABLE cmd_err |
| OUTPUT_VARIABLE cmd_out) |
| if (cmd_out MATCHES "x86_64") |
| set(GCC_IS64 ON) |
| endif () |
| # check cygwin gcc |
| if (cmd_out MATCHES "cygwin" OR |
| # cmake can't launch gcc.exe as it's a symlink to /etc/alternatives/gcc -- |
| # we assume this error always means that it's that symlink: |
| cmd_result MATCHES "Access is denied") |
| set(GCC_IS_CYGWIN ON) |
| endif() |
| endif (NOT GCC) |
| else (WIN32) |
| # i#215: if SELinux is enabled we'll use chcon to mark tests w/ text relocations |
| # to avoid violating SELinux policies. On Ubuntu, chcon is part of coreutils |
| # so it will be there even if SELinux isn't installed or enabled. If SELinux |
| # is not enabled, chcon will give 'Operation not supported'. |
| # To find out whether SELinux is enabled, we find and run the selinuxenabled |
| # command and look for a zero return code. |
| find_program(SEUNIXENABLED selinuxenabled DOC "path to selinuxenabled") |
| if (SEUNIXENABLED) |
| execute_process(COMMAND ${SEUNIXENABLED} |
| RESULT_VARIABLE cmd_result) |
| if (NOT cmd_result) |
| find_program(CHCON chcon DOC "path to chcon") |
| if (CHCON) |
| message(STATUS "Detected SELnux: will chcon binaries with text relocations.") |
| set(SEUNIXFOUND "yes") |
| else (CHCON) |
| message(WARNING "SELinux enabled, but chcon command not found.") |
| endif (CHCON) |
| mark_as_advanced(CHCON) |
| endif (NOT cmd_result) |
| endif (SEUNIXENABLED) |
| endif (WIN32) |
| |
| # put libs in same dir for tests that need to load them |
| set(MAIN_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") |
| set(MAIN_LIBRARY_OUTPUT_DIRECTORY "${DR_LIBRARY_OUTPUT_DIRECTORY}") |
| string(REGEX REPLACE "/lib([36])" "/ext/lib\\1" |
| EXT_LIBRARY_OUTPUT_DIRECTORY "${MAIN_LIBRARY_OUTPUT_DIRECTORY}") |
| set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") |
| set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") |
| set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") |
| set_per_config_ouput_to_match_single_config() |
| |
| include_directories(${CMAKE_CURRENT_SOURCE_DIR}) # tools.h |
| include_directories(${PROJECT_SOURCE_DIR}/core/arch) # asm_defines.asm |
| |
| if (ANDROID AND NOT ADB) |
| find_program(ADB adb) |
| if (NOT adb) |
| message(STATUS "Failed to find adb: tests expected to fail to run") |
| endif () |
| endif () |
| |
| # FIXME i#98: improve code so can set Wall/W4 |
| if (UNIX) |
| string(REGEX REPLACE "-Wall" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") |
| # some tests rely on specific "nop;nop" patterns that optimization ruins |
| # we should probably move the -O from top level into core/CMakeLists.txt |
| # |
| # -O3 is selectively re-added to some tests using the add_sve_flags() or |
| # optimize() functions |
| string(REGEX REPLACE "-O[0-9]? " " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") |
| else (UNIX) |
| # W2 is default (we're using W3). We should also replace |
| # all references to unsafe functions (e.g., fopen) and |
| # remove /wd4996 |
| string(REGEX REPLACE "/W4" "/W3" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") |
| # Versions without debug, for over ssh |
| string(REGEX REPLACE "/Zi" "" ORIG_C_FLAGS_NODBG "${CMAKE_C_FLAGS}") |
| if (RUNNING_OVER_SSH) |
| set(CMAKE_C_FLAGS "${ORIG_C_FLAGS_NODBG}") |
| string(REGEX REPLACE "/debug" "" CMAKE_SHARED_LINKER_FLAGS |
| "${CMAKE_SHARED_LINKER_FLAGS}") |
| endif (RUNNING_OVER_SSH) |
| endif (UNIX) |
| |
| CHECK_C_COMPILER_FLAG("-no-pie" no_pie_avail) |
| |
| # To avoid having separate subdirs with separate CMakeLists.txt files, |
| # we use DynamoRIOConfig.cmake here. It makes global changes, though. |
| # We live with those changes on all our tests even though we don't |
| # need them everywhere for: |
| # - include_directories |
| # - link_directories |
| # We isolate these: |
| # - CMAKE_C_FLAGS |
| # We have to be careful to append its changes to target properties |
| # with changes we want to make, as well. |
| |
| if (UNIX) |
| if (X86) |
| if (X64) |
| set(ARCH_CFLAGS "-m64") |
| else (X64) |
| set(ARCH_CFLAGS "-m32") |
| endif (X64) |
| endif () |
| set(ARCH_LDFLAGS "${ARCH_CFLAGS}") |
| set(ARCH_DEBUG "${ARCH_CFLAGS}") # somehow not being propagated so we set here |
| else (UNIX) |
| set(ARCH_CFLAGS "") |
| # we don't add /debug here (=> SHARED_LINKER flags) since can't remove |
| set(ARCH_LDFLAGS "") |
| if (RUNNING_OVER_SSH) |
| set(ARCH_DEBUG "") |
| else (RUNNING_OVER_SSH) |
| # ensure we get proper debugging (i#567) |
| set(ARCH_DEBUG "/debug") |
| endif (RUNNING_OVER_SSH) |
| endif (UNIX) |
| |
| if (NOT DEFINED DynamoRIO_DIR) |
| set(DynamoRIO_DIR "${PROJECT_SOURCE_DIR}/../cmake" CACHE PATH |
| "DynamoRIO installation's cmake directory") |
| endif (NOT DEFINED DynamoRIO_DIR) |
| find_package(DynamoRIO) |
| if (NOT DynamoRIO_FOUND) |
| message(FATAL_ERROR "DynamoRIO package required to build") |
| endif(NOT DynamoRIO_FOUND) |
| |
| # Force global changes now, and set ORIG_CMAKE_C_FLAGS |
| configure_DynamoRIO_global(OFF ON) |
| |
| # configure_DynamoRIO_global() cleared the absolute flags for us. |
| # We now use PROPERTIES to set for each test. |
| # We do want the bitwidth flags for gcc on everything though: |
| set(CMAKE_C_FLAGS "${ARCH_CFLAGS}") |
| # DynamoRIOConfig.cmake no longer sets global CMAKE_SHARED_LINKER_FLAGS |
| # so we no longer need to clear this and we can just add arch: |
| set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ARCH_LDFLAGS}") |
| |
| # Must be AFTER build/include now that dr_api.h is configured. |
| # We need this for Windows resources.rc to include globals_shared.h, and |
| # for tools.c to include drlibc.h. |
| include_directories(AFTER |
| ${PROJECT_SOURCE_DIR}/core/drlibc # drlibc.h |
| ${PROJECT_SOURCE_DIR}/core/lib) # c_defines.h |
| |
| # Since we're including configure.h we do not want any default defines. |
| # Note that the new DynamoRIOConfig.cmake doesn't set these so we can |
| # probably remove this line. We remove from target-specific flags |
| # from configure_DynamoRIO_* in tobuild_api(). |
| remove_definitions(-DX64 -DLINUX -DWINDOWS -DMACOS -DCLANG -DANDROID) |
| # If people want perf stress tests they'll have to manually build to avoid |
| # the NIGHTLY_REGRESSION define |
| set(test_defs "-DNIGHTLY_REGRESSION -DNOT_DYNAMORIO_CORE") |
| set(platform_defs "${test_defs}") |
| if (X64) |
| set(platform_defs "${platform_defs} -DX64") |
| endif (X64) |
| if (UNIX) |
| if (APPLE) |
| set(platform_defs "${platform_defs} -DMACOS -DUNIX") |
| else (APPLE) |
| set(platform_defs "${platform_defs} -DLINUX -DUNIX") |
| endif (APPLE) |
| else (UNIX) |
| set(platform_defs "${platform_defs} -DWINDOWS") |
| endif (UNIX) |
| |
| ################################################## |
| |
| set(asm_deps |
| "${PROJECT_SOURCE_DIR}/core/arch/asm_defines.asm" |
| "${PROJECT_BINARY_DIR}/configure.h") |
| set(asm_defs |
| -I "${CMAKE_CURRENT_SOURCE_DIR}" # tools.h |
| -I "${CMAKE_CURRENT_SOURCE_DIR}/client-interface" # for drreg-test-shared.h |
| -I "${CMAKE_CURRENT_SOURCE_DIR}/api" # for detach_state_shared.h |
| -I "${PROJECT_SOURCE_DIR}/core/arch") # asm_defines.asm |
| |
| # some tests need to link with tools.c and its embedded asm code |
| set(tools_c ${CMAKE_CURRENT_SOURCE_DIR}/tools.c) |
| set_source_files_properties(${tools_c} PROPERTIES |
| COMPILE_FLAGS "${ORIG_CMAKE_C_FLAGS}") |
| add_split_asm_target("${tools_c}" tools_asm generate_tools_asm "_asm" |
| "${asm_defs}" "${asm_deps}") |
| |
| add_library(tools STATIC ${tools_c} ${tools_asm}) |
| if (UNIX) |
| # We link tools into shared libraries, so it has to be PIC. |
| append_property_string(SOURCE ${tools_c} COMPILE_FLAGS "-fPIC") |
| endif () |
| if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio") |
| # for correct parallel builds we need a target |
| add_dependencies(tools ${generate_tools_asm}) |
| endif () |
| target_link_libraries(tools drlibc) |
| |
| if (WIN32) |
| set_source_files_properties(${PROJECT_SOURCE_DIR}/core/win32/resources.rc |
| PROPERTIES COMPILE_DEFINITIONS "RC_IS_TEST") |
| endif (WIN32) |
| |
| function (set_cflags source) |
| if ("${source}" MATCHES "^security-win32/except-execution.c") |
| # PR 229292: we want over-ssh and local builds to match the template so |
| # we always build w/o pdbs. We put this check here as it's simpler |
| # than passing args all the way through, and needing extra explicit |
| # sets for PARENT_SCOPE due to new helper routine layers. |
| set(cflags "${ORIG_C_FLAGS_NODBG}") |
| else () |
| set(cflags "${ORIG_CMAKE_C_FLAGS}") |
| endif () |
| if ("${source}" MATCHES ".cpp$") |
| # Our C files need -std=gnu99, but that's an invalid flag for C++. |
| # configure_DynamoRIO_global removes unfavorable options for clients, |
| # re-adding -std=c++11. |
| string(REGEX REPLACE "-std=gnu99" "-std=c++11" cflags "${cflags}") |
| if (WIN32) |
| set(cflags "${cflags} /EHsc") |
| endif (WIN32) |
| endif () |
| if ("${source}" MATCHES ".dll.(c|cpp)$") |
| # do nothing |
| else ("${source}" MATCHES ".dll.(c|cpp)$") |
| # We only do it for the executable, not the dll |
| # Xref i#230, removes "-fvisibility=internal" option. |
| string(REGEX REPLACE "-fvisibility=internal" "" cflags "${cflags}") |
| # Xref i#331, removes "/O2" to avoid optimization on the executable |
| if (WIN32) |
| string(REGEX REPLACE "/O2" "" cflags "${cflags}") |
| endif (WIN32) |
| endif ("${source}" MATCHES ".dll.(c|cpp)$") |
| # We can't set the target properties COMPILE_FLAGS as that will |
| # pass -g3 to cpp which ends up not expanding macros! |
| # So we set properties on source files only. |
| get_filename_component(abs ${source} ABSOLUTE) |
| file(READ ${abs} srccode) |
| set(srccode "${srccode}" PARENT_SCOPE) |
| if (WIN32 AND "${srccode}" MATCHES "condvar\\.h") |
| # Ensure the ConditionVariable routines are pulled in when using >VS2010. |
| # Because dr_api.h includes windows.h and must be included before tools.h we do |
| # this via command line flags. |
| set(cflags "${cflags} -D_WIN32_WINNT=0x0600") |
| endif () |
| # We support a test either getting defines from configure.h or |
| # needing them passed in on cmd line. |
| if ("${srccode}" MATCHES "tools\\.h" OR |
| "${srccode}" MATCHES "configure\\.h") |
| # getting defines from configure.h |
| set_source_files_properties(${source} PROPERTIES |
| COMPILE_FLAGS "${cflags} ${test_defs}") |
| else () |
| set_source_files_properties(${source} PROPERTIES |
| COMPILE_FLAGS "${platform_defs} ${cflags}") |
| endif () |
| endfunction (set_cflags) |
| |
| function(append_link_flags target newflags) |
| get_target_property(cur_ldflags ${target} LINK_FLAGS) |
| # cmake should add an APPEND option |
| set_target_properties(${target} PROPERTIES |
| LINK_FLAGS "${cur_ldflags} ${newflags}") |
| endfunction(append_link_flags) |
| |
| # It would be nice to get rid of the |
| # string(REGEX REPLACE "-O[0-9]? " " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") |
| # line above and instead selectively remove -O3 from tests that cannot |
| # support it. |
| # This was investigated and proved to be non trivial as the client tests |
| # use _DR_set_compile_flags() to set the compile flags whereas the core |
| # tests use set_cflags(). _DR_set_compile_flags() is a public function and we |
| # didn't want to add a blocklist in there. |
| # For now we create a list of tests that can be built with -O3. |
| # This is for AARCH64 UNIX only. |
| # TODO i#6429 Change this allowlist to a blocklist. |
| set(sve_tests |
| simple_app api.ir api.ir_negative api.ir_v81 api.ir_v82 api.ir_v83 api.ir_v84 |
| api.ir_v85 api.ir_v86 api.ir_sve api.ir_sve2 api.ir-static api.drdecode |
| common.broadfun common.nzcv common.getretaddr common.segfault |
| common.allasm_aarch64_isa common.allasm_aarch64_cache allasm_aarch64_prefetch |
| allasm_aarch64_flush libutil.frontend_test libutil.drconfig_test |
| client.call-retarget client.modules client.annotation-concurrency |
| client.partial_module_map client.execfault client.events client.events_cpp |
| client.timer client.mangle_suspend client.syscall-mod client.signal |
| client.cleancallsig client.file_io client.cleancall-opt-1 client.inline |
| client.null_instrument client.large_options client.stolen-reg-index |
| client.gonative client.drmgr-test client.drx_buf-test |
| client.drbbdup-drwrap-test client.drbbdup-emul-test client.process-id |
| client.drreg-test client.low_on_memory client.tls client.drwrap-test |
| client.drwrap-drreg-test drstatecmp-fuzz-app client.drutil-test client.stolen-reg |
| client.ldstex client.drsyms-test client.drwrap-test-detach api.dis-a64 |
| api.reenc-a64 api.opnd api.detach api.detach_state api.detach_signal |
| api.detach_spawn api.detach_spawn_stress_FLAKY api.detach_spawn_quick_exit |
| api.ibl-stress api.ibl-stress-aarch64-far-link_LONG api.static_startstop |
| api.static_noclient api.static_noinit api.static_detach api.static_prepop |
| api.static_reattach_client_flags api.static_crash api.static_sideline_FLAKY |
| api.static_symbols api.static_maps_mixup_yesvars |
| api.static_maps_mixup_novars_FLAKY api.thread_churn client.app_args |
| client.destructor builtin_prefetch stride_benchmark |
| tool.heap_test tool.drcacheoff.gencode |
| linux.execve-sub linux.execve-null linux.execve-config linux.execv |
| linux.execve-rec linux.exit linux.fork linux.fork-sleep linux.infinite |
| linux.longjmp linux.prctl linux.mmap linux.zero-length-mem-ranges |
| linux.sigaction linux.syscall_pwait linux.sigaction_nosignals linux.thread |
| linux.threadexit linux.threadexit2 linux.signalfd linux.alarm |
| linux.signal_racesys linux.signal_pre_syscall linux.bad-signal-stack |
| linux.sigsuspend linux.sigmask linux.mangle_asynch linux.app_tls |
| linux.readlink linux.vfork |
| pthreads.pthreads pthreads.pthreads_exit pthreads.ptsig |
| pthreads.pthreads_fork_FLAKY security-linux.trampoline linux.infloop |
| linux.rseq_disable security-common.codemod security-common.ret_noncall_trace |
| security-common.retnonexisting security-common.TestAllocWE |
| security-common.TestMemProtChg_FLAKY client.drx-test |
| ) |
| |
| function(add_sve_flags target) |
| if (proc_supports_sve) |
| if (target IN_LIST sve_tests) |
| target_compile_options(${target} PRIVATE |
| -march=armv8.4-a+crypto+rcpc+sha3+sm4+sve+rng+ssbs+nodotprod |
| # Reinstate the -03 flag which is removed with the |
| # string(REGEX REPLACE "-O[0-9]? " " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") |
| # line above. |
| -O3) |
| endif() |
| endif() |
| endfunction(add_sve_flags) |
| |
| function(add_exe test source) |
| get_filename_component(srcbase ${source} NAME_WE) |
| get_filename_component(srcpath ${source} PATH) |
| |
| if (WINDOWS) |
| if ("${source}" MATCHES "^security-common") |
| # we add non-MS non-DR version info to some tests to better test -use_moduledb |
| set(rc_srcs ${CMAKE_CURRENT_SOURCE_DIR}/oresources.rc) |
| elseif ("${source}" MATCHES "^runall") |
| # we add MS-like version info to some tests to better test -use_moduledb |
| set(rc_srcs ${CMAKE_CURRENT_SOURCE_DIR}/mresources.rc) |
| else ("${source}" MATCHES "^security-common") |
| # we add dr resource version info to only some of our security tests to test both |
| # sides of the -use_moduledb functionality, and ensure the matching works |
| set(rc_srcs ${PROJECT_SOURCE_DIR}/core/win32/resources.rc) |
| endif ("${source}" MATCHES "^security-common") |
| else (WINDOWS) |
| set(rc_srcs "") |
| endif (WINDOWS) |
| |
| set(test_srcs ${source} ${rc_srcs}) |
| set_cflags(${source}) # sets srccode var |
| |
| # Some files use asm code, which must be separate for x64, but it's much |
| # more convenient to have it in the same source file and auto-split. |
| if ("${srccode}" MATCHES "ifndef ASM_CODE_ONLY") |
| if (DR_HOST_NOT_TARGET) |
| # We just don't support such tests. |
| message(FATAL_ERROR "No asm-containing tests supported for host!=target") |
| endif () |
| # we rely on the asm rule doing preprocessing for us, so we just make |
| # a copy and set the ASM_CODE_ONLY define |
| get_filename_component(source_abs "${source}" ABSOLUTE) |
| add_split_asm_target("${source_abs}" asm_source gen_asm_tgt |
| "_asm" "${asm_defs}" "${asm_deps}") |
| set(test_srcs ${test_srcs} ${asm_source}) |
| endif ("${srccode}" MATCHES "ifndef ASM_CODE_ONLY") |
| |
| if (ANNOTATIONS AND "${srccode}" MATCHES "include \"dr_annotations.h\"") |
| use_DynamoRIO_annotations(${test} test_srcs) |
| endif () |
| if ("${srccode}" MATCHES "include \"test.*annotation.*.h\"") |
| use_DynamoRIO_test_annotations(${test} test_srcs) |
| endif () |
| |
| add_executable(${test} ${test_srcs}) |
| if (DEFINED ${test}_outname) |
| set_target_properties(${test} PROPERTIES OUTPUT_NAME "${${test}_outname}") |
| endif () |
| copy_target_to_device(${test} "${location_suffix}") |
| |
| set_target_properties(${test} PROPERTIES |
| LINK_FLAGS "${ARCH_DEBUG}" |
| # we don't want the default rpath of <builddir>/lib as it makes |
| # it hard to use other DR builds w/ these apps |
| SKIP_BUILD_RPATH ON) |
| if (UNIX) |
| # Older CMake would add this for us, but no longer. We want global syms |
| # in .dynsym for all our executables, so our clients can use dr_get_proc_address() |
| # to find them. |
| append_link_flags(${test} "-rdynamic") |
| # This is kind of a hack: perhaps we should add a flag for whether to use libs. |
| if (NOT ${source} MATCHES "\\.asm$" AND NOT ${test} MATCHES "static" |
| AND NOT ${test} MATCHES "drdecode") |
| target_link_libraries(${test} ${libmath} ${libdl}) |
| endif () |
| if ("${test}" MATCHES "^pthread") |
| link_with_pthread(${test}) |
| endif () |
| elseif (WIN32) |
| append_link_flags(${test} "${ARCH_LDFLAGS}") |
| endif () |
| if ("${srccode}" MATCHES "include \"tools\\.h\"") |
| target_link_libraries(${test} tools) |
| endif () |
| if ("${srccode}" MATCHES "ifndef ASM_CODE_ONLY" AND |
| "${CMAKE_GENERATOR}" MATCHES "Visual Studio") |
| add_dependencies(${test} ${gen_asm_tgt}) |
| endif () |
| |
| # AARCH64 AND UNIX only |
| add_sve_flags(${test}) |
| |
| endfunction(add_exe) |
| |
| # normal app |
| function(tobuild test source) |
| add_exe(${test} ${source}) |
| set(testlist_normal ${testlist_normal} ${test} PARENT_SCOPE) |
| set(${test}_source ${source} PARENT_SCOPE) |
| endfunction(tobuild) |
| |
| # normal app w/ options |
| function(tobuild_ops test source dr_ops exe_ops) |
| set(srcs ${source}) |
| get_filename_component(abs ${source} ABSOLUTE) |
| file(READ ${abs} srccode) |
| if ("${srccode}" MATCHES "include \"dr_annotations.h\"") |
| use_DynamoRIO_annotations(${test} srcs) |
| endif () |
| add_exe(${test} ${srcs}) |
| set(testlist_normal ${testlist_normal} ${test} PARENT_SCOPE) |
| set(${test}_source ${source} PARENT_SCOPE) |
| set(${test}_dr_ops ${dr_ops} PARENT_SCOPE) |
| set(${test}_exe_ops ${exe_ops} PARENT_SCOPE) |
| endfunction(tobuild_ops) |
| |
| # normal app that has a dll and an executable |
| function(tobuild_dll test source dr_ops) |
| string(REGEX REPLACE "\\.(c|cpp)$" ".dll.c" dll_source "${source}") |
| |
| add_exe(${test} ${source}) |
| # On Linux, we need the rpath to load ${test}.dll at initialization. |
| set_target_properties(${test} PROPERTIES SKIP_BUILD_RPATH OFF) |
| |
| set(lib_srcs ${dll_source}) |
| set_cflags(${dll_source}) # sets srccode var |
| add_library(${test}.dll SHARED ${lib_srcs}) |
| set_target_properties(${test}.dll PROPERTIES LINK_FLAGS "${ARCH_DEBUG}") |
| copy_target_to_device(${test}.dll "${location_suffix}") |
| target_link_libraries(${test} ${test}.dll) |
| if ("${srccode}" MATCHES "include \"tools\\.h\"") |
| target_link_libraries(${test}.dll tools) |
| endif () |
| |
| set(testlist_normal ${testlist_normal} ${test} PARENT_SCOPE) |
| set(${test}_source ${source} PARENT_SCOPE) |
| set(${test}_dr_ops ${dr_ops} PARENT_SCOPE) |
| endfunction(tobuild_dll) |
| |
| function(get_client_path client_path_out realclient realexe) |
| get_target_path_for_execution(client_path ${realclient} "${location_suffix}") |
| set(${client_path_out} "${client_path}" PARENT_SCOPE) |
| endfunction(get_client_path) |
| |
| # A shared app for use with multiple ci tests |
| set(ci_shared_app simple_app) |
| set(ci_shared_app_src client-interface/${ci_shared_app}.c) |
| add_exe(${ci_shared_app} ${ci_shared_app_src}) |
| |
| # A shared tiny app. |
| if (DR_HOST_X86 AND DR_HOST_X64 AND LINUX) |
| add_exe(allasm_x86_64 common/allasm_x86_64.asm) |
| set_target_properties(allasm_x86_64 PROPERTIES LINKER_LANGUAGE C) |
| append_link_flags(allasm_x86_64 "-nostartfiles -nodefaultlibs -static") |
| endif () |
| |
| function(setup_test_client_dll_basics test) |
| configure_DynamoRIO_client(${test}) |
| append_property_string(TARGET ${test} LINK_FLAGS "${ARCH_DEBUG}") |
| add_dependencies(${test} api_headers) |
| copy_target_to_device(${test} "${location_suffix}") |
| endfunction (setup_test_client_dll_basics) |
| |
| # A client interface app with client. |
| # If ${source} does not exist, ${ci_shared_app} is used as the target app. |
| # Note that we can't easily have a routine that takes no ops |
| # and calls this one w/ "" "" "" b/c the PARENT_SCOPE won't make |
| # it all the way back then: would need to chain. |
| function(tobuild_ci test source client_ops dr_ops exe_ops) |
| if (NOT DEFINED ${test}_client_source) |
| string(REGEX REPLACE "\\.(c|cpp)$" ".dll.\\1" client_source "${source}") |
| string(REGEX REPLACE "\\.runall$" ".dll.c" client_source "${client_source}") |
| if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${client_source}") |
| string(REGEX REPLACE "\\.c$" ".cpp" client_source "${client_source}") |
| endif () |
| set(${test}_client_source ${client_source}) |
| endif() |
| |
| if (NOT "${source}" MATCHES "\\.runall$") |
| # Many client tests don't care about the app that's run. To save time |
| # and space with a ton of duplicated hello,world apps, we support using |
| # a single one, "simple_app". |
| if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${source}) |
| add_exe(${test} ${source}) |
| # Make sure to avoid using the modified flags which can break msbuild (i#1748). |
| # On Linux this results in some build issues which I did not want to track |
| # down, so we do this only on Windows. |
| if (WIN32) |
| get_source_file_property(src_lang ${source} LANGUAGE) |
| if (src_lang MATCHES CXX) |
| set(tst_flags "${ORIG_CMAKE_CXX_FLAGS}") |
| else () |
| set(tst_flags "${ORIG_CMAKE_C_FLAGS}") |
| endif () |
| set_target_properties(${test} PROPERTIES COMPILE_FLAGS "${tst_flags}") |
| endif () |
| else () |
| if (NOT DEFINED ${test}_realtest) |
| set(${test}_realtest ${ci_shared_app} PARENT_SCOPE) |
| endif () |
| endif () |
| endif () |
| |
| add_library(${test}.dll SHARED ${${test}_client_source}) |
| if (NOT DEFINED ${test}_no_reg_compat AND |
| NOT "${source}" MATCHES "cpp\\.cpp") |
| # to avoid changing all the REG_ constants we ask for compatibility |
| set(DynamoRIO_REG_COMPATIBILITY ON) |
| endif () |
| setup_test_client_dll_basics(${test}.dll) |
| get_client_path(client_path ${test}.dll ${test}) |
| |
| set(testlist_ci ${testlist_ci} ${test} PARENT_SCOPE) |
| set(${test}_source ${source} PARENT_SCOPE) |
| set(${test}_client_ops ${client_ops} PARENT_SCOPE) |
| set(${test}_dr_ops ${dr_ops} PARENT_SCOPE) |
| set(${test}_exe_ops ${exe_ops} PARENT_SCOPE) |
| set(${test}_client_path ${client_path} PARENT_SCOPE) |
| endfunction(tobuild_ci) |
| |
| function(configure_app_api_build_flags test decoder use_static_DR) |
| # save property since configure_DynamoRIO_standalone will clobber it |
| get_target_property(pre_lflags ${test} LINK_FLAGS) |
| # disable the default rpath for standalone apps |
| set(DynamoRIO_RPATH OFF) |
| # To avoid changing all the REG_ constants we ask for compatibility. |
| if (DEFINED ${test}_no_reg_compat) |
| # We try but it's already in the flags so we unset in drwrap-test-detach.cpp. |
| set(DynamoRIO_REG_COMPATIBILITY OFF) |
| else () |
| set(DynamoRIO_REG_COMPATIBILITY ON) |
| endif () |
| if (decoder) |
| configure_DynamoRIO_decoder(${test}) |
| set(extra_flags "-DSTANDALONE_DECODER") |
| elseif (use_static_DR) |
| configure_DynamoRIO_static(${test}) |
| set(extra_flags "-DSTATIC_LIBRARY") |
| else () |
| configure_DynamoRIO_standalone(${test}) |
| set(extra_flags "-DSTANDALONE") |
| endif () |
| # Since we're including configure.h we do not want any default defines. |
| get_target_property(prop_defs ${test} COMPILE_DEFINITIONS) |
| if (NOT prop_defs) |
| set(prop_defs "") |
| endif () |
| string(REGEX REPLACE "X64" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "LINUX" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "WINDOWS" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "MACOS" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "CLANG" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "ANDROID" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "DR_APP_EXPORTS" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "DR_HOST_ARM" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "DR_HOST_AARCH64" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "DR_HOST_X86" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "DR_HOST_X64" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "DR_HOST_RISCV64" "" prop_defs "${prop_defs}") |
| string(REGEX REPLACE "DR_HOST_NOT_TARGET" "" prop_defs "${prop_defs}") |
| # Append to properties set by configure_DynamoRIO_standalone. |
| get_target_property(prop_cflags ${test} COMPILE_FLAGS) |
| if (NOT prop_cflags) |
| set(prop_cflags "") |
| endif () |
| set(prop_cflags "${prop_cflags} ${extra_flags}") |
| set(prop_cflags "${prop_cflags} -DUSE_DYNAMO") |
| # FIXME: apparently moving cflags to a target property makes it show up |
| # in the cpp run for asm targets, where it doesn't if in global var. |
| # This causes compilation failure. Removing -g3 manually as a workaround. |
| string(REGEX REPLACE "-g3" "" prop_cflags "${prop_cflags}") |
| get_target_property(prop_lflags ${test} LINK_FLAGS) |
| set_target_properties(${test} PROPERTIES |
| COMPILE_FLAGS "${prop_cflags}" |
| COMPILE_DEFINITIONS "${prop_defs}" |
| LINK_FLAGS "${pre_lflags} ${prop_lflags}") |
| endfunction (configure_app_api_build_flags) |
| |
| # adds a library target ${test}.appdll built from ${source-without-extension}.appdll.c |
| function(tobuild_appdll test source) |
| # support a test with a library |
| get_filename_component(srcpath ${source} ABSOLUTE) |
| string(REGEX REPLACE "\\.(c|cpp)$" ".appdll.\\1" dll_srcpath "${srcpath}") |
| if (EXISTS "${dll_srcpath}") |
| string(REGEX REPLACE "\\.(c|cpp)$" ".appdll.\\1" dll_source "${source}") |
| set(lib_srcs ${dll_source}) |
| set_cflags(${dll_source}) # sets srccode var |
| |
| if ("${srccode}" MATCHES "ifndef ASM_CODE_ONLY") |
| # we rely on the asm rule doing preprocessing for us, so we just make |
| # a copy and set the ASM_CODE_ONLY define |
| get_filename_component(srcbase ${dll_srcpath} NAME_WE) |
| set(srcbase "${srcbase}.appdll") # NAME_WE took this off |
| get_filename_component(srcpath_rel ${source} PATH) |
| add_split_asm_target("${dll_srcpath}" asm_source gen_asm_tgt |
| "_asm" "${asm_defs}" "${asm_deps}") |
| set(lib_srcs ${lib_srcs} ${asm_source}) |
| endif ("${srccode}" MATCHES "ifndef ASM_CODE_ONLY") |
| |
| if (ANNOTATIONS AND "${srccode}" MATCHES "include \"dr_annotations.h\"") |
| use_DynamoRIO_annotations(${test}.appdll lib_srcs) |
| endif () |
| if ("${srccode}" MATCHES "include \"test.*annotation.*.h\"") |
| use_DynamoRIO_test_annotations(${test}.appdll lib_srcs) |
| endif () |
| |
| add_library(${test}.appdll SHARED ${lib_srcs}) |
| set_target_properties(${test}.appdll PROPERTIES LINK_FLAGS "${ARCH_DEBUG}") |
| # so far these are all dynamically loaded so we don't bother |
| # with "target_link_libraries(${test} ${test}.appdll)" |
| if ("${srccode}" MATCHES "include \"tools\\.h\"") |
| target_link_libraries(${test}.appdll tools) |
| endif () |
| if ("${srccode}" MATCHES "ifndef ASM_CODE_ONLY" AND |
| "${CMAKE_GENERATOR}" MATCHES "Visual Studio") |
| add_dependencies(${test}.appdll ${gen_asm_tgt}) |
| endif () |
| if ("${test}" MATCHES "nativeexec") |
| # Link DynamoRIO for building nativeexec.appdll for using |
| # dr_running_under_dynamorio and dr_native_handle_mbr_target. |
| configure_app_api_build_flags(${test}.appdll OFF OFF) |
| add_dependencies(${test}.appdll api_headers) |
| endif() |
| copy_target_to_device(${test}.appdll "${location_suffix}") |
| endif (EXISTS "${dll_srcpath}") |
| endfunction(tobuild_appdll) |
| |
| function(tobuild_gcc exe source depender extra_args) |
| add_custom_target(target_${exe} DEPENDS ${exe}) |
| add_custom_command(OUTPUT ${exe} DEPENDS ${source} |
| COMMAND ${CMAKE_COMMAND} |
| # to work around i#84 be sure to put a space after -D for 1st arg at least |
| ARGS -D exename=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${exe} |
| -D source=${CMAKE_CURRENT_SOURCE_DIR}/${source} |
| -D args=${extra_args} |
| -P ${CMAKE_CURRENT_SOURCE_DIR}/rungcc.cmake |
| VERBATIM # recommended: p260 |
| ) |
| add_dependencies(${depender} target_${exe}) |
| endfunction(tobuild_gcc) |
| |
| # If the client is in suite/tests/client-interface, caller must append ".dll". |
| function(torunonly_ci test realexe realclient source client_ops dr_ops exe_ops) |
| get_client_path(client_path ${realclient} ${realexe}) |
| |
| # note that b/c of cmake's ridiculous scoping we can't easily share this code |
| # w/ tobuild_ci: still have to propagate out of there, so we dup. |
| set(testlist_ci ${testlist_ci} ${test} PARENT_SCOPE) |
| set(${test}_realtest ${realexe} PARENT_SCOPE) |
| set(${test}_source ${source} PARENT_SCOPE) |
| set(${test}_client_ops ${client_ops} PARENT_SCOPE) |
| set(${test}_dr_ops ${dr_ops} PARENT_SCOPE) |
| set(${test}_exe_ops ${exe_ops} PARENT_SCOPE) |
| set(${test}_client_path ${client_path} PARENT_SCOPE) |
| set(${test}_pass_opts_via_env OFF PARENT_SCOPE) |
| endfunction(torunonly_ci) |
| |
| function(torunonly_api test realexe source dr_ops exe_ops use_decoder pass_opts_via_env) |
| set(testlist_api ${testlist_api} ${test} PARENT_SCOPE) |
| if (realexe) |
| set(${test}_realtest ${realexe} PARENT_SCOPE) |
| endif (realexe) |
| set(${test}_source ${source} PARENT_SCOPE) |
| set(${test}_dr_ops ${dr_ops} PARENT_SCOPE) |
| set(${test}_exe_ops ${exe_ops} PARENT_SCOPE) |
| set(${test}_pass_opts_via_env ${pass_opts_via_env} PARENT_SCOPE) |
| # If using drdecodelib, the app does not load DR, so no reason to use drrun |
| # to set options (plus drrun will create a never-deleted .1config file). |
| if (use_decoder) |
| set(${test}_standalone_dr OFF PARENT_SCOPE) |
| else () |
| set(${test}_standalone_dr ON PARENT_SCOPE) |
| endif () |
| endfunction(torunonly_api) |
| |
| # client interface standalone app |
| function(add_api_exe test source use_decoder use_static_DR) |
| add_exe(${test} ${source}) |
| configure_app_api_build_flags(${test} ${use_decoder} ${use_static_DR}) |
| add_dependencies(${test} api_headers) |
| if (WIN32 AND NOT use_decoder AND NOT use_static_DR) |
| # Since we can't set the working dir w/o making an external script, |
| # we copy dynamorio.dll into the default dir. If we just do a POST_BUILD |
| # custom command we have races (i#810) so we use a globally unique |
| # custom target (alternative of just adding POST_BUILD once has the downside |
| # that building just one target will not work if it's not the one w/ the |
| # POST_BUILD). |
| if (NOT created_drcopy_target) |
| set(drcopy_stamp "${CMAKE_CURRENT_BINARY_DIR}/DRcopy.stamp") |
| add_custom_command(OUTPUT "${drcopy_stamp}" |
| DEPENDS dynamorio drsyms |
| COMMAND ${CMAKE_COMMAND} ARGS |
| -E touch "${drcopy_stamp}" |
| COMMAND ${CMAKE_COMMAND} ARGS |
| -E copy "${MAIN_LIBRARY_OUTPUT_DIRECTORY}/dynamorio.dll" |
| "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/dynamorio.dll" |
| # libutil.drconfig_test needs drconfiglib. |
| COMMAND ${CMAKE_COMMAND} ARGS |
| -E copy "${MAIN_LIBRARY_OUTPUT_DIRECTORY}/../drconfiglib.dll" |
| "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/drconfiglib.dll" |
| # We copy drsyms.dll too, for api.symtest |
| COMMAND ${CMAKE_COMMAND} ARGS |
| -E copy "${PROJECT_BINARY_DIR}/ext/${INSTALL_LIB}/drsyms.dll" |
| "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/drsyms.dll" |
| VERBATIM) |
| add_custom_target(drcopy DEPENDS "${drcopy_stamp}") |
| set(created_drcopy_target ON PARENT_SCOPE) |
| endif () |
| add_dependencies(${test} drcopy) |
| endif () |
| endfunction(add_api_exe) |
| |
| # tobuild_api builds an API test which uses the either DR as a dynamic or |
| # static library, depending on use_static_DR. It is a macro so the |
| # PARENT_SCOPE in torunonly_api will reach caller of this. |
| macro(tobuild_api test source dr_ops exe_ops use_decoder use_static_DR pass_opts_via_env) |
| add_api_exe(${test} ${source} ${use_decoder} ${use_static_DR}) |
| torunonly_api(${test} OFF ${source} "${dr_ops}" "${exe_ops}" ${use_decoder} |
| ${pass_opts_via_env}) |
| endmacro(tobuild_api) |
| |
| # run that uses a different build |
| function(torunonly test realtest source dr_ops exe_ops) |
| set(testlist_normal ${testlist_normal} ${test} PARENT_SCOPE) |
| set(${test}_realtest ${realtest} PARENT_SCOPE) |
| set(${test}_source ${source} PARENT_SCOPE) |
| set(${test}_dr_ops ${dr_ops} PARENT_SCOPE) |
| set(${test}_exe_ops ${exe_ops} PARENT_SCOPE) |
| endfunction(torunonly) |
| |
| # macro so the PARENT_SCOPE in torunonly will reach caller of this |
| macro(tobuild_csharp test source) |
| if (CSC) |
| set(exe "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test}.exe") |
| add_custom_target(${test} ALL DEPENDS ${exe}) |
| if (X64) |
| set(platform "x64") |
| else () |
| set(platform "x86") |
| endif () |
| set(source_winpath "${CMAKE_CURRENT_SOURCE_DIR}/${source}") |
| string(REGEX REPLACE "/" "\\\\" source_winpath "${source_winpath}") |
| add_custom_command(OUTPUT ${exe} DEPENDS ${source} |
| COMMAND ${CSC} ARGS /debug /platform:${platform} /t:exe /out:${exe} |
| "${source_winpath}" VERBATIM) |
| torunonly(${test} ${exe} ${source} "" "") |
| endif () |
| endmacro(tobuild_csharp) |
| |
| macro(append_pure_asm_app_link_flags target) |
| set_target_properties(${target} PROPERTIES LINKER_LANGUAGE C) |
| append_link_flags(${target} "-nostartfiles -nodefaultlibs -static") |
| if (APPLE) |
| append_property_string(TARGET ${target} LINK_FLAGS "-e _start") |
| else () |
| append_property_string(TARGET ${target} LINK_FLAGS |
| # The default value of CMAKE_SHARED_LIBRARY_LINK_C_FLAGS has -rdynamic, which |
| # with some tool chains (such as SUSE GCC 6.2) results in an executable that |
| # is not properly static. Adding --no-export-dynamic avoids the problem. |
| "-Wl,--no-export-dynamic") |
| endif () |
| endmacro(append_pure_asm_app_link_flags) |
| |
| function(tobind target) |
| if (BIND_EXECUTABLE) |
| add_custom_command(TARGET ${target} |
| POST_BUILD |
| COMMAND ${BIND_EXECUTABLE} |
| ARGS -u $<TARGET_FILE:${target}> |
| VERBATIM # recommended: p260 |
| ) |
| else (BIND_EXECUTABLE) |
| add_custom_command(TARGET ${target} |
| POST_BUILD |
| COMMAND ${CMAKE_LINKER} |
| ARGS /edit /bind $<TARGET_FILE:${target}> |
| VERBATIM # recommended: p260 |
| ) |
| endif (BIND_EXECUTABLE) |
| endfunction(tobind) |
| |
| # i#215: mark tests w/ text relocations to avoid violating selinux policies: |
| # for that, pass in "textrel_shlib_t" as the type. |
| # We also need to mark tests that make their stack +x: "execmem_exec_t" |
| # for the type. |
| # If both are needed, "wine_exec_t" seems to do the trick. |
| function(tochcon target type) |
| if (UNIX AND SEUNIXFOUND) |
| add_custom_command(TARGET ${target} |
| POST_BUILD |
| COMMAND ${CHCON} |
| ARGS -t ${type} $<TARGET_FILE:${target}> |
| VERBATIM # recommended: p260 |
| ) |
| endif (UNIX AND SEUNIXFOUND) |
| endfunction(tochcon) |
| |
| function(mark_execstack target) |
| if (UNIX AND NOT APPLE) |
| # Use -Wl escaping because CMake invokes the compiler to link. |
| get_target_property(existing_flags ${target} LINK_FLAGS) |
| set_target_properties(${target} PROPERTIES LINK_FLAGS |
| "-Wl,-z,execstack ${existing_flags}") |
| endif () |
| endfunction(mark_execstack) |
| |
| # XXX i#1468: this function is added as part of an incremental commit. It is not |
| # currently used, but will be used when the annotation tests are added. |
| function (use_DynamoRIO_test_annotations target target_srcs) |
| set(dr_annotation_test_dir "${DynamoRIO_cwd}/../suite/tests/annotations") |
| set(dr_annotation_test_srcs |
| "${dr_annotation_test_dir}/test_mode_annotations.c" |
| "${dr_annotation_test_dir}/test_annotation_arguments.c") |
| if (ANNOTATIONS) |
| configure_DynamoRIO_annotation_sources("${dr_annotation_test_srcs}") |
| endif () |
| set(${target_srcs} ${${target_srcs}} ${dr_annotation_test_srcs} PARENT_SCOPE) |
| endfunction (use_DynamoRIO_test_annotations target target_srcs) |
| |
| ########################################################################### |
| # RUNNING |
| |
| set(PCACHE_DIR "${PROJECT_BINARY_DIR}/pcache") |
| set(PCACHE_SHARED_DIR "${PROJECT_BINARY_DIR}/pcache/shared") |
| |
| function(template2expect outexpect template runops key) |
| # We used to use a custom perl script to match defines and runtime |
| # options but we've switched to cpp. We convert -foo to -Dfoo and |
| # -foo value to -Dfoo___value. |
| # First we strip out the client lib and client args |
| # (this was easier when we passed a single single-quoted client_lib arg). |
| string(REGEX REPLACE |
| "-c;.*" |
| "" rundefs "${runops}") |
| # We now pass a list, so convert ; separators to spaces: |
| string(REPLACE |
| ";" |
| " " rundefs "${rundefs}") |
| # We replace bad define-name chars in client_lib with _. |
| string(REGEX REPLACE |
| "[;/\\.!,]" |
| "_" rundefs "${rundefs}") |
| string(REGEX REPLACE |
| "([^ ])-" |
| "\\1_" rundefs "${rundefs}") |
| string(REGEX REPLACE |
| "(^| +)-([^ ]+)" |
| " -D\\2" rundefs "${rundefs}") |
| # allow matching * via XX (since * can't be in define) |
| string(REGEX REPLACE |
| "\\*" |
| "XX" rundefs "${rundefs}") |
| # allow matching = via YY (since = can't be in define) |
| string(REGEX REPLACE |
| "=" |
| "YY" rundefs "${rundefs}") |
| # allow matching runtime option values via -Dfoo___value |
| string(REGEX REPLACE |
| "(-D[^ ]+) +([^-][^ ]*)" |
| "\\1___\\2" rundefs "${rundefs}") |
| |
| if ("${CMAKE_SYSTEM_VERSION}" STRLESS "5.0") |
| set(rundefs "${rundefs} -DRUNREGRESSION_NT") |
| elseif ("${CMAKE_SYSTEM_VERSION}" STRLESS "5.1") |
| set(rundefs "${rundefs} -DRUNREGRESSION_2000") |
| elseif ("${CMAKE_SYSTEM_VERSION}" STRLESS "5.2") |
| set(rundefs "${rundefs} -DRUNREGRESSION_XP") |
| elseif ("${CMAKE_SYSTEM_VERSION}" STRLESS "6.0") |
| set(rundefs "${rundefs} -DRUNREGRESSION_2003") |
| elseif ("${CMAKE_SYSTEM_VERSION}" STRLESS "6.1") |
| set(rundefs "${rundefs} -DRUNREGRESSION_VISTA") |
| elseif ("${CMAKE_SYSTEM_VERSION}" STRLESS "6.2") |
| set(rundefs "${rundefs} -DRUNREGRESSION_WIN7") |
| elseif ("${CMAKE_SYSTEM_VERSION}" STRLESS "6.3") |
| set(rundefs "${rundefs} -DRUNREGRESSION_WIN8") |
| endif () |
| if (${key}_is_cygwin) |
| # i#1478 option used to avoid cygwin messes up output issue: though |
| # whether the output is messed up seems to depend on the cygwin version, |
| # so currently this is unused. |
| set(rundefs "${rundefs} -DCYGWIN") |
| endif () |
| if (DEFINED ${key}_runavx512) |
| set(rundefs "${rundefs} -D__AVX__ -D__AVX512F__") |
| elseif (DEFINED ${key}_runavx) |
| set(rundefs "${rundefs} -D__AVX__") |
| elseif (DEFINED ${key}_runsve2) |
| set(rundefs "${rundefs} -D__ARM_FEATURE_SVE") |
| set(rundefs "${rundefs} -D__ARM_FEATURE_SVE2") |
| set(rundefs "${rundefs} -D__ARM_FEATURE_SVE_BITS=${proc_sve_vl}") |
| elseif (DEFINED ${key}_runsve) |
| set(rundefs "${rundefs} -D__ARM_FEATURE_SVE") |
| set(rundefs "${rundefs} -D__ARM_FEATURE_SVE_BITS=${proc_sve_vl}") |
| endif () |
| if (CPU_AMD) |
| set(rundefs "${rundefs} -DCPU_AMD") |
| elseif (CPU_INTEL) |
| set(rundefs "${rundefs} -DCPU_INTEL") |
| endif () |
| |
| if (DEFINED ${key}_test_sample_client) |
| set(rundefs "${rundefs} -DTEST_SAMPLE_CLIENT") |
| endif () |
| |
| string(STRIP "${rundefs}" rundefs) |
| |
| # relies on ${defines} from top level |
| # we need a list: else passed as a single arg in quotes |
| string(REGEX REPLACE " " ";" deflist "${defines} ${rundefs}") |
| execute_process(COMMAND |
| ${CMAKE_CPP} ${CMAKE_CPP_FLAGS} ${deflist} -E ${CPP_NO_LINENUM} |
| ${CPP_KEEP_WHITESPACE} ${template} |
| RESULT_VARIABLE cpp_result |
| ERROR_VARIABLE cpp_err |
| OUTPUT_VARIABLE cpp_out |
| ) |
| if (WIN32) |
| # cl prints out name of file: no way to quiet it |
| get_filename_component(file_nm ${template} NAME) |
| string(REGEX REPLACE "${file_nm}[ \r\n]*" "" cpp_err "${cpp_err}") |
| string(STRIP "${cpp_err}" cpp_err) |
| endif (WIN32) |
| if (cpp_result OR cpp_err) |
| message(FATAL_ERROR "*** ${CMAKE_CPP} failed: ***\n${cpp_err}") |
| endif (cpp_result OR cpp_err) |
| |
| # remove // comments since we use -traditional-cpp to preserve whitespace |
| # on linux |
| string(REGEX REPLACE "(\r?\n)//[^\n]*" "" cpp_out "${cpp_out}") |
| string(REGEX REPLACE "^//[^\n]*" "" cpp_out "${cpp_out}") |
| |
| # remove blank lines left by cpp directives |
| string(REGEX REPLACE |
| "(\r?\n)+" |
| "\\1" cpp_out "${cpp_out}") |
| string(REGEX REPLACE |
| "^(\r?\n)+" |
| "" cpp_out "${cpp_out}") |
| # allow trailing space on a line via @& |
| string(REGEX REPLACE |
| "@&" |
| " " cpp_out "${cpp_out}") |
| # allow matching blank lines via @@ => we strip it out after stripping blank |
| string(REGEX REPLACE |
| "@@" |
| "" cpp_out "${cpp_out}") |
| |
| # support macros from our security days |
| string(REGEX MATCHALL "-throw_exception" op_throw "${runops}") |
| string(REGEX MATCHALL "-kill_thread" op_kill "${runops}") |
| set(msg_vio "<Execution security violation was intercepted!\nContact your vendor for a security vulnerability fix.\n") |
| set(msg_cont "Program continuing!") |
| set(msg_term "Program terminated.") |
| set(msg_thread "Program continuing after terminating thread.") |
| set(msg_throw "Program continuing after throwing an exception.") |
| set(msg_mem "Out of memory. Program aborted.") |
| set(msg_unhand "Unhandled exception caught.\n") |
| # FIXME: add in \r? and test on Windows |
| string(REGEX REPLACE "(^|\n) *SEC_VIO_CONT\n" "\\1${msg_vio}${msg_cont}>\n" |
| cpp_out "${cpp_out}") |
| string(REGEX REPLACE "(^|\n) *SEC_VIO_STOP\n" "\\1${msg_vio}${msg_term}>\n" |
| cpp_out "${cpp_out}") |
| string(REGEX REPLACE "(^|\n) *SEC_VIO_EXCEPTION\n" "\\1${msg_vio}${msg_throw}>\n" |
| cpp_out "${cpp_out}") |
| string(REGEX REPLACE "(^|\n) *SEC_VIO_THREAD\n" "\\1${msg_vio}${msg_thread}>\n" |
| cpp_out "${cpp_out}") |
| string(REGEX REPLACE "\n *OUT_OF_MEMORY\n" "\n<${msg_mem}>\n" |
| cpp_out "${cpp_out}") |
| if (WIN32) |
| string(REGEX REPLACE "\n *UNHANDLED_EXCEPTION\n" "\n${msg_unhand}" |
| cpp_out "${cpp_out}") |
| endif (WIN32) |
| if (op_throw) |
| if (WIN32) |
| string(REGEX REPLACE "\n *SEC_VIO_AUTO_STOP\n" |
| "\n${msg_vio}${msg_throw}>\n${msg_unhand}" |
| cpp_out "${cpp_out}") |
| else (WIN32) |
| string(REGEX REPLACE "\n *SEC_VIO_AUTO_STOP\n" "\n${msg_vio}${msg_throw}>\n" |
| cpp_out "${cpp_out}") |
| endif (WIN32) |
| elseif (op_kill) |
| string(REGEX REPLACE "\n *SEC_VIO_AUTO_STOP\n" "\n${msg_vio}${msg_thread}>\n" |
| cpp_out "${cpp_out}") |
| else (op_throw) |
| string(REGEX REPLACE "\n *SEC_VIO_AUTO_STOP\n" "\n${msg_vio}${msg_term}>\n" |
| cpp_out "${cpp_out}") |
| endif (op_throw) |
| string(REGEX REPLACE "\n *STOP\n.*$" "\n" |
| cpp_out "${cpp_out}") |
| |
| set(${outexpect} ${cpp_out} PARENT_SCOPE) |
| endfunction(template2expect) |
| |
| ################################################## |
| |
| if (UNIX) |
| set(dr_os_ops -dumpcore_mask 0) |
| else () |
| # Turn on core dumps for most fatal errors. Don't dump for curiosities or |
| # security violations. |
| set(dr_os_ops -msgbox_mask 0 -dumpcore_mask 0x7d -staged) |
| endif () |
| set(dr_test_ops -stderr_mask 0xC ${dr_os_ops}) |
| if (CMAKE_CROSSCOMPILING AND DEFINED CMAKE_FIND_ROOT_PATH) |
| set(dr_test_ops -xarch_root ${CMAKE_FIND_ROOT_PATH} ${dr_test_ops}) |
| endif () |
| |
| function(runtest_cmd outcmd outops key native standalone_dr dr_ops_aux separate_script) |
| # assumes tools have been built: enforced at top level |
| set(dr_ops ${dr_test_ops} ${dr_ops_aux} ${TEST_OPTIONS}) |
| |
| if (separate_script) |
| # eliminate double-spaces, to help w/ passing strings to runall.cmake |
| string(REGEX REPLACE " +" " " dr_ops "${dr_ops}") |
| string(REGEX REPLACE " $" "" dr_ops "${dr_ops}") |
| # We assume there is no ; inside an option: only there as cmake list separtors |
| # (we use -c instead of -client_lib). |
| endif (separate_script) |
| |
| set(timeout ${TEST_SECONDS}) |
| if (DEFINED ${key}_timeout) |
| set(timeout ${${key}_timeout}) |
| endif () |
| if (CMAKE_CROSSCOMPILING) |
| # Everything is slower under emulation. |
| math(EXPR timeout "${timeout}*4") |
| endif () |
| |
| if (WIN32 OR NOT native) |
| # Both Windows and non-native Unix tests now use the native drrun frontend. |
| # Since the creation of CTestTestfile.cmake ends up replacing \ with / we |
| # can't escape quotes, so we have to use a list variable |
| if (standalone_dr OR NOT native) |
| get_target_path_for_execution(drrun_path drrun "${location_suffix}") |
| endif (standalone_dr OR NOT native) |
| # CMake 3.x seems to put double slashes in there (xref i#1559) |
| string(REGEX REPLACE "//" "/" drrun_path "${drrun_path}") |
| set(cmd "${drrun_path}" -s ${timeout} -quiet) |
| prefix_cmd_if_necessary(cmd OFF ${cmd}) |
| if (DEBUG) |
| set(cmd ${cmd} -debug) |
| endif () |
| if (UNIX) |
| set(cmd ${cmd} -killpg) |
| endif () |
| if (UNIX AND TEST_SUITE AND TEST_32BIT_PATH) |
| # In the Unix suite, use the DR install dir for cross-arch execve. |
| set(cmd ${cmd} -dr_home "${CMAKE_INSTALL_PREFIX}") |
| endif () |
| if (WIN32) |
| file(TO_CMAKE_PATH "${MAIN_LIBRARY_OUTPUT_DIRECTORY}/dynamorio.dll" dllpath) |
| # forward slashes work fine: we just need drive-letter path |
| set(cmd ${cmd} -use_dll ${dllpath}) |
| # we pass -exit0 to avoid ctest from considering our segfault and other tests |
| # to have failed (also xref PR 548997). |
| set(cmd ${cmd} -exit0) |
| if (native) |
| set(cmd ${cmd} -noinject) |
| endif () |
| endif (WIN32) |
| if (standalone_dr OR NOT native) |
| # add dr_ops last to avoid needing extra \ on ; |
| set(${outcmd} ${cmd} ${dr_ops} "--" PARENT_SCOPE) |
| else (standalone_dr OR NOT native) |
| # the test is pure native, so we rely on ctest for job control |
| set(${outcmd} "" PARENT_SCOPE) |
| endif (standalone_dr OR NOT native) |
| |
| elseif (UNIX AND native) |
| get_target_path_for_execution(runstats_path runstats "${location_suffix}") |
| set(cmd ${runstats_path} -s ${timeout} -killpg -silent) |
| prefix_cmd_if_necessary(cmd OFF ${cmd}) |
| # We set LD_LIBRARY_PATH for native api/ apps since we're not setting |
| # rpath (to make it easier to try different trees) |
| if (APPLE) |
| set(libvar "DYLD_LIBRARY_PATH") |
| else () |
| set(libvar "LD_LIBRARY_PATH") |
| endif () |
| set(cmd ${cmd} -env ${libvar} |
| "${MAIN_LIBRARY_OUTPUT_DIRECTORY}:${EXT_LIBRARY_OUTPUT_DIRECTORY}:$ENV{${libvar}}") |
| # add dr_ops last to avoid needing extra \ on ; |
| string(REPLACE ";" " " dr_ops_string "${dr_ops}") |
| set(${outcmd} ${cmd} -env DYNAMORIO_OPTIONS "${dr_ops_string}" PARENT_SCOPE) |
| else () |
| # clear the caller's `outcmd` |
| set(${outcmd} "" PARENT_SCOPE) |
| endif () |
| |
| set(${outops} "${dr_ops}" PARENT_SCOPE) |
| endfunction(runtest_cmd) |
| |
| # if test != exe we assume exe is already added as a build target |
| # key is the test name without the options, and is used to look up ${key}_expectbase |
| # and ${key}_postcmd, which points to the post-processing executable if necessary. |
| # If pass_opts_via_env is ON, we pass the computed DynamoRIO options as the |
| # DYNAMORIO_OPTIONS environment variable for the test run. |
| function(torun test key source native standalone_dr dr_ops exe_ops added_out pass_opts_via_env) |
| # Avoid running some tests with invalid option combinations. For example, |
| # coarse fragments are incompatible with thread private code caches. |
| if ("${dr_ops}" MATCHES "-thread_private" AND |
| "${dr_ops}" MATCHES "-opt_memory") |
| set(${added_out} OFF PARENT_SCOPE) |
| return() |
| endif () |
| if (NOT "${dr_ops}" MATCHES "-no_early_inject" AND |
| "${dr_ops}" MATCHES "-no_private_loader") |
| set(${added_out} OFF PARENT_SCOPE) |
| return() |
| endif () |
| |
| if (DEFINED ${key}_realtest) |
| set(exe ${${key}_realtest}) |
| else (DEFINED ${key}_realtest) |
| set(exe ${key}) |
| endif (DEFINED ${key}_realtest) |
| |
| get_filename_component(srcbase ${source} NAME_WE) |
| if (DEFINED ${key}_basedir) |
| set(testpath ${${key}_basedir}) |
| else () |
| get_filename_component(srcpath ${source} PATH) |
| set(testpath ${CMAKE_CURRENT_SOURCE_DIR}/${srcpath}) |
| endif () |
| if (EXISTS "${testpath}/${srcbase}.runall") |
| set(is_runall ON) |
| else () |
| set(is_runall OFF) |
| endif () |
| if (EXISTS "${testpath}/${srcbase}.runcmp" OR |
| DEFINED ${key}_runcmp) |
| set(is_runcmp ON) |
| else () |
| set(is_runcmp OFF) |
| endif () |
| if (is_runall OR is_runcmp) |
| set(separate_script ON) |
| else () |
| set(separate_script OFF) |
| endif () |
| |
| set(ALREADY_REGEX OFF) |
| |
| runtest_cmd(rundr runops ${key} ${native} ${standalone_dr} |
| "${dr_ops}" ${separate_script}) |
| |
| if (TARGET ${exe}) |
| get_target_path_for_execution(exepath ${exe} "${location_suffix}") |
| else () |
| # support running binaries that are not targets of this build |
| set(exepath ${exe}) |
| endif () |
| |
| if (DEFINED ${key}_expectbase) |
| set(expectbase ${${key}_expectbase}) |
| else () |
| set(expectbase ${srcbase}) |
| endif () |
| |
| if (TEST_SUITE AND TEST_32BIT_PATH AND ${test} MATCHES "linux.execve32") |
| # We're an x64 build, but we need to launch a 32-bit app under DR. The |
| # suite sets -dr_home to the full install dir with both archs, but we're |
| # invoking bin64/drrun. Ideally drrun would detect which ELF class we're |
| # about to exec, but until then we have to add -32 for 32-bit apps. |
| string(REGEX REPLACE "/drrun;" "/drrun;-32;" rundr "${rundr}") |
| endif () |
| |
| if (DEFINED ${key}_sudo) |
| set(rundr "sudo;${rundr}") |
| endif () |
| |
| if (is_runall) |
| # To run the test we use a series of commands in runall.cmake. |
| file(READ "${testpath}/${srcbase}.runall" runall) |
| if (UNIX) |
| # We always run infloop. |
| get_target_path_for_execution(app_path linux.infloop "${location_suffix}") |
| if ("${runall}" MATCHES "<attach>") |
| # Add a starting message with -v, and avoid mprotect for now (i#38: mprotect |
| # is failing). |
| set(exe_ops "${exe_ops};-v;-attach") |
| endif () |
| if ("${runall}" MATCHES "<detach>") |
| set(exe_ops "${exe_ops};-v;") |
| endif () |
| if ("${runall}" MATCHES "<block>") |
| set(exe_ops "${exe_ops};-block") |
| endif () |
| else () |
| if ("${runall}" MATCHES "<attach>" OR "${runall}" MATCHES "<detach>") |
| # For detach we use attachee to attach firstly, and "-detach" option is used |
| # for differentiating between attach and detach. |
| if ("${runall}" MATCHES "<detach>") |
| set(exe_ops "${exe_ops};-detach") |
| endif () |
| # For attach we use attachee, which is identical to infloop, aside for writing |
| # a starting message to the output file. This allows us to detect when it is |
| # up and running and we can start the attach process. |
| get_target_path_for_execution(app_path win32.attachee "${location_suffix}") |
| else () |
| # It's easier to run our own infloop, which prints so we know when it's up, |
| # than to run notepad or sthg. |
| get_target_path_for_execution(app_path win32.infloop "${location_suffix}") |
| endif () |
| endif () |
| # Swap from drrun to run_in_bg to run the test in the background and print the pid. |
| # XXX i#1874: add support for running on Android |
| set(tmpfile "${CMAKE_CURRENT_BINARY_DIR}/${key}-out") |
| if (UNIX) |
| set(pidfile "") |
| string(REGEX REPLACE "^(.*)/drrun" "\\1/run_in_bg;-out;${tmpfile};\\1/drrun" |
| rundr "${rundr}") |
| else () |
| set(pidfile "${CMAKE_CURRENT_BINARY_DIR}/${key}-pid") |
| # We want the pid not of drrun but its child so we pass -pidfile to drrun rather |
| # than -pid to run_in_bg. |
| # XXX i#120: add systemwide injection testing. For now we only test drrun. |
| string(REGEX REPLACE "^(.*)/drrun.exe" |
| "\\1/run_in_bg;-out;${tmpfile};\\1/drrun.exe;-pidfile;${pidfile}" |
| rundr "${rundr}") |
| endif () |
| # Remove timeout args to drrun to ensure that it doesn't fork the app. |
| string(REGEX REPLACE ";-s;[0-9]+" "" rundr "${rundr}") |
| string(REGEX REPLACE ";-killpg" "" rundr "${rundr}") |
| set(clear_arg "") |
| if ("${runall}" MATCHES "<reset>") |
| set(nudge_arg "-type\;reset") |
| elseif ("${runall}" MATCHES "<freeze>") |
| set(nudge_arg "-type\;freeze") |
| elseif ("${runall}" MATCHES "<persist>") |
| set(nudge_arg "-type\;persist") |
| # clear out pcache dir prior to run |
| set(clear_arg "${PCACHE_SHARED_DIR}") |
| elseif ("${runall}" MATCHES "<use-persisted>") |
| set(nudge_arg "<use-persisted>") |
| elseif ("${runall}" MATCHES "<client") |
| string(REGEX MATCHALL "<client_nudge[^>]+" nudge_arg "${runall}") |
| string(REGEX REPLACE "<client_nudge" "-client" nudge_arg "${nudge_arg}") |
| string(REGEX REPLACE " " "\\\\;" nudge_arg "${nudge_arg}") |
| elseif ("${runall}" MATCHES "<attach>") |
| # move params to nudge |
| string(REGEX MATCH ";-quiet;(.*);--" nudge_arg "${rundr}") |
| string(REGEX REPLACE ";--" "" nudge_arg "${nudge_arg}") |
| string(PREPEND nudge_arg "<attach>") |
| string(REGEX REPLACE ";" "@" nudge_arg "${nudge_arg}") |
| # clear client from dr command and run native |
| string(REGEX REPLACE ";-quiet;(.*);--" ";-no_inject;--;" rundr "${rundr}") |
| elseif ("${runall}" MATCHES "<detach>") |
| # Move params to nudge. |
| string(REGEX MATCH ";-quiet;(.*);--" nudge_arg "${rundr}") |
| string(REGEX REPLACE ";--" "" nudge_arg "${nudge_arg}") |
| string(PREPEND nudge_arg "<detach>") |
| string(REGEX REPLACE ";" "@" nudge_arg "${nudge_arg}") |
| # Clear client from dr command and run native. |
| string(REGEX REPLACE ";-quiet;(.*);--" ";-no_inject;--;" rundr "${rundr}") |
| endif () |
| set(cmd_with_at ${rundr} ${app_path} ${exe_ops}) |
| # we pass intra-arg spaces via @@ and inter-arg via @ and ; via ! |
| # to get around the pain of trying to quote everything just right: |
| # much simpler this way. |
| string(REGEX REPLACE " " "@@" cmd_with_at "${cmd_with_at}") |
| string(REGEX REPLACE ";" "@" cmd_with_at "${cmd_with_at}") |
| if (NOT APPLE) # XXX i#1286: implement nudge for MacOS |
| if (UNIX) |
| get_target_path_for_execution(toolbindir drnudgeunix "${location_suffix}") |
| else () |
| get_target_path_for_execution(toolbindir drconfig "${location_suffix}") |
| endif () |
| else () |
| set(toolbindir "i#1286-not-implemented-for-Mac") |
| endif () |
| get_filename_component(toolbindir ${toolbindir} DIRECTORY) |
| add_test(${test} ${CMAKE_COMMAND} -D toolbindir=${toolbindir} |
| -D cmd=${cmd_with_at} -D out=${tmpfile} -D nudge=${nudge_arg} |
| -D clear=${clear_arg} -D pidfile=${pidfile} |
| -P ${CMAKE_CURRENT_SOURCE_DIR}/runall.cmake) |
| elseif (is_runcmp) |
| # Some apps have enough output that ctest runs out of memory when |
| # doing its built-in regex cmp so we use a separate script. |
| # We also use this approach for tests that need custom success tests. |
| if (DEFINED ${key}_nodr) |
| set(cmd_with_at ${exepath} ${exe_ops}) |
| else () |
| set(cmd_with_at ${rundr} ${exepath} ${exe_ops}) |
| endif () |
| # we pass intra-arg spaces via @@ and inter-arg via @ and ; via ! |
| # to get around the pain of trying to quote everything just right: |
| # much simpler this way. |
| # XXX i#1327: now that we have -c and other option passing improvements we |
| # should be able to get rid of this @@ stuff. |
| string(REGEX REPLACE " " "@@" cmd_with_at "${cmd_with_at}") |
| string(REGEX REPLACE ";" "@" cmd_with_at "${cmd_with_at}") |
| if (DEFINED ${key}_runcmp) |
| set(runcmp_script ${${key}_runcmp}) |
| else () |
| set(runcmp_script ${CMAKE_CURRENT_SOURCE_DIR}/runcmp.cmake) |
| endif () |
| if (NOT DEFINED ${key}_postcmd) |
| set(${key}_postcmd "") |
| endif () |
| add_test(${test} ${CMAKE_COMMAND} |
| -D precmd=${${key}_precmd} |
| -D cmd=${cmd_with_at} |
| -D postcmd=${${key}_postcmd} |
| -D postcmd2=${${key}_postcmd2} |
| -D postcmd3=${${key}_postcmd3} |
| -D postcmd4=${${key}_postcmd4} |
| -D failok=${${key}_failok} |
| -D cmp=${CMAKE_CURRENT_BINARY_DIR}/${expectbase}.expect |
| -D code=${${key}_code} |
| -D capture=${${key}_runcmp_capture} |
| -D ignore_matching_lines=${${key}_runcmp_ignore_matching_lines} |
| -P ${runcmp_script}) |
| # No support for regex here (ctest can't handle large regex) |
| set(ALREADY_REGEX ON) |
| else (is_runcmp) |
| add_test(${test} ${rundr} ${exepath} ${exe_ops}) |
| endif (is_runall) |
| |
| if (EXISTS ${testpath}/${expectbase}.expect) |
| file(READ ${testpath}/${expectbase}.expect expect) |
| # add dependence so cmake will reconfigure if file changes |
| configure_file(${testpath}/${expectbase}.expect |
| ${CMAKE_CURRENT_BINARY_DIR}/ignoreme_for_dep) |
| elseif (EXISTS ${testpath}/${expectbase}.template) |
| # We convert .template at configure time and use CTest's built-in |
| # PASS_REGULAR_EXPRESSION to diff the output. |
| # |
| # Advantages of this approach: |
| # * More efficient: no separate script to launch that then launches |
| # multiple sub-processes to diff or cmake -E compare_files. |
| # |
| # Advantages of instead using a script at runtime to convert: |
| # * CMake can't handle giant files as regexps (api/dis.template in particular) |
| # so we wouldn't need to special-case it |
| # * Large regexps that don't match are printed in their entirety, so |
| # if we did our own diff then the CTest output would be more readable. |
| # Note that we can't output, say, the diff head, but we can be quieter. |
| # * Changes in .template don't require reconfiguring: but it's automatic |
| # (thanks to configure_file() hack) and pretty quick |
| # * We could support extra runtime options via env var DYNAMORIO_OPTIONS, |
| # but while that might be useful it could also be confusing. |
| template2expect(expect |
| ${testpath}/${expectbase}.template |
| "${runops}" |
| ${key}) |
| # add dependence so cmake will reconfigure if file changes |
| configure_file(${testpath}/${expectbase}.template |
| ${CMAKE_CURRENT_BINARY_DIR}/ignoreme_for_dep) |
| elseif (EXISTS ${testpath}/${expectbase}.templatex) |
| # A .templatex is a .template that is treated directly as a regex: |
| # so any regex chars inside are not converted to literals. |
| # We separate the two so that we don't have to escape everything in |
| # regular templates where we want a literal match. |
| if (DEFINED ${key}_rawtemp) |
| # No preprocessor |
| file(READ ${testpath}/${expectbase}.templatex expect) |
| else () |
| template2expect(expect |
| ${testpath}/${expectbase}.templatex |
| "${runops}" |
| ${key}) |
| endif () |
| # add dependence so cmake will reconfigure if file changes |
| configure_file(${testpath}/${expectbase}.templatex |
| ${CMAKE_CURRENT_BINARY_DIR}/ignoreme_for_dep) |
| set(ALREADY_REGEX ON) |
| else (EXISTS ${testpath}/${expectbase}.expect) |
| message(FATAL_ERROR |
| "no .expect or .template or .templatex for ${testpath}/${expectbase} for ${key}") |
| endif (EXISTS ${testpath}/${expectbase}.expect) |
| |
| if (NOT ALREADY_REGEX) |
| # turn regex chars into literals |
| # \\] somehow messes up the match though $expect looks identical |
| # some tests do have ']' so we replace it in a separate step below |
| string(REGEX REPLACE "([\\^\\$\\.\\*\\+\\?\\|\\(\\)\\[\\;])" |
| "\\\\\\1" expect "${expect}") |
| string(REGEX REPLACE "\\]" |
| "\\\\]" expect "${expect}") |
| endif (NOT ALREADY_REGEX) |
| |
| if (WIN32 AND NOT is_runcmp) # for runcmp it's up to the test |
| # libc print => CRLF, dr_printf => plain newline: match both |
| string(REGEX REPLACE "\n" "\r?\n" expect "${expect}") |
| endif () |
| |
| if (is_runcmp) |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${expectbase}.expect" "${expect}") |
| else () |
| # match whole output |
| set(expect "^${expect}$") |
| set_tests_properties(${test} PROPERTIES PASS_REGULAR_EXPRESSION "${expect}") |
| endif () |
| |
| if (DEFINED ${key}_timeout) |
| # Though we mostly use drrun's -s we set this too in case the requested |
| # value is higher than ctest's default. |
| set_tests_properties(${test} PROPERTIES TIMEOUT ${${key}_timeout}) |
| elseif (is_runcmp OR is_runall) |
| # Runcmp/runall generally don't use drrun or runstats so we need a ctest timeout. |
| set_tests_properties(${test} PROPERTIES TIMEOUT ${TEST_SECONDS}) |
| else () |
| # Even though we expect drrun -s to enforce a timeout, set one in ctest just |
| # in case, but give time for drrun first. |
| math(EXPR timeout "${TEST_SECONDS}+30") |
| set_tests_properties(${test} PROPERTIES TIMEOUT ${timeout}) |
| endif () |
| |
| # Though we use drrun and runstats -s timeout parameters, we have |
| if (pass_opts_via_env) |
| string(REPLACE ";" " " runops_string "${runops}") |
| set_tests_properties(${test} PROPERTIES ENVIRONMENT "DYNAMORIO_OPTIONS=${runops_string}") |
| endif (pass_opts_via_env) |
| |
| if (WIN32) |
| # With i#265/PR 486139 we use local one-time config files instead of |
| # global reg keys and can thus run multiple instances of the same |
| # app name simultaneously so we do not need to mark RUN_SERIAL |
| endif (WIN32) |
| |
| # A subset of release tests has been added and labeled with RUN_IN_RELEASE. It focuses |
| # on Google's use of the drcachesim client. We do not want to extend the Travis |
| # regression time by too much and keep the following list concise. |
| if (NOT DEBUG AND UNIX AND X64 AND NOT CMAKE_COMPILER_IS_CLANG) |
| if (${test} MATCHES "common" OR |
| ${test} MATCHES "drcachesim" OR |
| ${test} MATCHES "drcacheoff") |
| set_tests_properties(${test} PROPERTIES LABELS RUN_IN_RELEASE) |
| endif() |
| endif () |
| set(${added_out} ON PARENT_SCOPE) |
| endfunction(torun) |
| |
| macro (string2list var) |
| string(REPLACE " " ";" ${var} ${${var}}) |
| endmacro () |
| |
| macro(strings2lists test ops_var) |
| # We now use a list instead of a string for ops. We convert here where we can |
| # assume there are no spaces (from paths) in the options. |
| if (NOT ${${ops_var}} STREQUAL "") |
| string2list(${ops_var}) |
| endif () |
| if (DEFINED ${test}_dr_ops) |
| string2list(${test}_dr_ops) |
| endif () |
| if (DEFINED ${test}_client_ops AND NOT DEFINED ${test}_client_ops_islist) |
| string2list(${test}_client_ops) |
| endif () |
| endmacro() |
| |
| function(set_properties name test myprefix) |
| if (DEFINED ${test}_depends) |
| set_property(TEST ${name} APPEND PROPERTY DEPENDS "${myprefix}${${test}_depends}") |
| endif (DEFINED ${test}_depends) |
| if (DEFINED ${test}_self_serial) |
| # We blindly add a dep to every possible cross-cutting same test w/ diff ops. |
| # CTest seems ok with a dep on a non-existent test. |
| foreach (prefix ${prior_prefixes}) |
| if (NOT "${prefix}" STREQUAL "${myprefix}") |
| set_property(TEST ${name} APPEND PROPERTY DEPENDS "${prefix}${test}") |
| endif () |
| endforeach () |
| endif () |
| if (DEFINED ${test}_env) |
| set_property(TEST ${name} APPEND PROPERTY ENVIRONMENT "${myprefix}${${test}_env}") |
| endif () |
| endfunction () |
| |
| function(torun_normal name test ops) |
| strings2lists(${test} ops) |
| torun("${name}" ${test} ${${test}_source} OFF OFF "${${test}_dr_ops};${ops}" |
| "${${test}_exe_ops}" added OFF) |
| ops2testprefix(myprefix "${ops}") |
| set_properties(${name} ${test} ${myprefix}) |
| endfunction(torun_normal) |
| |
| function(torun_ci name test ops) |
| ops2testprefix(myprefix "${ops}") |
| strings2lists(${test} ops) |
| set(cli_ops "${${test}_client_ops}") |
| if ("${test}" MATCHES "client\\.flush") |
| # See PR 244090 - currently there is no way for a client to see what |
| # options DR was run with. The flush tests needs to know whether it |
| # can use the unlink flush routines or not which depends on having |
| # either -thread_private or -enable_full_api We check here and pass |
| # a client option if the unlink flush is safe to use. |
| if ("${ops} ${TEST_OPTIONS}" MATCHES "(-thread_private|-enable_full_api)") |
| set(cli_ops "use_unlink") |
| endif () |
| endif ("${test}" MATCHES "client\\.flush") |
| # note that we cannot use double quotes as they'll be stripped out |
| if (DEFINED ${test}_toolname) |
| # end-user tool |
| torun("${name}" ${test} ${${test}_source} OFF OFF |
| "${${test}_dr_ops};${ops};-t;${${test}_toolname};${cli_ops}" |
| "${${test}_exe_ops}" added OFF) |
| else () |
| # simple client |
| torun("${name}" ${test} ${${test}_source} OFF OFF |
| "${${test}_dr_ops};${ops};-c;${${test}_client_path};${cli_ops}" |
| "${${test}_exe_ops}" added OFF) |
| endif () |
| if (added) |
| set_properties(${name} ${test} ${myprefix}) |
| endif (added) |
| endfunction(torun_ci) |
| |
| function(torun_api name test ops) |
| strings2lists(${test} ops) |
| torun("${name}" ${test} ${${test}_source} ON ${${test}_standalone_dr} |
| "${${test}_dr_ops};${ops}" "${${test}_exe_ops}" added ${${test}_pass_opts_via_env}) |
| endfunction(torun_api) |
| |
| function(torunonly_native name realexe expect source exe_ops) |
| strings2lists(${name} ops) |
| set(${name}_expectbase ${expect}) |
| set(${name}_realtest ${realexe}) |
| if (NOT DEFINED ${test}_timeout) |
| # We're not going through drrun with its timeout, so set the ctest timeout. |
| set(${test}_timeout ${TEST_SECONDS}) |
| endif () |
| torun(${name} ${name} ${source} ON OFF "" "${exe_ops}" added OFF) |
| endfunction(torunonly_native) |
| |
| function(torun_runall name test ops) |
| strings2lists(${test} ops) |
| # FIXME NYI i#120 |
| endfunction(torun_runall) |
| |
| function(disable_optimizations_for_file source_file) |
| get_source_file_property(cflags "${source_file}" COMPILE_FLAGS) |
| string(REGEX REPLACE "[/-]O[1-9]" "" cflags "${cflags}") |
| set_source_files_properties("${source_file}" PROPERTIES |
| COMPILE_FLAGS "${cflags}") |
| endfunction(disable_optimizations_for_file) |
| |
| # Some of our tests were created for /MT which was the top-level flag even |
| # in debug build until recently, so we go back to it to avoid breaking them. |
| function(use_MT_not_MTd source_file) |
| if (WIN32) |
| # Appending to the target flags goes in too early: we need source to |
| # override the /MTd from the top level. |
| append_property_string(SOURCE ${source_file} COMPILE_FLAGS "/MT /DNO_DBG_CRT") |
| endif () |
| endfunction() |
| |
| function(use_MD_not_MTd source_file) |
| if (WIN32) |
| # Appending to the target flags goes in too early: we need source to |
| # override the /MTd from the top level. |
| append_property_string(SOURCE ${source_file} COMPILE_FLAGS "/MD") |
| endif () |
| endfunction() |
| |
| # The -O3 flag is removed above with the |
| # string(REGEX REPLACE "-O[0-9]? " " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") |
| # line. -O3 is then selectively re-added with this function or add_sve_flags(). |
| # It will be desirable to one day remove the "REGEX REPLACE" line and just |
| # remove -O3 for targets that cannot support it. |
| function(optimize target) |
| if (UNIX) |
| append_property_string(TARGET ${target} COMPILE_FLAGS "-O3") |
| else () |
| append_property_string(TARGET ${target} COMPILE_FLAGS "/Ox /GL") |
| endif (UNIX) |
| endfunction(optimize) |
| |
| macro(set_avx_flags target) |
| if (proc_supports_avx512) |
| if (TARGET ${target}) # Support calling on non-exe target. |
| append_property_string(TARGET ${target} COMPILE_FLAGS "${CFLAGS_AVX512}") |
| endif () |
| set(${target}_runavx512 1) |
| elseif (proc_supports_avx) |
| if (TARGET ${target}) # Support calling on non-exe target. |
| append_property_string(TARGET ${target} COMPILE_FLAGS "${CFLAGS_AVX}") |
| endif () |
| set(${target}_runavx 1) |
| endif () |
| endmacro(set_avx_flags) |
| |
| macro(set_sve_flags target) |
| if (proc_supports_sve2) |
| if (TARGET ${target}) # Support calling on non-exe target. |
| append_property_string(TARGET ${target} COMPILE_FLAGS "${CFLAGS_SVE2}") |
| endif () |
| set(${target}_runsve2 1) |
| elseif (proc_supports_sve) |
| if (TARGET ${target}) # Support calling on non-exe target. |
| append_property_string(TARGET ${target} COMPILE_FLAGS "${CFLAGS_SVE}") |
| endif () |
| set(${target}_runsve 1) |
| endif () |
| endmacro(set_sve_flags) |
| |
| ########################################################################### |
| |
| # We'll want the latest CTest (2.6.4) so we can use the -W parameter |
| # for wider test name fields as ours include the runtime options and |
| # app name. |
| |
| function(ops2testprefix prefix ops) |
| string(REGEX REPLACE " [^-][^ ]*" "" name "${ops}") |
| string(REGEX REPLACE " +-" "," name "${name}") |
| string(REGEX REPLACE "^-" "" name "${name}") |
| string(STRIP "${name}" name) |
| # want it grouped by run, not by test, and it auto-alpha-sorts |
| set(${prefix} "${name}|" PARENT_SCOPE) |
| endfunction(ops2testprefix) |
| |
| function(run2testname testname ops test) |
| ops2testprefix(prefix "${ops}") |
| # want it grouped by run, not by test, and it auto-alpha-sorts |
| set(${testname} "${prefix}${test}" PARENT_SCOPE) |
| endfunction(run2testname) |
| |
| function(is_test_enabled_by_name output name regex) |
| set(enabled OFF) |
| if (NOT SKIP_FLAKY_TESTS OR NOT "${name}" MATCHES "_FLAKY") |
| if (TEST_LONG OR NOT "${name}" MATCHES "_LONG") |
| if (RUN_SUDO_TESTS OR NOT "${name}" MATCHES "_SUDO") |
| if (NOT regex OR "${name}" MATCHES "${regex}") |
| if (SKIP_LESS_DIFFERENTIATED_TESTS_FOR_PULL_REQUEST AND |
| # See above: for particular builds we skip some of the similar tests from |
| # some of the test groups. |
| (("${name}" MATCHES "tool.drcache" AND |
| NOT "${name}" MATCHES "(simple|invariants|burst_malloc|burst_replaceall)") OR |
| ("${name}" MATCHES "tool.drcpusim" AND |
| NOT "${name}" MATCHES "Pentium3") OR |
| ("${name}" MATCHES "tool.[^d]" AND |
| NOT "${name}" MATCHES "(basic_counts|reuse_offline)") OR |
| # instrcalls is the slowest of the samples. |
| "${name}" MATCHES "sample.instrcalls" OR |
| ("${name}" MATCHES "client.annotation-" AND |
| NOT "${name}" MATCHES "(-opt|tiny-bb)"))) |
| set(enabled OFF) |
| else () |
| set(enabled ON) |
| endif () |
| endif () |
| endif () |
| endif () |
| endif () |
| set(${output} ${enabled} PARENT_SCOPE) |
| endfunction () |
| |
| macro (set_up_test_lists) |
| foreach (run ${run_list}) |
| set(enabled OFF) |
| |
| string(REGEX MATCHALL "^SHORT::" is_short "${run}") |
| string(REGEX REPLACE "^SHORT::" "" run "${run}") |
| if (is_short OR TEST_LONG) |
| set(enabled ON) |
| endif (is_short OR TEST_LONG) |
| |
| string(REGEX MATCHALL "^DEBUG::" is_debug "${run}") |
| string(REGEX REPLACE "^DEBUG::" "" run "${run}") |
| if (is_debug AND NOT DEBUG) |
| set(enabled OFF) |
| endif (is_debug AND NOT DEBUG) |
| |
| string(REGEX MATCHALL "^X86::" is_x86 "${run}") |
| string(REGEX REPLACE "^X86::" "" run "${run}") |
| if (is_x86 AND NOT X86) |
| set(enabled OFF) |
| endif () |
| |
| string(REGEX MATCHALL "^X64::" is_x64 "${run}") |
| string(REGEX REPLACE "^X64::" "" run "${run}") |
| if (is_x64 AND NOT X64) |
| set(enabled OFF) |
| endif () |
| |
| string(REGEX MATCHALL "^WIN::" is_win "${run}") |
| string(REGEX REPLACE "^WIN::" "" run "${run}") |
| if (is_win AND UNIX) |
| set(enabled OFF) |
| endif (is_win AND UNIX) |
| |
| string(REGEX MATCHALL "^LIN::" is_lin "${run}") |
| string(REGEX REPLACE "^LIN::" "" run "${run}") |
| if (is_lin AND WIN32) |
| set(enabled OFF) |
| endif (is_lin AND WIN32) |
| |
| if (enabled) |
| |
| string(REGEX MATCHALL "^ONLY::.*::" regex "${run}") |
| string(REGEX REPLACE "^ONLY::.*::" "" run "${run}") |
| string(REGEX REPLACE "^ONLY::(.*)::" "\\1" regex "${regex}") |
| |
| if (NOT is_short) |
| # FIXME i#1807: fix the failing long suite tests so we can enable them once again |
| # in our nightly regression runs. For now we disable the extra tests (but |
| # we leave the extra builds selected in runsuite.cmake) by throttling |
| # all long tests to only run ^common. |
| set(regex "^common") |
| endif () |
| |
| ops2testprefix(prefix "${run}") |
| list(FIND prior_prefixes "${prefix}" index) |
| if (${index} EQUAL -1) |
| list(APPEND prior_prefixes "${prefix}") |
| endif () |
| foreach (test ${testlist_normal}) |
| is_test_enabled_by_name(name_ok ${test} "${regex}") |
| if (name_ok) |
| run2testname(test_name "${run}" ${test}) |
| torun_normal("${test_name}" ${test} "${run}") |
| endif () |
| endforeach (test) |
| foreach (test ${testlist_ci}) |
| is_test_enabled_by_name(name_ok ${test} "${regex}") |
| if (name_ok) |
| run2testname(test_name "${run}" ${test}) |
| torun_ci("${test_name}" ${test} "${run}") |
| endif () |
| endforeach (test) |
| foreach (test ${testlist_api}) |
| is_test_enabled_by_name(name_ok ${test} "${regex}") |
| if (name_ok) |
| run2testname(test_name "${run}" ${test}) |
| torun_api("${test_name}" ${test} "${run}") |
| endif () |
| endforeach (test) |
| foreach (test ${testlist_runall}) |
| is_test_enabled_by_name(name_ok ${test} "${regex}") |
| if (name_ok) |
| run2testname(test_name "${run}" ${test}) |
| torun_runall("${test_name}" ${test} "${run}") |
| endif () |
| endforeach (test) |
| |
| endif (enabled) |
| endforeach(run) |
| endmacro () |
| |
| ########################################################################### |
| # tests |
| |
| # This step takes a while so we provide a status message: |
| message(STATUS "Processing tests and generating expected output patterns") |
| |
| # Tests enabled when DR_HOST_NOT_TARGET go first: |
| if (ARM) |
| set(sfx "arm") |
| elseif (AARCH64) |
| set(sfx "aarch64") |
| elseif (RISCV64) |
| set(sfx "riscv64") |
| else () |
| set(sfx "x86") |
| endif () |
| if (NOT ANDROID) |
| # XXX i#1874: get working on Android |
| tobuild_api(api.ir api/ir_${sfx}.c "" "" OFF OFF OFF) |
| if (AARCH64 OR RISCV64) |
| # The ir_{aarch64,riscv64}.expect file is too large for CMake's regexes. |
| set(api.ir_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runcmp.cmake") |
| set(api.ir_runcmp_capture "stderr") |
| endif () |
| # XXX i#1686: add ARM's headers too once they are all created |
| if (NOT ARM AND NOT AARCH64 AND NOT RISCV64 AND "${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") |
| # CMake's Unix Makefiles dependence analysis doesn't run the preprocessor |
| # and so doesn't find headers named via macros |
| # (http://www.cmake.org/Bug/view.php?id=13718) |
| set(api_ir_headers # must be full paths: |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_0args.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_1args.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_2args.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_2args_mm.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_3args.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_4args.h |
| # The following headers are x86 specific. |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_3args_avx.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_2args_avx512_evex.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_2args_avx512_vex.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_3args_avx512_evex.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_3args_avx512_evex_mask.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_3args_avx512_vex.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_4args_avx512_evex_mask_A.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_4args_avx512_evex_mask_B.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_4args_avx512_evex_mask_C.h |
| ${CMAKE_CURRENT_SOURCE_DIR}/api/ir_${sfx}_5args_avx512_evex_mask.h) |
| append_property_string(SOURCE api/ir_${sfx}.c OBJECT_DEPENDS "${api_ir_headers}") |
| endif () |
| |
| if (AARCH64) |
| tobuild_api(api.ir_negative api/ir_aarch64_negative.c "" "" OFF OFF OFF) |
| tobuild_api(api.ir_v81 api/ir_aarch64_v81.c "" "" OFF OFF OFF) |
| tobuild_api(api.ir_v82 api/ir_aarch64_v82.c "" "" OFF OFF OFF) |
| tobuild_api(api.ir_v83 api/ir_aarch64_v83.c "" "" OFF OFF OFF) |
| tobuild_api(api.ir_v84 api/ir_aarch64_v84.c "" "" OFF OFF OFF) |
| tobuild_api(api.ir_v85 api/ir_aarch64_v85.c "" "" OFF OFF OFF) |
| tobuild_api(api.ir_v86 api/ir_aarch64_v86.c "" "" OFF OFF OFF) |
| tobuild_api(api.ir_sve api/ir_aarch64_sve.c "" "" OFF OFF OFF) |
| tobuild_api(api.ir_sve2 api/ir_aarch64_sve2.c "" "" OFF OFF OFF) |
| endif (AARCH64) |
| endif () |
| |
| # test static decoder library |
| tobuild_api(api.ir-static api/ir_${sfx}.c "" "" ON OFF OFF) |
| if (AARCH64) |
| # The ir_aarch64.expect file is too large for CMake's regexes. |
| set(api.ir-static_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runcmp.cmake") |
| set(api.ir-static_runcmp_capture "stderr") |
| elseif (RISCV64) |
| # The ir_riscv64.expect file is too large for CMake's regexes. |
| set(api.ir-static_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runcmp.cmake") |
| set(api.ir-static_runcmp_capture "stderr") |
| # Internal error lines are ignored as they are not printed in static builds. |
| set(api.ir-static_runcmp_ignore_matching_lines "^<.+>") |
| endif () |
| |
| if (ARM) |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| tobuild_api(api.drdecode api/drdecode_arm.c "" "" ON OFF OFF) |
| endif () |
| elseif (AARCH64) |
| tobuild_api(api.drdecode api/drdecode_aarch64.c "" "" ON OFF OFF) |
| else () |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_api(api.drdecode api/drdecode_x86.c "" "" ON OFF OFF) |
| endif (NOT RISCV64) |
| endif () |
| |
| if (BUILD_CLIENTS) |
| ########################################################################### |
| # drdisas tests |
| # XXX: We should try to export or share the test list, filtering, matching, |
| # and other code here to support tests being declared locally rather than |
| # in one central place. |
| if (AARCH64) |
| set(drdisas_args "-vl" "256" "00000000" "f94017a0" "a9be7bfd" "e58057a1" "85865e6b" "88") |
| elseif (ARM) |
| set(drdisas_args "6813" "f243" "42c8" "b2db" "88") |
| elseif (RISCV64) |
| set(drdisas_args "853e" "4581" "1d27b783" "00f55733" "9d89" "88") |
| else () |
| set(drdisas_args "-syntax" "dr" "66" "90" "c4" "e2" "65" "90" "14" "80" "88") |
| endif () |
| torunonly_api(tool.drdisas drdisas |
| "../../clients/drdisas/test_simple.template" "" "${drdisas_args}" ON OFF) |
| if (ARM) |
| torunonly_api(tool.drdisas_thumb drdisas |
| # Pass -thumb as a "DR op" to define it in the .template file. |
| "../../clients/drdisas/test_simple.template" |
| "-thumb" "-mode;thumb;${drdisas_args}" ON OFF) |
| endif () |
| # Test syntax |
| # XXX i#:4021: ARM/AARCH64 not yet supported. |
| if (X86) |
| set(drdisas_args "66" "90" "c4" "e2" "65" "90" "14" "80") |
| torunonly_api(tool.drdisas_syntax drdisas |
| "../../clients/drdisas/test_syntax.template" "" "${drdisas_args}" ON OFF) |
| endif () |
| endif () |
| |
| if (DR_HOST_NOT_TARGET) |
| # i#1684,i#4318: Test postprocessing and analysis with an alternate binary directory. |
| # Limited to UNIX because the checked-in modules.log is in UNIX format |
| # (Windows needs extra fields per library). |
| # Limited to ZLIB_FOUND because we test gzipped .raw files here as well. |
| if (BUILD_CLIENTS AND UNIX AND ZLIB_FOUND) |
| # We make a writable copy so we can both write the final trace there and run our |
| # analyzer in a single command line. |
| set(srcdir |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.threadsig.aarch64.raw) |
| set(locdir ${PROJECT_BINARY_DIR}/drmemtrace.threadsig.aarch64) |
| file(MAKE_DIRECTORY ${locdir}) |
| file(COPY ${srcdir}/raw DESTINATION ${locdir}/) |
| get_target_path_for_execution(drcachesim_path drcachesim "${location_suffix}") |
| prefix_cmd_if_necessary(drcachesim_path ON ${drcachesim_path}) |
| torunonly_api(tool.drcacheoff.altbindir "${drcachesim_path}" |
| "offline-altbindir.c" "" |
| "-indir;${locdir};-simulator_type;opcode_mix;-alt_module_dir;${srcdir};-module_file;${locdir}/raw/modules.log" |
| OFF OFF) |
| set(tool.drcacheoff.altbindir_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| endif () |
| |
| # The tests are not ported to build with host!=target. Most will never work there, |
| # so rather than spend effort on making everything build when we can only enable |
| # a few tests, we simply enable the few tests here and return, skipping the rest of |
| # the file and avoiding a giant if(). |
| set_up_test_lists() |
| return () |
| endif (DR_HOST_NOT_TARGET) |
| |
| # Make sure we test running a path with spaces (to avoid regressions like i#2538). |
| set(common.broadfun_outname "common.broadfun spaces") |
| tobuild(common.broadfun common/broadfun.c) |
| if (DEBUG) |
| torunonly(common.logstderr common.broadfun common/logstderr.c |
| "-log_to_stderr -loglevel 1 -logmask 2" "") |
| endif () |
| if (NOT ANDROID) # We do not support -no_early_inject on Android (i#1873). |
| tobuild_ops(common.fib common/fib.c "-no_early_inject" "") |
| endif () |
| if (X86) # TODO i#1551, i#1569: port asm to ARM and AArch64 |
| tobuild(common.decode-bad common/decode-bad.c) |
| tobuild(common.decode common/decode.c) |
| if (proc_supports_avx512) |
| set_target_properties(common.decode PROPERTIES COMPILE_FLAGS "${CFLAGS_AVX512}") |
| endif () |
| endif (X86) |
| if (X86) |
| torunonly(common.decode-stress common.decode common/decode.c |
| "-stress_recreate_state" "") |
| elseif (AARCHXX) |
| # The common.decode test is very x86-centric and may never be ported. |
| # For now we simply run a simple app which still exercises quite a bit. |
| torunonly(common.broadfun-stress common.broadfun common/broadfun.c |
| "-stress_recreate_state" "") |
| endif () |
| |
| if (X86) |
| set(control_flags "eflags") |
| elseif (AARCHXX) |
| set(control_flags "nzcv") |
| elseif (RISCV64) |
| # XXX: RISC-V does not have control flags, so a dummy test is used. |
| set(control_flags "hello") |
| endif () |
| tobuild(common.${control_flags} common/${control_flags}.c) |
| |
| if (X86) # FIXME i#1551, i#1569: port asm to ARM and AArch64 |
| tobuild(common.floatpc common/floatpc.c) |
| torunonly(common.floatpc_xl8all common.floatpc common/floatpc.c "-translate_fpu_pc" "") |
| endif (X86) |
| tobuild(common.getretaddr common/getretaddr.c) |
| |
| if (X86) # FIXME i#1551, i#1569: port asm to ARM and AArch64 |
| # XXX i#1287: implement for MacOS |
| # We do not support -no_early_inject on Android (i#1873). |
| # FIXME i#1799: clang does not support "asm goto". |
| if (NOT APPLE AND NOT ANDROID AND ANNOTATIONS AND NOT CMAKE_COMPILER_IS_CLANG) |
| # XXX i#1651: we don't support -native_exec combined with -early_inject so |
| # for now we pass -no_early_inject to all of these tests. |
| tobuild_appdll(common.nativeexec common/nativeexec.c) |
| DynamoRIO_get_full_path(native_dll_name common.nativeexec.appdll "${location_suffix}") |
| get_filename_component(native_dll_name "${native_dll_name}" NAME) |
| tobuild_ops(common.nativeexec common/nativeexec.c |
| "-no_early_inject -native_exec_list ${native_dll_name}" "") |
| target_link_libraries(common.nativeexec common.nativeexec.appdll) |
| # We want rpath on Linux so we can load the appdll. |
| set_target_properties(common.nativeexec PROPERTIES SKIP_BUILD_RPATH OFF) |
| # For common.nativeexec takeover tests, we do not support PIE. Newer (unix-) distri- |
| # butions with toolchains may enable PIE by default. In order to be able take over the |
| # "PLT style" dll call (test with executable in native exec list), we expect the call |
| # to jump to a PLT stub first. However with PIE enabled, the compiler will generate a |
| # rip-relative gotplt table call instead. |
| if (UNIX AND no_pie_avail) |
| set_source_files_properties(common/nativeexec.c PROPERTIES COMPILE_FLAGS |
| "${CMAKE_C_FLAGS} -fno-pie") |
| append_link_flags(common.nativeexec "-no-pie") |
| endif() |
| if (UNIX) |
| # FIXME i#978: Windows support NYI |
| torunonly(common.nativeexec_retakeover common.nativeexec common/nativeexec.c |
| "-no_early_inject -native_exec_list ${native_dll_name} -native_exec_retakeover" |
| "") |
| torunonly(common.nativeexec_exe common.nativeexec |
| common/nativeexec_exenative.c |
| "-no_early_inject -native_exec_list common.nativeexec -native_exec_retakeover" "") |
| torunonly(common.nativeexec_bindnow common.nativeexec common/nativeexec_exenative.c |
| "-no_early_inject -native_exec_list common.nativeexec -native_exec_retakeover" |
| "-bind_now") |
| # XXX: the next 3 tests, and perhaps all of these native_exec tests, |
| # really want a mode with -no_private_loader -no_mangle_app_seg. With |
| # our reluctance to add lib deps back to DR, that's going to require a |
| # sepaparate build. Until someone really focuses on hybrid mode again |
| # (in which case a new build param should be added to re-enable libdl), |
| # we leave the tests here as regression tests but w/ private loader in place. |
| torunonly(common.nativeexec_retakeover_opt common.nativeexec common/nativeexec.c |
| "-no_early_inject -native_exec_list ${native_dll_name} -native_exec_retakeover -native_exec_opt -no_kstats" "") |
| # No swap TLS and no kstats for optimized native_exec |
| torunonly(common.nativeexec_exe_opt common.nativeexec common/nativeexec_exenative.c |
| "-no_early_inject -native_exec_list common.nativeexec -native_exec_retakeover -native_exec_opt -no_kstats" "") |
| torunonly(common.nativeexec_bindnow_opt common.nativeexec |
| common/nativeexec_exenative.c |
| "-no_early_inject -native_exec_list common.nativeexec -native_exec_retakeover -native_exec_opt -no_kstats" "-bind_now") |
| endif () |
| endif () |
| |
| # App seg mangling makes dstack test fail, and our default build does not |
| # support disabling such mangling, so this test is Windows-only. |
| if (WIN32) |
| tobuild_ops(common.protect-dstack common/protect-dstack.c |
| "-no_mangle_app_seg" "") |
| endif () |
| endif (X86) |
| |
| if (NOT ANDROID) # FIXME i#1874: failing on Android |
| tobuild(common.segfault common/segfault.c) |
| endif () |
| |
| # PR 217255: these 4 removed to shorten the regression suite since not |
| # adding much value in terms of testing corner cases |
| #tobuild(common.hello common/hello.c) |
| #tobuild(common.conflict common/conflict.c) |
| #tobuild(common.ops common/ops.c) |
| #tobuild(common.recurse common/recurse.c) |
| |
| # XXX i#1874: Android loader won't run our static asm apps |
| if (DR_HOST_ARM AND NOT ANDROID) |
| tobuild_ops(common.allasm_thumb common/allasm_thumb.asm |
| # set small -max_bb_instrs to test bb_safe_to_stop() |
| "-early_inject -max_bb_instrs 6" "") |
| set_target_properties(common.allasm_thumb PROPERTIES LINKER_LANGUAGE C) |
| append_link_flags(common.allasm_thumb |
| "-nostartfiles -nodefaultlibs -static") |
| |
| tobuild_ops(common.allasm_arm common/allasm_arm.asm "-early_inject" "") |
| set_target_properties(common.allasm_arm PROPERTIES LINKER_LANGUAGE C) |
| append_link_flags(common.allasm_arm "-nostartfiles -nodefaultlibs -static") |
| endif () |
| |
| if (DR_HOST_AARCH64) |
| if (NOT APPLE) # TODO i#5383: Port to Mac M1. |
| tobuild_ops(common.allasm_aarch64_isa common/allasm_aarch64_isa.asm |
| "-early_inject" "") # FIXME i#1569: -enable_traces here |
| set_target_properties(common.allasm_aarch64_isa PROPERTIES LINKER_LANGUAGE C) |
| append_link_flags(common.allasm_aarch64_isa |
| "-nostartfiles -nodefaultlibs -static") |
| endif () |
| |
| tobuild_ops(common.allasm_aarch64_cache common/allasm_aarch64_cache.asm |
| "-early_inject" "") |
| append_pure_asm_app_link_flags(common.allasm_aarch64_cache) |
| |
| add_exe(allasm_aarch64_prefetch |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/allasm_aarch64_prefetch.asm |
| "-early_inject" "") |
| append_pure_asm_app_link_flags(allasm_aarch64_prefetch) |
| |
| add_exe(allasm_aarch64_flush |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/allasm_aarch64_flush.asm "" "") |
| append_pure_asm_app_link_flags(allasm_aarch64_flush) |
| endif () |
| |
| if (DEBUG) |
| # A high-loglevel test. |
| if (DR_HOST_X86 AND DR_HOST_X64) |
| # Unfortunately it's not possible to create a tiny app on Windows, and hello,world |
| # at -loglevel 19 produces 11GB of data and takes >17 minutes to run (vs <10MB and |
| # <1s for Linux). We live w/o a regression test on Windows for high loglevels. |
| if (LINUX) |
| torunonly(common.loglevel allasm_x86_64 common/allasm_x86_64.asm "-loglevel 19" "") |
| endif () |
| elseif (DR_HOST_AARCH64) |
| torunonly(common.loglevel common.allasm_aarch64_cache |
| common/allasm_aarch64_cache.asm "-loglevel 19" "") |
| elseif (DR_HOST_ARM AND NOT ANDROID) |
| torunonly(common.loglevel common.allasm_thumb |
| common/allasm_thumb.asm "-loglevel 19" "") |
| endif () |
| endif () |
| |
| if (DEBUG) |
| torunonly(common.no_global_stats_LONG ${ci_shared_app} ${ci_shared_app_src} "-no_global_stats" "") |
| else (DEBUG) |
| torunonly(common.no_global_stats_LONG ${ci_shared_app} ${ci_shared_app_src} "-no_global_rstats" "") |
| endif (DEBUG) |
| |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| # We don't want to link with DR. We hack that for now by requesting drdecode so |
| # we'll get the arch defs. XXX: Add a better way! |
| tobuild_api(libutil.frontend_test libutil/frontend_test.c "" "" ON OFF OFF) |
| target_link_libraries(libutil.frontend_test drfrontendlib) |
| endif () |
| |
| set(dr_root ${PROJECT_BINARY_DIR}) |
| # Just like frontend_test we request drdecode. |
| tobuild_api(libutil.drconfig_test libutil/drconfig_test.c "" "${dr_root}" ON OFF OFF) |
| target_link_libraries(libutil.drconfig_test drconfiglib) |
| if (WIN32) |
| # We have to copy drconfiglib.dll into the bin dir. |
| add_dependencies(libutil.drconfig_test drcopy) |
| endif () |
| |
| set(BUILD_TEST_ANNOTATION "${PROJECT_BINARY_DIR}/suite/tests/annotations") |
| configure_file( |
| "${CMAKE_CURRENT_SOURCE_DIR}/client-interface/annotation/test_mode_annotations.h" |
| "${BUILD_TEST_ANNOTATION}/test_mode_annotations.h" COPYONLY) |
| configure_file( |
| "${CMAKE_CURRENT_SOURCE_DIR}/client-interface/annotation/test_mode_annotations.c" |
| "${BUILD_TEST_ANNOTATION}/test_mode_annotations.c" COPYONLY) |
| configure_file( |
| "${CMAKE_CURRENT_SOURCE_DIR}/client-interface/annotation/test_annotation_arguments.h" |
| "${BUILD_TEST_ANNOTATION}/test_annotation_arguments.h" COPYONLY) |
| configure_file( |
| "${CMAKE_CURRENT_SOURCE_DIR}/client-interface/annotation/test_annotation_arguments.c" |
| "${BUILD_TEST_ANNOTATION}/test_annotation_arguments.c" COPYONLY) |
| |
| include_directories("${PROJECT_BINARY_DIR}/include/annotations") |
| include_directories("${PROJECT_BINARY_DIR}/suite/tests/annotations") |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.call-retarget client-interface/call-retarget.c "" "" "") |
| tobuild_ci(client.int64_overrides client-interface/int64_overrides.c "" "" "") |
| endif () |
| if (X86) # FIXME i#1551, i#1569: port to ARM and AArch64 |
| set(client.abort_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runcode.cmake") |
| set(client.abort_code "8") |
| tobuild_ci(client.abort client-interface/abort.c "" "" "") |
| endif (X86) |
| tobuild_ci(client.crashmsg client-interface/crashmsg.c "" "" "") |
| if (UNIX) # XXX i#2595: NYI on Windows |
| tobuild_ci(client.stack-overflow client-interface/stack-overflow.c "" |
| # To avoid flakiness on different systems we nail down the stack size: |
| "-stack_size 64K" "") |
| endif () |
| # FIXME i#1360: implement Mach-O export iterator |
| # FIXME i#2008: fix bugs on Android |
| if (NOT MACOS AND NOT ANDROID) |
| tobuild_appdll(client.modules client-interface/modules.c) |
| DynamoRIO_get_full_path(modules_libname client.modules.appdll "${location_suffix}") |
| tobuild_ci(client.modules client-interface/modules.c "" "" "${modules_libname}") |
| endif () |
| if (X86) # FIXME i#1551, i#1569: port to ARM and AArch64 |
| tobuild_ci(client.alloc client-interface/alloc.c "" |
| # For the subtest "targeting upper 2GB of low 4GB" we move -vm_base out of the |
| # way. We also raise the checklevel so we get memory filling for client allocs. |
| # We keep vmheap_size at 2G to more easily trigger OOM. |
| "-no_vm_base_near_app -vm_base 0x120000000 -vmheap_size 2G -checklevel 3" "") |
| # A second test for i#4335's OOM despite a reset. We leave checklevel for CI speed. |
| tobuild_ci(client.alloc-noreset client-interface/alloc.c "" |
| "-no_enable_reset -no_vm_base_near_app -vm_base 0x120000000 -vmheap_size 2G" "") |
| # XXX i#1312, i#3504: The test doesn't currently compile with CFLAGS_AVX512 but |
| # attempts to test features based on it. The compile flag needs to be added. |
| tobuild_ci(client.cleancall client-interface/cleancall.c "" "" "") |
| if (proc_supports_avx512) |
| append_property_string(TARGET client.cleancall.dll COMPILE_FLAGS "${CFLAGS_AVX512}") |
| endif () |
| if (UNIX) |
| torunonly_ci(client.cleancall.prof-pcs client.cleancall client.cleancall.dll |
| client-interface/cleancall.c "" "-prof_pcs -opt_cleancall 0" "") |
| if (NOT X64) |
| torunonly_ci(client.cleancall.prof-pcs.thread-private |
| client.cleancall client.cleancall.dll |
| client-interface/cleancall.c "" "-thread_private -prof_pcs -opt_cleancall 0" "") |
| endif (NOT X64) |
| endif (UNIX) |
| tobuild_ci(client.count-ctis client-interface/count-ctis.c "" "" "") |
| # check dr_insert_cbr_instrumentation with out-of-line clean call |
| torunonly_ci(client.count-ctis-noopt client.count-ctis client.count-ctis.dll |
| client-interface/count-ctis.c "" "-opt_cleancall 0" "") |
| tobuild_ci(client.syscall client-interface/syscall.c "" "-no_follow_children" "") |
| tobuild_ci(client.count-bbs client-interface/count-bbs.c "" "" "") |
| endif (X86) |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.cleancallparams client-interface/cleancallparams.c "" "" "") |
| tobuild_ci(client.app_inscount client-interface/app_inscount.c "" "" "") |
| endif (NOT RISCV64) |
| if (NOT WIN32) # FIXME i#1717: add Windows client C++ EH support |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| tobuild_ci(client.exception client-interface/exception.cpp "" "" "") |
| if (UNIX) |
| # This test deliberately crashes: disable the compiler warning about it. |
| CHECK_C_COMPILER_FLAG("-Wno-array-bounds" noarray_avail) |
| if (noarray_avail) |
| append_property_string(TARGET client.exception.dll |
| COMPILE_FLAGS "-Wno-array-bounds") |
| endif () |
| endif () |
| endif () |
| endif () |
| |
| if (UNIX) |
| set(annotation_test_args "libclient.annotation-concurrency.appdll.so" "A" "4") |
| set(annotation_test_args_shorter |
| "libclient.annotation-concurrency.appdll.so" "A" "4" "64" "3") |
| else (UNIX) |
| set(annotation_test_args "client.annotation-concurrency.appdll.dll" "A" "4") |
| set(annotation_test_args_shorter |
| "client.annotation-concurrency.appdll.dll" "A" "4" "64" "3") |
| endif (UNIX) |
| # FIXME i#1799: clang does not support "asm goto" |
| if (ANNOTATIONS AND NOT CMAKE_COMPILER_IS_CLANG) |
| set(DynamoRIO_USE_LIBC OFF) |
| tobuild_ci(client.annotation-concurrency client-interface/annotation-concurrency.c |
| "" "" "${annotation_test_args}") |
| tobuild_appdll(client.annotation-concurrency |
| client-interface/annotation-concurrency.c) |
| link_with_pthread(client.annotation-concurrency) |
| # i#1681: on a many-core machine this test can hit the 1-min timeout |
| set(client.annotation-concurrency_timeout 120) |
| set(client.annotation-concurrency.full-decode_expectbase |
| "annotation-concurrency.full-decode") |
| torunonly_ci(client.annotation-concurrency.full-decode client.annotation-concurrency |
| client.annotation-concurrency.dll client-interface/annotation-concurrency.c |
| "full-decode" "" "${annotation_test_args}") |
| # i#1681: on a many-core machine this test can hit the 1-min timeout |
| set(client.annotation-concurrency.full-decode_timeout 120) |
| set(client.annotation-concurrency.full-decode.tiny-bb_expectbase |
| "annotation-concurrency.full-decode") |
| torunonly_ci(client.annotation-concurrency.full-decode.tiny-bb |
| client.annotation-concurrency client.annotation-concurrency.dll |
| client-interface/annotation-concurrency.c "full-decode" "-max_bb_instrs 2" |
| "${annotation_test_args}") |
| # i#1681: on a many-core machine this test can hit the 1-min timeout |
| set(client.annotation-concurrency.full-decode.tiny-bb_timeout 120) |
| set(client.annotation-concurrency.bb-truncate-1_expectbase |
| "annotation-concurrency.bb-truncate") |
| torunonly_ci(client.annotation-concurrency.bb-truncate-1 client.annotation-concurrency |
| client.annotation-concurrency.dll client-interface/annotation-concurrency.c |
| "truncate@1" "" "${annotation_test_args}") |
| # i#1681: on a many-core machine this test can hit the 1-min timeout |
| set(client.annotation-concurrency.bb-truncate-1_timeout 120) |
| set(client.annotation-concurrency.bb-truncate-2_expectbase |
| "annotation-concurrency.bb-truncate") |
| torunonly_ci(client.annotation-concurrency.bb-truncate-2 client.annotation-concurrency |
| client.annotation-concurrency.dll client-interface/annotation-concurrency.c |
| "truncate@2" "" "${annotation_test_args}") |
| # i#1681: on a many-core machine this test can hit the 1-min timeout |
| set(client.annotation-concurrency.bb-truncate-2_timeout 120) |
| |
| if (UNIX) |
| set(client.annotation-concurrency.prof-pcs_timeout 120) |
| set(client.annotation-concurrency.prof-pcs_expectbase |
| "annotation-concurrency.full-decode") |
| torunonly_ci(client.annotation-concurrency.prof-pcs client.annotation-concurrency |
| client.annotation-concurrency.dll client-interface/annotation-concurrency.c |
| "full-decode" "-prof_pcs" "${annotation_test_args}") |
| if (NOT X64) |
| set(client.annotation-concurrency.prof-pcs.thread-private_timeout 120) |
| set(client.annotation-concurrency.prof-pcs.thread-private_expectbase |
| "annotation-concurrency.full-decode") |
| torunonly_ci(client.annotation-concurrency.prof-pcs.thread-private |
| client.annotation-concurrency |
| client.annotation-concurrency.dll client-interface/annotation-concurrency.c |
| "full-decode" "-thread_private -prof_pcs" "${annotation_test_args}") |
| endif (NOT X64) |
| endif (UNIX) |
| |
| if (UNIX) |
| set(annotation_opt_args "libclient.annotation-concurrency-opt.appdll.so" "A" "4") |
| else (UNIX) |
| set(annotation_opt_args "client.annotation-concurrency-opt.appdll.dll" "A" "4") |
| endif (UNIX) |
| tobuild_ci(client.annotation-concurrency-opt client-interface/annotation-concurrency.c |
| "" "" "${annotation_opt_args}") |
| optimize(client.annotation-concurrency-opt) |
| tobuild_appdll(client.annotation-concurrency-opt |
| client-interface/annotation-concurrency.c) |
| optimize(client.annotation-concurrency-opt.appdll) |
| link_with_pthread(client.annotation-concurrency-opt) |
| # i#1681: on a many-core machine this test can hit the 1-min timeout |
| set(client.annotation-concurrency-opt_timeout 120) |
| set(client.annotation-concurrency-opt.full-decode_expectbase |
| "annotation-concurrency.full-decode") |
| torunonly_ci(client.annotation-concurrency-opt.full-decode |
| client.annotation-concurrency-opt client.annotation-concurrency-opt.dll |
| client-interface/annotation-concurrency.c "full-decode" "" "${annotation_opt_args}") |
| # i#1681: on a many-core machine this test can hit the 1-min timeout |
| set(client.annotation-concurrency-opt.full-decode_timeout 120) |
| |
| tobuild_ci(client.annotation-detection client-interface/annotation-detection.cpp |
| "" "" "") |
| use_DynamoRIO_extension(client.annotation-detection.dll drmgr) |
| use_DynamoRIO_extension(client.annotation-detection.dll drreg) |
| set(client.annotation-detection.full-decode_expectbase |
| "annotation-detection.full-decode") |
| torunonly_ci(client.annotation-detection.full-decode client.annotation-detection |
| client.annotation-detection.dll client-interface/annotation-detection.c |
| "full-decode" "" "") |
| set(client.annotation-detection.full-decode.tiny-bb_expectbase |
| "annotation-detection.full-decode") |
| torunonly_ci(client.annotation-detection.full-decode.tiny-bb |
| client.annotation-detection client.annotation-detection.dll |
| client-interface/annotation-detection.c "full-decode" "-max_bb_instrs 2" "") |
| set(client.annotation-detection.bb-truncate-1_expectbase |
| "annotation-detection.bb-truncate") |
| torunonly_ci(client.annotation-detection.bb-truncate-1 client.annotation-detection |
| client.annotation-detection.dll client-interface/annotation-detection.c |
| "truncate@1" "" "") |
| set(client.annotation-detection.bb-truncate-2_expectbase |
| "annotation-detection.bb-truncate") |
| torunonly_ci(client.annotation-detection.bb-truncate-2 client.annotation-detection |
| client.annotation-detection.dll client-interface/annotation-detection.c |
| "truncate@2" "" "") |
| torunonly_native(client.annotation-detection.native client.annotation-detection |
| annotation-detection.native client-interface/annotation-detection.c "") |
| |
| set(client.annotation-detection-opt_expectbase "annotation-detection") |
| tobuild_ci(client.annotation-detection-opt client-interface/annotation-detection.cpp |
| "" "" "") |
| use_DynamoRIO_extension(client.annotation-detection-opt.dll drmgr) |
| use_DynamoRIO_extension(client.annotation-detection-opt.dll drreg) |
| optimize(client.annotation-detection-opt) |
| torunonly_native(client.annotation-detection-opt.native |
| client.annotation-detection-opt annotation-detection.native |
| client-interface/annotation-detection.c "") |
| set(DynamoRIO_USE_LIBC ON) |
| else (ANNOTATIONS AND NOT CMAKE_COMPILER_IS_CLANG) |
| # We build the client.annotation-concurrency app even if we have no annotation |
| # support, since it is used in drcachesim tests. |
| add_exe(client.annotation-concurrency |
| client-interface/annotation-concurrency.c) |
| append_property_string(TARGET client.annotation-concurrency COMPILE_FLAGS |
| "-DANNOTATIONS_DISABLED") |
| link_with_pthread(client.annotation-concurrency) |
| tobuild_appdll(client.annotation-concurrency |
| client-interface/annotation-concurrency.c) |
| append_property_string(TARGET client.annotation-concurrency.appdll COMPILE_FLAGS |
| "-DANNOTATIONS_DISABLED") |
| endif (ANNOTATIONS AND NOT CMAKE_COMPILER_IS_CLANG) |
| |
| if (UNIX) |
| # XXX i#1246: Make partial_module_map work for Windows as well. |
| tobuild_ci(client.partial_module_map client-interface/partial_module_map.c "" "" "") |
| endif () |
| if (LINUX AND X86) |
| # XXX i#1833: once i#1833 is fixed, enable code in mbr_instrumentation_segment.dll.c |
| tobuild_ci(client.mbr_instrumentation_segment |
| client-interface/mbr_instrumentation_segment.c "" "" "") |
| use_DynamoRIO_extension(client.mbr_instrumentation_segment.dll drsyms) |
| use_DynamoRIO_extension(client.mbr_instrumentation_segment.dll drmgr) |
| endif() |
| if (NOT ARM) # FIXME i#1551: fix bugs on ARM |
| tobuild_ci(client.segfault client-interface/segfault.c "" "" "") |
| tobuild_ci(client.execfault client-interface/execfault.c "" "" "") |
| tobuild_appdll(client.events client-interface/events.c) |
| DynamoRIO_get_full_path(events_appdll_path client.events.appdll "${location_suffix}") |
| endif (NOT ARM) |
| if (ANNOTATIONS AND NOT ARM) |
| if (UNIX OR NOT X64) # the Valgrind annotation structure cannot support Windows x64 |
| tobuild_ci(client.vg-annot client-interface/vg-annot.c "" "" "") |
| set(client.vg-annot.full-decode_expectbase "vg-annot.full-decode") |
| torunonly_ci(client.vg-annot.full-decode client.vg-annot client.vg-annot.dll |
| client-interface/vg-annot.c "full-decode" "" "") |
| set(client.vg-annot.full-decode.tiny-bb_expectbase "vg-annot.full-decode") |
| torunonly_ci(client.vg-annot.full-decode.tiny-bb client.vg-annot client.vg-annot.dll |
| client-interface/vg-annot.c "full-decode" "-max_bb_instrs 2" "") |
| set(client.vg-annot.bb-truncate-1_expectbase "vg-annot.bb-truncate") |
| torunonly_ci(client.vg-annot.bb-truncate-1 client.vg-annot client.vg-annot.dll |
| client-interface/vg-annot.c "truncate@1" "" "") |
| set(client.vg-annot.bb-truncate-2_expectbase "vg-annot.bb-truncate") |
| torunonly_ci(client.vg-annot.bb-truncate-2 client.vg-annot client.vg-annot.dll |
| client-interface/vg-annot.c "truncate@2" "" "") |
| tobuild_ci(client.vg-annot-opt client-interface/vg-annot.c "" "" "") |
| optimize(client.vg-annot-opt) |
| set(client.vg-annot-opt.full-decode_expectbase "vg-annot.full-decode") |
| torunonly_ci(client.vg-annot-opt.full-decode client.vg-annot-opt client.vg-annot.dll |
| client-interface/vg-annot.c "full-decode" "" "") |
| set(client.vg-annot-opt.full-decode.tiny-bb_expectbase "vg-annot.full-decode") |
| torunonly_ci(client.vg-annot-opt.full-decode.tiny-bb client.vg-annot-opt |
| client.vg-annot.dll client-interface/vg-annot.c |
| "full-decode" "-max_bb_instrs 3" "") |
| set(client.vg-annot-opt.bb-truncate_expectbase "vg-annot.bb-truncate") |
| torunonly_ci(client.vg-annot-opt.bb-truncate client.vg-annot-opt client.vg-annot.dll |
| client-interface/vg-annot.c "truncate@2" "" "") |
| endif (UNIX OR NOT X64) |
| endif (ANNOTATIONS AND NOT ARM) |
| |
| if (NOT ANDROID) # TODO i#38: Port test to Android. |
| tobuild_ci(client.attach_test client-interface/attach_test.runall "" "" "") |
| if ((LINUX OR WIN32) AND NOT RISCV64) |
| tobuild_ci(client.detach_test client-interface/detach_test.runall "" "" "") |
| endif () |
| if (UNIX) |
| # Test attaching during a blocking syscall. |
| torunonly_ci(client.attach_blocking linux.infloop client.attach_test.dll |
| client-interface/attach_blocking.runall "" "" "") |
| endif () |
| endif () |
| |
| if (UNIX) |
| if (NOT ARM) # FIXME i#1551: fix bugs on ARM |
| if (AARCH64) |
| # FIXME i#1569: Reenable when trace construction is implemented. |
| set(trace_arg "-disable_traces") |
| else () |
| # Just happens to not make as many traces. |
| set(trace_arg "-trace_threshold 5") |
| endif () |
| tobuild_ci(client.events client-interface/events.c |
| "" "${trace_arg}" "${events_appdll_path}") |
| tobuild_ci(client.events_cpp client-interface/events_cpp.cpp |
| "" "${trace_arg}" "${events_appdll_path}") |
| tobuild_ci(client.nudge_test client-interface/nudge_test.runall "" "" "") |
| # We disable traces to get bb prefixes for testing i#4669. |
| tobuild_ci(client.timer client-interface/timer.c "" "-disable_traces" "") |
| if (X64) |
| tobuild_ci(client.mangle_suspend client-interface/mangle_suspend.c "" |
| "-vm_base 0x100000000 -no_vm_base_near_app" "") |
| use_DynamoRIO_extension(client.mangle_suspend.dll drmgr) |
| target_include_directories(client.mangle_suspend PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/client-interface) |
| link_with_pthread(client.mangle_suspend) |
| endif () |
| endif (NOT ARM) |
| if (X86 OR AARCH64) # FIXME i#1551: port asm to AArch32 |
| tobuild_ci(client.syscall-mod client-interface/syscall-mod.c "" "" "") |
| endif (X86 OR AARCH64) |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.signal client-interface/signal.c "" "" "") |
| link_with_pthread(client.signal) |
| endif () |
| if (X86) # FIXME i#1551, i#1569: port asm to ARM and AArch64 |
| tobuild_ci(client.cbr-retarget client-interface/cbr-retarget.c "" "" "") |
| endif (X86) |
| tobuild_ci(client.cleancallsig client-interface/cleancallsig.c "" "" "") |
| if (X64 AND NOT RISCV64) # XXX i#3173 Improve testing of emulation API functions |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.emulation_api_simple client-interface/emulation_api_simple.c |
| "" "" "") |
| use_DynamoRIO_extension(client.emulation_api_simple.dll drmgr) |
| endif () |
| else (UNIX) |
| tobuild_ci(client.events client-interface/events.c |
| "" "" "${events_appdll_path}") |
| tobuild_ci(client.events_cpp client-interface/events_cpp.cpp |
| "" "" "${events_appdll_path}") |
| tobuild_ci(client.cbr3 client-interface/cbr3.c "" "" "") |
| tobuild_ci(client.cbr4 client-interface/cbr4.c "" "-thread_private" "") |
| # FIXME i#120: enable these .runall tests once have .runall support |
| #tobuild_ci_runall(client.cbr2 client-interface/cbr2.runall "" "" "") |
| #tobuild_ci_runall(client.cbr client-interface/cbr.runall "" "" "") |
| #tobuild_ci_runall(client.custom_traces client-interface/custom_traces.runall |
| # "" "" "") |
| #tobuild_ci_runall(client.decode-bb client-interface/decode-bb.runall "" "" "") |
| # I reworked Windows .runall support to run the new win32.infloop but have not yet |
| # looked at other tests: |
| tobuild_ci(client.nudge_test client-interface/nudge_test.runall "" "" "") |
| #tobuild_ci_runall(client.pc-check client-interface/pc-check.runall "" "" "") |
| if (NOT X64) |
| # FIXME i#16, does not work in Win-X64 because of inline assembly code. |
| tobuild_ci(client.cbr-retarget client-interface/cbr-retarget.c "" "" "") |
| endif (NOT X64) |
| |
| add_exe(client.fibers client-interface/fibers.c) |
| torunonly_ci(client.fibers client.fibers client.events_cpp.dll |
| client-interface/fibers.c "" "" "") |
| |
| # i#1866: stress our private loader |
| tobuild_ci(client.loader client-interface/loader.c "" "" "") |
| target_link_libraries(client.loader.dll "shlwapi") |
| |
| tobuild_ci(client.winxfer client-interface/winxfer.c "" "" "") |
| endif (UNIX) |
| if (NOT APPLE OR NOT AARCH64) # TODO i#5383: Port to Mac M1. |
| tobuild_ci(client.file_io client-interface/file_io.c |
| "${CMAKE_CURRENT_SOURCE_DIR}/client-interface/file_io_data.txt" "" "") |
| endif () |
| if (X86) # FIXME i#1551, i#1569: port asm to ARM and AArch64 |
| if (DEBUG) # FIXME i#1806: fails in release; also in OSX list below. |
| # we add custom option to flush test based on dr ops in torun_ci() |
| tobuild_ci(client.flush client-interface/flush.c "" "" "") |
| endif () |
| tobuild_ci(client.thread client-interface/thread.c "-paramx -paramy" "" "") |
| tobuild_appdll(client.thread client-interface/thread.c) |
| tobuild_ci(client.strace client-interface/strace.c "" "" "") |
| use_DynamoRIO_extension(client.strace.dll drmgr) |
| endif (X86) |
| # FIXME: PR 199115 to re-enable fragdel, get some more of the UNIX tests working |
| #tobuild_ci(client.fragdel client-interface/fragdel.c "" "" "") |
| if (PROGRAM_SHEPHERDING) |
| tobuild_ci(client.security client-interface/security.c "" "-security_api" "") |
| endif (PROGRAM_SHEPHERDING) |
| if (NOT ARM) # FIXME i#1551: fix bugs on ARM |
| tobuild_ci(client.truncate client-interface/truncate.c "" "" "") |
| if (WIN32) |
| set(client.truncate.thread-churn-1_expectbase "truncate.thread-churn") |
| torunonly_ci(client.truncate.thread-churn-1 win32.threadchurn client.truncate.dll |
| client-interface/truncate.c "1" "" "") |
| set(client.truncate.thread-churn-2_expectbase "truncate.thread-churn") |
| torunonly_ci(client.truncate.thread-churn-2 win32.threadchurn client.truncate.dll |
| client-interface/truncate.c "2" "" "") |
| endif (WIN32) |
| if (NOT AARCH64) # FIXME i#1569: get working on AArch64 |
| tobuild_ci(client.dr_options client-interface/dr_options.c |
| "" "-native_exec_list foo.dll,bar.dll -opt_cleancall 3 -thread_private" "") |
| endif (NOT AARCH64) |
| endif (NOT ARM) |
| tobuild_ci(client.unregister client-interface/unregister.c "" "" "") |
| if (NOT ARM AND NOT RISCV64) # FIXME i#2094: implement cleancall optimizations on ARM |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.cleancall-opt-1 client-interface/cleancall-opt-1.c "" |
| "-opt_cleancall 1" "") |
| if (proc_supports_avx512) |
| # XXX i#1312: This is untested on Windows. |
| tobuild_ci(client.avx512cleancall-opt-1 client-interface/cleancall-opt-1.c "" |
| "-opt_cleancall 1" "") |
| append_property_string(TARGET client.avx512cleancall-opt-1 COMPILE_FLAGS |
| "${CFLAGS_AVX512}") |
| append_property_string(TARGET client.avx512cleancall-opt-1.dll COMPILE_FLAGS |
| "${CFLAGS_AVX512}") |
| endif () |
| |
| tobuild_ci(client.inline client-interface/inline.c "" "-opt_cleancall 3" "") |
| if (CMAKE_COMPILER_IS_CLANG) |
| optimize(client.inline.dll) |
| endif () |
| endif (NOT ARM AND NOT RISCV64) |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| tobuild_ci(client.null_instrument client-interface/null_instrument.c "" "" "") |
| tobuild_appdll(client.null_instrument client-interface/null_instrument.c) |
| target_link_libraries(client.null_instrument client.null_instrument.appdll) |
| # We want rpath on Linux so we can load the appdll. |
| set_target_properties(client.null_instrument PROPERTIES SKIP_BUILD_RPATH OFF) |
| endif () |
| |
| if (NOT ARM) # FIXME i#1551: fix bugs on ARM |
| # Test passing a really long (600 chars) client option string. |
| tobuild_ci(client.large_options client-interface/large_options.c |
| "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" |
| "" "") |
| endif (NOT ARM) |
| |
| add_library(client.blackbox.dll.A SHARED client-interface/blackbox.dll.A.c) |
| setup_test_client_dll_basics(client.blackbox.dll.A) |
| add_library(client.blackbox.dll.B SHARED client-interface/blackbox.dll.B.c) |
| setup_test_client_dll_basics(client.blackbox.dll.B) |
| target_link_libraries(client.blackbox.dll.A client.blackbox.dll.B) |
| torunonly_ci(client.blackbox ${ci_shared_app} client.blackbox.dll.A |
| client-interface/${ci_shared_app} # for .expect |
| "" "" "") |
| |
| tobuild_ci(client.option_parse client-interface/option_parse.cpp |
| "-l;-4;-ll;-3220721071790640321;-ul;4;-ull;1384772493926445887;-x;3;-x_alias;4;-y;quoted string;-z;first;-z_alias;single quotes -dash --dashes;-front;value;-y;accum;-front2;value2;-flag;-flag_alias1;-no_flag_alias2;-takes2;1_of_4;2_of_4;-takes2;3_of_4;4_of_4;-val_sep;v1.1 v1.2;-val_sep;v2.1 v2.2;-val_sep2;v1;v2;-val_sep2;v3;v4;-large_bytesize;9999999999;-oi;-012;-ol;-012;-oll;-012;-ou;012;-oul;012;-oull;012;-xi;-0xa;-xl;-0xa;-xll;-0xa;-xu;0xa;-xul;0xa;-xull;0xa;" |
| "" "") |
| use_DynamoRIO_extension(client.option_parse.dll droption) |
| set(client.option_parse_client_ops_islist ON) |
| |
| if (AARCH64) |
| tobuild_ci(client.features client-interface/features.c "" "" "") |
| |
| tobuild_ci(client.stolen-reg-index client-interface/stolen-reg-index.c "" "" "") |
| use_DynamoRIO_extension(client.stolen-reg-index.dll drmgr) |
| use_DynamoRIO_extension(client.stolen-reg-index.dll drreg) |
| use_DynamoRIO_extension(client.stolen-reg-index.dll drutil) |
| endif () |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.reg_size_test client-interface/reg_size_test.c "" "" "") |
| |
| tobuild_ci(client.thread_exit_xl8 client-interface/thread_exit_xl8.c "" "" "") |
| endif (NOT RISCV64) |
| |
| if (UNIX AND NOT RISCV64) # The test uses signals. |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.gonative client-interface/gonative.c "" "" "") |
| link_with_pthread(client.gonative) |
| # Configure for dr_app_running_under_dynamorio(). |
| configure_app_api_build_flags(client.gonative OFF OFF) |
| add_dependencies(client.gonative api_headers) |
| set_target_properties(client.gonative PROPERTIES SKIP_BUILD_RPATH OFF) |
| endif () |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.drcontainers-test client-interface/drcontainers-test.c "" "" "") |
| use_DynamoRIO_extension(client.drcontainers-test.dll drcontainers) |
| |
| tobuild_ci(client.drmgr-test client-interface/drmgr-test.c "" "" "${events_appdll_path}") |
| use_DynamoRIO_extension(client.drmgr-test.dll drmgr) |
| link_with_pthread(client.drmgr-test) |
| endif (NOT RISCV64) |
| |
| if (proc_supports_pt) |
| tobuild_ci(client.drpttracer_SUDO-test client-interface/drpttracer_SUDO-test.c "" "" "") |
| use_DynamoRIO_extension(client.drpttracer_SUDO-test.dll drpttracer) |
| use_DynamoRIO_extension(client.drpttracer_SUDO-test.dll drmgr) |
| set(client.drpttracer_SUDO-test_sudo ON) |
| endif () |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.drx_buf-test client-interface/drx_buf-test.c "" "" "") |
| use_DynamoRIO_extension(client.drx_buf-test.dll drmgr) |
| use_DynamoRIO_extension(client.drx_buf-test.dll drx) |
| link_with_pthread(client.drx_buf-test) |
| target_include_directories(client.drx_buf-test PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/client-interface) |
| endif (NOT RISCV64) |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.drbbdup-test client-interface/drbbdup-test.c "" "" "") |
| use_DynamoRIO_extension(client.drbbdup-test.dll drmgr) |
| use_DynamoRIO_extension(client.drbbdup-test.dll drbbdup) |
| endif (NOT RISCV64) |
| |
| # XXX i#1884: The thread-private option is not yet available for ARM. |
| if (X86) |
| # Same drbbdup test but with thread-private code caches. |
| torunonly_ci(client.drbbdup-thread-private-test ${ci_shared_app} |
| client.drbbdup-test.dll client-interface/drbbdup-test.c "" "-thread_private" "") |
| endif (X86) |
| |
| macro(drbbdup_bb_test test) |
| add_exe(client.${test}-exe client-interface/${test}.asm) |
| set_target_properties(client.${test}-exe PROPERTIES LINKER_LANGUAGE C) |
| append_link_flags(client.${test}-exe "-nostartfiles -nodefaultlibs -static") |
| |
| add_library(client.${test}.dll SHARED client-interface/${test}.dll.c) |
| setup_test_client_dll_basics(client.${test}.dll) |
| use_DynamoRIO_extension(client.${test}.dll drmgr) |
| use_DynamoRIO_extension(client.${test}.dll drbbdup) |
| |
| torunonly_ci(client.${test} client.${test}-exe |
| client.${test}.dll client-interface/${test}.asm "" "-max_bb_instrs 0" "") |
| endmacro(drbbdup_bb_test) |
| |
| if (X86 AND X64 AND LINUX) |
| drbbdup_bb_test(drbbdup-meta-label-bb-test) |
| drbbdup_bb_test(drbbdup-meta-nop-bb-test) |
| drbbdup_bb_test(drbbdup-empty-bb-test) |
| endif (X86 AND X64 AND LINUX) |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.drbbdup-no-encode-test client-interface/drbbdup-no-encode-test.c "" "" "") |
| use_DynamoRIO_extension(client.drbbdup-no-encode-test.dll drmgr) |
| use_DynamoRIO_extension(client.drbbdup-no-encode-test.dll drbbdup) |
| |
| tobuild_ci(client.drbbdup-no-dup-test client-interface/drbbdup-no-dup-test.c "" "" "") |
| use_DynamoRIO_extension(client.drbbdup-no-dup-test.dll drmgr) |
| use_DynamoRIO_extension(client.drbbdup-no-dup-test.dll drbbdup) |
| |
| tobuild_ci(client.drbbdup-nonzero-test client-interface/drbbdup-nonzero-test.c "" "" "") |
| use_DynamoRIO_extension(client.drbbdup-nonzero-test.dll drmgr) |
| use_DynamoRIO_extension(client.drbbdup-nonzero-test.dll drbbdup) |
| |
| tobuild_ci(client.drbbdup-analysis-test client-interface/drbbdup-analysis-test.c "" "" "") |
| use_DynamoRIO_extension(client.drbbdup-analysis-test.dll drmgr) |
| use_DynamoRIO_extension(client.drbbdup-analysis-test.dll drbbdup) |
| |
| tobuild_appdll(client.drbbdup-drwrap-test client-interface/drbbdup-drwrap-test.c) |
| get_target_path_for_execution(bbdupwrap_libpath |
| client.drbbdup-drwrap-test.appdll "${location_suffix}") |
| tobuild_ci(client.drbbdup-drwrap-test client-interface/drbbdup-drwrap-test.c "" "" |
| "${bbdupwrap_libpath}") |
| use_DynamoRIO_extension(client.drbbdup-drwrap-test.dll drmgr) |
| use_DynamoRIO_extension(client.drbbdup-drwrap-test.dll drbbdup) |
| use_DynamoRIO_extension(client.drbbdup-drwrap-test.dll drwrap) |
| |
| tobuild_ci(client.drbbdup-emul-test client-interface/drbbdup-emul-test.c "" "" "") |
| use_DynamoRIO_extension(client.drbbdup-emul-test.dll drmgr) |
| use_DynamoRIO_extension(client.drbbdup-emul-test.dll drutil) |
| use_DynamoRIO_extension(client.drbbdup-emul-test.dll drbbdup) |
| use_DynamoRIO_extension(client.drbbdup-emul-test.dll drreg) |
| endif (NOT RISCV64) |
| |
| if (X86) |
| tobuild_ci(client.drbbdup-emul-reg-clobber-test |
| client-interface/drbbdup-emul-reg-clobber-test.c "" "" "") |
| use_DynamoRIO_extension(client.drbbdup-emul-reg-clobber-test.dll drmgr) |
| use_DynamoRIO_extension(client.drbbdup-emul-reg-clobber-test.dll drutil) |
| use_DynamoRIO_extension(client.drbbdup-emul-reg-clobber-test.dll drbbdup) |
| use_DynamoRIO_extension(client.drbbdup-emul-reg-clobber-test.dll drreg) |
| endif (X86) |
| |
| if (ARM) |
| tobuild_ci(client.predicate-test client-interface/predicate-test.c "" "" "") |
| use_DynamoRIO_extension(client.predicate-test.dll drmgr) |
| use_DynamoRIO_extension(client.predicate-test.dll drutil) |
| use_DynamoRIO_extension(client.predicate-test.dll drreg) |
| target_include_directories(client.predicate-test PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/client-interface) |
| endif (ARM) |
| |
| if (UNIX) |
| tobuild_ci(client.process-id client-interface/process-id.c "" "" "") |
| link_with_pthread(client.process-id) |
| endif (UNIX) |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| if (NOT APPLE OR NOT AARCH64) # TODO i#5383: Port to Mac M1. |
| tobuild_ci(client.drreg-test client-interface/drreg-test.c "" "" "") |
| use_DynamoRIO_extension(client.drreg-test.dll drmgr) |
| use_DynamoRIO_extension(client.drreg-test.dll drreg) |
| use_DynamoRIO_extension(client.drreg-test.dll drx) |
| target_include_directories(client.drreg-test PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/client-interface) |
| endif () |
| |
| tobuild_ci(client.drreg-end-restore client-interface/drreg-end-restore.c "" "" "") |
| use_DynamoRIO_extension(client.drreg-end-restore.dll drmgr) |
| use_DynamoRIO_extension(client.drreg-end-restore.dll drreg) |
| |
| tobuild_ci(client.drreg-flow client-interface/drreg-flow.c "" "" "") |
| use_DynamoRIO_extension(client.drreg-flow.dll drmgr) |
| use_DynamoRIO_extension(client.drreg-flow.dll drreg) |
| use_DynamoRIO_extension(client.drreg-flow.dll drutil) |
| |
| tobuild_ci(client.drreg-cross client-interface/drreg-cross.c "" "" "") |
| use_DynamoRIO_extension(client.drreg-cross.dll drmgr) |
| use_DynamoRIO_extension(client.drreg-cross.dll drreg) |
| use_DynamoRIO_extension(client.drreg-cross.dll drutil) |
| |
| tobuild_ci(client.drx-test client-interface/drx-test.c "" "" "") |
| use_DynamoRIO_extension(client.drx-test.dll drx) |
| |
| tobuild_ci(client.drxmgr-test client-interface/drxmgr-test.c "" "" "") |
| use_DynamoRIO_extension(client.drxmgr-test.dll drmgr) |
| use_DynamoRIO_extension(client.drxmgr-test.dll drx) |
| use_DynamoRIO_extension(client.drxmgr-test.dll drreg) |
| |
| # Declare reset params due to i#1674 and i#3912 |
| tobuild_ci(client.low_on_memory client-interface/low_on_memory.c "" |
| "-enable_reset -reset_at_vmm_percent_free_limit 10 -vm_size 4M" "") |
| use_DynamoRIO_extension(client.low_on_memory.dll drmgr) |
| use_DynamoRIO_extension(client.low_on_memory.dll drwrap) |
| |
| tobuild_ci(client.tls client-interface/tls.c "" "" "") |
| link_with_pthread(client.tls) |
| use_DynamoRIO_extension(client.tls.dll drmgr) |
| endif (NOT RISCV64) |
| |
| if (X86 OR AARCH64) |
| if (NOT MACOS) |
| # XXX i#2985: The test's asm doesn't build with MacOS's clang. |
| set(client.drx-scattergather_client_source "client-interface/drx-scattergather.dll.c") |
| if (X86) |
| tobuild_ci(client.drx-scattergather "client-interface/drx-scattergather-x86.c" |
| "" "" "") |
| set_avx_flags(client.drx-scattergather) |
| elseif (AARCH64) |
| tobuild_ci(client.drx-scattergather "client-interface/drx-scattergather-aarch64.cpp" |
| "" "" "") |
| set_sve_flags(client.drx-scattergather) |
| |
| if (proc_supports_sve OR proc_supports_sve2) |
| # Run the tests natively as well to confirm the test reference data is correct. |
| if (proc_supports_sve2) |
| set(client.drx-scattergather-native_runsve2 1) |
| else () |
| set(client.drx-scattergather-native_runsve 1) |
| endif () |
| set(client.drx-scattergather-native_test_sample_client 1) |
| torunonly_native(client.drx-scattergather-native client.drx-scattergather |
| drx-scattergather-aarch64 "client-interface/drx-scattergather-aarch64.cpp" "") |
| endif() |
| endif() |
| target_include_directories(client.drx-scattergather PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/client-interface) |
| use_DynamoRIO_extension(client.drx-scattergather.dll drmgr) |
| use_DynamoRIO_extension(client.drx-scattergather.dll drx) |
| use_DynamoRIO_extension(client.drx-scattergather.dll drreg) |
| |
| # Our scattergather drbbdup test uses the same app as the base test. |
| set(client.drx-scattergather-bbdup_realtest client.drx-scattergather) |
| set(client.drx-scattergather-bbdup_expectbase "drx-scattergather-${ARCH_NAME}") |
| tobuild_ci(client.drx-scattergather-bbdup client-interface/drx-scattergather-bbdup.c |
| "" "" "") |
| if (X86) |
| set_avx_flags(client.drx-scattergather-bbdup) |
| elseif (AARCH64) |
| set_sve_flags(client.drx-scattergather-bbdup) |
| endif() |
| target_include_directories(client.drx-scattergather PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/client-interface) |
| use_DynamoRIO_extension(client.drx-scattergather-bbdup.dll drmgr) |
| use_DynamoRIO_extension(client.drx-scattergather-bbdup.dll drx) |
| use_DynamoRIO_extension(client.drx-scattergather-bbdup.dll drreg) |
| use_DynamoRIO_extension(client.drx-scattergather-bbdup.dll drbbdup) |
| |
| if (AARCH64) |
| set(client.drx-scattergather-instrumentation-fault_realtest client.drx-scattergather) |
| set(client.drx-scattergather-instrumentation-fault_expectbase "drx-scattergather-${ARCH_NAME}") |
| tobuild_ci(client.drx-scattergather-instrumentation-fault |
| client-interface/drx-scattergather-instrumentation-fault.c "" "" "") |
| set_sve_flags(client.drx-scattergather-instrumentation-fault) |
| target_include_directories(client.drx-scattergather PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/client-interface) |
| use_DynamoRIO_extension(client.drx-scattergather-instrumentation-fault.dll drmgr) |
| use_DynamoRIO_extension(client.drx-scattergather-instrumentation-fault.dll drx) |
| use_DynamoRIO_extension(client.drx-scattergather-instrumentation-fault.dll drreg) |
| # drx-scattergather-instrumentation-fault.dll isn't really a sample client but it is |
| # a stripped down version of memval_simple and gives the same output so we want the |
| # templatex file to be processed the same way as it is for sample clients. |
| set(client.drx-scattergather-instrumentation-fault_test_sample_client 1) |
| endif () |
| |
| if (UNIX AND ((X86 AND X64 AND proc_supports_avx) OR (AARCH64 AND proc_supports_sve))) |
| add_exe(allasm_scattergather |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/allasm_scattergather_${ARCH_NAME}.asm |
| "-early_inject" "") |
| append_pure_asm_app_link_flags(allasm_scattergather) |
| if (X86) |
| set_avx_flags(allasm_scattergather) |
| elseif (AARCH64) |
| set_sve_flags(allasm_scattergather) |
| endif () |
| endif () |
| |
| if (X86 AND X64 AND UNIX) |
| add_exe(allasm_repstr |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/allasm_repstr.asm |
| "-early_inject" "") |
| append_pure_asm_app_link_flags(allasm_repstr) |
| endif () |
| endif () |
| endif () |
| |
| if (NOT RISCV64) |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_appdll(client.drwrap-test client-interface/drwrap-test.c) |
| get_target_path_for_execution(drwrap_libpath client.drwrap-test.appdll |
| "${location_suffix}") |
| tobuild_ci(client.drwrap-test client-interface/drwrap-test.c "" "" "${drwrap_libpath}") |
| use_DynamoRIO_extension(client.drwrap-test.dll drwrap) |
| tochcon(client.drwrap-test.appdll textrel_shlib_t) |
| endif (NOT RISCV64) |
| |
| if (WIN32) |
| # export from asm code |
| append_link_flags(client.drwrap-test.appdll |
| "/export:makes_tailcall /export:tailcall_test2 /export:tailcall_tail") |
| endif (WIN32) |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| tobuild_ci(client.drwrap-test-callconv client-interface/drwrap-test-callconv.cpp |
| "" "" "") |
| use_DynamoRIO_extension(client.drwrap-test-callconv.dll drwrap) |
| endif () |
| if (NOT APPLE AND NOT RISCV64) # XXX i#1997: static DR not fully supported on Mac yet |
| # TODO i#3544: Port tests to RISC-V 64 |
| set(client.drwrap-test-detach_no_reg_compat) |
| tobuild_api(client.drwrap-test-detach client-interface/drwrap-test-detach.cpp |
| "" "" OFF ON OFF) |
| use_DynamoRIO_extension(client.drwrap-test-detach drwrap_static) |
| link_with_pthread(client.drwrap-test-detach) |
| endif () |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_appdll(client.drwrap-drreg-test client-interface/drwrap-drreg-test.c) |
| get_target_path_for_execution(drwrap_drreg_libpath client.drwrap-drreg-test.appdll |
| "${location_suffix}") |
| tobuild_ci(client.drwrap-drreg-test client-interface/drwrap-drreg-test.c "" "" |
| "${drwrap_drreg_libpath}") |
| use_DynamoRIO_extension(client.drwrap-drreg-test.dll drwrap) |
| use_DynamoRIO_extension(client.drwrap-drreg-test.dll drreg) |
| use_DynamoRIO_extension(client.drwrap-drreg-test.dll drmgr) |
| endif (NOT RISCV64) |
| |
| if (AARCH64 AND NOT APPLE) # TODO i#5383: Port to Mac M1. |
| # Create a fuzzing application for stress-testing via drstatecmp. |
| add_api_exe(drstatecmp-fuzz-app client-interface/drstatecmp-fuzz-app.c ON OFF) |
| endif () |
| |
| # We rely on dbghelp >= 6.0 for our drsyms and sample.instrcalls tests, |
| # but the system dbghelp pre-Vista is too old, so we copy one from VS. |
| if ("${CMAKE_SYSTEM_VERSION}" STRLESS "6.0") |
| if (dbghelp_path) # set at top level |
| configure_file(${dbghelp_path} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/dbghelp.dll |
| COPYONLY) |
| if (BUILD_SAMPLES) |
| get_property(sample_list GLOBAL PROPERTY DynamoRIO_sample_list) |
| list(GET sample_list 1 sample_one) # 0 is empty |
| DynamoRIO_get_full_path(sample_loc ${sample_one} "${location_suffix}") |
| get_filename_component(sample_dir ${sample_loc} PATH) |
| configure_file(${dbghelp_path} ${sample_dir}/dbghelp.dll COPYONLY) |
| endif (BUILD_SAMPLES) |
| message(STATUS "Using ${dbghelp_path} for drsyms tests") |
| endif (dbghelp_path) |
| endif () |
| |
| if (NOT ANDROID AND NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| # XXX i#1874: get working on Android |
| macro (add_drsyms_test suffix flag) |
| tobuild_appdll(client.drsyms${suffix}-test client-interface/drsyms-test.cpp) |
| get_target_path_for_execution(drsyms_libpath client.drsyms${suffix}-test.appdll |
| "${location_suffix}") |
| tobuild_ci(client.drsyms${suffix}-test client-interface/drsyms-test.cpp "" |
| "" "${drsyms_libpath}") |
| # Disable optimizations for the exe and appdll to allow stack tracing. |
| disable_optimizations_for_file(client-interface/drsyms-test.cpp) |
| disable_optimizations_for_file(client-interface/drsyms-test.appdll.cpp) |
| # Debug libc seems to mess up the test. |
| use_MT_not_MTd(client-interface/drsyms-test.appdll.cpp) |
| use_DynamoRIO_extension(client.drsyms${suffix}-test.dll drsyms) |
| use_DynamoRIO_extension(client.drsyms${suffix}-test.dll drwrap) # Makes testing easy |
| if (NOT "${flag}" STREQUAL "") |
| append_property_string(TARGET client.drsyms${suffix}-test |
| COMPILE_FLAGS "${flag}") |
| append_property_string(TARGET client.drsyms${suffix}-test.appdll |
| COMPILE_FLAGS "${flag}") |
| endif () |
| endmacro () |
| |
| add_drsyms_test("" "") |
| if (LINUX) |
| # We don't try to figure out the default: we just try each variant in addition to |
| # whatever the default is. |
| CHECK_C_COMPILER_FLAG("-gdwarf-4" gdwarf4_avail) |
| if (gdwarf4_avail) |
| add_drsyms_test("-dwarf4" "-gdwarf-4") |
| endif () |
| CHECK_C_COMPILER_FLAG("-gdwarf-5" gdwarf5_avail) |
| if (gdwarf5_avail) |
| add_drsyms_test("-dwarf5" "-gdwarf-5") |
| endif () |
| endif () |
| |
| # TODO i#2414: Port to Windows, Mac, and Android. |
| if (LINUX AND HAVE_LIBUNWIND_H) |
| tobuild_ci(client.drcallstack-test client-interface/drcallstack-test.c "" "" "") |
| use_DynamoRIO_extension(client.drcallstack-test.dll drsyms) |
| use_DynamoRIO_extension(client.drcallstack-test.dll drwrap) |
| use_DynamoRIO_extension(client.drcallstack-test.dll drcallstack) |
| endif () |
| endif () |
| |
| # We check these two statements here b/c not all gcc compilers support |
| # cross - architecture compilation (e.g. perl mingw x64 doesn't support |
| # x32 app compilation). |
| if (WIN32 AND GCC AND (GCC_IS64 AND X64) OR (NOT GCC_IS64 AND NOT X64)) |
| # test drsyms dwarf-on-windows capabilities. |
| # cmake doesn't support a new compiler so we do a simple build here. |
| tobuild_gcc(client.drsyms-testgcc.exe |
| client-interface/drsyms-test.cpp client.drsyms-test "") |
| tobuild_gcc(client.drsyms-testgcc.appdll.dll |
| client-interface/drsyms-test.appdll.cpp client.drsyms-test "-shared") |
| torunonly_ci(client.drsyms-testgcc |
| ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/client.drsyms-testgcc.exe |
| client.drsyms-test.dll client-interface/drsyms-test.cpp "" "-stack_size 36K" |
| "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/client.drsyms-testgcc.appdll.dll") |
| set(client.drsyms-testgcc_expectbase "drsyms-testgcc") |
| if (GCC_IS_CYGWIN) |
| set(client.drsyms-testgcc_is_cygwin ON) |
| endif() |
| endif (WIN32 AND GCC AND (GCC_IS64 AND X64) OR (NOT GCC_IS64 AND NOT X64)) |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ci(client.drutil-test client-interface/drutil-test.c "" "" "") |
| use_DynamoRIO_extension(client.drutil-test.dll drutil) |
| use_DynamoRIO_extension(client.drutil-test.dll drmgr) |
| link_with_pthread(client.drutil-test) |
| |
| tobuild_ci(client.drmodtrack-test client-interface/drmodtrack-test.cpp "" "" "") |
| use_DynamoRIO_extension(client.drmodtrack-test.dll drcovlib) |
| use_DynamoRIO_extension(client.drmodtrack-test.dll drx) |
| use_DynamoRIO_extension(client.drmodtrack-test.dll drmgr) |
| endif (NOT RISCV64) |
| if (X86) # FIXME i#1551, i#1569: port to ARM and AArch64 |
| # We need to load w/ the same base so the test passes |
| set(DynamoRIO_SET_PREFERRED_BASE ON) |
| if (X64) |
| # We need this higher than DR's vmm. |
| set(PREFERRED_BASE 0xabc00000) |
| else () |
| set(PREFERRED_BASE 0x6f000000) |
| endif () |
| # Pass extra options to first run so this will pass when run repeatedly in local |
| # build dir w/o loading any pcache |
| tobuild_ci(client.pcache client-interface/pcache.c "" |
| "-persist -no_use_persisted -no_coarse_disk_merge -no_coarse_lone_merge" "") |
| use_DynamoRIO_extension(client.pcache.dll drcontainers) |
| if (WIN32) |
| append_link_flags(client.pcache "/dynamicbase:no") |
| endif () |
| if (UNIX AND no_pie_avail) |
| # i#2868: pcache tests are failing with ET_DYN so we disable PIE. |
| set_source_files_properties(client-interface/pcache.c PROPERTIES COMPILE_FLAGS |
| "${CMAKE_C_FLAGS} -fno-pie") |
| append_link_flags(client.pcache "-no-pie") |
| endif () |
| torunonly_ci(client.pcache-use client.pcache client.pcache.dll |
| client-interface/pcache.c "" "-persist" "") |
| # XXX: we should have the key be the default for the .expect but |
| # currently that's not the case (thread-reset, etc.). |
| set(client.pcache-use_expectbase "pcache-use") |
| # when running tests in parallel: have to generate pcaches first |
| set(client.pcache-use_depends client.pcache) |
| set(DynamoRIO_SET_PREFERRED_BASE OFF) |
| endif (X86) |
| |
| if (AARCHXX) |
| tobuild_ci(client.stolen-reg client-interface/stolen-reg.c "" "" "") |
| link_with_pthread(client.stolen-reg) |
| |
| tobuild_ci(client.ldstex client-interface/ldstex.c "" "" "") |
| link_with_pthread(client.ldstex) |
| endif () |
| |
| if (ARM AND NOT ANDROID) |
| # i#2580: DT_RUNPATH is not yet supported on android so we disable this test on |
| # android |
| tobuild_api(api.it api/it_arm.c "" "" OFF OFF OFF) |
| endif(ARM AND NOT ANDROID) |
| |
| if (ARM) |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| # Helper exe, used offline to build smaller input binary to test itself: |
| add_api_exe(api.dis-create api/dis-create.c OFF OFF) |
| # XXX i#1686: get -syntax_arm working and test it further here. |
| # For now our template is DR syntax. |
| add_api_exe(api.dis api/dis.c OFF OFF) |
| torunonly_api(api.disA32 api.dis api/dis.c "" |
| "${CMAKE_CURRENT_SOURCE_DIR}/api/dis-armA32-randtest.raw;-arm" OFF OFF) |
| set(api.disA32_expectbase "dis-armA32") |
| torunonly_api(api.disT32 api.dis api/dis.c "" |
| "${CMAKE_CURRENT_SOURCE_DIR}/api/dis-armT32-randtest.raw;-thumb" OFF OFF) |
| set(api.disT32_expectbase "dis-armT32") |
| endif () |
| elseif (AARCH64) |
| add_api_exe(api.dis-a64 api/dis-a64.c OFF OFF) |
| torunonly_api(api.dis-a64 api.dis-a64 api/dis-a64.c "" |
| "-q;${CMAKE_CURRENT_SOURCE_DIR}/api/dis-a64.txt" OFF OFF) |
| torunonly_api(api.dis-a64-v82 api.dis-a64 api/dis-a64.c "" |
| "-q;${CMAKE_CURRENT_SOURCE_DIR}/api/dis-a64-v82.txt" OFF OFF) |
| torunonly_api(api.dis-a64-v83 api.dis-a64 api/dis-a64.c "" |
| "-q;${CMAKE_CURRENT_SOURCE_DIR}/api/dis-a64-v83.txt" OFF OFF) |
| torunonly_api(api.dis-a64-v84 api.dis-a64 api/dis-a64.c "" |
| "-q;${CMAKE_CURRENT_SOURCE_DIR}/api/dis-a64-v84.txt" OFF OFF) |
| torunonly_api(api.dis-a64-v85 api.dis-a64 api/dis-a64.c "" |
| "-q;${CMAKE_CURRENT_SOURCE_DIR}/api/dis-a64-v85.txt" OFF OFF) |
| torunonly_api(api.dis-a64-v86 api.dis-a64 api/dis-a64.c "" |
| "-q;${CMAKE_CURRENT_SOURCE_DIR}/api/dis-a64-v86.txt" OFF OFF) |
| torunonly_api(api.dis-a64-sve api.dis-a64 api/dis-a64.c "" |
| "-q;${CMAKE_CURRENT_SOURCE_DIR}/api/dis-a64-sve.txt" OFF OFF) |
| torunonly_api(api.dis-a64-sve2 api.dis-a64 api/dis-a64.c "" |
| "-q;${CMAKE_CURRENT_SOURCE_DIR}/api/dis-a64-sve2.txt" OFF OFF) |
| add_api_exe(api.reenc-a64 api/reenc-a64.c OFF OFF) |
| tobuild_api(api.opnd api/opnd-a64.c "" "" OFF OFF OFF) |
| elseif (X86) |
| tobuild_api(api.dis api/dis.c "-syntax_intel" |
| "${CMAKE_CURRENT_SOURCE_DIR}/api/dis-udis86-randtest.raw" OFF OFF OFF) |
| if (X64) |
| set(api.dis_expectbase "dis-x64") |
| else () |
| set(api.dis_expectbase "dis-x86") |
| endif () |
| endif (ARM) |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_api(api.startstop api/startstop.c "" "" OFF OFF OFF) |
| link_with_pthread(api.startstop) |
| tobuild_api(api.detach api/detach.c "" "" OFF OFF OFF) |
| link_with_pthread(api.detach) |
| endif (NOT RISCV64) |
| if (LINUX AND X64 AND NOT RISCV64) # Will take extra work to port to 32-bit. |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_api(api.detach_state api/detach_state.c "" "" OFF ON OFF) |
| target_include_directories(api.detach_state PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/api) |
| link_with_pthread(api.detach_state) |
| set_source_files_properties(detach_state.c_asm.asm APPEND_LIST PROPERTIES |
| OBJECT_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/api/detach_state_shared.h") |
| set_avx_flags(api.detach_state) |
| endif () |
| if (UNIX AND NOT RISCV64) |
| if (X64) # TODO i#4664: Fix crash in vsyscall hook under native threads. |
| tobuild_api(api.detach_signal api/detach_signal.cpp "" "" OFF OFF OFF) |
| link_with_pthread(api.detach_signal) |
| endif () |
| endif () |
| if (NOT WIN32 AND NOT RISCV64) # XXX i#2611: fix for Windows |
| # TODO i#3544: Port tests to RISC-V 64 |
| if (X64) |
| set(detach_spawn_name api.detach_spawn) |
| else () |
| # FIXME i#2694: failing sometimes on 32-bit Linux. |
| set(detach_spawn_name api.detach_spawn_FLAKY) |
| endif () |
| set(detach_spawn_stress_name api.detach_spawn_stress_FLAKY) |
| set(detach_spawn_quick_exit_name api.detach_spawn_quick_exit) |
| tobuild_api(${detach_spawn_name} api/detach_spawn.c "" "" OFF OFF OFF) |
| link_with_pthread(${detach_spawn_name}) |
| tobuild_api(${detach_spawn_stress_name} api/detach_spawn_stress.c "" "" OFF OFF OFF) |
| link_with_pthread(${detach_spawn_stress_name}) |
| tobuild_api(${detach_spawn_quick_exit_name} api/detach_spawn_quick_exit.c "" "" |
| OFF OFF OFF) |
| link_with_pthread(${detach_spawn_quick_exit_name}) |
| endif () |
| if (X86) |
| if (X64) |
| tobuild_api(decenc.drdecode_decenc_x86_64 |
| ../../third_party/binutils/test_decenc/drdecode_decenc_x86_64.c "" "" OFF OFF OFF) |
| target_include_directories(decenc.drdecode_decenc_x86_64 PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/../../third_party/binutils/test_decenc/) |
| set(decenc.drdecode_decenc_x86_64_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runcmp.cmake") |
| else () |
| tobuild_api(decenc.drdecode_decenc_x86 |
| ../../third_party/binutils/test_decenc/drdecode_decenc_x86.c "" "" OFF OFF OFF) |
| target_include_directories(decenc.drdecode_decenc_x86 PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/../../third_party/binutils/test_decenc/) |
| set(decenc.drdecode_decenc_x86_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runcmp.cmake") |
| endif () |
| endif () |
| if (X86 OR AARCH64) # Generated code is x86- or AArch64-specific. |
| set(checklevel "") |
| if (DEBUG) |
| # This tests indirect branches between blocks. |
| # We use -checklevel 0 to disable the DOCHECK in check_thread_vm_area |
| # which makes building 150K bbs very slow. |
| set(checklevel "-checklevel 0") |
| endif () |
| |
| tobuild_api(api.ibl-stress api/ibl-stress.c |
| "-disable_traces -shared_bb_ibt_tables ${checklevel}" "" OFF OFF OFF) |
| use_DynamoRIO_extension(api.ibl-stress drcontainers) |
| link_with_pthread(api.ibl-stress) |
| |
| if (WIN32) |
| # On Windows, somehow linking with drcontainers inserts it and drlibc |
| # in front of dynamorio.lib, despite being added to the link list later, |
| # which results in unresolved symbols. |
| # The only fix I could come up with is to force dynamorio.lib earlier |
| # using the link flags: |
| DynamoRIO_get_full_path(drpath dynamorio "${location_suffix}") |
| get_filename_component(drdir ${drpath} DIRECTORY) |
| get_filename_component(drname ${drpath} NAME_WE) |
| append_link_flags(api.ibl-stress "${drdir}/${drname}.lib") |
| endif () |
| |
| if (AARCH64) |
| tobuild_api(api.ibl-stress-aarch64-far-link_LONG api/ibl-stress.c |
| "-disable_traces -shared_bb_ibt_tables ${checklevel}" "" OFF OFF OFF) |
| append_property_string(TARGET api.ibl-stress-aarch64-far-link_LONG COMPILE_FLAGS |
| "-DTEST_FAR_LINK_AARCH64") |
| set(api.ibl-stress-aarch64-far-link_LONG_timeout 900) |
| use_DynamoRIO_extension(api.ibl-stress-aarch64-far-link_LONG drcontainers) |
| link_with_pthread(api.ibl-stress-aarch64-far-link_LONG) |
| endif () |
| endif () |
| |
| # XXX: we should expand this test of drsyms standalone to be cross-platform and |
| # not just check libstdc++-6.dll. |
| if (WIN32) |
| find_program(mingwlib libstdc++-6.dll |
| HINTS "c:/cygwin/usr/i686-pc-mingw32/sys-root/mingw/bin" |
| DOC "path to MinGW libstdc++-6.dll") |
| if (mingwlib) |
| message(STATUS "Found ${mingwlib}, enabling api.symtest") |
| tobuild_api(api.symtest api/symtest.c "" "${mingwlib}" OFF OFF OFF) |
| use_DynamoRIO_extension(api.symtest drsyms) |
| endif () |
| endif () |
| |
| # Test DR as a static library |
| # XXX i#1996: not fully supported on Android yet |
| # XXX i#1997: not fully supported on Mac yet |
| # TODO i#3544: Port tests to RISC-V 64 |
| if (NOT ANDROID AND NOT APPLE AND NOT RISCV64) |
| tobuild_api(api.static_startstop api/static_startstop.c "" "" OFF ON OFF) |
| target_link_libraries(api.static_startstop ${libmath}) |
| tobuild_api(api.static_noclient api/static_noclient.c "" "" OFF ON OFF) |
| target_link_libraries(api.static_noclient ${libmath}) |
| tobuild_api(api.static_noinit api/static_noinit.c "" "" OFF ON OFF) |
| target_link_libraries(api.static_noinit ${libmath}) |
| tobuild_api(api.static_detach api/static_detach.c "" "" OFF ON OFF) |
| target_link_libraries(api.static_detach ${libmath}) |
| tobuild_api(api.static_prepop api/static_prepop.c "" "" OFF ON OFF) |
| target_link_libraries(api.static_prepop ${libmath}) |
| tobuild_api(api.static_reattach_client_flags api/static_reattach_client_flags.c |
| "" "" OFF ON ON) |
| target_link_libraries(api.static_reattach_client_flags ${libmath}) |
| |
| if (NOT WIN32) |
| tobuild_api(api.static_signal api/static_signal.c "" "" OFF ON OFF) |
| target_link_libraries(api.static_signal ${libmath}) |
| link_with_pthread(api.static_signal) |
| # i#2119: test invoking the app's handler on a DR fault. |
| tobuild_api(api.static_crash api/static_crash.c "-unsafe_crash_process" "" OFF ON OFF) |
| target_link_libraries(api.static_crash ${libmath}) |
| # XXX i#2346: add delayed sideline thread exit on Windows |
| # FIXME i#297: static_sideline is flaky and sometimes hangs on exit. |
| tobuild_api(api.static_sideline_FLAKY api/static_sideline.c "" "" OFF ON OFF) |
| target_link_libraries(api.static_sideline_FLAKY ${libmath}) |
| link_with_pthread(api.static_sideline_FLAKY) |
| |
| # i#3348: Ensure that DR without local symbols hidden is linkable and |
| # avoids conflicts (though CMake_symbol_check does most of the conflict |
| # checking). |
| |
| tobuild_api(api.static_symbols api/static_symbols.c "" "" OFF ON OFF) |
| append_link_flags(api.static_symbols "-Wl,--warn-common -Wl,--fatal-warnings") |
| |
| # To ensure that the dynamorio_so_start/_end linker variables are actually |
| # used in static binaries, we have two tests which run the same "map mixup" |
| # logic: one which exits successfully because we provide the linker |
| # variables and another which exits with an assertion because we don't. |
| set(api.static_maps_mixup_yesvars_expectbase |
| "static_maps_mixup_yesvars") |
| tobuild_api(api.static_maps_mixup_yesvars |
| api/static_maps_mixup.c "" "" OFF ON OFF) |
| append_link_flags(api.static_maps_mixup_yesvars |
| "-Wl,--defsym,dynamorio_so_start=__executable_start -Wl,--defsym,dynamorio_so_end=end") |
| |
| set(api.static_maps_mixup_novars_FLAKY_expectbase |
| "static_maps_mixup_novars") |
| tobuild_api(api.static_maps_mixup_novars_FLAKY |
| api/static_maps_mixup.c "" "" OFF ON OFF) |
| endif () |
| |
| if (NOT WIN32 AND NOT RISCV64) # TODO i#4349: Fix re-attach issues to enable. |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_api(api.thread_churn api/thread_churn.c "" "" OFF OFF OFF) |
| link_with_pthread(api.thread_churn) |
| endif () |
| endif () |
| |
| if (NOT X64 AND NOT ARM) # FIXME i#1551: port to ARM |
| # i#696: Use -thread_private and small fcache units to trigger shifts. x64 |
| # does not support fcache unit resizing and won't allow 4k unit sizes, so |
| # skip it. |
| tobuild_ci(client.fcache_shift client-interface/fcache_shift.c |
| "" "-thread_private -cache_bb_unit_init 4K" "") |
| endif () |
| |
| if (X86) |
| if (X64) # Tests x86 reachability. |
| tobuild_ci(client.reachability client-interface/reachability.c "" |
| # The vm_base options were added in order to expose bugs that fail to xl8 reachable |
| # addresses to the executable view within the scheme of satisfy_w_xor_x. |
| "-no_vm_base_near_app -vm_base 0x100000000" "") |
| else () |
| tobuild_ci(client.reachability client-interface/reachability.c "" "" "") |
| endif () |
| endif () |
| |
| if (X86) # FIXME i#1551, i#1569: fix bugs on ARM and AArch64 |
| tobuild_ci(client.nudge_ex client-interface/nudge_ex.c "" "" "") |
| use_DynamoRIO_extension(client.nudge_ex.dll drmgr) |
| endif (X86) |
| |
| tobuild_ci(client.app_args client-interface/app_args.c "" "" "Test;Test2;Test3") |
| |
| if (X86) # FIXME i#1551, i#1569: port asm to ARM and AArch64 |
| tobuild_ci(client.retaddr client-interface/retaddr.c "" "" "") |
| # Debug libc seems to mess up the test. |
| use_MT_not_MTd(client-interface/retaddr.c) |
| endif (X86) |
| |
| if (X86 AND WIN32) # FIXME port test application to other systems |
| tobuild_ci(client.translate_sandbox client-interface/translate_sandbox.c "" "" "") |
| endif () |
| |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| tobuild_ci(client.destructor client-interface/destructor.cpp "" "" "") |
| endif () |
| |
| if (proc_supports_avx512) |
| # XXX i#1312: This is untested on Windows. |
| tobuild_ci(client.avx512lazy client-interface/avx512lazy.c "" "" "") |
| set_target_properties(client.avx512lazy PROPERTIES COMPILE_FLAGS "${CFLAGS_AVX512}") |
| |
| # XXX i#1312: This is untested on Windows. |
| tobuild_ci(client.avx512lazy-initial client-interface/avx512lazy.c "" "" "") |
| set_target_properties(client.avx512lazy-initial PROPERTIES COMPILE_FLAGS |
| "${CFLAGS_AVX512}") |
| append_property_string(TARGET client.avx512lazy-initial.dll COMPILE_FLAGS |
| "${CFLAGS_AVX512} -DCLIENT_COMPILED_WITH_AVX512") |
| |
| if (UNIX) |
| # XXX i#1312: we do not yet support AVX-512 Windows context switching. |
| tobuild_ci(client.avx512ctx client-interface/avx512ctx.c "" "" "") |
| set_target_properties(client.avx512ctx PROPERTIES COMPILE_FLAGS "${CFLAGS_AVX512}") |
| append_property_string(TARGET client.avx512ctx.dll COMPILE_FLAGS |
| "${CFLAGS_AVX512}") |
| target_include_directories(client.avx512ctx PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/client-interface) |
| |
| # This could be generalized in a new function. Currently this is the only api-style |
| # test that also has a client library. |
| add_library(api.startstop_avx512lazy.dll SHARED api/startstop_avx512lazy.dll.c) |
| setup_test_client_dll_basics(api.startstop_avx512lazy.dll) |
| append_property_string(TARGET api.startstop_avx512lazy.dll COMPILE_FLAGS |
| "${CFLAGS_AVX512}") |
| get_client_path(client_path api.startstop_avx512lazy.dll api.startstop_avx512lazy) |
| tobuild_api(api.startstop_avx512lazy api/startstop_avx512lazy.c |
| "-client_lib ${client_path}" "" OFF OFF OFF) |
| append_property_string(TARGET api.startstop_avx512lazy COMPILE_FLAGS |
| "${CFLAGS_AVX512}") |
| append_property_string(TARGET api.startstop_avx512lazy.dll COMPILE_FLAGS |
| "${CFLAGS_AVX512}") |
| endif (UNIX) |
| endif () |
| |
| if (BUILD_SAMPLES) |
| # Sanity tests: we run the samples without SHOW_RESULTS (turned off |
| # if BUILD_TESTS is on) so we're only ensuring the client doesn't crash. |
| # This requires that each sample does not affect stdout and works |
| # when given no arguments. |
| # We run common.eflags mainly for memtrace and other big clients which |
| # are quite slow on common.fib or common.broadfun: just a sanity check |
| # after all. |
| if (NOT ANDROID) # FIXME i#2130: On Android, copy samples to device and test. |
| get_property(sample_list GLOBAL PROPERTY DynamoRIO_sample_list) |
| foreach (sample ${sample_list}) |
| # FIXME i#4392: Remove sanity checks and replace with functioning tests like |
| # that done for the opcode_count and memtrace_simple samples. |
| torunonly_ci(sample.${sample} common.${control_flags} |
| ${sample} common/${control_flags}.c "" "" "") |
| if (sample STREQUAL "inscount") |
| # test out-of-line clean call |
| torunonly_ci(sample.${sample}.cleancall common.${control_flags} ${sample} |
| common/${control_flags}.c "" "-opt_cleancall 0" "") |
| if (UNIX) |
| torunonly_ci(sample.${sample}.prof-pcs.cleancall common.${control_flags} |
| ${sample} common/${control_flags}.c "" "-prof_pcs -opt_cleancall 0" "") |
| if (NOT X64 AND NOT ARM) # FIXME i#2160: "-thread_private -prof_pcs" support on AArch64 |
| # FIXME i#1551: "-thread_private -prof_pcs" support on ARM |
| torunonly_ci(sample.${sample}.prof-pcs.thread-private.cleancall |
| common.${control_flags} ${sample} common/${control_flags}.c "" |
| "-thread_private -prof_pcs -opt_cleancall 0" "") |
| endif (NOT X64 AND NOT ARM) |
| endif (UNIX) |
| elseif (sample STREQUAL "memval_simple") |
| if (X86 AND UNIX) |
| tobuild(client.memval-test client-interface/memval-test.c) |
| torunonly_ci(sample.${sample} client.memval-test ${sample} |
| client-interface/memval-test.c "" "" "") |
| |
| torunonly_ci(sample.${sample}_scattergather client.drx-scattergather ${sample} |
| client-interface/drx-scattergather-x86.c "" "" "") |
| set(sample.${sample}_scattergather_test_sample_client 1) |
| if (proc_supports_avx512) |
| set(sample.${sample}_scattergather_runavx512 1) |
| elseif (proc_supports_avx) |
| set(sample.${sample}_scattergather_runavx 1) |
| endif () |
| elseif (AARCH64) |
| torunonly_ci(sample.${sample}_scattergather client.drx-scattergather ${sample} |
| client-interface/drx-scattergather-aarch64.cpp "" "" "") |
| set(sample.${sample}_scattergather_test_sample_client 1) |
| if (proc_supports_sve2) |
| set(sample.${sample}_scattergather_runsve2 1) |
| elseif (proc_supports_sve) |
| set(sample.${sample}_scattergather_runsve 1) |
| endif () |
| endif () |
| elseif (sample STREQUAL "opcode_count") |
| # We do not do a simple sanity test for opcode_count, but a normal test |
| # that checks the sample's output. |
| # FIXME i#4372: The test is currently only supported on X86 32-bit. |
| # The test program is implemented in pure asm (for UNIX). |
| if (X86 AND (NOT X64) AND UNIX) |
| add_exe(sample.opcode_count-test samples/opcode_count-test.asm) |
| set_target_properties(sample.opcode_count-test PROPERTIES LINKER_LANGUAGE C) |
| append_link_flags(sample.opcode_count-test "-nostartfiles -nodefaultlibs -static") |
| |
| torunonly_ci(sample.${sample} sample.opcode_count-test ${sample}_test |
| samples/opcode_count-test.asm "-opcode 5" "" "") |
| endif (X86 AND (NOT X64) AND UNIX) |
| elseif (sample STREQUAL "memtrace_simple") |
| if (X86 AND X64 AND UNIX) |
| torunonly_ci(sample.${sample}_repstr allasm_repstr ${sample}_test |
| samples/${sample}_repstr "-log_to_stderr" "" "") |
| endif () |
| elseif (sample STREQUAL "callstack") |
| set(sample.${sample}_expectbase "sample.callstack.control_flags") |
| endif() |
| endforeach () |
| endif (NOT ANDROID) |
| |
| # Test building the samples as an external project (i#1586). |
| # This is not a perfect test as the build dir is not an install dir, |
| # but this should catch errors in the public samples/CMakeLists.txt. |
| # To set up for this, we copied all the sample source files into the build |
| # dir, and we also copied the extension headers into the build dir. |
| # XXX: we could also execute the resulting clients. |
| # XXX i#1588: this does not catch exported-target issues, such as the absolute |
| # path problem. Such things are not easy to test. Also note that with |
| # cmake < 3.x our build-dir IMPORTED_LINK_INTERFACE_LIBRARIES does not |
| # list the transitive closure of the dependents, so we end up with link errors |
| # if we make a client link drx_static. |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| get_property(sample_proj_dir GLOBAL PROPERTY DynamoRIO_sample_proj_dir) |
| add_test(samples_proj ${CMAKE_CTEST_COMMAND} |
| --build-and-test "${sample_proj_dir}" "${sample_proj_dir}/build_and_test" |
| --build-generator ${CMAKE_GENERATOR} |
| --build-project DynamoRIO_samples # needed for VS generators |
| --build-makeprogram ${CMAKE_MAKE_PROGRAM} |
| # If we don't set Debug, we only have RelWithDebInfo available (b/c we |
| # collapse configs) but --build-and-test still tries to build Debug: |
| --build-options -DDEBUG=ON -DDynamoRIO_DIR:PATH=${public_config_dir}) |
| if (UNIX AND X86 AND NOT X64) |
| set_tests_properties(samples_proj PROPERTIES ENVIRONMENT |
| "CFLAGS=-m32;CXXFLAGS=-m32") |
| endif () |
| endif () |
| endif (BUILD_SAMPLES) |
| |
| if (BUILD_CLIENTS) |
| |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| torunonly_ci(tool.drcov.fib common.fib drcov common/fib.c "" "" "") |
| set(tool.drcov.fib_runcmp "${PROJECT_SOURCE_DIR}/clients/drcov/runtest.cmake") |
| set(tool.drcov.fib_expectbase "tool.drcov.fib") |
| DynamoRIO_get_full_path(tool.drcov.fib_postcmd drcov2lcov "${location_suffix}") |
| |
| if (UNIX AND NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| # Test an app that executes a pipe syscall for i#5981. |
| torunonly_ci(tool.drcov.eintr linux.eintr drcov linux/eintr.c "" "" "") |
| set(tool.drcov.eintr_runcmp "${PROJECT_SOURCE_DIR}/clients/drcov/runtest.cmake") |
| set(tool.drcov.eintr_expectbase "tool.drcov.eintr") |
| DynamoRIO_get_full_path(tool.drcov.eintr_postcmd drcov2lcov "${location_suffix}") |
| endif () |
| endif () |
| |
| ########################################################################### |
| # drcachesim tests |
| |
| if (NOT ANDROID) # Pipes not working on Android yet (i#1874) |
| # i#2023: to avoid stale pipe files in /tmp from prior suite runs, we place them |
| # in the current build dir where they will be blown away on the next suite run. |
| if (UNIX) |
| set(IPC_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/") |
| else () |
| set(IPC_PREFIX "") |
| endif () |
| |
| macro (torunonly_drcachesim testname exetgt sim_ops app_args) |
| torunonly_ci(tool.drcachesim.${testname} ${exetgt} drcachesim |
| "${testname}.c" # for templatex basename |
| "-ipc_name ${IPC_PREFIX}drtestpipe_${testname} ${sim_ops}" |
| "" "${app_args}") |
| set(tool.drcachesim.${testname}_toolname "drcachesim") |
| set(tool.drcachesim.${testname}_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(tool.drcachesim.${testname}_rawtemp ON) # no preprocessor |
| set(tool.drcachesim.${testname}_self_serial ON) |
| endmacro (torunonly_drcachesim) |
| |
| set(config_files_dir ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests) |
| |
| # We have a couple of sanity checks that at least nothing crashes. |
| # We also test some runtime parameters. |
| torunonly_drcachesim(simple ${ci_shared_app} "" "") |
| |
| # Simple test that reads the cache configuration from a config file. |
| torunonly_drcachesim(simple-config-file ${ci_shared_app} |
| "-config_file ${config_files_dir}/cores-1-levels-3-no-missfile.conf" |
| "") |
| |
| # TLB simulator's single-thread sanity check |
| torunonly_drcachesim(TLB-simple ${ci_shared_app} "-simulator_type TLB" "") |
| |
| # Test that -LL_miss_file at least doesn't crash. It's not easy to test |
| # much further. |
| torunonly_drcachesim(missfile ${ci_shared_app} |
| "-LL_miss_file ${CMAKE_CURRENT_BINARY_DIR}/drtestmf.gz" "") |
| set(tool.drcachesim.missfile_source simple) # Share simple template. |
| |
| # Test miss file production. Test reads the cache configuration from a config file. |
| torunonly_drcachesim(missfile-config-file ${ci_shared_app} |
| "-config_file ${config_files_dir}/cores-1-levels-3-with-missfile.conf" |
| "") |
| |
| if (LINUX) # Physaddr access limited to Linux. |
| # XXX i#4014: We should verify that we're actually getting physical addresses: |
| # but A) there may not be pagemap access for automated tests and B) we |
| # would need an analyzer to go examine addresses, or to use the view tool. |
| # For now these are just sanity tests that flipping on the option doesn't |
| # cause outright failure. |
| set(tool.drcachesim.phys_SUDO_sudo ON) |
| set(tool.drcachesim.phys_SUDO_expectbase "phys") |
| torunonly_drcachesim(phys_SUDO ${ci_shared_app} "-use_physical" "") |
| set(tool.drcachesim.phys-threads_SUDO_sudo ON) |
| set(tool.drcachesim.phys-threads_SUDO_expectbase "phys-threads") |
| torunonly_drcachesim(phys-threads_SUDO client.annotation-concurrency "-use_physical" |
| "${annotation_test_args_shorter}") |
| endif () |
| |
| set(test_mode_flag "-test_mode") |
| torunonly_drcachesim(filter-simple ${ci_shared_app} |
| "-L0_filter ${test_mode_flag}" "") |
| if (DEBUG AND DR_HOST_X86 AND DR_HOST_X64 AND LINUX) |
| # If we have a pure-asm app with a constant instr count, check that count. |
| torunonly_drcachesim(filter-asm allasm_x86_64 |
| "-L0_filter -test_mode -test_mode_name filter_asm_instr_count" "") |
| endif () |
| torunonly_drcachesim(filter-no-i ${ci_shared_app} |
| "-L0I_filter -L0I_size 0 -simulator_type basic_counts ${test_mode_flag}" "") |
| torunonly_drcachesim(filter-i ${ci_shared_app} |
| "-L0I_filter -L0I_size 1024 -simulator_type basic_counts ${test_mode_flag}" "") |
| set(tool.drcachesim.filter-i_expectbase "basic-counts-generic") |
| torunonly_drcachesim(filter-no-d ${ci_shared_app} |
| "-L0D_filter -L0D_size 0 -simulator_type basic_counts ${test_mode_flag}" "") |
| torunonly_drcachesim(filter-d ${ci_shared_app} |
| "-L0D_filter -L0D_size 1024 -simulator_type basic_counts ${test_mode_flag}" "") |
| set(tool.drcachesim.filter-d_expectbase "basic-counts-generic") |
| |
| torunonly_drcachesim(instr-only-trace ${ci_shared_app} "-instr_only_trace" "") |
| |
| # __builtin_prefetch used in the test is not defined on MSVC. |
| if (NOT MSVC) |
| add_exe(builtin_prefetch ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/builtin_prefetch.c) |
| torunonly_drcachesim(builtin-prefetch-basic-counts builtin_prefetch "-simulator_type basic_counts" "") |
| unset(tool.drcachesim.builtin-prefetch-basic-counts_rawtemp) # use preprocessor |
| endif () |
| |
| torunonly_drcachesim(delay-simple ${ci_shared_app} |
| "-trace_after_instrs 20000 -exit_after_tracing 10000" "") |
| |
| # We use a many-threaded test with a small max and test that we only see |
| # 1 thread, testing the thread ignore logic. The max should be small enough |
| # to not be flaky on any platform. |
| torunonly_drcachesim(delay-global client.annotation-concurrency |
| "-simulator_type basic_counts -trace_after_instrs 20K -max_global_trace_refs 10K" |
| "${annotation_test_args_shorter}") |
| |
| torunonly_drcachesim(windows-simple ${ci_shared_app} |
| "-trace_after_instrs 20K -trace_for_instrs 5K -retrace_every_instrs 35K -simulator_type basic_counts" "") |
| |
| # Test that "Warmup hits" and "Warmup misses" are printed out |
| torunonly_drcachesim(warmup-valid ${ci_shared_app} "-warmup_refs 1" "") |
| |
| # Test that warmup was enabled but not triggered. |
| torunonly_drcachesim(warmup-zeros ${ci_shared_app} "-warmup_refs 1000000000" "") |
| |
| # Our pthreads tests don't have many threads so we run this annot test, |
| # though it is a little slow under drcachesim. |
| # XXX i#1703: this may be too flaky: we may want to remove this once |
| # we add some dedicated multi-thread (and multi-process) tests with |
| # more deterministic output. |
| # We test -cpu_scheduling on several tests with many threads. |
| # We use a smaller test (_shorter) to avoid taking multiple minutes on our |
| # CI (i#4059; xref i#2063). |
| torunonly_drcachesim(threads client.annotation-concurrency "-cpu_scheduling" |
| "${annotation_test_args_shorter}") |
| |
| # Threads test that reads the cache configuration from a config file. |
| torunonly_drcachesim(threads-with-config-file client.annotation-concurrency |
| "-config_file ${config_files_dir}/cores-1-levels-3-no-missfile.conf" |
| "${annotation_test_args_shorter}") |
| set(tool.drcachesim.threads_timeout 150) # This test is long. |
| |
| torunonly_drcachesim(coherence client.annotation-concurrency "-coherence" |
| "${annotation_test_args_shorter}") |
| set(tool.drcachesim.coherence_timeout 150) # This test is long. |
| |
| # TLB simulator's multi-thread sanity check |
| torunonly_drcachesim(TLB-threads client.annotation-concurrency |
| "-simulator_type TLB -cpu_scheduling" "${annotation_test_args_shorter}") |
| # i#2063: this test can time out. |
| set(tool.drcachesim.TLB-threads_timeout 150) |
| |
| if (ARM) |
| torunonly_drcachesim(allasm-thumb common.allasm_thumb "" "") |
| torunonly_drcachesim(allasm-arm common.allasm_arm "" "") |
| endif () |
| |
| if (AARCH64) |
| torunonly_drcachesim(allasm-aarch64-cache common.allasm_aarch64_cache |
| # XXX i#2676: We disable the data prefetcher until someone with A64 |
| # hardware gets a chance to update the expected output. |
| "-data_prefetcher none" "") |
| |
| torunonly_drcachesim(allasm-aarch64-prefetch-basic-counts allasm_aarch64_prefetch |
| "-simulator_type basic_counts" "") |
| |
| torunonly_drcachesim(allasm-aarch64-flush-basic-counts allasm_aarch64_flush |
| "-simulator_type basic_counts" "") |
| endif () |
| |
| # XXX i#1703: add more dedicated tests (in suite/tests/clients/) for which |
| # we know the results, and check the output. |
| # We have one so far: |
| if (UNIX) # FIXME i#1727: on Windows the child fails to open the pipe. |
| add_exe(tool.multiproc |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/multiproc.c) |
| get_target_path_for_execution(tool.multiproc_path tool.multiproc "${location_suffix}") |
| torunonly_drcachesim(multiproc tool.multiproc "" "${tool.multiproc_path}") |
| endif () |
| |
| # Test the cache miss analyzer. |
| if (UNIX) |
| add_exe(stride_benchmark |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/stride_benchmark.cpp) |
| torunonly_drcachesim(miss_analyzer stride_benchmark |
| "-simulator_type miss_analyzer -miss_count_threshold 5000 -miss_frac_threshold 0.25" "") |
| endif () |
| |
| # Test other analysis tools |
| macro (torunonly_simtool testname exetgt sim_ops app_args) |
| torunonly_ci(tool.${testname} ${exetgt} drcachesim |
| "${testname}.c" # for templatex basename |
| "-ipc_name ${IPC_PREFIX}drtestpipe_${testname} ${sim_ops}" "" "${app_args}") |
| set(tool.${testname}_toolname "drcachesim") |
| set(tool.${testname}_basedir "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| endmacro (torunonly_simtool) |
| |
| torunonly_simtool(histogram ${ci_shared_app} |
| "-simulator_type histogram -report_top 20" "") |
| |
| torunonly_simtool(reuse_distance ${ci_shared_app} |
| "-simulator_type reuse_distance -reuse_distance_threshold 256" "") |
| |
| # We run common.decode-bad to test markers for faults |
| if (X86) # decode-bad is x86-only |
| torunonly_simtool(basic_counts common.decode-bad |
| "-simulator_type basic_counts" "") |
| endif () |
| |
| if (X86 AND X64) # We only bother with a sample trace for x86_64. |
| # We test with a fixed trace file so we can test exact numeric results. |
| set(small_trace_file |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.small.x64.trace") |
| torunonly_simtool(reuse_offline ${ci_shared_app} |
| "-infile ${small_trace_file} -simulator_type reuse_distance -reuse_distance_histogram" "") |
| |
| # Our multi-threaded sample trace is larger so we require gzip. |
| if (ZLIB_FOUND) |
| set(thread_trace_dir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.threadsig.x64.tracedir") |
| torunonly_simtool(reuse_offline_threads ${ci_shared_app} |
| "-indir ${thread_trace_dir} -simulator_type reuse_distance -reuse_distance_histogram" "") |
| set(tool.reuse_offline_threads_rawtemp ON) # no preprocessor |
| |
| torunonly_simtool(reuse_time_offline ${ci_shared_app} |
| "-indir ${thread_trace_dir} -simulator_type reuse_time" "") |
| set(tool.reuse_time_offline_rawtemp ON) # no preprocessor |
| |
| torunonly_simtool(counts_only_thread ${ci_shared_app} |
| "-indir ${thread_trace_dir} -simulator_type basic_counts -only_thread 1257604" |
| "") |
| set(tool.counts_only_thread_rawtemp ON) # no preprocessor |
| |
| torunonly_simtool(schedule_stats_nopreempt ${ci_shared_app} |
| "-indir ${thread_trace_dir} -simulator_type schedule_stats -core_sharded -sched_quantum 10000000" |
| "") |
| set(tool.schedule_stats_nopreempt_rawtemp ON) # no preprocessor |
| |
| torunonly_simtool(core_serial ${ci_shared_app} |
| "-indir ${thread_trace_dir} -simulator_type schedule_stats:basic_counts -core_serial" |
| "") |
| set(tool.core_serial_rawtemp ON) # no preprocessor |
| |
| set(cpu_sched_path "${thread_trace_dir}/cpu_schedule.bin.zip") |
| torunonly_simtool(simulate_as_traced ${ci_shared_app} |
| "-indir ${thread_trace_dir} -core_serial -cpu_schedule_file ${cpu_sched_path} -cores 7" |
| "") |
| set(tool.simulate_as_traced_rawtemp ON) # no preprocessor |
| |
| set(switch_file |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/mock_switch_sequences.x64.zip") |
| torunonly_simtool(switch_insertion ${ci_shared_app} |
| "-indir ${thread_trace_dir} -simulator_type basic_counts -core_sharded -sched_quantum 1000 -sched_switch_file ${switch_file}" |
| "") |
| set(tool.switch_insertion_rawtemp ON) # no preprocessor |
| |
| # Sanity test that core-sharded at least runs without errors on our other tools. |
| torunonly_simtool(core_sharded ${ci_shared_app} |
| "-indir ${thread_trace_dir} -simulator_type reuse_time:reuse_distance:histogram:opcode_mix:syscall_mix -core_sharded" |
| "") |
| set(tool.core_sharded_rawtemp ON) # no preprocessor |
| |
| # Test analysis of core-sharded-on-disk traces. |
| set(core_sharded_dir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.threadsig-core-sharded.x64.tracedir") |
| torunonly_simtool(core_on_disk ${ci_shared_app} |
| "-indir ${core_sharded_dir} -simulator_type basic_counts" "") |
| set(tool.core_on_disk_rawtemp ON) # no preprocessor |
| |
| torunonly_simtool(core_on_disk_schedule ${ci_shared_app} |
| "-indir ${core_sharded_dir} -simulator_type schedule_stats" "") |
| set(tool.core_on_disk_schedule_rawtemp ON) # no preprocessor |
| endif () |
| endif () |
| |
| # We run an app w/ kernel xfers to test invariant_checker online. |
| # Offline invariants are tested in the tool.histogram.offline test below. |
| if (UNIX) |
| # The signal_invariants asm is x86-only. The extra checks are cross-arch |
| # so we do not try to port it to ARM or Mac but use a different app there. |
| if (X86 AND NOT APPLE) |
| add_exe(drmemtrace.signal_invariants |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/signal_invariants.c") |
| link_with_pthread(drmemtrace.signal_invariants) |
| set(kernel_xfer_app drmemtrace.signal_invariants) |
| else () |
| set(kernel_xfer_app pthreads.ptsig) |
| endif () |
| else () |
| set(kernel_xfer_app client.winxfer) # We want threads and xfers. |
| endif() |
| if (DEBUG) # for -test_mode |
| torunonly_drcachesim(invariants ${kernel_xfer_app} |
| "-test_mode -test_mode_name kernel_xfer_app" "") |
| # This is slow on Windows. I tried reducing the tracing window but |
| # it seems to vary too much across machines, and if we delay too far |
| # we start in the middle of a callback. |
| set(tool.drcachesim.invariants_timeout 180) |
| endif () |
| |
| if ((NOT MACOS) AND (X86 OR AARCH64)) |
| torunonly_drcachesim(scattergather-${ARCH_NAME} client.drx-scattergather |
| "-simulator_type invariant_checker" "") |
| unset(tool.drcachesim.scattergather-${ARCH_NAME}_rawtemp) # use preprocessor |
| if (proc_supports_avx512) |
| set(tool.drcachesim.scattergather-${ARCH_NAME}_runavx512 1) |
| elseif (proc_supports_avx) |
| set(tool.drcachesim.scattergather-${ARCH_NAME}_runavx 1) |
| elseif (proc_supports_sve2) |
| set(tool.drcachesim.scattergather-${ARCH_NAME}_runsve2 1) |
| elseif (proc_supports_sve) |
| set(tool.drcachesim.scattergather-${ARCH_NAME}_runsve 1) |
| endif () |
| endif () |
| |
| if (NOT RISCV64) |
| # Test offline traces. |
| # XXX: we could exclude the pipe files and build the offline trace |
| # support by itself for Android. |
| # TODO i#3544: Port tests to RISC-V 64 |
| get_target_path_for_execution(drcachesim_path drcachesim "${location_suffix}") |
| prefix_cmd_if_necessary(drcachesim_path ON ${drcachesim_path}) |
| get_target_path_for_execution(drraw2trace_path drraw2trace "${location_suffix}") |
| prefix_cmd_if_necessary(drraw2trace_path ON ${drraw2trace_path}) |
| |
| torunonly_drcachesim(opcode_mix ${ci_shared_app} |
| "-instr_encodings -simulator_type opcode_mix" "") |
| endif (NOT RISCV64) |
| # The sim_atops should start with @ and be in @-as-space format (hence "atops"). |
| # If the exetgt has drcachesim statically linked in, the _nodr property must be |
| # set *before* invoking this macro. |
| macro (torunonly_drcacheoff testname exetgt tracer_ops sim_atops app_args) |
| set(testname_full "tool.drcacheoff.${testname}") |
| if (${testname_full}_nodr) |
| # Static apps do not receive our -subdir_prefix param, but they have unique |
| # executable names so we're ok. |
| set(dir_prefix "drmemtrace.${testname_full}") |
| else () |
| set(dir_prefix "${testname_full}") |
| endif () |
| set(extra_ops "") |
| if (WIN32 AND NOT ${testname_full}_full_run) |
| # Shrink test times on Appveyor. |
| set(extra_ops "-max_trace_size 1M") |
| endif () |
| torunonly_ci(tool.drcacheoff.${testname} ${exetgt} drcachesim |
| "offline-${testname}.c" # for templatex basename |
| # Set a test-unique prefix to avoid races removing/finding output. |
| "-offline -subdir_prefix ${testname_full} ${extra_ops} ${tracer_ops}" |
| "" "${app_args}") |
| set(${testname_full}_toolname "drcachesim") |
| set(${testname_full}_basedir "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(${testname_full}_rawtemp ON) # no preprocessor |
| set(${testname_full}_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| # Support for running under sudo for -use_physical. |
| # Each command is assumed to need sudo. |
| if (DEFINED ${testname_full}_sudo) |
| set(cmd_pfx "sudo@") |
| else () |
| set(cmd_pfx "") |
| endif () |
| set(${testname_full}_precmd |
| "foreach@${cmd_pfx}${CMAKE_COMMAND}@-E@remove_directory@${dir_prefix}.*.dir") |
| if (${testname_full}_nopost) |
| # No post needed. |
| else () |
| set(${testname_full}_postcmd |
| "firstglob@${cmd_pfx}${drcachesim_path}@-indir@${dir_prefix}.*.dir${sim_atops}") |
| endif () |
| set(${testname_full}_self_serial ON) |
| endmacro() |
| |
| # We could share drcachesim-simple.templatex if we had the launcher fork |
| # and print out the "---- <application exited with code 0> ----". |
| torunonly_drcacheoff(simple ${ci_shared_app} "" |
| # We pass a small instr count to test multiple chunks in a zipfile. |
| "@-chunk_instr_count@10K" "") |
| |
| if (UNIX) |
| # Test an app with a fork. |
| torunonly_drcacheoff(fork linux.fork "" "" "") |
| endif () |
| |
| # Test reading a legacy pre-interleaved file. |
| if (ZLIB_FOUND) |
| torunonly_api(tool.drcacheoff.legacy "${drcachesim_path}" "offline-legacy.c" "" |
| "-infile;${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/offline-legacy-trace.gz" |
| OFF OFF) |
| set(tool.drcacheoff.legacy_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(tool.drcacheoff.legacy_rawtemp ON) # no preprocessor |
| endif () |
| |
| # Sanity tests for compression of raw output files. |
| if (libsnappy) |
| torunonly_drcacheoff(raw-snappy ${ci_shared_app} "-raw_compress snappy" "" "") |
| set(tool.drcacheoff.raw-snappy_expectbase "offline-simple") |
| torunonly_drcacheoff(raw-snappy-nocrc ${ci_shared_app} |
| "-raw_compress snappy_nocrc" "" "") |
| set(tool.drcacheoff.raw-snappy-nocrc_expectbase "offline-simple") |
| endif () |
| if (ZLIB_FOUND) |
| torunonly_drcacheoff(raw-zlib ${ci_shared_app} "-raw_compress zlib" "" "") |
| set(tool.drcacheoff.raw-zlib_expectbase "offline-simple") |
| torunonly_drcacheoff(raw-gzip ${ci_shared_app} "-raw_compress gzip" "" "") |
| set(tool.drcacheoff.raw-gzip_expectbase "offline-simple") |
| endif () |
| # lz4 is on by default so we test no compression here. |
| torunonly_drcacheoff(raw-none ${ci_shared_app} "-raw_compress none" "" "") |
| set(tool.drcacheoff.raw-none_expectbase "offline-simple") |
| |
| # Test that malloc & co. are not invoked. |
| # We disable the lz4 default as both lz4 and snappy call |
| # dr_allow_unsafe_static_behavior(). |
| # We enable function tracing for a non-library-exported function to exercise drsyms. |
| torunonly_drcacheoff(check-malloc ${ci_shared_app} |
| "-raw_compress none -record_function 'main|2'" "" "") |
| set(tool.drcacheoff.check-malloc_expectbase "offline-simple") |
| |
| # Test reading a trace in sharded snappy-compressed files. |
| if (libsnappy) |
| # with a parallel tool (basic_counts) |
| torunonly_api(tool.drcacheoff.snappy "${drcachesim_path}" "offline-snappy.c" "" |
| "-indir;${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.chase-snappy.x64.tracedir;-simulator_type;basic_counts" |
| OFF OFF) |
| |
| # with a legacy serial tool (full simulator) |
| torunonly_api(tool.drcacheoff.snappy "${drcachesim_path}" "offline-snappy-serial.c" "" |
| "-indir;${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.chase-snappy.x64.tracedir" |
| OFF OFF) |
| set(tool.drcacheoff.snappy_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| endif() |
| |
| if (UNIX) # Enable on Windows once i#1727 is fixed. |
| # FIXME i#2384: we need to combine the subdir from the child with the |
| # parent in some way and update the templatex file to include both. |
| # Right now we're only ensuring this doesn't crash and that one of |
| # the processes produced traces. |
| torunonly_drcacheoff(multiproc tool.multiproc "" "" "${tool.multiproc_path}") |
| endif () |
| |
| torunonly_drcacheoff(filter ${ci_shared_app} "-L0_filter ${test_mode_flag}" "" "") |
| torunonly_drcacheoff(filter-no-i ${ci_shared_app} |
| "-L0I_filter -L0I_size 0 ${test_mode_flag}" "@-simulator_type@basic_counts" "") |
| torunonly_drcacheoff(filter-i ${ci_shared_app} |
| "-L0I_filter -L0I_size 1024 ${test_mode_flag}" "@-simulator_type@basic_counts" "") |
| set(tool.drcacheoff.filter-i_expectbase "offline-basic-counts-generic") |
| torunonly_drcacheoff(filter-no-d ${ci_shared_app} |
| "-L0D_filter -L0D_size 0 ${test_mode_flag}" "@-simulator_type@basic_counts" "") |
| torunonly_drcacheoff(filter-d ${ci_shared_app} |
| "-L0D_filter -L0D_size 1024 ${test_mode_flag}" "@-simulator_type@basic_counts" "") |
| set(tool.drcacheoff.filter-d_expectbase "offline-basic-counts-generic") |
| |
| torunonly_drcacheoff(instr-only-trace ${ci_shared_app} "-instr_only_trace" "" "") |
| torunonly_drcacheoff(filter-and-instr-only-trace ${ci_shared_app} "-instr_only_trace -L0_filter" "" "") |
| |
| if (LINUX) # Test uses Linux-specific timer code. |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| torunonly_drcacheoff(sysnums linux.signal_pre_syscall "" |
| "@-simulator_type@basic_counts@${test_mode_flag}" "") |
| endif () |
| endif () |
| |
| torunonly_drcacheoff(interval-microseconds-count-output ${ci_shared_app} "" |
| "@-simulator_type@basic_counts@-interval_microseconds@1M" "") |
| |
| torunonly_drcacheoff(interval-instr-count-output ${ci_shared_app} "" |
| "@-simulator_type@basic_counts@-interval_instr_count@10000" "") |
| |
| # As for the online test, we check that only 1 thread is in the final trace. |
| torunonly_drcacheoff(max-global client.annotation-concurrency |
| # Include function tracing to sanity test combining with delay and max. |
| # We don't use '-record_heap' as it is slow on Windows (i#6342). |
| "-trace_after_instrs 20K -max_global_trace_refs 10K -record_function malloc|1" |
| "@-simulator_type@basic_counts" "${annotation_test_args_shorter}") |
| set(tool.drcacheoff.max-global_timeout 240) # Can take >120s. |
| |
| torunonly_drcacheoff(delay-func ${ci_shared_app} |
| # Delay enough that zero data should be logged to test that function |
| # tracing is delayed (i#4893). |
| # Update: drmemtrace now does not even create an output file if tracing |
| # never starts, so this now serves as a test of that. It only tests |
| # delayed function tracing if enough such tracing accumulated to output |
| # on its own which would assert on not having a file. |
| # This is also large enough to test the (non-triggering portion of) the |
| # per-thread counter feature (i#5026). |
| "-trace_after_instrs 200M -record_heap" |
| "@-simulator_type@basic_counts" "") |
| # There is now no data file at all: which we test by echoing the glob. |
| set(tool.drcacheoff.delay-func_nopost ON) |
| set(tool.drcacheoff.delay-func_postcmd |
| "${CMAKE_COMMAND}@-E@echo@${dir_prefix}.*.dir/raw/*raw*") |
| set(tool.drcacheoff.delay-func_timeout 240) # Can take >90s. |
| |
| torunonly_drcacheoff(windows-simple ${ci_shared_app} |
| "-no_split_windows -trace_after_instrs 20K -trace_for_instrs 5K -retrace_every_instrs 35K" |
| "@-simulator_type@basic_counts" "") |
| if (ZLIB_FOUND) |
| torunonly_drcacheoff(windows-zlib ${ci_shared_app} |
| "-raw_compress zlib -no_split_windows -trace_after_instrs 20K -trace_for_instrs 5K -retrace_every_instrs 35K" |
| "@-simulator_type@basic_counts" "") |
| set(tool.drcacheoff.windows-zlib_expectbase "offline-windows-simple") |
| torunonly_drcacheoff(windows-gzip ${ci_shared_app} |
| "-raw_compress gzip -no_split_windows -trace_after_instrs 20K -trace_for_instrs 5K -retrace_every_instrs 35K" |
| "@-simulator_type@basic_counts" "") |
| set(tool.drcacheoff.windows-gzip_expectbase "offline-windows-simple") |
| endif () |
| # lz4 is on by default so we test no compression here. |
| torunonly_drcacheoff(windows-none ${ci_shared_app} |
| "-raw_compress none -no_split_windows -trace_after_instrs 20K -trace_for_instrs 5K -retrace_every_instrs 35K" |
| "@-simulator_type@basic_counts" "") |
| set(tool.drcacheoff.windows-none_expectbase "offline-windows-simple") |
| # Ensure the invariant checker handles window transitions. |
| torunonly_drcacheoff(windows-invar ${ci_shared_app} |
| "-no_split_windows -trace_after_instrs 20K -trace_for_instrs 5K -retrace_every_instrs 35K" |
| "@-simulator_type@invariant_checker" "") |
| if (X86 AND X64 AND UNIX) |
| torunonly_drcacheoff(windows-asm allasm_repstr |
| "-no_split_windows -trace_after_instrs 3 -trace_for_instrs 4 -retrace_every_instrs 4" |
| "@-simulator_type@basic_counts" "") |
| endif () |
| # Test split-file windows. |
| torunonly_drcacheoff(windows-split ${ci_shared_app} |
| "-trace_after_instrs 20K -trace_for_instrs 10K -retrace_every_instrs 30K" |
| "@-simulator_type@basic_counts" "") |
| # The first postcmd did window #0. There should be at least 2 more windows. |
| set(tool.drcacheoff.windows-split_postcmd2 |
| "firstglob@${drcachesim_path}@-indir@${dir_prefix}.*.dir/raw/window.0001@-simulator_type@basic_counts") |
| set(tool.drcacheoff.windows-split_postcmd3 |
| "firstglob@${drcachesim_path}@-indir@${dir_prefix}.*.dir/raw/window.0002@-simulator_type@basic_counts") |
| |
| # Test L0_filter_until_instrs |
| torunonly_drcacheoff(L0-filter-until-instrs-windows-split ${ci_shared_app} |
| "-trace_after_instrs 10K -L0_filter_until_instrs 10K -trace_for_instrs 10K -retrace_every_instrs 10K" |
| "@-simulator_type@basic_counts" "") |
| # The first postcmd did window #0. There should be at least 2 more windows. |
| set(tool.drcacheoff.L0-filter-until-instrs-windows-split_postcmd2 |
| "firstglob@${drcachesim_path}@-indir@${dir_prefix}.*.dir/raw/window.0001@-simulator_type@basic_counts") |
| set(tool.drcacheoff.L0-filter-until-instrs-windows-split_postcmd3 |
| "firstglob@${drcachesim_path}@-indir@${dir_prefix}.*.dir/raw/window.0002@-simulator_type@basic_counts") |
| |
| torunonly_drcacheoff(L0-filter-until-instrs-2 ${ci_shared_app} |
| "-trace_after_instrs 10 -L0_filter_until_instrs 10K -trace_for_instrs 10K -retrace_every_instrs 10K" |
| "@-simulator_type@basic_counts" "") |
| |
| torunonly_drcacheoff(L0-filter-until-instrs-exit-after ${ci_shared_app} |
| "-trace_after_instrs 10K -L0_filter_until_instrs 10K -exit_after_tracing 10K" |
| "@-simulator_type@basic_counts" "") |
| |
| torunonly_drcacheoff(L0-filter-until-instrs-max-refs ${ci_shared_app} |
| "-trace_after_instrs 10K -L0_filter_until_instrs 10K -max_global_trace_refs 10K" |
| "@-simulator_type@basic_counts" "") |
| |
| torunonly_drcacheoff(L0-filter-until-instrs-max-trace-size ${ci_shared_app} |
| "-trace_after_instrs 10K -L0_filter_until_instrs 10K -max_trace_size 10K" |
| "@-simulator_type@basic_counts" "") |
| |
| # pthreads not available with MSVC |
| if (NOT MSVC) |
| set(ci_pthreads_app pthreads.pthreads) |
| # pthreads tests |
| torunonly_drcacheoff(warmup-pthreads-windows-split ${ci_pthreads_app} |
| "-trace_after_instrs 10K -L0_filter_until_instrs 100K -trace_for_instrs 10K -retrace_every_instrs 10K" |
| "@-simulator_type@basic_counts" "") |
| # The first postcmd did window #0. There should be at least 2 more windows. |
| set(tool.drcacheoff.warmup-pthreads-windows-split_postcmd2 |
| "firstglob@${drcachesim_path}@-indir@${dir_prefix}.*.dir/raw/window.0001@-simulator_type@basic_counts") |
| set(tool.drcacheoff.warmup-pthreads-windows-split_postcmd3 |
| "firstglob@${drcachesim_path}@-indir@${dir_prefix}.*.dir/raw/window.0002@-simulator_type@basic_counts") |
| |
| torunonly_drcacheoff(warmup-pthreads-2 ${ci_pthreads_app} |
| "-trace_after_instrs 10 -L0_filter_until_instrs 10K -trace_for_instrs 10K -retrace_every_instrs 10K" |
| "@-simulator_type@basic_counts" "") |
| |
| torunonly_drcacheoff(warmup-pthreads-max-refs ${ci_pthreads_app} |
| "-trace_after_instrs 10K -L0_filter_until_instrs 10K -max_global_trace_refs 300K" |
| "@-simulator_type@basic_counts" "20000") |
| |
| torunonly_drcacheoff(warmup-pthreads-max-trace-size ${ci_pthreads_app} |
| "-trace_after_instrs 10K -L0_filter_until_instrs 10K -max_trace_size 100K" |
| "@-simulator_type@basic_counts" "") |
| endif () |
| |
| |
| # __builtin_prefetch used in the test is not defined on MSVC. |
| if (NOT MSVC) |
| torunonly_drcacheoff(builtin-prefetch-basic-counts builtin_prefetch "" "@-simulator_type@basic_counts" "") |
| unset(tool.drcacheoff.builtin-prefetch-basic-counts_rawtemp) # use preprocessor |
| endif () |
| |
| if (X86 AND X64 AND ZLIB_FOUND) |
| # XXX i#5538: Add trace files for other arches. |
| set(zip_path |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.allasm_x86_64.trace.zip") |
| torunonly_api(tool.drcacheoff.skip "${drcachesim_path}" "offline-skip" "" |
| # Test invariants with global headers after skipping instrs. |
| # Here the skip does not find real headers and we expect synthetic. |
| "-simulator_type;view;-infile;${zip_path};${test_mode_flag};-skip_instrs;62;-sim_refs;10" |
| OFF OFF) |
| set(tool.drcacheoff.skip_basedir "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(tool.drcacheoff.skip_rawtemp ON) # no preprocessor |
| torunonly_api(tool.drcacheoff.skip2 "${drcachesim_path}" "offline-skip2" "" |
| # Test invariants with global headers after skipping instrs. |
| # Here the skip finds real headers and we expect no synthetic. |
| "-simulator_type;view;-infile;${zip_path};${test_mode_flag};-skip_instrs;63;-sim_refs;10" |
| OFF OFF) |
| set(tool.drcacheoff.skip2_basedir "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(tool.drcacheoff.skip2_rawtemp ON) # no preprocessor |
| |
| # Ensure -cpu_scheduling follows thread migrations. |
| # We have a checked-in trace with a migration. |
| set(migrate_path |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.simple_app.trace.zip") |
| torunonly_api(tool.drcacheoff.cpu "${drcachesim_path}" "offline-cpu" "" |
| "-cpu_scheduling;-infile;${migrate_path}" |
| OFF OFF) |
| set(tool.drcacheoff.cpu_basedir "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(tool.drcacheoff.cpu_rawtemp ON) # no preprocessor |
| endif () |
| |
| # We run common.decode-bad to test markers for faults |
| if (X86) # decode-bad is x86-only |
| # Do not cap the trace size (done to shorten tests) b/c it will then miss |
| # kernel transfer events. |
| set(tool.drcacheoff.basic_counts_full_run ON) |
| torunonly_drcacheoff(basic_counts common.decode-bad "" |
| "@-simulator_type@basic_counts" "") |
| unset(tool.drcacheoff.basic_counts_rawtemp) |
| endif () |
| if (NOT RISCV64) |
| # TODO i#3544: Port tests to RISC-V 64 |
| torunonly_drcacheoff(opcode_mix ${ci_shared_app} "" |
| "@-simulator_type@opcode_mix" "") |
| # Ensure the tool works without the raw/ subdir. |
| set(tool.drcacheoff.opcode_mix_postcmd |
| "firstglob@${drraw2trace_path}@-indir@${dir_prefix}.*.dir") |
| set(tool.drcacheoff.opcode_mix_postcmd2 |
| "foreach@${CMAKE_COMMAND}@-E@remove_directory@${dir_prefix}.*.dir/raw") |
| set(tool.drcacheoff.opcode_mix_postcmd3 |
| "firstglob@${drcachesim_path}@-indir@${dir_prefix}.*.dir@-simulator_type@opcode_mix") |
| |
| torunonly_drcacheoff(view ${ci_shared_app} "" |
| "@-simulator_type@view@-sim_refs@16384" "") |
| unset(tool.drcacheoff.view_rawtemp) # Use preprocessor |
| if (AARCH64 AND proc_supports_sve) |
| set(tool.drcacheoff.view_runsve 1) |
| endif () |
| |
| set(tool.drcacheoff.func_view_full_run ON) # Fails on Windows if truncated. |
| torunonly_drcacheoff(func_view common.fib "-record_function fib|1" |
| "@-simulator_type@func_view" "only_5") |
| endif (NOT RISCV64) |
| if (DR_HOST_X86 AND DR_HOST_X64 AND LINUX) |
| torunonly_drcacheoff(opcode_categories allasm_x86_64 "" |
| "@-simulator_type@opcode_mix" "") |
| |
| # Requires sudo to access pagemap. |
| # XXX: Should we not enable this outside of the Github suite where we know |
| # we have passwordless sudo? The pause for a password may cause problems |
| # for local interactive test running. |
| set(tool.drcacheoff.phys_SUDO_sudo ON) |
| set(tool.drcacheoff.phys_SUDO_expectbase "offline-phys") |
| torunonly_drcacheoff(phys_SUDO allasm_repstr |
| "-use_physical" "@${test_mode_flag}@-simulator_type@view" "") |
| set(tool.drcacheoff.phys_nopriv_failok ON) |
| set(tool.drcacheoff.phys_nopriv_nopost ON) |
| torunonly_drcacheoff(phys_nopriv allasm_x86_64 |
| "-use_physical" "@${test_mode_flag}@-simulator_type@view" "") |
| endif () |
| |
| if (UNIX AND ZLIB_FOUND) |
| add_exe(tool.fib_plus |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/fib_plus.c) |
| link_with_pthread(tool.fib_plus) |
| # We could run this like so, but with threads the output is non-deterministic: |
| # torunonly_drcacheoff(func_view_noret tool.fib_plus |
| # "-record_function fib|1&noret_func|2|noret&noargs|0" |
| # "@-simulator_type@func_view" "") |
| # Thus we run this manually and check in the resulting trace. I ran with |
| # a delay to shrink the size, since we are not interesting in the main thread's |
| # pre-main() init: |
| # $ bin64/drrun -t drcachesim -offline -trace_after_instrs 210K \ |
| # -record_function 'fib|1&noret_func|2|noret&noargs|0' -- \ |
| # suite/tests/bin/tool.fib_plus |
| # $ bin64/drrun -t drcachesim -simulator_type func_view -indir \ |
| # drmemtrace*.dir/ |
| torunonly_api(tool.drcacheoff.func_view_noret "${drcachesim_path}" |
| "offline-func_view_noret.c" "" |
| "-indir;${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/offline-func-trace;-simulator_type;func_view" |
| OFF OFF) |
| set(tool.drcacheoff.func_view_noret_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(tool.drcacheoff.func_view_noret_rawtemp ON) # no preprocessor |
| endif () |
| |
| # i#3048: Our mangled operator new/delete tracing is UNIX-only. |
| # PR#4178: Despite the aligned-new code in this test being guarded by |
| # "if defined(__cpp_aligned_new)" it fails to build on Travis clang-9 and |
| # OSX presumably due to runtime vs compiler mismatches. We just disable |
| # for clang for now and can re-enable later w/ more recent runtimes. |
| if (UNIX AND NOT CMAKE_COMPILER_IS_CLANG) |
| set(heap_test_src ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/heap_test.cpp) |
| add_exe(tool.heap_test ${heap_test_src}) |
| if (cxx17_available) |
| # Enable recent operator new/delete variants. |
| set_source_files_properties(${heap_test_src} PROPERTIES |
| # XXX: c++17 seems to warn more about the static functions in tools.h. |
| # We should move those to tools.c. For now we disable the warning. |
| COMPILE_FLAGS "${ORIG_CMAKE_CXX_FLAGS} -std=c++17 -Wno-unused-function") |
| endif () |
| torunonly_drcacheoff(func_view_heap tool.heap_test |
| "-record_heap" "@-simulator_type@func_view@-no_show_func_trace" "") |
| unset(tool.drcacheoff.func_view_heap_rawtemp) # use preprocessor |
| endif () |
| |
| if (LINUX AND X64 AND HAVE_RSEQ) |
| torunonly_drcacheoff(rseq linux.rseq |
| # Run with -trace_after_instrs to ensure we test the |
| # drbbdup + rseq combo (i#5658, i#5659). |
| "-trace_after_instrs 5K" |
| "@${test_mode_flag}@-test_mode_name@rseq_app" "") |
| # Test filtering. |
| torunonly_drcacheoff(rseq-filter linux.rseq |
| "-trace_after_instrs 5K -L0_filter" |
| "@${test_mode_flag}@-test_mode_name@rseq_app" "") |
| set(tool.drcacheoff.rseq-filter_expectbase "offline-rseq") |
| torunonly_drcacheoff(rseq-dfilter linux.rseq |
| "-trace_after_instrs 5K -L0D_filter" |
| "@${test_mode_flag}@-test_mode_name@rseq_app" "") |
| set(tool.drcacheoff.rseq-dfilter_expectbase "offline-rseq") |
| endif () |
| |
| if (AARCH64) |
| set(tool.drcacheoff.burst_aarch64_sys_nodr ON) |
| torunonly_drcacheoff(burst_aarch64_sys tool.drcacheoff.burst_aarch64_sys "" |
| "@-simulator_type@basic_counts" "") |
| endif () |
| |
| if (NOT APPLE AND NOT RISCV64) # XXX i#1997: static DR not fully supported on Mac yet |
| # We specify this executable here as it uses tools.h code. |
| # TODO i#3544: Port tests to RISC-V 64 |
| set(tool.drcacheoff.gencode_no_reg_compat) |
| add_api_exe(tool.drcacheoff.gencode |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/burst_gencode.cpp |
| OFF ON) |
| use_DynamoRIO_static_client(tool.drcacheoff.gencode drmemtrace_static) |
| use_DynamoRIO_drmemtrace_tracer(tool.drcacheoff.gencode) |
| target_link_libraries(tool.drcacheoff.gencode drmemtrace_raw2trace |
| drmemtrace_analyzer test_helpers) |
| target_include_directories(tool.drcacheoff.gencode PUBLIC |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/common" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/reader" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tracer" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/scheduler") |
| set(tool.drcacheoff.gencode_nodr ON) |
| torunonly_drcacheoff(gencode tool.drcacheoff.gencode |
| "" "@-simulator_type@opcode_mix" "") |
| unset(tool.drcacheoff.gencode_rawtemp) # Use preprocessor on template. |
| |
| set(tool.drcacheoff.gencode_filtered_nodr ON) |
| torunonly_drcacheoff(gencode_filtered tool.drcacheoff.gencode |
| "" "@-simulator_type@opcode_mix" |
| "-L0_filter -subdir_prefix drmemtrace.tool.drcacheoff.gencode_filtered") |
| |
| # TODO i#6474, i#2062: Add a similar gencode test with |
| # -L0_filter_until_instrs when i#6474 is fixed. |
| endif () |
| |
| # XXX i#1551: startstop API is NYI on ARM |
| # XXX i#1997: dynamorio_static is not supported on Mac yet |
| # FIXME i#2949: gcc 7.3 fails to link certain configs |
| # TODO i#3544: Port tests to RISC-V 64 |
| if (NOT ARM AND NOT APPLE AND NOT DISABLE_FOR_BUG_2949 AND NOT RISCV64) |
| set(tool.drcacheoff.burst_static_nodr ON) |
| torunonly_drcacheoff(burst_static tool.drcacheoff.burst_static "" "" "") |
| |
| set(tool.drcacheoff.burst_replace_nodr ON) |
| torunonly_drcacheoff(burst_replace tool.drcacheoff.burst_replace "" "" "") |
| |
| set(tool.drcacheoff.burst_replaceall_nodr ON) |
| torunonly_drcacheoff(burst_replaceall tool.drcacheoff.burst_replaceall "" |
| "@-simulator_type@basic_counts" "") |
| unset(tool.drcacheoff.burst_replaceall_rawtemp) # use preprocessor |
| |
| if (X64 AND UNIX) |
| set(tool.drcacheoff.burst_noreach_nodr ON) |
| torunonly_drcacheoff(burst_noreach tool.drcacheoff.burst_noreach "" "" "") |
| endif () |
| if (LINUX) |
| set(tool.drcacheoff.burst_maps_nodr ON) |
| torunonly_drcacheoff(burst_maps tool.drcacheoff.burst_maps "" "" "") |
| endif () |
| if (LINUX) |
| set(tool.drcacheoff.burst_syscall_inject_nodr ON) |
| torunonly_drcacheoff(burst_syscall_inject tool.drcacheoff.burst_syscall_inject "" |
| "@-simulator_type@invariant_checker@-syscall_template_file@drmemtrace.tool.drcacheoff.burst_syscall_inject.*.dir/raw/syscall_trace_template" |
| "") |
| endif () |
| |
| set(tool.drcacheoff.burst_traceopts_nodr ON) |
| set(tool.drcacheoff.burst_traceopts_nopost ON) |
| torunonly_drcacheoff(burst_traceopts tool.drcacheoff.burst_traceopts "" "" "") |
| set(tool.drcacheoff.windows-timestamps_nodr ON) |
| set(tool.drcacheoff.windows-timestamps_nopost ON) |
| torunonly_drcacheoff(windows-timestamps tool.drcacheoff.windows-timestamps "" "" "") |
| set(tool.drcacheoff.windows-timestamps-expectbase "offline-windows-timestamps") |
| set(tool.drcacheoff.windows-timestamps_timeout 120) |
| |
| if (LINUX) # Futex is Linux-only. |
| set(tool.drcacheoff.burst_futex_nodr ON) |
| set(tool.drcacheoff.burst_futex_nopost ON) |
| torunonly_drcacheoff(burst_futex tool.drcacheoff.burst_futex "" "" "") |
| endif () |
| |
| if (UNIX) |
| # FIXME i#2040: this hits static client issues on Windows |
| set(tool.drcacheoff.burst_threads_nodr ON) |
| torunonly_drcacheoff(burst_threads tool.drcacheoff.burst_threads |
| # We test cpu_scheduling for offline traces here. |
| "" "@-cpu_scheduling" "") |
| |
| set(tool.drcacheoff.burst_threads_counts_nodr ON) |
| torunonly_drcacheoff(burst_threads_counts tool.drcacheoff.burst_threads |
| "" "@-simulator_type@basic_counts" |
| # This test uses the same app as the one above, so set a new dir name. |
| "-subdir_prefix drmemtrace.tool.drcacheoff.burst_threads_counts") |
| |
| set(tool.drcacheoff.burst_malloc_nodr ON) |
| torunonly_drcacheoff(burst_malloc tool.drcacheoff.burst_malloc |
| "" "@-simulator_type@basic_counts" "") |
| |
| set(tool.drcacheoff.burst_reattach_nodr ON) |
| torunonly_drcacheoff(burst_reattach tool.drcacheoff.burst_reattach |
| "" "@-simulator_type@basic_counts" "") |
| |
| set(tool.drcacheoff.burst_threadfilter_nodr ON) |
| torunonly_drcacheoff(burst_threadfilter tool.drcacheoff.burst_threadfilter |
| "" "@-simulator_type@basic_counts" "") |
| # This test uses the same app as the one above, so we do not set _nodr |
| # so we'll get a custom -subdir_prefix. We have to pass that in as an |
| # app arg here. |
| torunonly_drcacheoff(burst_threadL0filter tool.drcacheoff.burst_threadfilter |
| "" "@-simulator_type@basic_counts" |
| "-L0_filter -L0I_size 0 -subdir_prefix tool.drcacheoff.burst_threadL0filter") |
| set(tool.drcacheoff.burst_threadL0filter_nodr ON) |
| |
| if (X86 AND NOT APPPLE AND NOT RISCV64) # This test is x86-specific. |
| # Test that raw2trace doesn't do more IO than it should. |
| get_target_path_for_execution(raw2trace_io_path tool.drcacheoff.raw2trace_io |
| "${location_suffix}") |
| prefix_cmd_if_necessary(raw2trace_io_path ON ${raw2trace_io_path}) |
| macro (torunonly_raw2trace testname exetgt extra_ops app_args) |
| set(testname_full "tool.raw2trace.${testname}") |
| torunonly_ci(tool.raw2trace.${testname} ${exetgt} drcachesim |
| "raw2trace-${testname}.c" # for templatex basename |
| # Disable compression, since we need to seek and our compression |
| # readers do not support seeking. |
| "-offline -raw_compress none -subdir_prefix ${testname_full} ${extra_ops}" |
| "" "${app_args}") |
| set(${testname_full}_toolname "drcachesim") |
| set(${testname_full}_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(${testname_full}_rawtemp ON) # no preprocessor |
| set(${testname_full}_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| set(${testname_full}_precmd |
| "foreach@${CMAKE_COMMAND}@-E@remove_directory@${testname_full}.*.dir") |
| set(${testname_full}_postcmd |
| "${raw2trace_io_path}@-indir@${testname_full}.*.dir") |
| endmacro() |
| # actual trace processing not important -- set a very small limit for speed |
| torunonly_raw2trace(simple ${ci_shared_app} "-max_trace_size 8K" "") |
| endif() |
| |
| # FIXME i#2099: the weak symbol is not supported not work on Windows |
| set(tool.drcacheoff.burst_client_nodr ON) |
| torunonly_drcacheoff(burst_client tool.drcacheoff.burst_client "" "" "") |
| endif () |
| endif () |
| |
| if (UNIX AND ((X86 AND X64 AND proc_supports_avx) OR (AARCH64 AND proc_supports_sve))) |
| torunonly_drcacheoff(allasm-scattergather-basic-counts allasm_scattergather |
| "" "@-simulator_type@basic_counts" "") |
| unset(tool.drcacheoff.allasm-scattergather-basic-counts_rawtemp) # use preprocessor |
| if (X86 AND proc_supports_avx512) |
| set(tool.drcacheoff.allasm-scattergather-basic-counts_runavx512 1) |
| elseif (AARCH64) |
| if (proc_supports_sve2) |
| set(tool.drcacheoff.allasm-scattergather-basic-counts_runsve2 1) |
| elseif (proc_supports_sve) |
| set(tool.drcacheoff.allasm-scattergather-basic-counts_runsve 1) |
| endif () |
| endif () |
| set(tool.drcacheoff.allasm-scattergather-basic-counts_expectbase |
| "offline-allasm-scattergather-basic-counts-${ARCH_NAME}") |
| |
| torunonly_drcachesim(allasm-scattergather-basic-counts allasm_scattergather |
| "-simulator_type basic_counts" "") |
| unset(tool.drcachesim.allasm-scattergather-basic-counts_rawtemp) # use preprocessor |
| if (X86 AND proc_supports_avx512) |
| set(tool.drcachesim.allasm-scattergather-basic-counts_runavx512 1) |
| elseif (AARCH64) |
| if (proc_supports_sve2) |
| set(tool.drcachesim.allasm-scattergather-basic-counts_runsve2 1) |
| elseif (proc_supports_sve) |
| set(tool.drcachesim.allasm-scattergather-basic-counts_runsve 1) |
| endif () |
| endif () |
| set(tool.drcachesim.allasm-scattergather-basic-counts_expectbase |
| "allasm-scattergather-basic-counts-${ARCH_NAME}") |
| endif () |
| |
| if (UNIX AND AARCH64 AND proc_supports_sve) |
| torunonly_drcacheoff(allasm-scattergather-vl-view allasm_scattergather |
| "" "@-simulator_type@view" "") |
| unset(tool.drcacheoff.allasm-scattergather-vl-view_rawtemp) # use preprocessor |
| set(tool.drcacheoff.allasm-scattergather-vl-view_runsve 1) |
| set(tool.drcacheoff.allasm-scattergather-vl-view_expectbase |
| "offline-allasm-scattergather-vl-view-${ARCH_NAME}") |
| |
| torunonly_drcachesim(allasm-scattergather-vl-view allasm_scattergather |
| "-simulator_type view" "") |
| unset(tool.drcachesim.allasm-scattergather-vl-view_rawtemp) # use preprocessor |
| set(tool.drcachesim.allasm-scattergather-vl-view_runsve 1) |
| set(tool.drcachesim.allasm-scattergather-vl-view_expectbase |
| "allasm-scattergather-vl-view-${ARCH_NAME}") |
| endif () |
| |
| if (UNIX AND X86 AND X64) |
| torunonly_drcacheoff(allasm-repstr-basic-counts allasm_repstr |
| "" "@-simulator_type@basic_counts" "") |
| unset(tool.drcacheoff.allasm-repstr-basic-counts_rawtemp) # use preprocessor |
| torunonly_drcachesim(allasm-repstr-basic-counts allasm_repstr |
| # We test counting encodings for online. |
| "-instr_encodings -simulator_type basic_counts" "") |
| unset(tool.drcachesim.allasm-repstr-basic-counts_rawtemp) # use preprocessor |
| |
| # Test -record_syscall on SYS_write == #1 with 3 args. |
| torunonly_drcacheoff(allasm-record-syscall allasm_repstr |
| "-record_syscall 1|3" "@-simulator_type@view" "") |
| endif (UNIX AND X86 AND X64) |
| |
| torunonly_drcacheoff(invariant_checker ${ci_shared_app} |
| # We pass a small instr count to test multiple chunks in a zipfile. |
| "" "@-chunk_instr_count@1000@-simulator_type@invariant_checker" "") |
| |
| # pthreads not available with MSVC |
| if (NOT MSVC) |
| torunonly_drcacheoff(invariant_checker_pthreads ${ci_pthreads_app} |
| "" "@-simulator_type@invariant_checker" "") |
| endif () |
| |
| # Test the standalone histogram tool. |
| # ${ci_shared_app} is already used for an offline test, so we run other apps |
| # for variety and to include threads and signals for invariant_checker. |
| set(histo_app ${kernel_xfer_app}) |
| if (WIN32) |
| # winxfer produces a 500M+ trace and test taking >3mins so we narrow |
| # the window. 2M makes a 50M trace and still hits 4 or 5 of the |
| # 13 markers on my machine but is still a little slow so we cut in half |
| # for 2+ markers. |
| # FIXME i#2752: somehow this is hanging on Appveyor so for now we shrink it |
| # from 1M to 50K to make progress. Once we figure out the hang we should |
| # put it back to 1M. |
| set(histo_ops "-trace_after_instrs 5K -exit_after_tracing 50K") |
| set(tool.histogram.offline_timeout 180) |
| else () |
| set(histo_ops "") |
| endif () |
| set(testname_full "tool.histogram.offline") |
| torunonly_ci(${testname_full} ${histo_app} drcachesim |
| "histogram-offline.c" |
| "-offline -subdir_prefix ${testname_full} ${histo_ops}" "" "") |
| set(${testname_full}_toolname "drcachesim") |
| set(${testname_full}_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(${testname_full}_rawtemp ON) # no preprocessor |
| get_target_path_for_execution(histo_path histogram_launcher "${location_suffix}") |
| prefix_cmd_if_necessary(histo_path ON ${histo_path}) |
| set(${testname_full}_runcmp |
| "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| set(${testname_full}_precmd |
| "foreach@${CMAKE_COMMAND}@-E@remove_directory@${testname_full}.*.dir") |
| set(${testname_full}_postcmd |
| "${drcachesim_path}@-indir@${testname_full}.*.dir") |
| set(${testname_full}_postcmd2 |
| "${histo_path}@-test_mode@-test_mode_name@kernel_xfer_app@-trace_dir@${testname_full}.*.dir/trace") |
| |
| # Test the standalone record filter tool (beyond its unit tests). |
| set(testname "tool.record_filter") |
| if (WIN32) |
| # Speed the test up (takes 1+ minutes otherwise). |
| set(extra_ops "-trace_after_instrs 5K -exit_after_tracing 50K") |
| else () |
| set(extra_ops "") |
| endif () |
| torunonly_ci(${testname} ${ci_shared_app} drcachesim |
| "record_filter-offline.c" |
| "-offline -subdir_prefix ${testname} ${extra_ops}" "" "") |
| set(${testname}_toolname "drcachesim") |
| set(${testname}_basedir "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| get_target_path_for_execution(filter_path record_filter_launcher "${location_suffix}") |
| prefix_cmd_if_necessary(filter_path ON ${filter_path}) |
| set(outdir "${testname}.filtered.dir") |
| set(${testname}_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| set(${testname}_precmd |
| "foreach@${CMAKE_COMMAND}@-E@remove_directory@${testname}.*.dir") |
| # Post-process the trace and sanity check it. |
| # Use a smaller chunk threshold to test multiple chunks. |
| set(${testname}_postcmd |
| "${drcachesim_path}@-chunk_instr_count@1000@-indir@${testname}.*.dir@-simulator_type@invariant_checker") |
| # Run the record filter tool with a null filter. |
| set(${testname}_postcmd2 "${CMAKE_COMMAND}@-E@make_directory@${outdir}") |
| set(${testname}_postcmd3 |
| # We assume the app name starts with "s" here to avoid colliding with |
| # our output dir, while still letting the single precmd remove both. |
| "${filter_path}@-trace_dir@${testname}.s*.dir/trace@-output_dir@${outdir}") |
| # Run the invariant checker on the result. |
| set(${testname}_postcmd4 |
| "${drcachesim_path}@-indir@${outdir}@-simulator_type@invariant_checker") |
| |
| # Test the trim filter. |
| if (X86 AND X64 AND ZLIB_FOUND) |
| set(zip_path |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.allasm_x86_64.trace.zip") |
| set(outdir ${PROJECT_BINARY_DIR}/trim_filter) |
| file(MAKE_DIRECTORY ${outdir}) |
| # The filter launcher doesn't have an -infile parameter. |
| set(srcdir ${PROJECT_BINARY_DIR}/trim_filter_src) |
| file(MAKE_DIRECTORY ${srcdir}) |
| file(COPY ${zip_path} DESTINATION ${srcdir}) |
| torunonly_api(tool.drcacheoff.trim "${drcachesim_path}" "offline-trim" "" |
| "-simulator_type;view;-indir;${outdir};${test_mode_flag}" |
| OFF OFF) |
| set(tool.drcacheoff.trim_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| # The filter overwrites any existing file in the dir from a prior run. |
| set(tool.drcacheoff.trim_precmd |
| "${drcachesim_path}@-simulator_type@record_filter@-trim_before_timestamp@13352268558646120@-trim_after_timestamp@13352268558646661@-indir@${srcdir}@-outdir@${outdir}") |
| set(tool.drcacheoff.trim_basedir "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(tool.drcacheoff.trim_rawtemp ON) # no preprocessor |
| endif () |
| |
| if (AARCH64) |
| set(testname_full "tool.drcacheoff.allasm-aarch64-prefetch-counts") |
| torunonly_ci(${testname_full} allasm_aarch64_prefetch drcachesim |
| "offline-allasm-aarch64-prefetch-counts" |
| "-offline -subdir_prefix ${testname_full}" "" "") |
| set(${testname_full}_toolname "drcachesim") |
| set(${testname_full}_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(${testname_full}_rawtemp ON) # no preprocessor |
| get_target_path_for_execution(prefetch_analyzer_path prefetch_analyzer_launcher "${location_suffix}") |
| prefix_cmd_if_necessary(prefetch_analyzer_path ON ${prefetch_analyzer_path}) |
| set(${testname_full}_runcmp |
| "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| set(${testname_full}_precmd |
| "foreach@${CMAKE_COMMAND}@-E@remove_directory@${testname_full}.*.dir") |
| set(${testname_full}_postcmd |
| "${drcachesim_path}@-indir@${testname_full}.*.dir@-simulator_type@basic_counts") |
| set(${testname_full}_postcmd2 |
| "${prefetch_analyzer_path}@-trace_dir@${testname_full}.*.dir/trace") |
| endif () |
| |
| # Stress-test drcachesim with drstatecmp checks. |
| if (AARCH64) |
| torunonly_drcachesim(drstatecmp-fuzz drstatecmp-fuzz-app |
| "-trace_after_instrs 10M -enable_drstatecmp" "" "") |
| set(tool.drcachesim.drstatecmp-fuzz_timeout 180) |
| endif () |
| if (NOT WIN32) |
| torunonly_drcachesim(drstatecmp-delay-simple ${ci_shared_app} |
| "-trace_after_instrs 20000 -enable_drstatecmp" "") |
| torunonly_drcacheoff(drstatecmp-delay-simple ${ci_shared_app} |
| "-trace_after_instrs 20000 -enable_drstatecmp" |
| "@-simulator_type@basic_counts" "") |
| endif (NOT WIN32) |
| |
| # Test syscall_mix. |
| torunonly_drcachesim(syscall-mix ${ci_shared_app} "-simulator_type syscall_mix" "") |
| torunonly_drcacheoff(syscall-mix ${ci_shared_app} "" "@-simulator_type@syscall_mix" "") |
| |
| endif (NOT ANDROID) |
| |
| # Test using our exported drmemtrace analysis framework (i#2006). |
| get_property(drmemtrace_src_dir GLOBAL PROPERTY DynamoRIO_drmemtrace_src_dir) |
| get_property(drmemtrace_build_dir GLOBAL PROPERTY DynamoRIO_drmemtrace_build_dir) |
| if (DEBUG) |
| set(debug_cfg -DCMAKE_BUILD_TYPE=Debug -DDEBUG=ON) |
| else () |
| set(debug_cfg -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDEBUG=OFF) |
| endif () |
| add_test(drmemtrace_proj ${CMAKE_CTEST_COMMAND} |
| --build-and-test "${drmemtrace_src_dir}" "${drmemtrace_build_dir}/build_and_test" |
| --build-generator ${CMAKE_GENERATOR} |
| --build-project DynamoRIO_drmemtrace # needed for VS generators |
| --build-makeprogram ${CMAKE_MAKE_PROGRAM} |
| --build-options ${debug_cfg} -DDynamoRIO_DIR:PATH=${public_config_dir}) |
| if (UNIX AND X86 AND NOT X64) |
| set_tests_properties(drmemtrace_proj PROPERTIES ENVIRONMENT |
| "CFLAGS=-m32;CXXFLAGS=-m32") |
| endif () |
| |
| # Test postprocessing and analysis with an alternate binary directory. |
| # Limited to UNIX because the checked-in modules.log is in UNIX format |
| # (Windows needs extra fields per library). |
| # Limited to ZLIB_FOUND because we test gzipped .raw files here as well. |
| if (UNIX AND ZLIB_FOUND) |
| # We make a writable copy so we can both write the final trace there and run our |
| # analyzer in a single command line. |
| set(srcdir |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.threadsig.aarch64.raw) |
| set(locdir ${PROJECT_BINARY_DIR}/drmemtrace.threadsig.aarch64) |
| file(REMOVE_RECURSE ${locdir}) |
| file(MAKE_DIRECTORY ${locdir}) |
| file(COPY ${srcdir}/raw DESTINATION ${locdir}/) |
| torunonly_api(tool.drcacheoff.altbindir "${drcachesim_path}" |
| "offline-altbindir.c" "" |
| "-indir;${locdir};-simulator_type;opcode_mix;-alt_module_dir;${srcdir};-module_file;${locdir}/raw/modules.log" |
| OFF OFF) |
| set(tool.drcacheoff.altbindir_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| |
| # Test the legacy trace versions OFFLINE_FILE_VERSION_KERNEL_INT_PC-1 and |
| # TRACE_ENTRY_VERSION_NO_KERNEL_PC. This requires a checked-in trace and thus |
| # -alt_module_dir; it has gzipped .raw files; hence here next to the altbindir test. |
| set(srcdir |
| ${PROJECT_SOURCE_DIR}/clients/drcachesim/tests/drmemtrace.legacy-int-offs.raw) |
| set(locdir ${PROJECT_BINARY_DIR}/drmemtrace.legacy-int-offs) |
| file(REMOVE_RECURSE ${locdir}) |
| file(MAKE_DIRECTORY ${locdir}) |
| file(COPY ${srcdir}/raw DESTINATION ${locdir}/) |
| torunonly_api(tool.drcacheoff.legacy-int-offs "${drcachesim_path}" |
| "offline-legacy-int-offs.c" "" |
| "-indir;${locdir};-simulator_type;basic_counts;-alt_module_dir;${srcdir};-module_file;${locdir}/raw/modules.log" |
| OFF OFF) |
| set(tool.drcacheoff.legacy-int-offs_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| endif () |
| |
| if (proc_supports_pt) |
| if (BUILD_PT_TRACER AND BUILD_PT_POST_PROCESSOR) |
| get_target_path_for_execution(drpt2trace_path drpt2trace "${location_suffix}") |
| macro (torunonly_drcacheoff_kernel testname exetgt extra_ops app_args sim_atops) |
| set(testname_full "tool.drcacheoff.kernel.${testname}_SUDO") |
| torunonly_ci(${testname_full} ${exetgt} drcachesim |
| "offline-kernel-${testname}.c" # for templatex basename |
| "-offline -enable_kernel_tracing -subdir_prefix ${testname_full} ${extra_ops}" |
| "" "${app_args}") |
| set(${testname_full}_sudo ON) |
| set(${testname_full}_self_serial ON) |
| set(${testname_full}_toolname "drcachesim") |
| set(${testname_full}_basedir "${PROJECT_SOURCE_DIR}/clients/drcachesim/tests") |
| set(${testname_full}_rawtemp ON) # no preprocessor |
| set(${testname_full}_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| # Each command is assumed to need sudo. |
| set(cmd_pfx "sudo@") |
| set(${testname_full}_precmd |
| "foreach@${cmd_pfx}${CMAKE_COMMAND}@-E@remove_directory@${testname_full}.*.dir") |
| set(${testname_full}_postcmd |
| "firstglob@${cmd_pfx}${drcachesim_path}@-indir@${testname_full}.*.dir${sim_atops}") |
| endmacro () |
| # We use '-raw_compress none' because when snappy or lz4 is used for raw traces, |
| # the check that complains about malloc use in the client is disabled by invoking |
| # dr_allow_unsafe_static_behavior. We want to perform this check on the kernel |
| # tracing flow. |
| torunonly_drcacheoff_kernel(simple ${ci_shared_app} "-raw_compress none" "" |
| "@-simulator_type@basic_counts") |
| torunonly_drcacheoff_kernel(opcode-mix ${ci_shared_app} "-raw_compress none" "" |
| "@-simulator_type@opcode_mix") |
| torunonly_drcacheoff_kernel(syscall-mix ${ci_shared_app} "-raw_compress none" "" |
| "@-simulator_type@syscall_mix") |
| torunonly_drcacheoff_kernel(invariant-checker ${ci_shared_app} "-raw_compress none" "" |
| "@-simulator_type@invariant_checker@-test_mode_name@kernel_syscall_pt_trace") |
| endif (BUILD_PT_TRACER AND BUILD_PT_POST_PROCESSOR) |
| endif (proc_supports_pt) |
| |
| if ((AARCHXX AND NOT ANDROID) OR X86) |
| torunonly_drcacheoff(getretaddr_record_replace_retaddr common.getretaddr |
| "-record_replace_retaddr -record_function tailcall_with_retaddr|1&foo|1" |
| "@-simulator_type@invariant_checker" "") |
| endif () |
| |
| ########################################################################### |
| # drcpusim tests |
| |
| if (X86) # i#1732: no ARM/AArch64 support for drcpusim yet |
| torunonly_ci(tool.drcpusim.simple ${ci_shared_app} drcpusim |
| client-interface/${ci_shared_app} # for .expect |
| "" "" "") |
| set(tool.drcpusim.simple_toolname "drcpusim") |
| |
| if (UNIX AND NOT APPLE) |
| # For more targeted tests, we need whole-asm, which is much easier |
| # on Linux where we can make a static app that executes just a few insrs. |
| macro (add_cpusim_asm_test name model) |
| add_exe(tool.${name} ${PROJECT_SOURCE_DIR}/clients/drcpusim/tests/${name}.asm) |
| set_target_properties(tool.${name} PROPERTIES LINKER_LANGUAGE C) |
| append_link_flags(tool.${name} "-nostartfiles -nodefaultlibs -static") |
| torunonly_ci(tool.drcpusim.${name} tool.${name} drcpusim |
| ${PROJECT_SOURCE_DIR}/clients/drcpusim/tests/${name}.asm |
| "-cpu ${model}" "" "") |
| set(tool.drcpusim.${name}_toolname "drcpusim") |
| set(tool.drcpusim.${name}_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcpusim/tests") |
| endmacro () |
| |
| if (NOT X64) |
| add_cpusim_asm_test(mmx Pentium) |
| add_cpusim_asm_test(sse PentiumMMX) |
| add_cpusim_asm_test(sse2 Pentium3) |
| add_cpusim_asm_test(sse3 Banias) |
| endif () |
| add_cpusim_asm_test(ssse3 Prescott) |
| add_cpusim_asm_test(sse41 Merom) |
| add_cpusim_asm_test(sse42 Penryn) |
| |
| # Test -blocklist. |
| torunonly_ci(tool.drcpusim.block tool.ssse3 drcpusim |
| "ignore" "-cpu Prescott -blocklist tool.ssse3" "" "") |
| set(tool.drcpusim.block_toolname "drcpusim") |
| set(tool.drcpusim.block_expectbase "block") |
| set(tool.drcpusim.block_basedir "${PROJECT_SOURCE_DIR}/clients/drcpusim/tests") |
| # Legacy option name. |
| torunonly_ci(tool.drcpusim.legacy tool.ssse3 drcpusim |
| "ignore" "-cpu Prescott -blacklist tool.ssse3" "" "") |
| set(tool.drcpusim.legacy_toolname "drcpusim") |
| set(tool.drcpusim.legacy_expectbase "block") |
| set(tool.drcpusim.legacy_basedir "${PROJECT_SOURCE_DIR}/clients/drcpusim/tests") |
| endif () |
| |
| add_exe(tool.cpuid ${PROJECT_SOURCE_DIR}/clients/drcpusim/tests/cpuid.c) |
| if (WIN32) |
| append_property_string(TARGET tool.cpuid COMPILE_FLAGS "/arch:IA32") |
| # Debug libc seems to run newer instructions, messing up the test. |
| # Plus on VS2017 *any* libc does that even with /arch:IA32 so we |
| # separate libc out. |
| use_MD_not_MTd(${PROJECT_SOURCE_DIR}/clients/drcpusim/tests/cpuid.c) |
| endif () |
| macro (add_cpusim_cpuid_test model) |
| torunonly_ci(tool.drcpusim.cpuid-${model} tool.cpuid drcpusim |
| ${PROJECT_SOURCE_DIR}/clients/drcpusim/tests/cpuid-${model}.c |
| # Ignore libs to reduce risk of violations (e.g., i#2720) |
| "-cpu ${model} -ignore_all_libs" "" "") |
| set(tool.drcpusim.cpuid-${model}_toolname "drcpusim") |
| set(tool.drcpusim.cpuid-${model}_basedir |
| "${PROJECT_SOURCE_DIR}/clients/drcpusim/tests") |
| endmacro () |
| # Not running earlier than Klamath b/c the app likely will have bad opcodes. |
| if (NOT X64) |
| # i#5109: We do not run Klamath or Deschutes since gcc on Ubuntu20 includes |
| # CET instructions which cannot be avoided. DR currently thinks they're |
| # SSE-added multi-byte nops; we'll have more trouble when i#4040 is implemented. |
| add_cpusim_cpuid_test(Pentium3) |
| add_cpusim_cpuid_test(Banias) |
| endif () |
| add_cpusim_cpuid_test(Prescott) |
| add_cpusim_cpuid_test(Presler) |
| add_cpusim_cpuid_test(Merom) |
| add_cpusim_cpuid_test(Penryn) |
| add_cpusim_cpuid_test(Westmere) |
| add_cpusim_cpuid_test(Nehalem) |
| # XXX i#1761: we should selectively enable these. Disabling for now. |
| if (OFF) |
| add_cpusim_cpuid_test(Sandybridge) |
| add_cpusim_cpuid_test(Ivybridge) |
| endif () |
| # XXX i#1732: add more tests. However, we don't want the suite to fail |
| # b/c our tests have too-new instrs for older machines. |
| endif (X86) |
| |
| endif (BUILD_CLIENTS) |
| |
| # ########################################################################## |
| # drpt2trace tests |
| # We use the libipt/script/perf-get-opts.bash script to get the options for drpt2trace's tests. |
| if (BUILD_CLIENTS) |
| if (BUILD_PT_TRACER AND BUILD_PT_POST_PROCESSOR) |
| set(drpt2trace_commong "-print_instrs" |
| "-raw_pt" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/drpt2trace/test_simple.raw/pt.bin" |
| "-pt_cpu_family" "6" |
| "-pt_cpu_model" "85" |
| "-pt_cpu_stepping" "4" |
| "-pt_mtc_freq" "3" "-pt_nom_freq" "37" |
| "-pt_cpuid_0x15_eax" "2" "-pt_cpuid_0x15_ebx" "308") |
| set(drpt2trace_sideband_args ${drpt2trace_commong} |
| "-mode" "SIDEBAND" |
| "-raw_pt_format" "PERF" |
| "-primary_sb" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/drpt2trace/test_simple.raw/primary.sideband.pevent" |
| "-secondary_sb" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/drpt2trace/test_simple.raw/secondary.sideband.pevent" |
| "-sb_sample_type" "0x10086" |
| "-sb_time_shift" "31" |
| "-sb_time_mult" "581029125" |
| "-sb_time_zero" "18444502336406842448" |
| "-sb_sysroot" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/drpt2trace/test_simple.raw") |
| torunonly_api(tool.drpt2trace.sideband drpt2trace |
| "../../clients/drcachesim/drpt2trace/test_simple.templatex" |
| "" "${drpt2trace_sideband_args}" ON OFF) |
| set(drpt2trace_elf_args ${drpt2trace_commong} |
| "-mode" "ELF" |
| "-raw_pt_format" "PERF" |
| "-elf" |
| "${PROJECT_SOURCE_DIR}/clients/drcachesim/drpt2trace/test_simple.raw/hello") |
| torunonly_api(tool.drpt2trace.elf drpt2trace |
| "../../clients/drcachesim/drpt2trace/test_simple.templatex" |
| "" "${drpt2trace_elf_args}" ON OFF) |
| endif (BUILD_PT_TRACER AND BUILD_PT_POST_PROCESSOR) |
| endif (BUILD_CLIENTS) |
| |
| if (UNIX) |
| macro(make_symlink src dst) |
| execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${src} ${dst} |
| RESULT_VARIABLE ln_result ERROR_VARIABLE ln_err) |
| if (ln_result OR ln_err) |
| message(FATAL_ERROR "*** symlink failed: ***\n${ln_err}") |
| endif () |
| endmacro() |
| |
| if (NOT APPLE AND NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild(linux.clone linux/clone.c) |
| |
| # A PIE build tests MSR-based TLS instead of GDT-based (i#2089). |
| tobuild(linux.clone-pie linux/clone.c) |
| append_property_string(TARGET linux.clone-pie COMPILE_FLAGS "-fPIE") |
| append_property_string(TARGET linux.clone-pie LINK_FLAGS "-pie") |
| endif () |
| |
| # Cross-arch execve test: can only be done via a suite of tests that |
| # build both 32-bit and 64-bit. We have 32-bit just build, and |
| # 64-bit then builds and runs both directions. |
| # |
| # i#2971: We test -c32/-c64 here since modern DR focuses on clients. |
| if (X86) |
| if (X64) |
| add_exe(linux.execve-sub64 linux/execve-sub.c) |
| if (TEST_SUITE AND TEST_32BIT_PATH) |
| # XXX: Should we remove TEST_32BIT_PATH since we're not using it with |
| # our separate 32- and 64-bit jobs (replaced by our test-and-build)? |
| tobuild_ops(linux.execve64 linux/execve.c "" |
| "${TEST_32BIT_PATH}/linux.execve-sub32") |
| torunonly(linux.execve32 ${TEST_32BIT_PATH}/linux.execve32 linux/execve.c "" |
| "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/linux.execve-sub64") |
| else () |
| # If we didn't just build the entire 32-bit and so don't have an |
| # install dir handy, we still perform a cross-arch test by building |
| # just the few binaries we need and both faking a multi-arch install |
| # via symlinks and using -use_alt_dll to point to the other bitwidth. |
| set(32dir ${CMAKE_CURRENT_BINARY_DIR}/32bit) |
| set(test_bindir suite/tests/bin) |
| file(MAKE_DIRECTORY ${32dir}) |
| # We use a client that takes some options and prints something at |
| # init and at exit to test cross-arch injection with clients. |
| get_target_path_for_execution(client64_path client.large_options.dll |
| "${location_suffix}") |
| set(client32_path ${32dir}/${test_bindir}/libclient.large_options.dll.so) |
| # Hardcoding this path as the simplest solution: |
| if (DEBUG) |
| set(libdr_32bit_path "${32dir}/${INSTALL_LIB_X86}/debug/libdynamorio.so") |
| else () |
| set(libdr_32bit_path "${32dir}/${INSTALL_LIB_X86}/release/libdynamorio.so") |
| endif () |
| |
| add_exe(linux.execve64 linux/execve.c) |
| # Use a relative path for the child's execve to stress i#1660, i#4892. |
| file(RELATIVE_PATH relative_sub32 "${CMAKE_CURRENT_BINARY_DIR}" |
| "${32dir}/${test_bindir}/linux.execve-sub32") |
| get_target_path_for_execution(drrun_path drrun "${location_suffix}") |
| get_target_path_for_execution(drlib_path dynamorio "${location_suffix}") |
| |
| # We have 2 tests (one each 32<->64 direction) for each of two configs: |
| # locating the other-bitwidth path via a config entry, or locating it |
| # via assumptions on side-by-side installation. |
| # To do both configs with just one build we run buth from a script which |
| # we generate here: |
| set(xarch_script "${CMAKE_CURRENT_BINARY_DIR}/linux.xarch.cmake") |
| file(WRITE "${xarch_script}" |
| "macro(make_symlink src dst)\n" |
| " execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink \${src} \${dst}\n" |
| " RESULT_VARIABLE ln_result ERROR_VARIABLE ln_err)\n" |
| " if (ln_result OR ln_err)\n" |
| " message(FATAL_ERROR \"*** create symlink failed: \${ln_err} ***\")\n" |
| " endif ()\n" |
| "endmacro()\n" |
| "macro(remove_symlink link)\n" |
| " execute_process(COMMAND ${CMAKE_COMMAND} -E remove \${link}\n" |
| " RESULT_VARIABLE rm_result ERROR_VARIABLE rm_err)\n" |
| " if (rm_result OR rm_err)\n" |
| " message(FATAL_ERROR \"*** remove symlink failed: \${rm_err} ***\")\n" |
| " endif ()\n" |
| "endmacro()\n" |
| "# 32 to 64, assumed layout:\n" |
| "make_symlink(${PROJECT_BINARY_DIR}/${INSTALL_LIB_BASE}\n" |
| " ${32dir}/${INSTALL_LIB_BASE})\n" |
| "make_symlink(${32dir}/${INSTALL_LIB_X86}\n" |
| " ${PROJECT_BINARY_DIR}/${INSTALL_LIB_X86})\n" |
| "execute_process(WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n" |
| " COMMAND ${drrun_path} -32\n" |
| " -dr_home ${32dir} ${dr_test_ops}\n" |
| " # We test the \"-c32 -c64\" syntax here.\n" |
| " -c32 ${client32_path} -paramA foo -paramB bar --\n" |
| " -c64 ${client64_path} -paramA foo -paramB bar --\n" |
| " ${32dir}/${test_bindir}/linux.execve32\n" |
| " \"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/linux.execve-sub64\")\n" |
| "# 64 to 32, assumed layout:\n" |
| "execute_process(WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n" |
| " COMMAND ${drrun_path} ${dr_test_ops}\n" |
| " -c32 ${client32_path} -paramA foo -paramB bar --\n" |
| " -c64 ${client64_path} -paramA foo -paramB bar --\n" |
| " ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/linux.execve64\n" |
| " \"${relative_sub32}\")\n" |
| "remove_symlink(${32dir}/${INSTALL_LIB_BASE})\n" |
| "remove_symlink(${PROJECT_BINARY_DIR}/${INSTALL_LIB_X86})\n" |
| "# 32 to 64, config entry (symlinks are gone so assumptions fail):\n" |
| "execute_process(WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n" |
| " COMMAND ${drrun_path} -32\n" |
| " -use_alt_dll ${drlib_path} \n" |
| " -dr_home ${32dir} ${dr_test_ops}\n" |
| " -c32 ${client32_path} -paramA foo -paramB bar --\n" |
| " -c64 ${client64_path} -paramA foo -paramB bar --\n" |
| " ${32dir}/${test_bindir}/linux.execve32\n" |
| " \"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/linux.execve-sub64\")\n" |
| "# 64 to 32, config entry (symlinks are gone so assumptions fail):\n" |
| "execute_process(WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n" |
| " COMMAND ${drrun_path}\n" |
| # Hardcoding this path as the simplest solution: |
| " -use_alt_dll ${libdr_32bit_path}\n" |
| " ${dr_test_ops}\n" |
| " -c32 ${client32_path} -paramA foo -paramB bar --\n" |
| " -c64 ${client64_path} -paramA foo -paramB bar --\n" |
| " ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/linux.execve64\n" |
| " \"${relative_sub32}\")\n" |
| ) |
| if (DEBUG) |
| set(config_type -DDEBUG=ON) |
| else () |
| set(config_type "") |
| endif () |
| add_test(linux.xarch ${CMAKE_CTEST_COMMAND} -V |
| --build-and-test ${PROJECT_SOURCE_DIR} ${32dir} |
| --build-generator ${CMAKE_GENERATOR} |
| --build-target dynamorio |
| --build-target linux.execve32 |
| --build-target linux.execve-sub32 |
| --build-target client.large_options.dll |
| --build-noclean # else it tries to clean between each target! |
| --build-makeprogram ${CMAKE_MAKE_PROGRAM} |
| --build-options ${config_type} -DBUILD_TESTS=ON -DBUILD_DOCS=OFF |
| -DBUILD_SAMPLES=OFF -DBUILD_EXT=OFF -DBUILD_CLIENTS=OFF |
| --test-command ${CMAKE_COMMAND} -P ${xarch_script}) |
| file(READ linux/execve-client.expect expect) |
| set_tests_properties(linux.xarch PROPERTIES ENVIRONMENT |
| "CFLAGS=-m32;CXXFLAGS=-m32" |
| # We do not try to indirect this so we have to read .expect manually. |
| # We simplify and assume no regex chars. |
| # We start with .* for all the config and build stuff and then we |
| # expect 4 straight identical test outputs. |
| PASS_REGULAR_EXPRESSION |
| ".*${expect}[ \n]*${expect}[ \n]*${expect}[ \n]*${expect}[ \n]*$") |
| endif () |
| else (X64) |
| add_exe(linux.execve-sub32 linux/execve-sub.c) |
| add_exe(linux.execve32 linux/execve.c) |
| endif (X64) |
| endif () |
| |
| # helper app for execve-null |
| add_exe(linux.execve-sub linux/execve-sub.c) |
| get_target_path_for_execution(execve-sub-path linux.execve-sub "${location_suffix}") |
| tobuild_ops(linux.execve-null linux/execve-null.c "" "${execve-sub-path}") |
| |
| if (NOT ANDROID) # XXX i#1874: get working on Android |
| # Test blocklist and allowlist child config vs follow-children options (i#1667). |
| # Use a different name to avoid parallel test conflicts when we manipulate |
| # config files. |
| add_exe(linux.execve-config linux/execve-sub.c) |
| # We want the environment to keep HOME for config dirs (xref i#1679). |
| add_exe(linux.execv linux/execv.c) |
| set(linux.child-blocklist_expectbase "child-blocklist") |
| get_target_path_for_execution(execve-config-path linux.execve-config "${location_suffix}") |
| torunonly(linux.child-blocklist linux.execv linux/execv.c |
| "-follow_children" "${execve-config-path}") |
| get_target_path_for_execution(drconfig_path drconfig "${location_suffix}") |
| prefix_cmd_if_necessary(drconfig_path ON ${drconfig_path}) |
| set(linux.child-blocklist_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| set(linux.child-blocklist_precmd |
| "${drconfig_path}@-quiet@-reg@linux.execve-config@-norun") |
| set(linux.child-blocklist_postcmd |
| "${drconfig_path}@-quiet@-unreg@linux.execve-config") |
| |
| set(linux.child-allowlist_expectbase "child-allowlist") |
| torunonly(linux.child-allowlist linux.execv linux/execv.c |
| "-no_follow_children" "${execve-config-path}") |
| set(linux.child-allowlist_runcmp "${CMAKE_CURRENT_SOURCE_DIR}/runmulti.cmake") |
| if (DEBUG) |
| set(debug_args "@-debug") |
| else (DEBUG) |
| set(debug_args "") |
| endif (DEBUG) |
| set(linux.child-allowlist_precmd |
| "${drconfig_path}@-quiet@-reg@linux.execve-config${debug_args}@-ops@-stderr_mask@@0") |
| set(linux.child-allowlist_postcmd |
| "${drconfig_path}@-quiet@-unreg@linux.execve-config") |
| # Can't run in parallel w/ blocklist since manipulating same config file: |
| set(linux.child-allowlist_depends linux.child-blocklist) |
| endif () |
| |
| tobuild(linux.execve-rec linux/execve-rec.c) |
| if (ANDROID) |
| # Times out in 120s in suite (i#2106). |
| set(linux.execve-rec_timeout 180) |
| endif () |
| tobuild(linux.exit linux/exit.c) |
| if (NOT ANDROID) # XXX i#1874: get working on Android: just output order?!? |
| tobuild(linux.fork linux/fork.c) |
| endif () |
| tobuild(linux.fork-sleep linux/fork-sleep.c) |
| if (X86) |
| # i#1537: test MSR for fs/gs in fork |
| torunonly(linux.fork-MSR linux.fork linux/fork.c |
| "-vm_base 0x100000000 -no_vm_base_near_app" "") |
| endif () |
| |
| tobuild(linux.infinite linux/infinite.c) |
| tobuild(linux.longjmp linux/longjmp.c) |
| if (NOT APPLE) |
| tobuild(linux.prctl linux/prctl.c) |
| endif () |
| tobuild(linux.mmap linux/mmap.c) |
| tobuild(linux.zero-length-mem-ranges linux/zero-length-mem-ranges.c) |
| tobuild(linux.signal0000 linux/signal0000.c) |
| tobuild(linux.signal0001 linux/signal0001.c) |
| tobuild(linux.signal0010 linux/signal0010.c) |
| tobuild(linux.signal0011 linux/signal0011.c) |
| tobuild(linux.signal0100 linux/signal0100.c) |
| tobuild(linux.signal0101 linux/signal0101.c) |
| tobuild(linux.signal0110 linux/signal0110.c) |
| tobuild(linux.signal0111 linux/signal0111.c) |
| tobuild(linux.signal1000 linux/signal1000.c) |
| tobuild(linux.signal1001 linux/signal1001.c) |
| tobuild(linux.signal1010 linux/signal1010.c) |
| tobuild(linux.signal1011 linux/signal1011.c) |
| tobuild(linux.signal1100 linux/signal1100.c) |
| tobuild(linux.signal1101 linux/signal1101.c) |
| tobuild(linux.signal1110 linux/signal1110.c) |
| tobuild(linux.signal1111 linux/signal1111.c) |
| tobuild(linux.sigplain000 linux/sigplain000.c) |
| tobuild(linux.sigplain001 linux/sigplain001.c) |
| tobuild(linux.sigplain010 linux/sigplain010.c) |
| tobuild(linux.sigplain011 linux/sigplain011.c) |
| tobuild(linux.sigplain100 linux/sigplain100.c) |
| tobuild(linux.sigplain101 linux/sigplain101.c) |
| tobuild(linux.sigplain110 linux/sigplain110.c) |
| tobuild(linux.sigplain111 linux/sigplain111.c) |
| tobuild(linux.sigaction linux/sigaction.c) |
| # We want a native run to verify our assumptions of kernel behaviour. |
| torunonly_native(code_api|linux.sigaction.native linux.sigaction |
| "" linux/sigaction.c "") |
| if (LINUX) |
| tobuild(linux.syscall_pwait linux/syscall_pwait.cpp) |
| link_with_pthread(linux.syscall_pwait) |
| endif () |
| if (LINUX AND NOT ANDROID) # Only tests RT sigaction which is not supported on Android. |
| tobuild(linux.sigaction_nosignals linux/sigaction_nosignals.c) |
| endif () |
| # FIXME i#1551, i#1569: port asm to ARM and AArch64 |
| # FIXME i#58: port test to MacOS |
| # TODO i#3544: Port tests to RISC-V 64 |
| if (NOT ARM AND NOT AARCH64 AND NOT APPLE AND NOT RISCV64) |
| tobuild(linux.sigcontext linux/sigcontext.c) |
| set_avx_flags(linux.sigcontext) |
| if (proc_supports_avx512) |
| if (CLANG) |
| append_property_string(TARGET linux.sigcontext COMPILE_FLAGS |
| "-mllvm -x86-use-vzeroupper=0") |
| else () |
| append_property_string(TARGET linux.sigcontext COMPILE_FLAGS |
| "-mno-vzeroupper") |
| endif () |
| endif () |
| endif () |
| if (NOT APPLE) |
| tobuild(linux.thread linux/thread.c) |
| tobuild(linux.threadexit linux/threadexit.c) |
| if (NOT ANDROID) |
| tobuild(linux.threadexit2 linux/threadexit2.c) # XXX i#1874: hangs on Android |
| tobuild(linux.signalfd linux/signalfd.c) # XXX i#1874: fails natively on Android |
| endif () |
| endif () |
| # i#784: test app behavior on alarm |
| tobuild(linux.alarm linux/alarm.c) |
| if (NOT APPLE AND NOT ANDROID AND NOT RISCV64) # Test uses Linux-specific timer code. |
| # TODO i#3544: Port tests to RISC-V 64 |
| if (NOT AARCH64) # TODO i#1569: Enable this for AArch64. |
| tobuild(linux.signal_race linux/signal_race.c) |
| target_link_libraries(linux.signal_race rt) |
| endif () |
| tobuild(linux.signal_racesys linux/signal_racesys.c) |
| target_link_libraries(linux.signal_racesys rt) |
| |
| tobuild(linux.signal_pre_syscall linux/signal_pre_syscall.c) |
| target_link_libraries(linux.signal_pre_syscall rt) |
| endif () |
| |
| tobuild(linux.bad-signal-stack linux/bad-signal-stack.c) |
| |
| # i#1145: test re-starting syscalls, both inlined and from dispatch |
| tobuild(linux.eintr linux/eintr.c) |
| link_with_pthread(linux.eintr) |
| torunonly(linux.eintr-noinline linux.eintr linux/eintr.c "-no_ignore_syscalls" "") |
| |
| if (NOT ANDROID AND NOT RISCV64) # XXX i#1874: get working on Android |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild(linux.sigsuspend linux/sigsuspend.c) |
| link_with_pthread(linux.sigsuspend) |
| |
| tobuild(linux.signest linux/signest.c) |
| link_with_pthread(linux.signest) |
| |
| tobuild(linux.sigmask linux/sigmask.c) |
| link_with_pthread(linux.sigmask) |
| # Sanity check that this option works. |
| torunonly(linux.sigmask-noalarm linux.sigmask linux/sigmask.c |
| "-no_reroute_alarm_signals" "") |
| |
| if (UNIX) |
| if (X64) |
| # XXX i#3307: add Windows test. |
| tobuild_ops(linux.mangle_asynch linux/mangle_asynch.c "-vm_base 0x100000000 -no_vm_base_near_app" "") |
| target_include_directories(linux.mangle_asynch PRIVATE |
| ${CMAKE_CURRENT_SOURCE_DIR}/linux) |
| link_with_pthread(linux.mangle_asynch) |
| endif () |
| endif () |
| endif () |
| |
| if (NOT RISCV64) |
| # We pass -native_exec_list which causes us to call strcasecmp in libc, |
| # thereby exercising on our ability to copy libc's TLS data. |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ops(linux.app_tls linux/app_tls.c "-native_exec_list libfoo.so" "") |
| endif (NOT RISCV64) |
| |
| if (NOT ANDROID AND NOT RISCV64) # XXX i#1874: get working on Android |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ops(linux.readlink linux/readlink.c "-early_inject" "exec") |
| endif () |
| |
| if (NOT ANDROID AND NOT RISCV64) # FIXME i#1874: failing on Android |
| # Test collision with DR's preferred base |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild(linux.fib-conflict common/fib.c) |
| set_preferred_base_start_and_end(linux.fib-conflict ${preferred_base} OFF) |
| # i#1227: test 2-stage loader |
| torunonly(linux.fib-conflict-early linux.fib-conflict common/fib.c "-early_inject" "") |
| endif () |
| |
| # Test fully static executables, which we only support with early injection |
| # or static DR. |
| # XXX i#1874: get working on Android |
| if (NOT APPLE AND NOT ANDROID AND NOT RISCV64) # XXX i#1285: implement private loader on MacOS |
| # TODO i#3544: Port tests to RISC-V 64 |
| set(fib_static_ops "-early_inject") |
| tobuild_ops(linux.fib-static common/fib.c "${fib_static_ops}" "") |
| append_property_string(TARGET linux.fib-static LINK_FLAGS |
| # The default value of CMAKE_SHARED_LIBRARY_LINK_C_FLAGS has -rdynamic, |
| # which doesn't play well with clang and -static. Adding |
| # --no-export-dynamic avoids the problem. |
| "-static -Wl,--no-export-dynamic") |
| endif () |
| # Test position independent executables. |
| # FIXME i#1001: fib-pie fails with -early_inject. |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild(linux.fib-pie common/fib.c) |
| append_property_string(TARGET linux.fib-pie COMPILE_FLAGS "-fPIE") |
| append_property_string(TARGET linux.fib-pie LINK_FLAGS "-pie") |
| endif (NOT RISCV64) |
| |
| # vfork is deprecated on macOS. |
| if (NOT APPLE AND NOT RISCV64) |
| # FIXME i#125: bugs in these, were disabled in the past |
| # TODO i#3544: Port tests to RISC-V 64 |
| tobuild_ops(linux.vfork linux/vfork.c "" "${execve-sub-path}") |
| #tobuild(linux.vfork-fib linux/vfork-fib.c) |
| endif () |
| |
| if (NOT RISCV64) |
| # runs of other builds with custom DR options |
| # TODO i#3544: Port tests to RISC-V 64 |
| torunonly(linux.thread-reset linux.thread linux/thread.c |
| "-enable_reset -reset_at_nth_thread 2" "") |
| torunonly(linux.clone-reset linux.clone linux/clone.c |
| "-enable_reset -reset_at_nth_thread 2" "") |
| endif (NOT RISCV64) |
| if (AARCHXX) |
| # Test our diagnostic option -steal_reg_at_reset, which is also a stress |
| # test of reset and register stealing. |
| if (ARM) |
| set(new_reg 9) |
| else () |
| set(new_reg 29) |
| endif () |
| torunonly(linux.steal-switch linux.thread linux/thread.c |
| "-enable_reset -reset_at_fragment_count 100 -steal_reg_at_reset ${new_reg}" "") |
| endif () |
| tobuild(pthreads.pthreads pthreads/pthreads.c) |
| tobuild(pthreads.pthreads_exit pthreads/pthreads_exit.c) |
| tobuild(pthreads.ptsig pthreads/ptsig.c) |
| if (NOT ANDROID) # FIXME i#1874: failing on Android |
| # XXX i#951: pthreads_fork reports leaks on occasion so we mark it FLAKY |
| tobuild(pthreads.pthreads_fork_FLAKY pthreads/pthreads_fork.c) |
| endif () |
| |
| # Clang will likely never support gcc nested functions: |
| # http://llvm.org/PR9206 |
| if (NOT CMAKE_COMPILER_IS_CLANG) |
| if (NOT X64 AND NOT ARM) # FIXME i#1551: port asm to ARM |
| # FIXME i#16: these tests need to be fixed to compile for x64 |
| tobuild(security-linux.stacktest security-linux/stacktest.c) |
| tochcon(security-linux.stacktest execmem_exec_t) |
| mark_execstack(security-linux.stacktest) |
| endif (NOT X64 AND NOT ARM) |
| if (NOT ARM) # FIXME i#1551: signal TLS on ARM |
| tobuild(security-linux.trampoline security-linux/trampoline.c) |
| endif (NOT ARM) |
| endif (NOT CMAKE_COMPILER_IS_CLANG) |
| |
| # this app is used in nudge tests |
| # XXX: should all these infloop tests be made cross-platform? |
| # or rely on runall tests that run calc covering this on Windows? |
| if (NOT ANDROID) # XXX i#1874: add support for running this on Android |
| add_exe(linux.infloop linux/infloop.c) |
| torunonly(linux.reset linux/infloop linux/reset.runall "-enable_reset" "-v") |
| endif () |
| if (NOT X64 AND NOT ARM) # FIXME i#1551: add coarse-grain ARM support |
| # XXX: 64-bit support not quite there yet |
| torunonly(linux.freeze_FLAKY linux/infloop linux/freeze.runall |
| "-coarse_units -coarse_enable_freeze" "-v") |
| endif (NOT X64 AND NOT ARM) |
| |
| # persistent cache nudge tests with shared cache |
| file(MAKE_DIRECTORY "${PCACHE_DIR}") |
| file(MAKE_DIRECTORY "${PCACHE_SHARED_DIR}") |
| if (NOT X64 AND NOT ARM) # FIXME i#1551: add coarse-grain ARM support |
| # XXX: 64-bit support not quite there yet |
| torunonly(linux.persist_FLAKY linux/infloop linux/persist.runall |
| "-coarse_units -coarse_split_calls -coarse_enable_freeze -coarse_freeze_min_size 0 -no_persist_per_user -no_validate_owner_dir" "-v") |
| torunonly(linux.persist-use_FLAKY linux/infloop linux/persist-use.runall |
| "-use_persisted -coarse_units -coarse_split_calls -no_persist_per_user -no_validate_owner_dir" "-v") |
| endif (NOT X64 AND NOT ARM) |
| # when running tests in parallel: have to generate pcaches first |
| set(linux.persist-use_FLAKY_depends linux.persist_FLAKY) |
| |
| if (LINUX AND X64 AND HAVE_RSEQ AND NOT RISCV64) |
| # The rseq kernel feature is Linux-only. |
| # TODO i#2350: Port the assembly in the test to 32-bit x86 and to ARM. |
| # TODO i#3544: Port tests to RISC-V 64 |
| set(linux.rseq_no_reg_compat) |
| tobuild(linux.rseq linux/rseq.cpp) |
| # Test the other sections. Unfortunately we need a separate binary for each. |
| tobuild(linux.rseq_table linux/rseq.cpp) |
| append_property_list(TARGET linux.rseq_table |
| COMPILE_DEFINITIONS "RSEQ_TEST_USE_OLD_SECTION_NAME") |
| tobuild(linux.rseq_noarray linux/rseq.cpp) |
| append_property_list(TARGET linux.rseq_noarray |
| COMPILE_DEFINITIONS "RSEQ_TEST_USE_NO_ARRAY") |
| # Test attaching, which has a separate lazy rseq check. |
| # We build with static DR to also test client interactions. |
| tobuild_api(api.rseq linux/rseq.cpp "" "" OFF ON OFF) |
| link_with_pthread(api.rseq) |
| append_property_list(TARGET api.rseq COMPILE_DEFINITIONS "RSEQ_TEST_ATTACH") |
| use_DynamoRIO_static_client(api.rseq drmemtrace_static) |
| use_DynamoRIO_drmemtrace_tracer(api.rseq) |
| set(api.rseq_expectbase rseq_client) |
| # Test non-compliant code with our workaround flag. |
| tobuild_ops(linux.rseq_disable linux/rseq_disable.c "-disable_rseq" "") |
| endif () |
| else (UNIX) |
| add_exe(win32.infloop win32/infloop.c) |
| add_exe(win32.attachee win32/attachee.c) |
| if (PROGRAM_SHEPHERDING) |
| # too flaky across platforms so we limit to security mode only: not too useful |
| # for other than testing our ASLR anyway |
| tobuild(win32.aslr-dll win32/aslr-dll.c) |
| endif () |
| tobuild(win32.callback win32/callback.c) |
| tobuild(win32.crtprcs win32/crtprcs.c) |
| if (X64) |
| # regression test for in-progress earliest injection feature |
| # XXX i#234: once have wow64 support run on 32-bit |
| torunonly(win32.crtprcs-earliest win32.crtprcs win32/crtprcs.c |
| "-early_inject_map -early_inject_location 5" "") |
| endif (X64) |
| |
| tobuild_dll(win32.delaybind win32/delaybind.c "") |
| append_link_flags(win32.delaybind "/delayload:win32.delaybind.dll.dll /delay:unload") |
| tobind(win32.delaybind) |
| tobind(win32.delaybind.dll) |
| |
| tobuild_dll(win32.dll win32/dll.c "") |
| tobuild(win32.fiber-rac win32/fiber-rac.c) |
| tobuild(win32.finally win32/finally.c) |
| |
| tobuild_dll(win32.multisec win32/multisec.c "") |
| # On Win8+ loading via 8.3 name doesn't fool the loader, so we make a copy. |
| DynamoRIO_get_full_path(multisec_path win32.multisec.dll "${location_suffix}") |
| add_custom_command(TARGET win32.multisec.dll POST_BUILD |
| COMMAND ${CMAKE_COMMAND} ARGS -E copy ${multisec_path} |
| ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/win32.multisec2.dll.dll VERBATIM) |
| |
| tobuild_dll(win32.nativeterminate win32/nativeterminate.c |
| "-native_exec_list nativeterminate.dll.dll") |
| # FIXME i#192: oomtest ends up killing parent shell: investigate, fix, re-enable! |
| #tobuild(win32.oomtest win32/oomtest.c) |
| if (TEST_SUITE) # failing on win7 (i#422) so run only in suite |
| # Keep exe name same, is checked in DR. |
| add_exe(win32.partial_map win32/partial_map.c) |
| torunonly(win32.partial_map_FLAKY win32.partial_map win32/partial_map.c "" "") |
| endif (TEST_SUITE) |
| tobuild(win32.protect-datasec win32/protect-datasec.c) |
| |
| tobuild_dll(win32.rebased win32/rebased.c "") |
| # On Win8+ loading via 8.3 name doesn't fool the loader, so we make a copy. |
| DynamoRIO_get_full_path(rebased_path win32.rebased.dll "${location_suffix}") |
| add_custom_command(TARGET win32.rebased.dll POST_BUILD |
| COMMAND ${CMAKE_COMMAND} ARGS -E copy ${rebased_path} |
| ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/win32.rebased2.dll.dll VERBATIM) |
| |
| # Memory usage does go up a bit with reloading due to traces so we disable traces. |
| tobuild_dll(win32.reload win32/reload.c "-disable_traces") |
| |
| tobuild_dll(win32.reload-newaddr win32/reload-newaddr.c "") |
| # FIXME i#267: fix curiosities and re-enable |
| #tobuild_dll(win32.reload-race win32/reload-race.c "") |
| |
| tobuild_dll(win32.section-max win32/section-max.c "") |
| |
| tobuild(win32.suspend win32/suspend.c) |
| tobuild(win32.threadchurn win32/threadchurn.c) |
| if (TEST_SUITE) # occasionally fails so run only in suite |
| tobuild(win32.threadexit_FLAKY win32/threadexit.c) |
| endif (TEST_SUITE) |
| # PR 215238 covers re-enabling threadinjection |
| #tobuild(win32.threadinjection win32/threadinjection.c) |
| # FIXME i#125: debugger test was disabled in past: not sure why |
| #tobuild(win32.debugger win32/debugger.c) |
| tobuild(win32.virtualfree win32/virtualfree.c) |
| tobuild(win32.virtualreserve win32/virtualreserve.c) |
| tobuild(win32.winapc win32/winapc.c) |
| tobuild(win32.winthread win32/winthread.c) |
| tobuild(security-win32.apc-shellcode security-win32/apc-shellcode.c) |
| tobuild(security-win32.except-int2d security-win32/except-int2d.c) |
| tobuild(security-win32.except-guard security-win32/except-guard.c) |
| tobuild(security-win32.thread-setcontext security-win32/thread-setcontext.c) |
| tobuild(security-win32.singlestep security-win32/singlestep.c) |
| if (NOT X64) |
| # 32-bit limitation is test only |
| # to get a test on x64, we should find a way to set debug registers |
| tobuild(security-win32.except-debugreg security-win32/except-debugreg.c) |
| endif (NOT X64) |
| |
| tobuild(win32.threadterm win32/threadterm.c) |
| |
| tobuild_dll(win32.earlythread win32/earlythread.c "") |
| |
| if (DEBUG) |
| # We have a special allowance for this test to target our nudge handler in DEBUG. |
| tobuild(win32.tls win32/tls.c) |
| endif () |
| |
| if (NOT X64) |
| # FIXME i#16: these tests need to be fixed to compile for x64 |
| |
| # fpe compiles, but pops up an unhandled exception box |
| tobuild(win32.fpe win32/fpe.c) |
| |
| tobuild(win32.except win32/except.c) |
| # Debug libc seems to mess up the test. |
| use_MT_not_MTd(win32/except.c) |
| tobuild(win32.getthreadcontext win32/getthreadcontext.c) |
| tobuild_dll(win32.hookerfirst win32/hookerfirst.c |
| "-handle_ntdll_modify 1 -native_exec_hook_conflict 1") |
| tobuild(win32.hooker-secur32 win32/hooker-secur32.c) |
| tobuild(win32.rsbtest win32/rsbtest.c) |
| tobuild(win32.setcxtsyscall win32/setcxtsyscall.c) |
| tobuild(win32.setthreadcontext win32/setthreadcontext.c) |
| |
| tobuild_dll(security-win32.aslr-ind security-win32/aslr-ind.c "") |
| if (TEST_SUITE) # fails non-det so run only in suite |
| tobuild(security-win32.codemod-threads_FLAKY security-win32/codemod-threads.c) |
| endif (TEST_SUITE) |
| |
| # we tweak cflags in set_cflags() rather than passing extra param all |
| # the way through: adding helper func layers gets awkward w/ PARENT_SCOPE |
| tobuild(security-win32.except-execution security-win32/except-execution.c) |
| # we match exe addresses in output so no ASLR |
| append_link_flags(security-win32.except-execution "/dynamicbase:no") |
| |
| tobuild(security-win32.except-thread security-win32/except-thread.c) |
| tobuild(security-win32.gbop-test security-win32/gbop-test.c) |
| |
| if (TEST_SUITE) # fails non-det so run only in suite |
| tobuild(security-win32.hooker_FLAKY security-win32/hooker.c) |
| endif (TEST_SUITE) |
| tobuild_ops(security-win32.hooker-ntdll security-win32/hooker-ntdll.c |
| "-handle_ntdll_modify 1" "") |
| tobuild(security-win32.indexisting security-win32/indexisting.c) |
| tobuild(security-win32.patterns security-win32/patterns.c) |
| tobuild(security-win32.ret-SEH security-win32/ret-SEH.c) |
| endif (NOT X64) |
| |
| tobuild(security-win32.sd_tester security-win32/sd_tester.c) |
| tobuild(security-win32.sec-adata security-win32/sec-adata.c) |
| |
| # FIXME: getting warnings from pragmas in src code: |
| # secalign-fixed.dll.c.obj : warning LNK4229: invalid directive '/fixed' encountered; ignored |
| # secalign-fixed.dll.c.obj : warning LNK4229: invalid directive '/driver' encountered; ignored |
| # section-max.dll.c.obj : warning LNK4229: invalid directive '/driver' encountered; ignored |
| # sec-xdata.dll.c.obj : warning LNK4078: multiple '.xdata' sections found with different attributes (C0500040) |
| # I checked secalign-fixed.dll.dll and it does have 0x2000 alignment and has |
| # no relocations, so not sure what the warnings imply. Did not check the others. |
| tobuild_dll(security-win32.secalign-fixed security-win32/secalign-fixed.c "") |
| append_link_flags(security-win32.secalign-fixed.dll "/dynamicbase:no /fixed") |
| |
| tobuild_dll(security-win32.sec-fixed security-win32/sec-fixed.c "") |
| append_link_flags(security-win32.sec-fixed.dll "/dynamicbase:no /fixed") |
| |
| tobuild_dll(security-win32.sec-xdata security-win32/sec-xdata.c "") |
| |
| # PR 209235 covers re-enabling selfmod-threads |
| #tobuild(security-win32.selfmod-threads security-win32/selfmod-threads.c) |
| tobuild(security-win32.TestNTFlush security-win32/TestNTFlush.c) |
| |
| # FIXME: enable once have .runall support |
| #tobuild_runall(runall.calc-detach runall/calc-detach.runall "") |
| #tobuild_runall(runall.calc-freeze runall/calc-freeze.runall |
| # # xref PR 226578 which tracks incompatibility between probe_api & pcaches |
| # "-coarse_enable_freeze -no_probe_api") |
| #tobuild_runall(runall.calc-hotp runall/calc-hotp.runall "") |
| #tobuild_runall(runall.calc-persist runall/calc-persist.runall |
| # "-coarse_enable_freeze -use_persisted -no_probe_api") |
| #tobuild_runall(runall.calc-reset runall/calc-reset.runall "") |
| #tobuild_runall(runall.calc runall/calc.runall "") |
| #tobuild_runall(runall.detach_test runall/detach_test.runall "") |
| ## case 9423 covers re-enabling |
| ##tobuild_runall(runall.earlythread runall/earlythread.runall "") |
| #tobuild_runall(runall.initapc runall/initapc.runall "") |
| #tobuild_runall(runall.notepad runall/notepad.runall "") |
| #tobuild_runall(runall.preunload runall/preunload.runall "") |
| #tobuild_runall(runall.processchain runall/processchain.runall "") |
| |
| tobuild_csharp(win32.dotnet win32/dotnet.cs) |
| |
| # Cross-arch injection tests. |
| if (X86) |
| set(xarch_dir ${CMAKE_CURRENT_BINARY_DIR}/xarch) |
| set(test_bindir suite/tests/bin) |
| file(MAKE_DIRECTORY ${xarch_dir}) |
| # Unfortunately, while CMake 3.13+ supports create_symlink on Windows, that |
| # only works if the user has the right privileges, so we can't set up |
| # lib dir symlinks like we do for unix cross-arch build-and-test. |
| # We have to make a copy in order to have parallel dirs with the two bitwidths. |
| file(MAKE_DIRECTORY "${xarch_dir}/${INSTALL_LIB}") |
| set(xarch_copy_stamp "${CMAKE_CURRENT_BINARY_DIR}/xarch_copy.stamp") |
| add_custom_command(OUTPUT "${xarch_copy_stamp}" |
| DEPENDS dynamorio |
| COMMAND ${CMAKE_COMMAND} ARGS |
| -E touch "${xarch_copy_stamp}" |
| COMMAND ${CMAKE_COMMAND} ARGS |
| -E copy "${MAIN_LIBRARY_OUTPUT_DIRECTORY}/dynamorio.dll" |
| "${xarch_dir}/${INSTALL_LIB}/dynamorio.dll" |
| VERBATIM) |
| add_custom_target(xarch_copy DEPENDS "${xarch_copy_stamp}") |
| add_dependencies(drcopy xarch_copy) |
| # We use a client that takes some options and prints something at |
| # init and at exit to test cross-arch injection with clients. |
| get_target_path_for_execution(cur_client_path client.large_options.dll |
| "${location_suffix}") |
| set(xarch_client_path ${xarch_dir}/${test_bindir}/client.large_options.dll.dll) |
| get_target_path_for_execution(drrun_path drrun "${location_suffix}") |
| if (X64) |
| set(client32_path ${xarch_client_path}) |
| set(client64_path ${cur_client_path}) |
| set(other_is64 OFF) |
| else () |
| set(client32_path ${cur_client_path}) |
| set(client64_path ${xarch_client_path}) |
| set(other_is64 ON) |
| endif () |
| if (DEBUG) |
| set(config_type -DDEBUG=ON) |
| else () |
| set(config_type "") |
| endif () |
| # I abandoned --build-generator-platform (3.13+ only; VS gen only) or explicitly |
| # setting the full generator (fails w/ Ninja) and went with the env var scheme we |
| # use in our test suite. |
| _DR_set_VS_bitwidth_env_vars(${other_is64} env_names) |
| foreach (env ${env_names}) |
| # Escape internal ; since this goes into a CMake "var=value;..." list. |
| string(REPLACE ";" "\\;" value "${${env}_env_value}") |
| list(APPEND test_env_pairs "${env}=${value}") |
| endforeach () |
| add_test(win32.xarch ${CMAKE_CTEST_COMMAND} -V |
| --build-and-test ${PROJECT_SOURCE_DIR} ${xarch_dir} |
| --build-generator ${CMAKE_GENERATOR} |
| --build-target dynamorio |
| --build-target common.eflags |
| --build-target client.large_options.dll |
| --build-noclean # Else it tries to clean between each target! |
| --build-makeprogram ${CMAKE_MAKE_PROGRAM} |
| --build-options ${config_type} -DBUILD_TESTS=ON -DBUILD_DOCS=OFF |
| -DBUILD_SAMPLES=OFF -DBUILD_EXT=OFF -DBUILD_CLIENTS=OFF |
| --test-command ${drrun_path} -dr_home ${xarch_dir} ${dr_test_ops} |
| -c32 ${client32_path} -paramA foo -paramB bar -- |
| -c64 ${client64_path} -paramA foo -paramB bar -- |
| ${MAIN_RUNTIME_OUTPUT_DIRECTORY}/create_process.exe |
| ${xarch_dir}/${test_bindir}/common.eflags.exe) |
| file(READ win32/xarch.templatex expect) |
| set_tests_properties(win32.xarch PROPERTIES ENVIRONMENT |
| "${test_env_pairs}" |
| # We start with .* for all the config and build stuff. |
| PASS_REGULAR_EXPRESSION ".*${expect}[ \n]*$") |
| endif (X86) |
| |
| # Cross-arch mixedmode/x86_to_x64 test: can only be done via a suite of tests that |
| # build both 32-bit and 64-bit. We have 32-bit just build, and |
| # 64-bit then builds and runs both directions. |
| # |
| # XXX: alternative of cmake cross-compilation support really |
| # requires a separate config anyway; to build 32-bit in 64-bit build |
| # dir would require manual build rules. Not difficult, just a |
| # little messy. |
| # |
| # We support setting TEST_32BIT_PATH manually in a 64-bit build. |
| # We go ahead and build in any 32-bit build dir to make that easier. |
| # |
| # XXX: currently early injection doesn't work for pre-Vista WOW64, where |
| # w/ these options the child will end up native and the test will pass (!). |
| # For now we assume injection succeeds on Vista+ and that the test thus |
| # actually tests mixed-mode, until we've got early/earliest injection working |
| # everywhere (xref i#381, i#234, i#803). |
| # |
| # XXX i#829: mixed-mode stubs and abs far jmps require -heap_in_lower_4GB |
| # |
| # TODO i#803: Once cross-arch injection works on Windows, add a test of |
| # the "-c32 -c64" syntax like we have for Linux. |
| if (TEST_SUITE OR TEST_32BIT_PATH OR NOT X64) |
| if (X64) |
| # XXX i#1636: the earliest injection tests below seem to have the child |
| # native. Until we figure out what's up I'm at least adding this test |
| # which does inject into the child: |
| torunonly(win32.mixedmode_late |
| ${MAIN_RUNTIME_OUTPUT_DIRECTORY}/create_process.exe |
| win32/mixedmode.c |
| "-early_inject -heap_in_lower_4GB -reachable_heap" |
| "${TEST_32BIT_PATH}/win32.mixedmode.exe;mixedmode") |
| torunonly(win32.mixedmode |
| ${MAIN_RUNTIME_OUTPUT_DIRECTORY}/create_process.exe |
| win32/mixedmode.c |
| "-early_inject_map -early_inject_location 5 -heap_in_lower_4GB -reachable_heap" |
| "${TEST_32BIT_PATH}/win32.mixedmode.exe;mixedmode") |
| # i#1494: Trace creation should be disabled for -x86_to_x64. |
| # We did not use -disable_traces here to check if trace creation is |
| # disabled automatically. |
| torunonly(win32.x86_to_x64 |
| ${MAIN_RUNTIME_OUTPUT_DIRECTORY}/create_process.exe |
| win32/mixedmode.c |
| "-early_inject_map -early_inject_location 5 -heap_in_lower_4GB -reachable_heap -x86_to_x64" |
| "${TEST_32BIT_PATH}/win32.mixedmode.exe;x86_to_x64") |
| torunonly(win32.x86_to_x64_ibl_opt |
| ${MAIN_RUNTIME_OUTPUT_DIRECTORY}/create_process.exe |
| win32/mixedmode.c |
| "-early_inject_map -early_inject_location 5 -heap_in_lower_4GB -reachable_heap -x86_to_x64 -x86_to_x64_ibl_opt" |
| "${TEST_32BIT_PATH}/win32.mixedmode.exe;x86_to_x64") |
| else (X64) |
| add_exe(win32.mixedmode win32/mixedmode.c) |
| endif (X64) |
| endif (TEST_SUITE OR TEST_32BIT_PATH OR NOT X64) |
| |
| endif (UNIX) |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild(security-common.codemod security-common/codemod.c) |
| tochcon(security-common.codemod execmem_exec_t) |
| mark_execstack(security-common.codemod) |
| endif (NOT RISCV64) |
| if (X86) # FIXME i#1551, i#1569: port asm to ARM and AArch64 |
| # FIXME i#1308, i#2216: fails non-deterministically on Travis |
| set(decode_bad_stack_name security-common.decode-bad-stack_FLAKY) |
| tobuild(${decode_bad_stack_name} security-common/decode-bad-stack.c) |
| tochcon(${decode_bad_stack_name} execmem_exec_t) |
| mark_execstack(${decode_bad_stack_name}) |
| tobuild(security-common.retexisting security-common/retexisting.c) |
| endif (X86) |
| if (PROGRAM_SHEPHERDING) # relies on being aborted on .B violation |
| tobuild(security-common.jmp_from_trace security-common/jmp_from_trace.c) |
| tochcon(security-common.jmp_from_trace textrel_shlib_t) |
| endif () |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild(security-common.ret_noncall_trace security-common/ret_noncall_trace.c) |
| endif (NOT RISCV64) |
| if (NOT ARM) # FIXME i#1551: fix bugs on ARM |
| # FIXME i#1423: somehow when built with VS2013 x64 you can't catch a fault on |
| # jumping to an invalid address! For now we disable for VS2013 x64. |
| # It also seems to fail on win8 x64 with VS2012. |
| if (UNIX OR NOT X64 OR CMAKE_C_COMPILER_VERSION VERSION_LESS 17.0) |
| tobuild(security-common.retnonexisting security-common/retnonexisting.c) |
| endif () |
| endif (NOT ARM) |
| if (X86) # FIXME i#1551, i#1569: port asm to ARM and AArch64 |
| tobuild(security-common.selfmod2 security-common/selfmod2.c) |
| tochcon(security-common.selfmod2 textrel_shlib_t) |
| if (NOT APPLE) # XXX i#58: port test to MacOS |
| tobuild(security-common.selfmod-big security-common/selfmod-big.c) |
| tochcon(security-common.selfmod-big textrel_shlib_t) |
| endif () |
| tobuild(security-common.selfmod security-common/selfmod.c) |
| tochcon(security-common.selfmod textrel_shlib_t) |
| if (NOT X64 AND NOT APPLE) # XXX i#58: port test to MacOS |
| # FIXME i#125 |
| tobuild(security-common.vbjmp-rac-test security-common/vbjmp-rac-test.c) |
| endif () |
| endif (X86) |
| if (X64 AND NOT AARCH64 AND NOT RISCV64) # FIXME i#1569: get working on AArch64 |
| # Reachability tests |
| |
| # Floating DR lib. We'd have to build a 2nd dynamorio.dll on Windows so |
| # we only test on Linux for now. |
| # TODO i#3544: Port tests to RISC-V 64 |
| if (UNIX) |
| torunonly(float_DR security-common.selfmod security-common/selfmod.c "" "") |
| set(float_DR_env "LD_USE_LOAD_BIAS=0") |
| torunonly_ci(client.float_DR security-common.selfmod |
| client.dr_options.dll security-common/selfmod.c |
| # I picked dr_options b/c it has no output, but it requires all these ops: |
| "" "-native_exec_list foo.dll,bar.dll -opt_cleancall 3 -thread_private" "") |
| set(client.float_DR_env "LD_USE_LOAD_BIAS=0") |
| endif (UNIX) |
| |
| # Floating vmbase. Risky to just pick this hardcoded address: any better ideas? |
| torunonly(float_vmbase security-common.selfmod security-common/selfmod.c |
| "-vm_base 0x30000000000 -no_vm_base_near_app" "") |
| torunonly_ci(client.float_vmbase security-common.selfmod |
| client.dr_options.dll security-common/selfmod.c |
| # I picked dr_options b/c it has no output, but it requires |
| # -thread_private: |
| "" "-native_exec_list foo.dll,bar.dll -opt_cleancall 3 -thread_private -vm_base 0x30000000000 -no_vm_base_near_app" |
| "") |
| if (UNIX) |
| # Test client with PIE w/ default options |
| torunonly_ci(client.float_vmbase_PIE linux.fib-pie |
| client.dr_options.dll common/fib.c |
| # I picked dr_options b/c it has no output, but it requires |
| # -thread_private: |
| "" "-native_exec_list foo.dll,bar.dll -opt_cleancall 3 -thread_private" "") |
| endif (UNIX) |
| torunonly(low4GB security-common.selfmod security-common/selfmod.c |
| "-heap_in_lower_4GB -reachable_heap" "") |
| endif (X64 AND NOT AARCH64 AND NOT RISCV64) |
| |
| if (NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| tobuild("security-common.TestAllocWE" security-common/TestAllocWE.c) |
| endif (NOT RISCV64) |
| |
| # XXX i#1874: get working on Android |
| # FIXME i#1569: get working on AArch64 |
| if (NOT ANDROID) |
| set (TestMemProtChg "security-common.TestMemProtChg") |
| if (UNIX) # i#387: Still has issues with proc maps on some kernels. |
| set (TestMemProtChg "${TestMemProtChg}_FLAKY") |
| endif (UNIX) |
| tobuild("${TestMemProtChg}" security-common/TestMemProtChg.c) |
| if (UNIX) |
| append_property_string(SOURCE security-common/TestMemProtChg.c |
| COMPILE_FLAGS "-Wno-vla") |
| endif () |
| tochcon("${TestMemProtChg}" wine_exec_t) |
| mark_execstack("${TestMemProtChg}") |
| endif () |
| |
| if (vera++_FOUND) |
| file(READ "${PROJECT_SOURCE_DIR}/make/style_checks/style_test.templatex" vera_regex) |
| add_test(vera ${VERA++_EXECUTABLE} --root "${PROJECT_SOURCE_DIR}/make/style_checks" |
| --error "${PROJECT_SOURCE_DIR}/make/style_checks/style_test.c") |
| set_tests_properties(vera PROPERTIES PASS_REGULAR_EXPRESSION "${vera_regex}") |
| endif () |
| |
| ########################################################################### |
| |
| # Remember that we do not reach this point for DR_HOST_NOT_TARGET, so do not |
| # place anything here that should be shared across all configurations. |
| set_up_test_lists() |
| |
| if (APPLE) |
| # Enable just the quarter of the tests that pass, to get our test suite started |
| # on the bot without perturbing all the code above and without disabling tests |
| # from the build (all tests build, they just don't all run successfully). |
| # FIXME i#1815: fix the failing tests so we can enable the full suite. |
| # XXX: can we get this to automatically happen for a local "ctest" w/o |
| # the user having to pass "-L OSX"? |
| set_tests_properties( |
| samples_proj |
| code_api|common.broadfun |
| code_api|common.fib |
| code_api|common.getretaddr |
| code_api|libutil.frontend_test |
| code_api|linux.exit |
| code_api|linux.infinite |
| code_api|linux.signal0000 |
| code_api|linux.signal0010 |
| code_api|linux.signal0100 |
| code_api|linux.signal0110 |
| code_api|linux.app_tls |
| code_api|linux.fib-conflict |
| code_api|linux.fib-pie |
| code_api|security-common.codemod |
| code_api|security-common.ret_noncall_trace |
| code_api|client.crashmsg |
| code_api|client.exception |
| code_api|client.syscall-mod |
| code_api|client.truncate |
| code_api|client.unregister |
| code_api|client.null_instrument |
| code_api|client.option_parse |
| code_api|client.drcontainers-test |
| code_api|client.destructor |
| code_api|sample.signal |
| code_api|api.ir |
| code_api|api.ir-static |
| code_api|api.drdecode |
| code_api|linux.sigaction |
| no_code_api,no_intercept_all_signals|linux.sigaction |
| code_api|linux.sigaction.native |
| PROPERTIES LABELS OSX) |
| if (X86) |
| set_tests_properties( |
| code_api|common.floatpc |
| code_api|common.floatpc_xl8all |
| code_api|security-common.retexisting |
| code_api|client.count-ctis-noopt |
| code_api|client.cbr-retarget |
| code_api|client.dr_options |
| code_api|tool.drcpusim.cpuid-Prescott |
| code_api|tool.drcpusim.cpuid-Presler |
| code_api|tool.drcpusim.cpuid-Merom |
| code_api|tool.drcpusim.cpuid-Penryn |
| code_api|tool.drcpusim.cpuid-Westmere |
| code_api|tool.drcpusim.cpuid-Nehalem |
| code_api|api.dis |
| PROPERTIES LABELS OSX) |
| elseif (AARCH64) |
| set_tests_properties( |
| code_api|api.dis-a64 |
| PROPERTIES LABELS OSX) |
| endif () |
| if (DEBUG AND X86) # FIXME i#1806: fails in release |
| set_tests_properties(code_api|client.flush PROPERTIES LABELS OSX) |
| endif () |
| if (NOT X64) |
| set_tests_properties( |
| code_api|client.fcache_shift |
| code_api|tool.drcpusim.cpuid-Banias |
| PROPERTIES LABELS OSX) |
| endif () |
| endif () |
| |
| # XXX i#4719: Support for running aarchxx Linux tests under QEMU. |
| # Currently about 1/3 of the tests pass. The rest either are too slow under QEMU |
| # and hit the (expanded) timeout, or do not yet have full command line insertion |
| # support (drcachesim and other tools), or hit bugs in QEMU or in DR. |
| if (NOT ANDROID AND AARCHXX) |
| set_tests_properties( |
| code_api|common.broadfun |
| code_api|common.getretaddr |
| code_api|common.nzcv |
| code_api|linux.app_tls |
| code_api|linux.execve-null |
| code_api|linux.exit |
| code_api|linux.fib-conflict |
| code_api|linux.fib-conflict-early |
| code_api|linux.fib-pie |
| code_api|linux.fork |
| code_api|linux.infinite |
| code_api|linux.longjmp |
| code_api|linux.readlink |
| code_api|linux.sigaction |
| code_api|security-common.codemod |
| code_api|security-common.ret_noncall_trace |
| code_api|security-common.TestMemProtChg_FLAKY |
| code_api|client.app_args |
| code_api|client.blackbox |
| code_api|client.call-retarget |
| code_api|client.crashmsg |
| code_api|client.destructor |
| code_api|client.drbbdup-test |
| code_api|client.drbbdup-no-encode-test |
| code_api|client.drbbdup-nonzero-test |
| code_api|client.drbbdup-analysis-test |
| code_api|client.drcontainers-test |
| code_api|client.drmodtrack-test |
| code_api|client.drsyms-test |
| code_api|client.drwrap-test-callconv |
| code_api|client.drwrap-drreg-test |
| code_api|client.drxmgr-test |
| code_api|client.exception |
| code_api|client.int64_overrides |
| code_api|client.low_on_memory |
| code_api|client.null_instrument |
| code_api|client.option_parse |
| code_api|client.reg_size_test |
| code_api|client.partial_module_map |
| code_api|client.stack-overflow |
| code_api|client.thread_exit_xl8 |
| code_api|sample.bbbuf |
| code_api|sample.bbcount |
| code_api|sample.bbsize |
| code_api|sample.div |
| code_api|sample.empty |
| code_api|sample.inline |
| code_api|sample.opcode_count |
| code_api|sample.opcodes |
| code_api|sample.signal |
| code_api|sample.stl_test |
| code_api|sample.syscall |
| code_api|sample.wrap |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| if (NOT APPLE) |
| set_tests_properties( |
| code_api|linux.fib-static |
| code_api|linux.signalfd |
| code_api|linux.signal_racesys |
| code_api|client.modules |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| endif () |
| if (DEBUG) |
| set_tests_properties( |
| code_api|common.logstderr |
| code_api|common.loglevel |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| endif () |
| if (HAVE_LIBUNWIND_H) |
| set_tests_properties( |
| code_api|client.drcallstack-test |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| endif () |
| if (AARCH64) |
| set_tests_properties( |
| code_api|common.allasm_aarch64_cache |
| code_api|linux.mangle_asynch |
| code_api|linux.mmap |
| code_api|pthreads.pthreads_exit |
| code_api|pthreads.pthreads |
| code_api,satisfy_w_xor_x|linux.fork |
| code_api|security-common.retnonexisting |
| code_api|client.app_inscount |
| code_api|client.cleancall-opt-1 |
| code_api|client.cleancallparams |
| code_api|client.drmgr-test |
| code_api|client.drreg-cross |
| code_api|client.drreg-end-restore |
| code_api|client.drreg-flow |
| code_api|client.drutil-test |
| code_api|client.drx_buf-test |
| code_api|client.emulation_api_simple |
| code_api|client.execfault |
| code_api|client.gonative |
| code_api|client.inline |
| code_api|client.mangle_suspend |
| code_api|client.process-id |
| code_api|client.syscall-mod |
| code_api|client.tls |
| code_api|client.truncate |
| code_api|client.unregister |
| code_api|sample.inscount |
| code_api|sample.inscount.cleancall |
| code_api|sample.inscount.prof-pcs.cleancall |
| code_api|sample.instrace_simple |
| code_api|sample.memtrace_simple |
| code_api|sample.memval_simple |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| if (NOT APPLE) # TODO i#5383: Port to Mac M1. |
| set_tests_properties( |
| code_api|common.allasm_aarch64_isa |
| code_api|client.drreg-test |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| endif () |
| if (NOT CMAKE_COMPILER_IS_CLANG) |
| set_tests_properties( |
| code_api|security-linux.trampoline |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| endif () |
| if (LINUX AND X64 AND HAVE_RSEQ) |
| # QEMU just returns ENOSYS, but still this is testing that. |
| set_tests_properties( |
| code_api|linux.rseq |
| code_api|linux.rseq_table |
| code_api|linux.rseq_noarray |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| endif () |
| endif () |
| if (ARM) |
| set_tests_properties( |
| code_api|common.allasm_arm |
| code_api|common.allasm_thumb |
| code_api|common.broadfun-stress |
| code_api|linux.bad-signal-stack |
| code_api|linux.alarm |
| code_api|linux.fork-sleep |
| code_api|linux.signal_race |
| code_api|linux.signal0000 |
| code_api|linux.signal0001 |
| code_api|linux.signal0010 |
| code_api|linux.signal0011 |
| code_api|linux.signal0100 |
| code_api|linux.signal0101 |
| code_api|linux.signal0110 |
| code_api|linux.signal0111 |
| code_api|linux.signal1000 |
| code_api|linux.signal1001 |
| code_api|linux.signal1010 |
| code_api|linux.signal1011 |
| code_api|linux.signal1100 |
| code_api|linux.signal1101 |
| code_api|linux.signal1110 |
| code_api|linux.signal1111 |
| code_api|linux.sigplain000 |
| code_api|linux.sigplain001 |
| code_api|linux.sigplain010 |
| code_api|linux.sigplain011 |
| code_api|linux.sigplain100 |
| code_api|linux.sigplain101 |
| code_api|linux.sigplain110 |
| code_api|linux.sigplain111 |
| code_api|security-common.TestAllocWE |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| endif () |
| endif (NOT ANDROID AND AARCHXX) |
| |
| # XXX i#5437, i#5431: While we work through Ubuntu22 issues we want our new GA CI job to |
| # just run sanity tests that do pass now as a glibc change detector to see if our |
| # workarounds so far break over time. |
| set_tests_properties( |
| code_api|common.broadfun |
| PROPERTIES LABELS UBUNTU_22) |
| if (BUILD_SAMPLES AND NOT ANDROID AND NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| set_tests_properties( |
| code_api|sample.bbsize |
| PROPERTIES LABELS UBUNTU_22) |
| endif () |
| if (BUILD_CLIENTS AND NOT ANDROID) |
| set_tests_properties( |
| code_api|tool.drcachesim.simple |
| code_api|tool.drcacheoff.simple |
| PROPERTIES LABELS UBUNTU_22) |
| endif () |
| if (LINUX AND X64 AND HAVE_RSEQ AND NOT RISCV64) # TODO i#3544: Port tests to RISC-V 64 |
| set_tests_properties( |
| code_api|api.rseq |
| code_api|linux.rseq_disable |
| code_api|linux.rseq_noarray |
| code_api|linux.rseq |
| code_api|linux.rseq_table |
| code_api|tool.drcacheoff.rseq |
| PROPERTIES LABELS UBUNTU_22) |
| endif () |
| |
| # XXX i#3544: Support for running RISC-V Linux tests under QEMU. |
| # Currently about 1/6 of the compiled tests pass. |
| if (RISCV64) |
| set_tests_properties( |
| code_api|api.ir |
| code_api|api.ir-static |
| code_api|client.app_args |
| code_api|client.app_args |
| code_api|client.blackbox |
| code_api|client.blackbox |
| code_api|client.crashmsg |
| code_api|client.crashmsg |
| code_api|client.execfault |
| code_api|client.execfault |
| code_api|client.mangle_suspend |
| code_api|client.mangle_suspend |
| code_api|client.null_instrument |
| code_api|client.null_instrument |
| code_api|client.option_parse |
| code_api|client.option_parse |
| code_api|client.partial_module_map |
| code_api|client.partial_module_map |
| code_api|client.stack-overflow |
| code_api|client.stack-overflow |
| code_api|client.truncate |
| code_api|client.unregister |
| code_api|common.broadfun |
| code_api|common.hello |
| code_api|libutil.drconfig_test |
| code_api|libutil.drconfig_test |
| code_api|libutil.frontend_test |
| code_api|libutil.frontend_test |
| code_api|linux.exit |
| code_api|linux.exit |
| code_api|linux.infinite |
| code_api|linux.infinite |
| code_api|linux.longjmp |
| code_api|linux.longjmp |
| code_api|linux.prctl |
| code_api|linux.prctl |
| code_api|linux.signalfd |
| code_api|pthreads.pthreads |
| code_api|pthreads.pthreads_exit |
| code_api|pthreads.pthreads_exit |
| code_api|sample.bbbuf |
| code_api|sample.bbcount |
| code_api|sample.bbsize |
| code_api|sample.div |
| code_api|sample.empty |
| code_api|sample.inline |
| code_api|sample.inscount |
| code_api|sample.inscount.cleancall |
| code_api|sample.inscount.prof-pcs.cleancall |
| code_api|sample.opcode_count |
| code_api|sample.signal |
| code_api|sample.stl_test |
| code_api|sample.stl_test |
| code_api|sample.syscall |
| code_api|sample.syscall |
| code_api|security-linux.trampoline |
| code_api|security-linux.trampoline |
| code_api|tool.drcachesim.missfile-config-file |
| code_api|tool.drcachesim.syscall-mix |
| code_api|tool.drcov.fib |
| code_api|tool.drdisas |
| code_api|tool.histogram |
| code_api|tool.reuse_distance |
| no_code_api,no_intercept_all_signals|linux.sigaction |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| if (DEBUG) |
| set_tests_properties( |
| code_api|common.logstderr |
| PROPERTIES LABELS RUNS_ON_QEMU) |
| endif () |
| endif () |