[PATCH 2/2,v3] [AArch64] Test handling of additional brk instruction patterns
Luis Machado
luis.machado@linaro.org
Wed Jan 29 12:25:00 GMT 2020
On 1/29/20 12:18 AM, Simon Marchi wrote:
> On 2020-01-15 6:51 a.m., Luis Machado wrote:
>> New in v3:
>>
>> - Minor formatting and code cleanups.
>> - Added count check to validate number of brk SIGTRAP's.
>> - Moved count to SIGTRAP check conditional block.
>>
>> This test exercises the previous patch's code and makes sure GDB can
>> properly get a SIGTRAP from various brk instruction patterns.
>>
>> GDB needs to be able to see the program exiting normally. If GDB doesn't
>> support the additional brk instructions, we will see timeouts.
>>
>> We bail out with the first timeout since we won't be able to step through
>> the program breakpoint anyway, so it is no use carrying on.
>>
>> gdb/testsuite/ChangeLog:
>>
>> 2020-01-15 Luis Machado <luis.machado@linaro.org>
>>
>> * gdb.arch/aarch64-brk-patterns.c: New source file.
>> * gdb.arch/aarch64-brk-patterns.exp: New test.
>> ---
>> gdb/testsuite/gdb.arch/aarch64-brk-patterns.c | 30 ++++++++
>> .../gdb.arch/aarch64-brk-patterns.exp | 74 +++++++++++++++++++
>> 2 files changed, 104 insertions(+)
>> create mode 100644 gdb/testsuite/gdb.arch/aarch64-brk-patterns.c
>> create mode 100644 gdb/testsuite/gdb.arch/aarch64-brk-patterns.exp
>>
>> diff --git a/gdb/testsuite/gdb.arch/aarch64-brk-patterns.c b/gdb/testsuite/gdb.arch/aarch64-brk-patterns.c
>> new file mode 100644
>> index 0000000000..ccf9a35a94
>> --- /dev/null
>> +++ b/gdb/testsuite/gdb.arch/aarch64-brk-patterns.c
>> @@ -0,0 +1,30 @@
>> +/* This file is part of GDB, the GNU debugger.
>> +
>> + Copyright 2020 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/>. */
>> +
>> +int main(void)
>> +{
>> + /* Dummy instruction just so GDB doesn't stop at the first breakpoint
>> + instruction. */
>> + __asm __volatile ("nop\n\t");
>> +
>> + /* Multiple BRK instruction patterns. */
>> + __asm __volatile ("brk %0\n\t" ::"n"(0x0));
>> + __asm __volatile ("brk %0\n\t" ::"n"(0x900 + 0xf));
>> + __asm __volatile ("brk %0\n\t" ::"n"(0xf000));
>> +
>> + return 0;
>> +}
>> diff --git a/gdb/testsuite/gdb.arch/aarch64-brk-patterns.exp b/gdb/testsuite/gdb.arch/aarch64-brk-patterns.exp
>> new file mode 100644
>> index 0000000000..9a0ec81efa
>> --- /dev/null
>> +++ b/gdb/testsuite/gdb.arch/aarch64-brk-patterns.exp
>> @@ -0,0 +1,74 @@
>> +# Copyright 2020 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/>.
>> +#
>> +# This file is part of the gdb testsuite.
>> +
>> +# Test if GDB stops at various BRK instruction patterns inserted into
>> +# the code.
>> +
>> +if {![is_aarch64_target]} {
>> + verbose "Skipping ${gdb_test_file_name}."
>> + return
>> +}
>> +
>> +standard_testfile
>> +if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} {
>> + return -1
>> +}
>> +
>> +if {![runto_main]} {
>> + untested "could not run to main"
>> + return -1
>> +}
>> +
>> +# Number of expected SIGTRAP's to get. This needs to be kept in sync
>> +# with the source file.
>> +set expected_traps 3
>> +set keep_going 1
>> +set count 0
>> +set old_timeout $timeout
>> +set timeout 10
>
> Any reason you are changing the timeout? There is nothing in the test that
> looks like it would take time.
>
If GDB doesn't support one of these instructions, it will be caught in
an infinite loop. The reduced timeout will prevent a long wait time
until we bail out.
> If changing the timeout is really necessary, look into using with_timeout_factor.
>
That would raise the timeout even further. We want a reduced one.
It would be nice if we could reduce the timeout with
with_timeout_factor. I gave it a try but it didn't work.
I think we need adjustments to make it work with a floating point
number. I'll look into it.
>> +
>> +while {$keep_going} {
>> +
>> + set test "brk instruction $count causes SIGTRAP"
>
> Instead of setting the test name like that, look into using the special $gdb_test_name
> variable, available inside the gdb_test_multiple body.
>
Indeed. I'll tweak this to match the other reviews.
>> +
>> + # Continue to next program breakpoint instruction.
>> + gdb_test_multiple "continue" $test {
>> + -re "Program received signal SIGTRAP, Trace/breakpoint trap.*$gdb_prompt $" {
>> + pass $test
>> +
>> + # Insert a breakpoint at the program breakpoint instruction so GDB
>> + # can step over it.
>> + gdb_test "break" \
>> + "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>> + "insert breakpoint at brk instruction $count"
>> + incr count
>> + }
>> + -re "exited normally.*$gdb_prompt $" {
>> + set keep_going 0
>> + }
>> + timeout {
>> + fail $test
>> + set keep_going 0
>> + }
>> + }
>> +}
>> +
>> +set timeout $old_timeout
>> +
>> +if {$count < $expected_traps} {
>> + fail "all brk instructions triggered."
>> +}
>
> Use gdb_assert.
>
Ditto.
> Is there any reason why $count would be greater than $expected_taps? If no,
> I would test for "$count == $expected_traps".
Not really. We'd want the exact match. Fixed now.
Thanks for the review!
How does the updated attached patch look?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-AArch64-Test-handling-of-additional-brk-instruction-.patch
Type: text/x-patch
Size: 5450 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20200129/ce81bcfc/attachment.bin>
More information about the Gdb-patches
mailing list