From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id QZ2QI0JjYmrXVSoAWB0awg (envelope-from ) for ; Thu, 23 Jul 2026 14:53:54 -0400 Received: by simark.ca (Postfix, from userid 112) id 8E5911E09E; Thu, 23 Jul 2026 14:53:54 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.3 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 785991E033 for ; Thu, 23 Jul 2026 14:53:53 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E8A9E4BA23DB for ; Thu, 23 Jul 2026 18:53:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E8A9E4BA23DB Received: from angie.orcam.me.uk (angie.orcam.me.uk [IPv6:2001:4190:8020::34]) by sourceware.org (Postfix) with ESMTP id A6A354BA23EE for ; Thu, 23 Jul 2026 18:52:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A6A354BA23EE Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=orcam.me.uk Authentication-Results: sourceware.org; spf=none smtp.mailfrom=orcam.me.uk ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A6A354BA23EE Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2001:4190:8020::34 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1784832776; cv=none; b=kDqA87MjX6nLhdAh7VcBG7h2Q0lJ2fV8bQd5mzYhXnrOAeUQ7oHe9Zi4yBeWIYhPnHGH8j/pqyHTBo0T1ZY8RI9zKCY1m8Zn96JbXOc2wNOrehfR+14Y2lCLcUV/mBANJ+d4UzbWu0ROVBEX8cJ826/3cNzhEjOXq8wK1uiTdAs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1784832776; c=relaxed/simple; bh=Bg/f1Mq2GVTTSIUdSWlKMDcWR5KgaIbEKpwbS4wcG5U=; h=Date:From:To:Subject:Message-ID:MIME-Version; b=TaHiI60226WAX4OoYaKw/U+3Spl3DKTrMxmJi99ngpoA5lIJF0/JQi8J2me8PJS0hqS7Gw1kxXzrrl7z1USLxYDiyDvkyJIYUyYE5o0STJX4E0t7Z5MdnqmkOncZisvItEvcY7MNT1RmEHUiJYKYZR5BQLS/GvdAFssKD/7W1Gc= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A6A354BA23EE Received: by angie.orcam.me.uk (Postfix, from userid 500) id 245E492009D; Thu, 23 Jul 2026 20:52:56 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by angie.orcam.me.uk (Postfix) with ESMTP id 1E93592009B; Thu, 23 Jul 2026 19:52:56 +0100 (BST) Date: Thu, 23 Jul 2026 19:52:56 +0100 (BST) From: "Maciej W. Rozycki" To: gdb-patches@sourceware.org cc: Jovan Dmitrovic , Djordje Todorovic , Milica Matic , "Maciej W. Rozycki" Subject: [PATCH 3/7] MIPS/testsuite: Verify MIPS I CPU branch stepping In-Reply-To: Message-ID: References: User-Agent: Alpine 2.21 (DEB 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: "Maciej W. Rozycki" Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org From: Maciej W. Rozycki Verify that breakpoints are correctly placed via `mips32_next_pc' while single-stepping through MIPS I CPU branches. The idea behind these test cases is that if a branch is misinterpreted by the stepping code, then the breakpoint will be placed at the wrong place, usually at the branch destination rather than immediately beyond the delay slot or vice versa. In the former case a step will be missed over the extra NOP placed beyond the delay slot and therefore from the count and in the latter case the single-stepping breakpoint will be missed altogether, letting code run through to the end of the intended stepping range. In either case the stepping counter will not reach 0 at conclusion, causing the test case to fail. The target feature tests for these test cases have been written somewhat overly cautiously, for example BLTZL is never a macro, so `.set nomacro' doesn't really guard against anything. This is however harmless while making the feature tests more uniform. Co-Authored-By: Andrew Bennett Co-Authored-By: Matthew Fortune Co-Authored-By: Faraz Shahbazker Co-Authored-By: Milica Matic Co-Authored-By: Jovan Dmitrović Approved-by: Maciej W. Rozycki --- gdb/testsuite/gdb.arch/mips-allow.exp.tcl | 61 ++++++++++++++++++++++ gdb/testsuite/gdb.arch/mips-stepi.exp.tcl | 78 +++++++++++++++++++++++++++++ gdb/testsuite/gdb.arch/mips1-bal.c | 70 ++++++++++++++++++++++++++ gdb/testsuite/gdb.arch/mips1-bal.exp | 30 +++++++++++ gdb/testsuite/gdb.arch/mips1-branch.c | 80 ++++++++++++++++++++++++++++++ gdb/testsuite/gdb.arch/mips1-branch.exp | 30 +++++++++++ 6 files changed, 349 insertions(+) gdb-mips1-next-pc-test.diff Index: binutils-gdb/gdb/testsuite/gdb.arch/mips-allow.exp.tcl =================================================================== --- /dev/null +++ binutils-gdb/gdb/testsuite/gdb.arch/mips-allow.exp.tcl @@ -0,0 +1,61 @@ +# Copyright (C) 2026 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 . + +# Feature availability check helpers for MIPS tests. + +# Check for MIPS I branch support. These instructions may be absent, +# such as with MIPS16 compilations. Make sure an actual BLTZ machine +# instruction is produced and no macro expanded. +proc allow_mips1_branch_tests {} { + return [allow_target_tests "allow_mips1_branch_tests" \ + "MIPS I branch support" "Illegal instruction" \ + { + int main() { + asm volatile ( + ".set push\n\t" + ".set noreorder\n\t" + ".set nomacro\n\t" + "bltz $0, 0f\n\t" + " nop\n" + "0:\n\t" + ".set pop\n"); + return 0; + } + } \ + {-Wa,-fatal-warnings -mno-mips16 -minterlink-compressed}] +} + +# Check for MIPS I branch-and-link support. These instructions may be +# absent, such as with MIPSr6, or MIPS16 compilations. Make sure an +# actual BLTZAL machine instruction is produced and no macro expanded. +proc allow_mips1_bal_tests {} { + return [allow_target_tests "allow_mips1_bal_tests" \ + "MIPS I branch-and-link support" "Illegal instruction" \ + { + int main() { + asm volatile ( + ".set push\n\t" + ".set noreorder\n\t" + ".set nomacro\n\t" + "bltzal $4, 0f\n\t" + " nop\n" + "0:\n\t" + ".set pop\n" + : : : "$31"); + return 0; + } + } \ + {-Wa,-fatal-warnings -mno-mips16 -minterlink-compressed}] +} Index: binutils-gdb/gdb/testsuite/gdb.arch/mips-stepi.exp.tcl =================================================================== --- /dev/null +++ binutils-gdb/gdb/testsuite/gdb.arch/mips-stepi.exp.tcl @@ -0,0 +1,78 @@ +# Copyright (C) 2026 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 . + +# Template for MIPS single-stepping tests. + +# Send `stepi' to gdb until inferior hits a breakpoint, starting with +# ERR (which is a program variable) set to STEPS and decrementing it +# with each step. Use MESSAGE for the test result. +proc stepi { steps message } { + global gdb_prompt + + set timeout [get_largest_timeout] + set start [timestamp] + + gdb_test_no_output -nopass "set err = $steps" + while { [timestamp] - $start < $steps * $timeout } { + gdb_test_multiple "stepi" "" { + -re ".*Breakpoint.*$gdb_prompt" { + send_gdb "set err -= 1\n" + gdb_expect { + -re "$gdb_prompt" { } + } + pass $message + return 1 + } + -re ".*$gdb_prompt" { + send_gdb "set err -= 1\n" + gdb_expect { + -re "$gdb_prompt" { } + } + } + } + } + fail $message + return 0 +} + +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \ + [lappend compile_flags debug]] } { + return +} + +if { ![runto_main] } { + return +} + +# Put breakpoints at the boundaries of the stepping range. +foreach place [list step_start step_stop] { + if {![gdb_breakpoint "$place"]} { + unresolved "couldn't put breakpoint at $place" + return + } +} + +# Advance to the beginning of the range. +gdb_test "continue" ".*Breakpoint.*" "continue to step_start" + +# Make it easier to match results against expectations in the case of failures. +gdb_test "info registers" ".*" +gdb_test "display /i \$pc" ".*" + +# Step through to the end of the range. +stepi $steps "step through to step_stop" + +# And run to completion to retrieve the result. +gdb_test "continue" ".*exited normally.*" "continue to completion" Index: binutils-gdb/gdb/testsuite/gdb.arch/mips1-bal.c =================================================================== --- /dev/null +++ binutils-gdb/gdb/testsuite/gdb.arch/mips1-bal.c @@ -0,0 +1,70 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright (C) 2026 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 usefu, + 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 . */ + +/* Test single-stepping through MIPS I branch-and-link instructions. */ + +int +test_mips1_bal (void) +{ + /* Make 'err' available to the debugger to track the number of single + steps executed. Use `volatile' to prevent the variable from being + optimized away. */ + volatile int err = -1; + + int any = 0x55aa; + int mone = -1; + int zero = 0; + int one = 1; + + asm volatile ( + ".macro b_test op, args:vararg\n\t" + "\\op \\args, 0f\n\t" + " nop\n\t" + "nop\n" + "0:\n\t" + ".endm\n\t" + + ".set push\n\t" + ".set noreorder\n\t" + ".globl step_start\n\t" + ".type step_start, @function\n" + "step_start:\n\t" /* Units: steps. */ + "nop\n\t" /* NOP: 1s */ + "b_test bltzal, %[mone]\n\t" /* Taken: 1s */ + "b_test bltzal, %[zero]\n\t" /* Not taken: 2s */ + "b_test bltzal, %[one]\n\t" /* Not taken: 2s */ + "b_test bgezal, %[mone]\n\t" /* Not taken: 2s */ + "b_test bgezal, %[zero]\n\t" /* Taken: 1s */ + "b_test bgezal, %[one]\n\t" /* Taken: 1s */ + "nop\n\t" /* NOP: 1s */ + ".globl step_stop\n\t" /* Total: 11s */ + ".type step_stop, @function\n" + "step_stop:\n\t" + ".set pop\n" + : + : [mone] "r" (mone), [zero] "r" (zero), [one] "r" (one), + [any] "r" (any) + : "$31"); + + return err; +} + +int +main (void) +{ + return test_mips1_bal (); +} Index: binutils-gdb/gdb/testsuite/gdb.arch/mips1-bal.exp =================================================================== --- /dev/null +++ binutils-gdb/gdb/testsuite/gdb.arch/mips1-bal.exp @@ -0,0 +1,30 @@ +# Copyright (C) 2026 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 . + +# Test single-stepping through MIPS I branch-and-link instructions. + +require {istarget "mips*-*-*"} + +source $srcdir/$subdir/mips-allow.exp.tcl + +require allow_mips1_bal_tests + +standard_testfile + +set steps 11 +foreach flag {-mno-mips16 -minterlink-compressed} { + lappend compile_flags "additional_flags=$flag" +} +source $srcdir/$subdir/mips-stepi.exp.tcl Index: binutils-gdb/gdb/testsuite/gdb.arch/mips1-branch.c =================================================================== --- /dev/null +++ binutils-gdb/gdb/testsuite/gdb.arch/mips1-branch.c @@ -0,0 +1,80 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright (C) 2026 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 usefu, + 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 . */ + +/* Test single-stepping through MIPS I branch instructions. */ + +int +test_mips1_branch (void) +{ + /* Make 'err' available to the debugger to track the number of single + steps executed. Use `volatile' to prevent the variable from being + optimized away. */ + volatile int err = -1; + + int any = 0x55aa; + int mone = -1; + int zero = 0; + int one = 1; + + asm volatile ( + ".macro b_test op, args:vararg\n\t" + "\\op \\args, 0f\n\t" + " nop\n\t" + "nop\n" + "0:\n\t" + ".endm\n\t" + + ".set push\n\t" + ".set noreorder\n\t" + ".globl step_start\n\t" + ".type step_start, @function\n" + "step_start:\n\t" /* Units: steps. */ + "nop\n\t" /* NOP: 1s */ + "b_test beq, %[any], %[any]\n\t" /* Taken: 1s */ + "b_test beq, %[any], %[one]\n\t" /* Not taken: 2s */ + "b_test bne, %[any], %[any]\n\t" /* Not taken: 2s */ + "b_test bne, %[any], %[one]\n\t" /* Taken: 1s */ + "b_test bltz, %[mone]\n\t" /* Taken: 1s */ + "b_test bltz, %[zero]\n\t" /* Not taken: 2s */ + "b_test bltz, %[one]\n\t" /* Not taken: 2s */ + "b_test blez, %[mone]\n\t" /* Taken: 1s */ + "b_test blez, %[zero]\n\t" /* Taken: 1s */ + "b_test blez, %[one]\n\t" /* Not taken: 2s */ + "b_test bgez, %[mone]\n\t" /* Not taken: 2s */ + "b_test bgez, %[zero]\n\t" /* Taken: 1s */ + "b_test bgez, %[one]\n\t" /* Taken: 1s */ + "b_test bgtz, %[mone]\n\t" /* Not taken: 2s */ + "b_test bgtz, %[zero]\n\t" /* Not taken: 2s */ + "b_test bgtz, %[one]\n\t" /* Taken: 1s */ + "nop\n\t" /* NOP: 1s */ + ".globl step_stop\n\t" /* Total: 26s */ + ".type step_stop, @function\n" + "step_stop:\n\t" + ".set pop\n" + : + : [mone] "r" (mone), [zero] "r" (zero), [one] "r" (one), + [any] "r" (any) + : "$31"); + + return err; +} + +int +main (void) +{ + return test_mips1_branch (); +} Index: binutils-gdb/gdb/testsuite/gdb.arch/mips1-branch.exp =================================================================== --- /dev/null +++ binutils-gdb/gdb/testsuite/gdb.arch/mips1-branch.exp @@ -0,0 +1,30 @@ +# Copyright (C) 2026 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 . + +# Test single-stepping through MIPS I branch instructions. + +require {istarget "mips*-*-*"} + +source $srcdir/$subdir/mips-allow.exp.tcl + +require allow_mips1_branch_tests + +standard_testfile + +set steps 26 +foreach flag {-mno-mips16 -minterlink-compressed} { + lappend compile_flags "additional_flags=$flag" +} +source $srcdir/$subdir/mips-stepi.exp.tcl