From patchwork Wed Oct 24 01:43:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 29859 Received: (qmail 89769 invoked by alias); 24 Oct 2018 01:43:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 89137 invoked by uid 89); 24 Oct 2018 01:43:50 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_SOFTFAIL, UNSUBSCRIBE_BODY autolearn=ham version=3.3.2 spammy=UD:u X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 24 Oct 2018 01:43:44 +0000 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id Aksc9Kt1liILzKnl (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 23 Oct 2018 21:43:40 -0400 (EDT) Received: from simark.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id 83A55441B21; Tue, 23 Oct 2018 21:43:40 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Ulrich Weigand , Tom Tromey , Simon Marchi Subject: [PATCH v2 3/3] Add tests for unwinding of pseudo registers Date: Tue, 23 Oct 2018 21:43:33 -0400 Message-Id: <20181024014333.14143-4-simon.marchi@polymtl.ca> In-Reply-To: <20181024014333.14143-1-simon.marchi@polymtl.ca> References: <20181024014333.14143-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 X-IsSubscribed: yes This patch adds tests to exercise the previous patch's changes. All three tests: * aarch64-pseudo-unwind * amd64-pseudo-unwind * arm-pseudo-unwind follow the same pattern, just with different registers. The other test, arm-pseudo-unwind-legacy, tests the special case where the unwind information contains an entry for a register considered a pseudo-register by GDB. gdb/testsuite/ChangeLog: * gdb.arch/aarch64-pseudo-unwind-asm.S: New file. * gdb.arch/aarch64-pseudo-unwind.c: New file. * gdb.arch/aarch64-pseudo-unwind.exp: New file. * gdb.arch/amd64-pseudo-unwind-asm.S: New file. * gdb.arch/amd64-pseudo-unwind.c: New file. * gdb.arch/amd64-pseudo-unwind.exp: New file. * gdb.arch/arm-pseudo-unwind-asm.S: New file. * gdb.arch/arm-pseudo-unwind-legacy-asm.S: New file. * gdb.arch/arm-pseudo-unwind-legacy.c: New file. * gdb.arch/arm-pseudo-unwind-legacy.exp: New file. * gdb.arch/arm-pseudo-unwind.c: New file. * gdb.arch/arm-pseudo-unwind.exp: New file. --- .../gdb.arch/aarch64-pseudo-unwind-asm.S | 78 ++++++++++++++++ .../gdb.arch/aarch64-pseudo-unwind.c | 33 +++++++ .../gdb.arch/aarch64-pseudo-unwind.exp | 89 ++++++++++++++++++ .../gdb.arch/amd64-pseudo-unwind-asm.S | 63 +++++++++++++ gdb/testsuite/gdb.arch/amd64-pseudo-unwind.c | 33 +++++++ .../gdb.arch/amd64-pseudo-unwind.exp | 90 +++++++++++++++++++ .../gdb.arch/arm-pseudo-unwind-asm.S | 76 ++++++++++++++++ .../gdb.arch/arm-pseudo-unwind-legacy-asm.S | 79 ++++++++++++++++ .../gdb.arch/arm-pseudo-unwind-legacy.c | 33 +++++++ .../gdb.arch/arm-pseudo-unwind-legacy.exp | 85 ++++++++++++++++++ gdb/testsuite/gdb.arch/arm-pseudo-unwind.c | 33 +++++++ gdb/testsuite/gdb.arch/arm-pseudo-unwind.exp | 87 ++++++++++++++++++ 12 files changed, 779 insertions(+) create mode 100644 gdb/testsuite/gdb.arch/aarch64-pseudo-unwind-asm.S create mode 100644 gdb/testsuite/gdb.arch/aarch64-pseudo-unwind.c create mode 100644 gdb/testsuite/gdb.arch/aarch64-pseudo-unwind.exp create mode 100644 gdb/testsuite/gdb.arch/amd64-pseudo-unwind-asm.S create mode 100644 gdb/testsuite/gdb.arch/amd64-pseudo-unwind.c create mode 100644 gdb/testsuite/gdb.arch/amd64-pseudo-unwind.exp create mode 100644 gdb/testsuite/gdb.arch/arm-pseudo-unwind-asm.S create mode 100644 gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy-asm.S create mode 100644 gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.c create mode 100644 gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.exp create mode 100644 gdb/testsuite/gdb.arch/arm-pseudo-unwind.c create mode 100644 gdb/testsuite/gdb.arch/arm-pseudo-unwind.exp diff --git a/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind-asm.S b/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind-asm.S new file mode 100644 index 000000000000..6bd9d46bbfd8 --- /dev/null +++ b/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind-asm.S @@ -0,0 +1,78 @@ +/* Copyright 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +value_callee: +.quad 0x2021222324252627 +value_caller: +.quad 0x1011121314151617 + +.global callee +callee: + /* Standard prologue: + - push fp (x29) and lr (x30) to the stack. + - mov sp to fp */ +.cfi_startproc + stp x29, x30, [sp, -16]! +.cfi_def_cfa 29, 16 +.cfi_offset 29, -16 +.cfi_offset 30, -8 + mov x29, sp + + /* Save caller's q8 value on the stack. */ +.cfi_offset 72, -32 + str q8, [sp, -16]! + + /* Put our own q8 value. */ + adr x0, value_callee + ld1 { v8.1d }, [x0] +break_here_asm: + + /* Restore caller's q8 value. */ + ldr q8, [sp], 16 + + /* Standard epilogue: + - pop fo (x29) and lr (x30) from the stack */ + ldp x29, x30, [sp], 16 + ret +.cfi_endproc + + +.global caller +caller: + /* Standard prologue. */ +.cfi_startproc + stp x29, x30, [sp, -16]! +.cfi_def_cfa 29, 16 +.cfi_offset x29, -16 +.cfi_offset x30, -8 + add x29, sp, 0 + + /* Put our own q8 value. */ + adr x0, value_caller + ld1 { v8.1d }, [x0] + + /* Call callee. */ + bl callee + + /* Store our q8 value in x0 to return it. */ + str q8, [sp, -16]! + ldr x0, [sp], 16 + + /* Standard epilogue. */ + ldp x29, x30, [sp], 16 + ret +.cfi_endproc diff --git a/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind.c b/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind.c new file mode 100644 index 000000000000..c4553f844e9f --- /dev/null +++ b/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind.c @@ -0,0 +1,33 @@ +/* Copyright 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#include + +uint64_t caller (void); + +static void +break_here_c (uint64_t value) +{ +} + +int +main (void) +{ + uint64_t value = caller (); + break_here_c (value); + return 0; +} diff --git a/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind.exp b/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind.exp new file mode 100644 index 000000000000..0f92319c8a20 --- /dev/null +++ b/gdb/testsuite/gdb.arch/aarch64-pseudo-unwind.exp @@ -0,0 +1,89 @@ +# Copyright 2018 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 . + +# This test is equivalent to amd64-pseudo-unwind, but specific to AArch64. We +# use the raw register v8/q8 (it's the same register, but referred to differently +# depending on the instruction) which is 128 bits long (although we only load +# a 64-bits value, it's enough for the test). We use pseudo register s8, which +# is the low 32-bits of v8/q8. + +if { ![istarget aarch64-*-* ] } { + verbose "Skipping aarch64 pseudo register unwind." + return +} + +standard_testfile aarch64-pseudo-unwind.c aarch64-pseudo-unwind-asm.S + +if { [prepare_for_testing "failed to prepare" ${testfile} "${srcfile} ${srcfile2}" {debug}] } { + return -1 +} + +clean_restart ${binfile} + +if ![runto_main] then { + fail "could not run to main" +} + +gdb_breakpoint break_here_asm temporary +gdb_continue_to_breakpoint "continue to callee" + +# Verify the value of v8/s8 in the inner frame (callee). +with_test_prefix "callee, before change" { + gdb_test "p/x \$v8.q.u" " = \\{0x2021222324252627\\}" + gdb_test "p/x \$s8.u" " = 0x24252627" +} + +# Verify that we can change the value of the pseudo register (s8) in the inner +# frame (callee). +gdb_test_no_output "set \$s8.u = 0x34353637" + +# Verify the value of v8/s8 in the inner frame (callee) after the change. +with_test_prefix "callee, after change" { + gdb_test "p/x \$v8.q.u" " = \\{0x34353637\\}" + gdb_test "p/x \$s8.u" " = 0x34353637" +} + +# Go up one frame (to caller) and do the same. +gdb_test "up" + +# Verify the value of v8/s8 in the outer frame (caller). +with_test_prefix "caller, before change" { + gdb_test "p/x \$v8.q.u" " = \\{0x1011121314151617\\}" + gdb_test "p/x \$s8.u" " = 0x14151617" +} + +# Verify that we can change the value of the pseudo register (s8) in the outer +# frame (caller). +gdb_test_no_output "set \$s8.u = 0x44454647" + +# Verify the value of v8/s8 in the outer frame (caller) after the change. +with_test_prefix "caller, after change" { + gdb_test "p/x \$v8.q.u" " = \\{0x44454647\\}" + gdb_test "p/x \$s8.u" " = 0x44454647" +} + +# Go back to frame 0 (callee), check that the change to the outer frame didn't +# mess up anything there. +gdb_test "down" +with_test_prefix "callee, after change in caller" { + gdb_test "p/x \$v8.q.u" " = \\{0x34353637\\}" + gdb_test "p/x \$s8.u" " = 0x34353637" +} + +# Verify that the value of the saved v8 we changed is correctly seen by the +# inferior. +gdb_breakpoint break_here_c temporary +gdb_continue_to_breakpoint "continue to break_here_c" +gdb_test "p/x value" " = 0x44454647" diff --git a/gdb/testsuite/gdb.arch/amd64-pseudo-unwind-asm.S b/gdb/testsuite/gdb.arch/amd64-pseudo-unwind-asm.S new file mode 100644 index 000000000000..316e8ca007f6 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-pseudo-unwind-asm.S @@ -0,0 +1,63 @@ +/* Copyright 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +.global callee +callee: + /* Standard prologue. */ +.cfi_startproc + push %rbp +.cfi_def_cfa rbp, 16 + mov %rsp, %rbp + + /* Save caller's rbx value on the stack. */ +.cfi_offset rbx, -24 + push %rbx + + /* Put our own rbx value. */ + mov $0x2021222324252627, %rbx +break_here_asm: + + /* Restore caller's rbx value. */ + pop %rbx + + /* Standard epilogue. */ + pop %rbp + ret +.cfi_endproc + + +.global caller +caller: +.cfi_startproc + /* Standard prologue. */ + push %rbp +.cfi_def_cfa_offset 16 + mov %rsp, %rbp + + /* Put our own rbx value. */ + mov $0x1011121314151617, %rbx + + /* Call callee. */ + call callee + + /* Store our rbx value in rax to return it. */ + mov %rbx, %rax + + /* Standard epilogue. */ + pop %rbp + ret +.cfi_endproc diff --git a/gdb/testsuite/gdb.arch/amd64-pseudo-unwind.c b/gdb/testsuite/gdb.arch/amd64-pseudo-unwind.c new file mode 100644 index 000000000000..c4553f844e9f --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-pseudo-unwind.c @@ -0,0 +1,33 @@ +/* Copyright 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#include + +uint64_t caller (void); + +static void +break_here_c (uint64_t value) +{ +} + +int +main (void) +{ + uint64_t value = caller (); + break_here_c (value); + return 0; +} diff --git a/gdb/testsuite/gdb.arch/amd64-pseudo-unwind.exp b/gdb/testsuite/gdb.arch/amd64-pseudo-unwind.exp new file mode 100644 index 000000000000..379b05c9d4fa --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-pseudo-unwind.exp @@ -0,0 +1,90 @@ +# Copyright 2018 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 . + +# This test verifies that we can read and write the value of a pseudo register +# in unwound frames. For the test, we choose one raw register, rbx, and one +# pseudo register that is backed by rbx, ebx. We have two frames (the inner one, +# #0 and the outer one, #1) that each set a value for rbx. We verify that we +# can read both rbx and ebx correctly for each frame, and that when we write to +# ebx, rbx for that frame is correctly updated. + +if { ![istarget x86_64-*-* ] || ![is_lp64_target] } { + verbose "Skipping amd64 pseudo register unwind." + return +} + +standard_testfile amd64-pseudo-unwind.c amd64-pseudo-unwind-asm.S + +if { [prepare_for_testing "failed to prepare" ${testfile} "${srcfile} ${srcfile2}" {debug}] } { + return -1 +} + +clean_restart ${binfile} + +if ![runto_main] then { + fail "could not run to main" +} + +gdb_breakpoint break_here_asm temporary +gdb_continue_to_breakpoint "continue to callee" + +# Verify the value of rbx/ebx in the inner frame (callee). +with_test_prefix "callee, before change" { + gdb_test "p/x \$rbx" " = 0x2021222324252627" + gdb_test "p/x \$ebx" " = 0x24252627" +} + +# Verify that we can change the value of the pseudo register (ebx) in the inner +# frame (callee). +gdb_test_no_output "set \$ebx = 0x34353637" + +# Verify the value of rbx/ebx in the inner frame (callee) after the change. +with_test_prefix "callee, after change" { + gdb_test "p/x \$rbx" " = 0x2021222334353637" + gdb_test "p/x \$ebx" " = 0x34353637" +} + +# Go up one frame, and do the same. +gdb_test "up" + +# Verify the value of rbx/ebx in the outer frame (caller). +with_test_prefix "caller, before change" { + gdb_test "p/x \$rbx" " = 0x1011121314151617" + gdb_test "p/x \$ebx" " = 0x14151617" +} + +# Verify that we can change the value of the pseudo register (ebx) in the outer +# frame (caller). +gdb_test_no_output "set \$ebx = 0x44454647" + +# Verify the value of rbx/ebx in the outer frame (caller) after the change. +with_test_prefix "caller, after change" { + gdb_test "p/x \$rbx" " = 0x1011121344454647" + gdb_test "p/x \$ebx" " = 0x44454647" +} + +# Go back to frame 0 (callee), check that the change to the outer frame didn't +# mess up anything there. +gdb_test "down" +with_test_prefix "callee, after change in caller" { + gdb_test "p/x \$rbx" " = 0x2021222334353637" + gdb_test "p/x \$ebx" " = 0x34353637" +} + +# Verify that the value of the saved rbx we changed is correctly seen by the +# inferior. +gdb_breakpoint break_here_c temporary +gdb_continue_to_breakpoint "continue to break_here_c" +gdb_test "p/x value" " = 0x1011121344454647" diff --git a/gdb/testsuite/gdb.arch/arm-pseudo-unwind-asm.S b/gdb/testsuite/gdb.arch/arm-pseudo-unwind-asm.S new file mode 100644 index 000000000000..fe2346bf3cb2 --- /dev/null +++ b/gdb/testsuite/gdb.arch/arm-pseudo-unwind-asm.S @@ -0,0 +1,76 @@ +/* Copyright 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +value_callee: +.quad 0x2021222324252627 +value_caller: +.quad 0x1011121314151617 + +.global callee +callee: + /* Standard prologue. */ +.cfi_startproc + push {fp, lr} +.cfi_def_cfa fp, 4 +.cfi_offset fp, -8 +.cfi_offset lr, -4 + add fp, sp, #4 + + /* Save caller's d8 value on the stack. */ +.cfi_offset d8, -16 + vpush {d8} + + /* Put our own d8 value. */ + ldr r0, =value_callee + vldr d8, [r0] +break_here_asm: + + /* Restore caller's d8 value. */ + vpop {d8} + + /* Standard epilogue. */ + pop {fp, pc} +.cfi_endproc + + +.global caller +caller: + /* Standard prologue. */ +.cfi_startproc + push {fp, lr} +.cfi_def_cfa fp, 4 +.cfi_offset fp, -8 +.cfi_offset lr, -4 + add fp, sp, #4 + + /* Put our own d8 value. */ + ldr r0, =value_caller + vldr d8, [r0] + + /* Call callee. */ + bl callee + + /* Store our d8 value in r0-r1 to return it. */ + vpush {d8} + pop {r0} + pop {r1} + + /* Standard epilogue. */ + pop {fp, pc} +.cfi_endproc + + diff --git a/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy-asm.S b/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy-asm.S new file mode 100644 index 000000000000..d8f383e53223 --- /dev/null +++ b/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy-asm.S @@ -0,0 +1,79 @@ +/* Copyright 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +/* The difference between this and arm-pseudo-unwind is that here, the CFI + directives use the obsolete DWARF number for the s16 register (a + pseudo-register in GDB), whereas arm-pseudo-unwind uses the number for the d8 + register (the underlying raw register for s16). */ + +value_callee: +.quad 0x20212223 +value_caller: +.quad 0x10111213 + +.global callee +callee: +.cfi_startproc + /* Standard prologue. */ + push {fp, lr} +.cfi_def_cfa fp, 4 +.cfi_offset fp, -8 +.cfi_offset lr, -4 + add fp, sp, #4 + + /* Save caller's s16 value on the stack. */ +.cfi_offset 80, -12 + vpush {s16} + + /* Put our own s16 value. */ + ldr r0, =value_callee + vldr s16, [r0] +break_here_asm: + + /* Restore caller's s16 value. */ + vpop {s16} + + /* Standard epilogue. */ + pop {fp, pc} +.cfi_endproc + + +.global caller +caller: +.cfi_startproc + /* Standard prologue. */ + push {fp, lr} +.cfi_def_cfa fp, 4 +.cfi_offset fp, -8 +.cfi_offset lr, -4 + add fp, sp, #4 + + /* Put our own s16 value. */ + ldr r0, =value_caller + vldr s16, [r0] + + /* Call callee. */ + bl callee + + /* Store our s16 value in r0-r1 to return it. */ + vpush {s16} + pop {r0} + mov r1, #0 + + /* Standard epilogue. */ + pop {fp, pc} +.cfi_endproc diff --git a/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.c b/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.c new file mode 100644 index 000000000000..c4553f844e9f --- /dev/null +++ b/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.c @@ -0,0 +1,33 @@ +/* Copyright 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#include + +uint64_t caller (void); + +static void +break_here_c (uint64_t value) +{ +} + +int +main (void) +{ + uint64_t value = caller (); + break_here_c (value); + return 0; +} diff --git a/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.exp b/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.exp new file mode 100644 index 000000000000..6deab8833b21 --- /dev/null +++ b/gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.exp @@ -0,0 +1,85 @@ +# Copyright 2018 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 . + +# This test is in the same vein as amd64-pseudo-unwind, making sure we can +# read write pseudo registers in outer frames. However, it tests a special +# case where the debug info includes unwind information for a pseudo register +# but not the underlying raw register. This can happen for the pseudo register +# s16, which is the bottom half of the raw register d8. +# +# See "DWARF for the ARM architecture": +# http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf + +if { ![istarget arm*-*-* ] } { + verbose "Skipping arm pseudo register unwind." + return +} + +standard_testfile arm-pseudo-unwind-legacy.c arm-pseudo-unwind-legacy-asm.S + +if { [prepare_for_testing "failed to prepare" ${testfile} "${srcfile} ${srcfile2}" {debug}] } { + return -1 +} + +clean_restart ${binfile} + +if ![runto_main] then { + fail "could not run to main" +} + +gdb_breakpoint break_here_asm temporary +gdb_continue_to_breakpoint "continue to callee" + +# Verify the value of s16 in the inner frame (callee). +with_test_prefix "callee, before change" { + gdb_test "info registers s16" "raw 0x20212223\\)" +} + +# Verify that we can change the value of s16 in the inner frame (callee). +gdb_test_no_output "set \$s16 = 1.0" + +# Verify the value of s16 in the inner frame (callee) after the change. +with_test_prefix "callee, after change" { + gdb_test "info registers s16" "raw 0x3f800000\\)" +} + +# Go up one frame, and do the same +gdb_test "up" + +# Verify the value of s16 in the outer frame (caller). +with_test_prefix "caller, before change" { + gdb_test "info registers s16" "raw 0x10111213\\)" +} + +# Verify that we can change the value of s16 in the outer frame (caller). +gdb_test_no_output "set \$s16 = 2.0" + +# Verify the value of s16 in the outer frame (caller) after the change. +with_test_prefix "caller, after change" { + gdb_test "info registers s16" "raw 0x40000000\\)" +} + +# Go back to frame 0 (callee), check that the change to the outer frame didn't +# mess up anything there. +gdb_test "down" +with_test_prefix "callee, after change in caller" { + gdb_test "info registers s16" "raw 0x3f800000\\)" +} + +# Verify that the value of the saved s16 we changed is correctly seen by the +# inferior. +gdb_breakpoint break_here_c temporary +gdb_continue_to_breakpoint "continue to break_here_c" +gdb_test "p/x value" " = 0x40000000" diff --git a/gdb/testsuite/gdb.arch/arm-pseudo-unwind.c b/gdb/testsuite/gdb.arch/arm-pseudo-unwind.c new file mode 100644 index 000000000000..c4553f844e9f --- /dev/null +++ b/gdb/testsuite/gdb.arch/arm-pseudo-unwind.c @@ -0,0 +1,33 @@ +/* Copyright 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#include + +uint64_t caller (void); + +static void +break_here_c (uint64_t value) +{ +} + +int +main (void) +{ + uint64_t value = caller (); + break_here_c (value); + return 0; +} diff --git a/gdb/testsuite/gdb.arch/arm-pseudo-unwind.exp b/gdb/testsuite/gdb.arch/arm-pseudo-unwind.exp new file mode 100644 index 000000000000..cc64fab7aa39 --- /dev/null +++ b/gdb/testsuite/gdb.arch/arm-pseudo-unwind.exp @@ -0,0 +1,87 @@ +# Copyright 2018 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 . + +# This test is equivalent to amd64-pseudo-unwind, but specific to ARM. We +# use the raw register d8 which is 64 bits long. We use pseudo register s16, +# which is the low 32 bits of d8. + +if { ![istarget arm*-*-* ] } { + verbose "Skipping arm pseudo register unwind." + return +} + +standard_testfile arm-pseudo-unwind.c arm-pseudo-unwind-asm.S + +if { [prepare_for_testing "failed to prepare" ${testfile} "${srcfile} ${srcfile2}" {debug}] } { + return -1 +} + +clean_restart ${binfile} + +if ![runto_main] then { + fail "could not run to main" +} + +gdb_breakpoint break_here_asm temporary +gdb_continue_to_breakpoint "continue to callee" + +# Verify the value of d8/s16 in the inner frame (callee). +with_test_prefix "callee, before change" { + gdb_test "p/x \$d8.u64" " = 0x2021222324252627" + gdb_test "info registers s16" "raw 0x24252627\\)" +} + +# Verify that we can change the value of the pseudo register (s16) in the inner +# frame (callee). +gdb_test_no_output "set \$s16 = 1.0" + +# Verify the value of d8/s16 in the inner frame (callee) after the change. +with_test_prefix "callee, after change" { + gdb_test "p/x \$d8.u64" " = 0x202122233f800000" + gdb_test "info registers s16" "raw 0x3f800000\\)" +} + +# Go up one frame (to caller), and do the same. +gdb_test "up" + +# Verify the value of d8/s16 in the outer frame (caller). +with_test_prefix "caller, before change" { + gdb_test "p/x \$d8.u64" " = 0x1011121314151617" + gdb_test "info registers s16" "raw 0x14151617\\)" +} + +# Verify that we can change the value of the pseudo register (s16) in the outer +# frame (caller). +gdb_test_no_output "set \$s16 = 2.0" + +# Verify the value of d8/s16 in the outer frame (caller) after the change. +with_test_prefix "caller, after change" { + gdb_test "p/x \$d8.u64" " = 0x1011121340000000" + gdb_test "info registers s16" "raw 0x40000000\\)" +} + +# Go back to frame 0 (callee), check that the change to the outer frame didn't +# mess up anything there. +gdb_test "down" +with_test_prefix "callee, after change in caller" { + gdb_test "p/x \$d8.u64" " = 0x202122233f800000" + gdb_test "info registers s16" "raw 0x3f800000\\)" +} + +# Verify that the value of the saved d8 we changed is correctly seen by the +# inferior. +gdb_breakpoint break_here_c temporary +gdb_continue_to_breakpoint "continue to break_here_c" +gdb_test "p/x value" " = 0x1011121340000000"