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

Message ID 1455185675-27574-1-git-send-email-koriakin@0x04.net
State New, archived
Headers

Commit Message

Marcin Kościelnicki Feb. 11, 2016, 10:14 a.m. UTC
  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.
---
Fixes applied.

 gdb/testsuite/ChangeLog               |  5 +++
 gdb/testsuite/gdb.trace/tfile-avx.c   | 51 ++++++++++++++++++++++++
 gdb/testsuite/gdb.trace/tfile-avx.exp | 73 +++++++++++++++++++++++++++++++++++
 3 files changed, 129 insertions(+)
 create mode 100644 gdb/testsuite/gdb.trace/tfile-avx.c
 create mode 100644 gdb/testsuite/gdb.trace/tfile-avx.exp
  

Comments

Pedro Alves Feb. 11, 2016, 1 p.m. UTC | #1
On 02/11/2016 10:14 AM, Marcin Kościelnicki wrote:
> 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

OK once prereqs are in.

Thanks,
Pedro Alves
  
Marcin Kościelnicki Feb. 11, 2016, 2:17 p.m. UTC | #2
On 11/02/16 14:00, Pedro Alves wrote:
> On 02/11/2016 10:14 AM, Marcin Kościelnicki wrote:
>> 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
>
> OK once prereqs are in.
>
> Thanks,
> Pedro Alves
>

Thanks, pushed.
  
Antoine Tremblay Feb. 12, 2016, 6:31 p.m. UTC | #3
Marcin Kościelnicki writes:

> On 11/02/16 14:00, Pedro Alves wrote:
>> On 02/11/2016 10:14 AM, Marcin Kościelnicki wrote:
>>> 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
>>
>> OK once prereqs are in.
>>
>> Thanks,
>> Pedro Alves
>>
>
> Thanks, pushed.

