diff --git a/clients/drcachesim/tests/invariant_checker_test.cpp b/clients/drcachesim/tests/invariant_checker_test.cpp index 3d37b88fbda..65b112705af 100644 --- a/clients/drcachesim/tests/invariant_checker_test.cpp +++ b/clients/drcachesim/tests/invariant_checker_test.cpp @@ -43,6 +43,8 @@ #include "../tools/invariant_checker.h" #include "../common/memref.h" #include "memref_gen.h" +#include "trace_entry.h" + #ifdef LINUX # include "../../core/unix/include/syscall_target.h" #endif @@ -3572,6 +3574,48 @@ bool check_regdeps(void) { std::cerr << "Testing regdeps traces\n"; + + // Incorrect: OFFLINE_FILE_TYPE_ARCH_AARCH64 not allowed. + { + std::vector memrefs = { + gen_marker(TID_A, TRACE_MARKER_TYPE_FILETYPE, + OFFLINE_FILE_TYPE_ARCH_REGDEPS | OFFLINE_FILE_TYPE_ARCH_AARCH64), + gen_marker(TID_A, TRACE_MARKER_TYPE_CACHE_LINE_SIZE, 64), + gen_marker(TID_A, TRACE_MARKER_TYPE_PAGE_SIZE, 4096), + gen_marker(TID_A, TRACE_MARKER_TYPE_CPU_ID, INVALID_CPU_MARKER_VALUE), + gen_instr(TID_A), + gen_exit(TID_A), + }; + if (!run_checker(memrefs, true, + { "OFFLINE_FILE_TYPE_ARCH_REGDEPS traces cannot have other" + "OFFLINE_FILE_TYPE_ARCH_*", + /*tid=*/TID_A, + /*ref_ordinal=*/1, /*last_timestamp=*/0, + /*instrs_since_last_timestamp=*/0 }, + "Failed to catch non-allowed OFFLINE_FILE_TYPE_ARCH_AARCH64")) + return false; + } + + // Incorrect: TRACE_MARKER_TYPE_CPU_ID with value other than -1 not allowed. + { + std::vector memrefs = { + gen_marker(TID_A, TRACE_MARKER_TYPE_FILETYPE, OFFLINE_FILE_TYPE_ARCH_REGDEPS), + gen_marker(TID_A, TRACE_MARKER_TYPE_CACHE_LINE_SIZE, 64), + gen_marker(TID_A, TRACE_MARKER_TYPE_PAGE_SIZE, 4096), + gen_marker(TID_A, TRACE_MARKER_TYPE_CPU_ID, 1), + gen_instr(TID_A), + gen_exit(TID_A), + }; + if (!run_checker(memrefs, true, + { "OFFLINE_FILE_TYPE_ARCH_REGDEPS traces cannot have a valid " + "TRACE_MARKER_TYPE_CPU_ID", + /*tid=*/TID_A, + /*ref_ordinal=*/4, /*last_timestamp=*/0, + /*instrs_since_last_timestamp=*/0 }, + "Failed to catch non-allowed TRACE_MARKER_TYPE_CPU_ID marker")) + return false; + } + // Incorrect: TRACE_MARKER_TYPE_SYSCALL_IDX not allowed. { std::vector memrefs = { diff --git a/clients/drcachesim/tools/invariant_checker.cpp b/clients/drcachesim/tools/invariant_checker.cpp index 68d03b6f048..0c791129433 100644 --- a/clients/drcachesim/tools/invariant_checker.cpp +++ b/clients/drcachesim/tools/invariant_checker.cpp @@ -1638,6 +1638,26 @@ invariant_checker_t::check_regdeps_invariants(per_shard_t *shard, const memref_t // Check markers. if (memref.marker.type == TRACE_TYPE_MARKER) { switch (memref.marker.marker_type) { + case TRACE_MARKER_TYPE_FILETYPE: + report_if_false( + shard, + static_cast(memref.marker.marker_value) == + shard->file_type_, + "TRACE_MARKER_TYPE_FILETYPE and shard file type are not the same"); + // Check that the file type does not contain any architecture specific + // information except OFFLINE_FILE_TYPE_ARCH_REGDEPS. + report_if_false( + shard, + !TESTANY(OFFLINE_FILE_TYPE_ARCH_ALL & ~OFFLINE_FILE_TYPE_ARCH_REGDEPS, + shard->file_type_), + "OFFLINE_FILE_TYPE_ARCH_REGDEPS traces cannot have other" + "OFFLINE_FILE_TYPE_ARCH_*"); + break; + case TRACE_MARKER_TYPE_CPU_ID: + report_if_false(shard, memref.marker.marker_value == INVALID_CPU_MARKER_VALUE, + "OFFLINE_FILE_TYPE_ARCH_REGDEPS traces cannot have a valid " + "TRACE_MARKER_TYPE_CPU_ID"); + break; case TRACE_MARKER_TYPE_SYSCALL_IDX: report_if_false(shard, false, "OFFLINE_FILE_TYPE_ARCH_REGDEPS traces cannot have " diff --git a/suite/tests/CMakeLists.txt b/suite/tests/CMakeLists.txt index 22f64e5d528..00a2f781a62 100644 --- a/suite/tests/CMakeLists.txt +++ b/suite/tests/CMakeLists.txt @@ -4839,12 +4839,14 @@ if (BUILD_CLIENTS) # Generate an OFFLINE_FILE_TYPE_ARCH_REGDEPS trace by running record_filter # with -filter_encodings2regdeps to change instruction encodings, # -filter_keep_func_ids 4294967498 (which is SYS_futex, associated to the only - # TRACE_MARKER_TYPE_FUNC_ markers we want to keep), and + # TRACE_MARKER_TYPE_FUNC_ markers we want to keep), # -filter_marker_types 19,25,27,28,30 (which correspond to # TRACE_MARKER_TYPE_SYSCALL_IDX, TRACE_MARKER_TYPE_SYSCALL, # TRACE_MARKER_TYPE_SYSCALL_TRACE_START, TRACE_MARKER_TYPE_SYSCALL_TRACE_END, - # TRACE_MARKER_TYPE_SYSCALL_FAILED). - "${drcachesim_path}@-simulator_type@record_filter@-filter_encodings2regdeps@-indir@${testname}.${ci_shared_app}.*.dir/trace@-outdir@${testname}.filtered.dir@-filter_marker_types@19,25,27,28,30@-filter_keep_func_ids@4294967498" + # TRACE_MARKER_TYPE_SYSCALL_FAILED), and -filter_modify_marker_value 3,-1 + # (which changes the value of TRACE_MARKER_TYPE_CPU_ID == 3 to + # INVALID_CPU_MARKER_VALUE == (uintptr_t)-1). + "${drcachesim_path}@-simulator_type@record_filter@-filter_encodings2regdeps@-indir@${testname}.${ci_shared_app}.*.dir/trace@-outdir@${testname}.filtered.dir@-filter_marker_types@19,25,27,28,30@-filter_keep_func_ids@4294967498@-filter_modify_marker_value@3,-1" # We run the invariant_checker analyzer on the REGDEPS filtered trace. # We expect no invariant errors. "invariant_checker") @@ -4857,12 +4859,14 @@ if (BUILD_CLIENTS) # Generate an OFFLINE_FILE_TYPE_ARCH_REGDEPS trace by running record_filter # with -filter_encodings2regdeps to change instruction encodings, # -filter_keep_func_ids 4294967498 (which is SYS_futex, associated to the only - # TRACE_MARKER_TYPE_FUNC_ markers we want to keep), and + # TRACE_MARKER_TYPE_FUNC_ markers we want to keep), # -filter_marker_types 19,25,27,28,30 (which correspond to # TRACE_MARKER_TYPE_SYSCALL_IDX, TRACE_MARKER_TYPE_SYSCALL, # TRACE_MARKER_TYPE_SYSCALL_TRACE_START, TRACE_MARKER_TYPE_SYSCALL_TRACE_END, - # TRACE_MARKER_TYPE_SYSCALL_FAILED). - "${drcachesim_path}@-simulator_type@record_filter@-filter_encodings2regdeps@-indir@${testname}.${kernel_xfer_app}.*.dir/trace@-outdir@${testname}.filtered.dir@-filter_marker_types@19,25,27,28,30@-filter_keep_func_ids@4294967498" + # TRACE_MARKER_TYPE_SYSCALL_FAILED), and -filter_modify_marker_value 3,-1 + # (which changes the value of TRACE_MARKER_TYPE_CPU_ID == 3 to + # INVALID_CPU_MARKER_VALUE == (uintptr_t)-1). + "${drcachesim_path}@-simulator_type@record_filter@-filter_encodings2regdeps@-indir@${testname}.${kernel_xfer_app}.*.dir/trace@-outdir@${testname}.filtered.dir@-filter_marker_types@19,25,27,28,30@-filter_keep_func_ids@4294967498@-filter_modify_marker_value@3,-1" # We run the invariant_checker analyzer on the REGDEPS filtered trace. # We expect no invariant errors. "invariant_checker")