standard_testfile
-require {expr [have_syscall time]}
+# MODE is either "syscall" for testing the time syscall explicitly, or
+# "c" for testing the C time(2) function.
+proc test {mode} {
+ set options {debug}
-if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } {
- return -1
-}
+ if {$mode == "syscall"} {
+ lappend options additional_flags=-DUSE_SYSCALL
+ } elseif {$mode != "c"} {
+ error "unrecognized mode: $mode"
+ }
-runto_main
+ if { [prepare_for_testing "failed to prepare" $::testfile-$mode $::srcfile $options] } {
+ return
+ }
-if [supports_process_record] {
- # Activate process record/replay
- gdb_test_no_output "record" "turn on process record"
-}
+ runto_main
+
+ if [supports_process_record] {
+ # Activate process record/replay
+ gdb_test_no_output "record" "turn on process record"
+ }
+
+ gdb_test "break marker2" \
+ "Breakpoint $::decimal at $::hex: file .*$::srcfile, line $::decimal.*" \
+ "set breakpoint at marker2"
+
+ gdb_continue_to_breakpoint "marker2" ".*$::srcfile:.*"
-gdb_test "break marker2" \
- "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
- "set breakpoint at marker2"
+ gdb_test "break marker1" \
+ "Breakpoint $::decimal at $::hex: file .*$::srcfile, line $::decimal.*" \
+ "set breakpoint at marker1"
-gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+ gdb_test "reverse-continue" ".*$::srcfile:$::decimal.*" "reverse to marker1"
-gdb_test "break marker1" \
- "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
- "set breakpoint at marker1"
+ # If the variable was recorded properly, the old contents (-1)
+ # will be remembered. If not, new contents (current time) will be
+ # used, and the test will fail.
-gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+ gdb_test "print time_global" ".* = -1" "check time record"
+}
-# If the variable was recorded properly on syscall, the old contents (-1)
-# will be remembered. If not, new contents (current time) will be used,
-# and the test will fail.
+# Test both using the syscall explicitly, and using the time(2) C
+# function.
+#
+# The C variant ensures that if some platform uses some syscall we are
+# not aware of yet, we'll still exercise it (and likely fail).
+#
+# The explicit syscall variant is useful on platforms where the C
+# function does not call a syscall at all by default, e.g., on some
+# systems the C time function wraps an implementation provided by the
+# vDSO.
-gdb_test "print time_global" ".* = -1" "check time record"
+foreach_with_prefix mode {syscall c} {
+ if {$mode == "syscall" && ![have_syscall time]} {
+ continue
+ }
+
+ test $mode
+}