Hi,
  I've been trying to run this test on x86 but I get the following error
  while compiling tfile-avx.c :

 binutils-gdb/build-x86/gdb/testsuite/../../../gdb/testsuite/gdb.trace/tfile-avx.c:38:19: error: invalid register name for 'a'
  register __v8si a asm("ymm15") = {
                   ^

  I've also noticed the same error on the buildbot results see:
  http://gdb-build.sergiodj.net/builders/Debian-x86_64-m64/builds/2928/steps/test%20gdb/logs/stdio

  My cpu (Intel(R) Core(TM) i7-4600M ) supports avx, cat /proc/cpuinfo
  shows avx and a gdb print $ymm15 returns something...

  This is with gcc 4.8.4...

  Am I missing something?

Regards,
Antoine
  
Marcin Kościelnicki Feb. 12, 2016, 6:39 p.m. UTC | #4
On 12/02/16 19:31, Antoine Tremblay wrote:
>
> Marcin Kościelnicki writes:
>
>> On 11/02/16 14:00, Pedro Alves wrote:
>>> On 02/11/2016 10:14 AM, Marcin Kościelnicki wrote:
>>>> 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
>>>
>>> OK once prereqs are in.
>>>
>>> Thanks,
>>> Pedro Alves
>>>
>>
>> Thanks, pushed.
>
> Hi,
>    I've been trying to run this test on x86 but I get the following error
>    while compiling tfile-avx.c :
>
>   binutils-gdb/build-x86/gdb/testsuite/../../../gdb/testsuite/gdb.trace/tfile-avx.c:38:19: error: invalid register name for 'a'
>    register __v8si a asm("ymm15") = {
>                     ^
>
>    I've also noticed the same error on the buildbot results see:
>    http://gdb-build.sergiodj.net/builders/Debian-x86_64-m64/builds/2928/steps/test%20gdb/logs/stdio
>
>    My cpu (Intel(R) Core(TM) i7-4600M ) supports avx, cat /proc/cpuinfo
>    shows avx and a gdb print $ymm15 returns something...
>
>    This is with gcc 4.8.4...
>
>    Am I missing something?
>
> Regards,
> Antoine
>

Ugh.  It seems you need a newer gcc to recognize "ymm15" as a register 
name - 4.8.2 seems to want it called "xmm15" - sort of incorrect, but 
close enough.  gcc 5.3 still accepts that, so perhaps we should change 
it to xmm15 for the sake of older compilers, even if it harms readability?
  
Antoine Tremblay Feb. 12, 2016, 6:49 p.m. UTC | #5
Marcin Kościelnicki writes:

> On 12/02/16 19:31, Antoine Tremblay wrote:
>>
>> Marcin Kościelnicki writes:
>>
>>> On 11/02/16 14:00, Pedro Alves wrote:
>>>> On 02/11/2016 10:14 AM, Marcin Kościelnicki wrote:
>>>>> 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
>>>>
>>>> OK once prereqs are in.
>>>>
>>>> Thanks,
>>>> Pedro Alves
>>>>
>>>
>>> Thanks, pushed.
>>
>> Hi,
>>    I've been trying to run this test on x86 but I get the following error
>>    while compiling tfile-avx.c :
>>
>>   binutils-gdb/build-x86/gdb/testsuite/../../../gdb/testsuite/gdb.trace/tfile-avx.c:38:19: error: invalid register name for 'a'
>>    register __v8si a asm("ymm15") = {
>>                     ^
>>
>>    I've also noticed the same error on the buildbot results see:
>>    http://gdb-build.sergiodj.net/builders/Debian-x86_64-m64/builds/2928/steps/test%20gdb/logs/stdio
>>
>>    My cpu (Intel(R) Core(TM) i7-4600M ) supports avx, cat /proc/cpuinfo
>>    shows avx and a gdb print $ymm15 returns something...
>>
>>    This is with gcc 4.8.4...
>>
>>    Am I missing something?
>>
>> Regards,
>> Antoine
>>
>
> Ugh.  It seems you need a newer gcc to recognize "ymm15" as a register 
> name - 4.8.2 seems to want it called "xmm15" - sort of incorrect, but 
> close enough.  gcc 5.3 still accepts that, so perhaps we should change 
> it to xmm15 for the sake of older compilers, even if it harms readability?

Would xmm15 still work on newer gccs ? If so I would guess it's a good
idea to change it given that our own buildbot test machines seem to test
with an older gcc...?

Maybe adding a note of it in the test... or if there's a way to check
for the gcc version ?

I actually can't find the gcc doc where those names are defined at the
moment would you have that handy by any chance?

Regards,
Antoine
  
Marcin Kościelnicki Feb. 12, 2016, 6:53 p.m. UTC | #6
On 12/02/16 19:49, Antoine Tremblay wrote:
>
> Marcin Kościelnicki writes:
>
>> On 12/02/16 19:31, Antoine Tremblay wrote:
>>>
>>> Marcin Kościelnicki writes:
>>>
>>>> On 11/02/16 14:00, Pedro Alves wrote:
>>>>> On 02/11/2016 10:14 AM, Marcin Kościelnicki wrote:
>>>>>> 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
>>>>>
>>>>> OK once prereqs are in.
>>>>>
>>>>> Thanks,
>>>>> Pedro Alves
>>>>>
>>>>
>>>> Thanks, pushed.
>>>
>>> Hi,
>>>     I've been trying to run this test on x86 but I get the following error
>>>     while compiling tfile-avx.c :
>>>
>>>    binutils-gdb/build-x86/gdb/testsuite/../../../gdb/testsuite/gdb.trace/tfile-avx.c:38:19: error: invalid register name for 'a'
>>>     register __v8si a asm("ymm15") = {
>>>                      ^
>>>
>>>     I've also noticed the same error on the buildbot results see:
>>>     http://gdb-build.sergiodj.net/builders/Debian-x86_64-m64/builds/2928/steps/test%20gdb/logs/stdio
>>>
>>>     My cpu (Intel(R) Core(TM) i7-4600M ) supports avx, cat /proc/cpuinfo
>>>     shows avx and a gdb print $ymm15 returns something...
>>>
>>>     This is with gcc 4.8.4...
>>>
>>>     Am I missing something?
>>>
>>> Regards,
>>> Antoine
>>>
>>
>> Ugh.  It seems you need a newer gcc to recognize "ymm15" as a register
>> name - 4.8.2 seems to want it called "xmm15" - sort of incorrect, but
>> close enough.  gcc 5.3 still accepts that, so perhaps we should change
>> it to xmm15 for the sake of older compilers, even if it harms readability?
>
> Would xmm15 still work on newer gccs ? If so I would guess it's a good
> idea to change it given that our own buildbot test machines seem to test
> with an older gcc...?

Both xmm15 and ymm15 work just fine on gcc 4.9.3 and 5.3.0, which are 
the only ones I have around right now.  So, let's do it.
>
> Maybe adding a note of it in the test... or if there's a way to check
> for the gcc version ?

I'll throw in a comment.
>
> I actually can't find the gcc doc where those names are defined at the
> moment would you have that handy by any chance?

gcc/config/i386/i386.h, ADDITIONAL_REGISTER_NAMES.
>
> Regards,
> Antoine
>
  
Antoine Tremblay Feb. 12, 2016, 6:57 p.m. UTC | #7
Marcin Kościelnicki writes:

> On 12/02/16 19:49, Antoine Tremblay wrote:
>>
>> Marcin Kościelnicki writes:
>>
>>> On 12/02/16 19:31, Antoine Tremblay wrote:
>>>>
>>>> Marcin Kościelnicki writes:
>>>>
>>>>> On 11/02/16 14:00, Pedro Alves wrote:
>>>>>> On 02/11/2016 10:14 AM, Marcin Kościelnicki wrote:
>>>>>>> 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
>>>>>>
>>>>>> OK once prereqs are in.
>>>>>>
>>>>>> Thanks,
>>>>>> Pedro Alves
>>>>>>
>>>>>
>>>>> Thanks, pushed.
>>>>
>>>> Hi,
>>>>     I've been trying to run this test on x86 but I get the following error
>>>>     while compiling tfile-avx.c :
>>>>
>>>>    binutils-gdb/build-x86/gdb/testsuite/../../../gdb/testsuite/gdb.trace/tfile-avx.c:38:19: error: invalid register name for 'a'
>>>>     register __v8si a asm("ymm15") = {
>>>>                      ^
>>>>
>>>>     I've also noticed the same error on the buildbot results see:
>>>>     http://gdb-build.sergiodj.net/builders/Debian-x86_64-m64/builds/2928/steps/test%20gdb/logs/stdio
>>>>
>>>>     My cpu (Intel(R) Core(TM) i7-4600M ) supports avx, cat /proc/cpuinfo
>>>>     shows avx and a gdb print $ymm15 returns something...
>>>>
>>>>     This is with gcc 4.8.4...
>>>>
>>>>     Am I missing something?
>>>>
>>>> Regards,
>>>> Antoine
>>>>
>>>
>>> Ugh.  It seems you need a newer gcc to recognize "ymm15" as a register
>>> name - 4.8.2 seems to want it called "xmm15" - sort of incorrect, but
>>> close enough.  gcc 5.3 still accepts that, so perhaps we should change
>>> it to xmm15 for the sake of older compilers, even if it harms readability?
>>
>> Would xmm15 still work on newer gccs ? If so I would guess it's a good
>> idea to change it given that our own buildbot test machines seem to test
>> with an older gcc...?
>
> Both xmm15 and ymm15 work just fine on gcc 4.9.3 and 5.3.0, which are 
> the only ones I have around right now.  So, let's do it.

Great, sorry I had missed that in your original mail.

>>
>> Maybe adding a note of it in the test... or if there's a way to check
>> for the gcc version ?
>
> I'll throw in a comment.
>>
>> I actually can't find the gcc doc where those names are defined at the
>> moment would you have that handy by any chance?
>
> gcc/config/i386/i386.h, ADDITIONAL_REGISTER_NAMES.
>>

Thanks!
Antoine
  

Patch

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index c2e3466..dfded59 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@ 
+2016-02-10  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
diff --git a/gdb/testsuite/gdb.trace/tfile-avx.c b/gdb/testsuite/gdb.trace/tfile-avx.c
new file mode 100644
index 0000000..212c556
--- /dev/null
+++ b/gdb/testsuite/gdb.trace/tfile-avx.c
@@ -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;
+}
diff --git a/gdb/testsuite/gdb.trace/tfile-avx.exp b/gdb/testsuite/gdb.trace/tfile-avx.exp
new file mode 100644
index 0000000..4c52c64
--- /dev/null
+++ b/gdb/testsuite/gdb.trace/tfile-avx.exp
@@ -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}"