gdb.trace: Add a testcase for tdesc in tfile.

This tests whether $ymm15 can be correctly collected and printed from
tfile.  It covers:

- storing tdesc in tfile (without that, $ymm15 doesn't exist)
- ax_pseudo_register_collect for x86 (without that, $ymm15 cannot be
  collected)
- register order in tfile_fetch_registers (without that, $ymm15h is
  fetched from wrong position)
- off-by-one in tfile_fetch_registers (without that, $ymm15h is
  incorrectly considered to be out of bounds)
- using proper tdesc in encoding tracepoint actions (without that,
  internal error happens due to $ymm15h being considered unavailable)

gdb/testsuite/ChangeLog:

	* gdb.trace/tfile-avx.c: New test.
	* gdb.trace/tfile-avx.exp: New test.
This commit is contained in:
Marcin Kościelnicki 2016-02-06 18:19:49 +01:00
parent 82e9becd8a
commit 9f5fed7852
3 changed files with 129 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2016-02-11 Marcin Kościelnicki <koriakin@0x04.net>
* gdb.trace/tfile-avx.c: New test.
* gdb.trace/tfile-avx.exp: New test.
2016-02-09 Keith Seitz <keiths@redhat.com>
PR breakpoints/19546

View File

@ -0,0 +1,51 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2016 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/*
* Test program for reading target description from tfile: collects AVX
* registers on x86_64.
*/
#include <immintrin.h>
void
dummy (void)
{
}
static void
end (void)
{
}
int
main (void)
{
register __v8si a asm("ymm15") = {
0x12340001,
0x12340002,
0x12340003,
0x12340004,
0x12340005,
0x12340006,
0x12340007,
0x12340008,
};
asm volatile ("traceme: call dummy" : : "x" (a));
end ();
return 0;
}

View File

@ -0,0 +1,73 @@
# Copyright 2016 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
if { ! [is_amd64_regs_target] } {
verbose "Skipping tfile AVX test (target is not x86_64)."
return
}
load_lib "trace-support.exp"
standard_testfile
if {[prepare_for_testing $testfile.exp $testfile $srcfile \
[list debug additional_flags=-mavx]]} {
return -1
}
if ![runto_main] {
fail "Can't run to main to check for trace support"
return -1
}
if ![gdb_target_supports_trace] {
unsupported "target does not support trace"
return -1
}
gdb_test_multiple "print \$ymm15" "check for AVX support" {
-re " = void.*$gdb_prompt $" {
verbose "Skipping tfile AVX test (target doesn't support AVX)."
return
}
-re " = \\{.*}.*$gdb_prompt $" {
# All is well.
}
}
gdb_test "trace traceme" ".*"
gdb_trace_setactions "set actions for tracepoint" "" \
"collect \$ymm15" "^$"
gdb_breakpoint "end"
gdb_test_no_output "tstart"
gdb_test "continue" ".*Breakpoint $decimal, end .*"
set tracefile [standard_output_file ${testfile}]
# Save trace frames to tfile.
gdb_test "tsave ${tracefile}.tf" \
"Trace data saved to file '${tracefile}.tf'.*" \
"save tfile trace file"
# Change target to tfile.
gdb_test "target tfile ${tracefile}.tf" "" "change to tfile target" \
"A program is being debugged already. Kill it. .y or n. $" "y"
gdb_test "tfind 0" "Found trace frame 0, tracepoint .*"
gdb_test "print/x \$ymm15.v8_int32" " = \\{0x12340001, .*, 0x12340008}"