Message ID | 20210331025234.518688-8-zied.guermazi@trande.de |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
On 3/30/21 11:52 PM, Zied Guermazi wrote: > > This patch extends the test suite for btrace to cover using > ARM CoreSight traces. > > > gdb/ChangeLog > * testsuite/lib/gdb.exp (skip_btrace_tests): enable btrace tests > for arm. > * testsuite/gdb.btrace/buffer-size.exp: enable btrace tests > and adapt test for arm. > * testsuite/gdb.btrace/delta.exp (check_trace): enable btrace tests > and adapt test for arm. > * testsuite/gdb.btrace/instruction_history.exp: enable btrace tests > and adapt tests for arm. > * testsuite/gdb.btrace/instruction_history.S: renamed to > x86-instruction_history.S > * testsuite/gdb.btrace/aarch64-instruction_history.S: New. > * testsuite/gdb.btrace/arm-instruction_history.S: New > * testsuite/gdb.btrace/non-stop.exp: enable btrace tests > and adapt tests for arm. > * testsuite/gdb.btrace/reconnect.exp: enable btrace tests > and adapt tests for arm. > * testsuite/gdb.btrace/record_goto.exp: enable btrace tests > and adapt tests for arm. > * testsuite/gdb.btrace/aarch64-record_goto.S: New. > * testsuite/gdb.btrace/arm-record_goto.S: New. > * testsuite/gdb.btrace/stepi.exp: enable btrace tests > and adapt tests for arm. > * testsuite/gdb.btrace/tailcall.exp: enable btrace tests > and adapt tests for arm. > * testsuite/gdb.btrace/aarch64-tailcall.S: New. > * testsuite/gdb.btrace/arm-tailcall.S: New. > * testsuite/gdb.btrace/tailcall-only.exp: enable btrace tests > and adapt tests for arm. > * testsuite/gdb.btrace/aarch64-tailcall-only.S: New. > * testsuite/gdb.btrace/arm-tailcall-only.S: New. > > --- > gdb/ChangeLog | 33 ++ > .../gdb.btrace/aarch64-instruction_history.S | 31 ++ > .../gdb.btrace/aarch64-record_goto.S | 400 ++++++++++++++ > .../gdb.btrace/aarch64-tailcall-only.S | 517 ++++++++++++++++++ > gdb/testsuite/gdb.btrace/aarch64-tailcall.S | 409 ++++++++++++++ > .../gdb.btrace/arm-instruction_history.S | 31 ++ > gdb/testsuite/gdb.btrace/arm-record_goto.S | 433 +++++++++++++++ > gdb/testsuite/gdb.btrace/arm-tailcall-only.S | 504 +++++++++++++++++ > gdb/testsuite/gdb.btrace/arm-tailcall.S | 391 +++++++++++++ > gdb/testsuite/gdb.btrace/buffer-size.exp | 15 +- > gdb/testsuite/gdb.btrace/delta.exp | 10 + > .../gdb.btrace/instruction_history.exp | 107 +++- > gdb/testsuite/gdb.btrace/non-stop.exp | 60 +- > gdb/testsuite/gdb.btrace/record_goto.exp | 241 ++++++-- > gdb/testsuite/gdb.btrace/stepi.exp | 95 +++- > gdb/testsuite/gdb.btrace/tailcall-only.exp | 8 + > gdb/testsuite/gdb.btrace/tailcall.exp | 46 +- > ...on_history.S => x86-instruction_history.S} | 0 > gdb/testsuite/lib/gdb.exp | 2 +- > 19 files changed, 3215 insertions(+), 118 deletions(-) > create mode 100644 gdb/testsuite/gdb.btrace/aarch64-instruction_history.S > create mode 100644 gdb/testsuite/gdb.btrace/aarch64-record_goto.S > create mode 100644 gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S > create mode 100644 gdb/testsuite/gdb.btrace/aarch64-tailcall.S > create mode 100644 gdb/testsuite/gdb.btrace/arm-instruction_history.S > create mode 100644 gdb/testsuite/gdb.btrace/arm-record_goto.S > create mode 100644 gdb/testsuite/gdb.btrace/arm-tailcall-only.S > create mode 100644 gdb/testsuite/gdb.btrace/arm-tailcall.S > rename gdb/testsuite/gdb.btrace/{instruction_history.S => x86-instruction_history.S} (100%) > > diff --git a/gdb/ChangeLog b/gdb/ChangeLog > index 76b413c3857..a1975363767 100644 > --- a/gdb/ChangeLog > +++ b/gdb/ChangeLog > @@ -1,3 +1,36 @@ > +2021-02-25 Zied Guermazi <zied.guermazi@trande.de> > + > + * testsuite/lib/gdb.exp (skip_btrace_tests): enable btrace tests > + for arm. > + * testsuite/gdb.btrace/buffer-size.exp: enable btrace tests > + and adapt test for arm. > + * testsuite/gdb.btrace/delta.exp (check_trace): enable btrace tests > + and adapt test for arm. > + * testsuite/gdb.btrace/instruction_history.exp: enable btrace tests > + and adapt tests for arm. > + * testsuite/gdb.btrace/instruction_history.S: renamed to > + x86-instruction_history.S > + * testsuite/gdb.btrace/aarch64-instruction_history.S: New. > + * testsuite/gdb.btrace/arm-instruction_history.S: New > + * testsuite/gdb.btrace/non-stop.exp: enable btrace tests > + and adapt tests for arm. > + * testsuite/gdb.btrace/reconnect.exp: enable btrace tests > + and adapt tests for arm. > + * testsuite/gdb.btrace/record_goto.exp: enable btrace tests > + and adapt tests for arm. > + * testsuite/gdb.btrace/aarch64-record_goto.S: New. > + * testsuite/gdb.btrace/arm-record_goto.S: New. > + * testsuite/gdb.btrace/stepi.exp: enable btrace tests > + and adapt tests for arm. > + * testsuite/gdb.btrace/tailcall.exp: enable btrace tests > + and adapt tests for arm. > + * testsuite/gdb.btrace/aarch64-tailcall.S: New. > + * testsuite/gdb.btrace/arm-tailcall.S: New. > + * testsuite/gdb.btrace/tailcall-only.exp: enable btrace tests > + and adapt tests for arm. > + * testsuite/gdb.btrace/aarch64-tailcall-only.S: New. > + * testsuite/gdb.btrace/arm-tailcall-only.S: New. > + > 2021-02-25 Zied Guermazi <zied.guermazi@trande.de> > > * btrace.c (check_xml_btrace_version): add version 1.1 > diff --git a/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S b/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S > new file mode 100644 > index 00000000000..66490e3b23e > --- /dev/null > +++ b/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S > @@ -0,0 +1,31 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2013-2021 Free Software Foundation, Inc. Given this is a new file and from a different architecture, we should make the copyright year 2021. There are other cases of this in the patch. > + > + 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/>. */ > +.arch armv8-a > +.text > +.globl loop > +.type loop, %function > +loop: > + mov x0, #2 /* bp.1 */ > +L1: > + cmp x0, #0 > + beq L2 > + subs x0, x0, #1 > + b L1 > +L2: > + ret /* bp.2 */ > + > + > diff --git a/gdb/testsuite/gdb.btrace/aarch64-record_goto.S b/gdb/testsuite/gdb.btrace/aarch64-record_goto.S > new file mode 100644 > index 00000000000..be832eeb4c1 > --- /dev/null > +++ b/gdb/testsuite/gdb.btrace/aarch64-record_goto.S > @@ -0,0 +1,400 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2013-2021 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/>. > + > + Spurious newline. > + This file has been generated on an armv8 machine using: > + gcc -S -dA -g record_goto.c -o aarch64-record_goto.S */ > + > + .arch armv8-a > + .file "record_goto.c" > + .text > +.Ltext0: > + .align 2 > + .global fun1 > + //.tune generic > + .type fun1, %function > +fun1: > +.LFB0: > + .file 1 "record_goto.c" > + // record_goto.c:22:1 > + .loc 1 22 1 > + .cfi_startproc > +// BLOCK 2 seq:0 > +// PRED: ENTRY (FALLTHRU) > + // record_goto.c:23:1 > + .loc 1 23 1 > + nop > +// SUCC: EXIT [always] > + ret > + .cfi_endproc > +.LFE0: > + .size fun1, .-fun1 > + .align 2 > + .global fun2 > + .type fun2, %function > +fun2: > +.LFB1: > + // record_goto.c:27:1 > + .loc 1 27 1 > + .cfi_startproc > +// BLOCK 2 seq:0 > +// PRED: ENTRY (FALLTHRU) > + stp x29, x30, [sp, -16]! > + .cfi_def_cfa_offset 16 > + .cfi_offset 29, -16 > + .cfi_offset 30, -8 > + mov x29, sp > + // record_goto.c:28:3 > + .loc 1 28 3 > + bl fun1 > + // record_goto.c:29:1 > + .loc 1 29 1 > + nop > + ldp x29, x30, [sp], 16 > + .cfi_restore 30 > + .cfi_restore 29 > + .cfi_def_cfa_offset 0 > +// SUCC: EXIT [always] > + ret > + .cfi_endproc > +.LFE1: > + .size fun2, .-fun2 > + .align 2 > + .global fun3 > + .type fun3, %function > +fun3: > +.LFB2: > + // record_goto.c:33:1 > + .loc 1 33 1 > + .cfi_startproc > +// BLOCK 2 seq:0 > +// PRED: ENTRY (FALLTHRU) > + stp x29, x30, [sp, -16]! > + .cfi_def_cfa_offset 16 > + .cfi_offset 29, -16 > + .cfi_offset 30, -8 > + mov x29, sp > + // record_goto.c:34:3 > + .loc 1 34 3 > + bl fun1 > + // record_goto.c:35:3 > + .loc 1 35 3 > + bl fun2 > + // record_goto.c:36:1 > + .loc 1 36 1 > + nop > + ldp x29, x30, [sp], 16 > + .cfi_restore 30 > + .cfi_restore 29 > + .cfi_def_cfa_offset 0 > +// SUCC: EXIT [always] > + ret > + .cfi_endproc > +.LFE2: > + .size fun3, .-fun3 > + .align 2 > + .global fun4 > + .type fun4, %function > +fun4: > +.LFB3: > + // record_goto.c:40:1 > + .loc 1 40 1 > + .cfi_startproc > +// BLOCK 2 seq:0 > +// PRED: ENTRY (FALLTHRU) > + stp x29, x30, [sp, -16]! > + .cfi_def_cfa_offset 16 > + .cfi_offset 29, -16 > + .cfi_offset 30, -8 > + mov x29, sp > + // record_goto.c:41:3 > + .loc 1 41 3 > + bl fun1 > + // record_goto.c:42:3 > + .loc 1 42 3 > + bl fun2 > + // record_goto.c:43:3 > + .loc 1 43 3 > + bl fun3 > + // record_goto.c:44:1 > + .loc 1 44 1 > + nop > + ldp x29, x30, [sp], 16 > + .cfi_restore 30 > + .cfi_restore 29 > + .cfi_def_cfa_offset 0 > +// SUCC: EXIT [always] > + ret > + .cfi_endproc > +.LFE3: > + .size fun4, .-fun4 > + .align 2 > + .global main > + .type main, %function > +main: > +.LFB4: > + // record_goto.c:48:1 > + .loc 1 48 1 > + .cfi_startproc > +// BLOCK 2 seq:0 > +// PRED: ENTRY (FALLTHRU) > + stp x29, x30, [sp, -16]! > + .cfi_def_cfa_offset 16 > + .cfi_offset 29, -16 > + .cfi_offset 30, -8 > + mov x29, sp > + // record_goto.c:49:3 > + .loc 1 49 3 > + bl fun4 > + // record_goto.c:50:10 > + .loc 1 50 10 > + mov w0, 0 > + // record_goto.c:51:1 > + .loc 1 51 1 > + ldp x29, x30, [sp], 16 > + .cfi_restore 30 > + .cfi_restore 29 > + .cfi_def_cfa_offset 0 > +// SUCC: EXIT [always] > + ret > + .cfi_endproc > +.LFE4: > + .size main, .-main > +.Letext0: > + .section .debug_info,"",@progbits > +.Ldebug_info0: > + .4byte 0xb7 // Length of Compilation Unit Info > + .2byte 0x4 // DWARF version number > + .4byte .Ldebug_abbrev0 // Offset Into Abbrev. Section > + .byte 0x8 // Pointer Size (in bytes) > + .uleb128 0x1 // (DIE (0xb) DW_TAG_compile_unit) > + .4byte .LASF4 // DW_AT_producer: "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -fasynchronous-unwind-tables" > + .byte 0xc // DW_AT_language > + .4byte .LASF5 // DW_AT_name: "record_goto.c" > + .4byte .LASF6 // DW_AT_comp_dir: "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > + .8byte .Ltext0 // DW_AT_low_pc > + .8byte .Letext0-.Ltext0 // DW_AT_high_pc > + .4byte .Ldebug_line0 // DW_AT_stmt_list > + .uleb128 0x2 // (DIE (0x2d) DW_TAG_subprogram) > + // DW_AT_external > + .4byte .LASF7 // DW_AT_name: "main" > + .byte 0x1 // DW_AT_decl_file (record_goto.c) > + .byte 0x2f // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x4b // DW_AT_type > + .8byte .LFB4 // DW_AT_low_pc > + .8byte .LFE4-.LFB4 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_tail_call_sites > + .uleb128 0x3 // (DIE (0x4b) DW_TAG_base_type) > + .byte 0x4 // DW_AT_byte_size > + .byte 0x5 // DW_AT_encoding > + .ascii "int\0" // DW_AT_name > + .uleb128 0x4 // (DIE (0x52) DW_TAG_subprogram) > + // DW_AT_external > + .4byte .LASF0 // DW_AT_name: "fun4" > + .byte 0x1 // DW_AT_decl_file (record_goto.c) > + .byte 0x27 // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .8byte .LFB3 // DW_AT_low_pc > + .8byte .LFE3-.LFB3 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_tail_call_sites > + .uleb128 0x4 // (DIE (0x6c) DW_TAG_subprogram) > + // DW_AT_external > + .4byte .LASF1 // DW_AT_name: "fun3" > + .byte 0x1 // DW_AT_decl_file (record_goto.c) > + .byte 0x20 // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .8byte .LFB2 // DW_AT_low_pc > + .8byte .LFE2-.LFB2 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_tail_call_sites > + .uleb128 0x4 // (DIE (0x86) DW_TAG_subprogram) > + // DW_AT_external > + .4byte .LASF2 // DW_AT_name: "fun2" > + .byte 0x1 // DW_AT_decl_file (record_goto.c) > + .byte 0x1a // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .8byte .LFB1 // DW_AT_low_pc > + .8byte .LFE1-.LFB1 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_tail_call_sites > + .uleb128 0x5 // (DIE (0xa0) DW_TAG_subprogram) > + // DW_AT_external > + .4byte .LASF3 // DW_AT_name: "fun1" > + .byte 0x1 // DW_AT_decl_file (record_goto.c) > + .byte 0x15 // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .8byte .LFB0 // DW_AT_low_pc > + .8byte .LFE0-.LFB0 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .byte 0 // end of children of DIE 0xb > + .section .debug_abbrev,"",@progbits > +.Ldebug_abbrev0: > + .uleb128 0x1 // (abbrev code) > + .uleb128 0x11 // (TAG: DW_TAG_compile_unit) > + .byte 0x1 // DW_children_yes > + .uleb128 0x25 // (DW_AT_producer) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x13 // (DW_AT_language) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x1b // (DW_AT_comp_dir) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x10 // (DW_AT_stmt_list) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x2 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0 // DW_children_no > + .uleb128 0x3f // (DW_AT_external) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2116 // (DW_AT_GNU_all_tail_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .uleb128 0x3 // (abbrev code) > + .uleb128 0x24 // (TAG: DW_TAG_base_type) > + .byte 0 // DW_children_no > + .uleb128 0xb // (DW_AT_byte_size) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3e // (DW_AT_encoding) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0x8 // (DW_FORM_string) > + .byte 0 > + .byte 0 > + .uleb128 0x4 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0 // DW_children_no > + .uleb128 0x3f // (DW_AT_external) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2116 // (DW_AT_GNU_all_tail_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .uleb128 0x5 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0 // DW_children_no > + .uleb128 0x3f // (DW_AT_external) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .byte 0 > + .section .debug_aranges,"",@progbits > + .4byte 0x2c // Length of Address Ranges Info > + .2byte 0x2 // DWARF aranges version > + .4byte .Ldebug_info0 // Offset of Compilation Unit Info > + .byte 0x8 // Size of Address > + .byte 0 // Size of Segment Descriptor > + .2byte 0 // Pad to 16 byte boundary > + .2byte 0 > + .8byte .Ltext0 // Address > + .8byte .Letext0-.Ltext0 // Length > + .8byte 0 > + .8byte 0 > + .section .debug_line,"",@progbits > +.Ldebug_line0: > + .section .debug_str,"MS",@progbits,1 > +.LASF5: > + .string "record_goto.c" > +.LASF4: > + .string "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -fasynchronous-unwind-tables" > +.LASF3: > + .string "fun1" > +.LASF2: > + .string "fun2" > +.LASF0: > + .string "fun4" > +.LASF6: > + .string "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > +.LASF7: > + .string "main" > +.LASF1: > + .string "fun3" > + .ident "GCC: (Debian 10.2.1-3) 10.2.1 20201224" > + .section .note.GNU-stack,"",@progbits > diff --git a/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S b/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S > new file mode 100644 > index 00000000000..1822385b85f > --- /dev/null > +++ b/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S > @@ -0,0 +1,517 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2016-2021 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/>. > + > + Spurious newline. > + This file has been generated on an armv8 machine using: > + gcc -m32 -S -O2 -dA -g tailcall-only.c -o aarch64-tailcall-only.S > + */ > + > + .arch armv8-a > + .file "tailcall-only.c" > + .text > +.Ltext0: > + .align 2 > + .p2align 4,,11 > + //.tune generic > + .type bar_1, %function > +bar_1: > +.LFB0: > + .file 1 "tailcall-only.c" > + // tailcall-only.c:22:1 > + .loc 1 22 1 view -0 > + .cfi_startproc > +// BLOCK 2, count:1073741824 (estimated locally) seq:0 > +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) > + // tailcall-only.c:23:3 > + .loc 1 23 3 view .LVU1 > + // tailcall-only.c:24:1 > + .loc 1 24 1 is_stmt 0 view .LVU2 > + mov w0, 42 > +// SUCC: EXIT [always] count:1073741824 (estimated locally) > + ret > + .cfi_endproc > +.LFE0: > + .size bar_1, .-bar_1 > + .align 2 > + .p2align 4,,11 > + .type bar, %function > +bar: > +.LFB1: > + // tailcall-only.c:28:1 > + .loc 1 28 1 is_stmt 1 view -0 > + .cfi_startproc > +// BLOCK 2, count:1073741824 (estimated locally) seq:0 > +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) > + // tailcall-only.c:29:3 > + .loc 1 29 3 view .LVU4 > +// SUCC: EXIT [always] count:1073741824 (estimated locally) (ABNORMAL,SIBCALL) > + // tailcall-only.c:29:10 > + .loc 1 29 10 is_stmt 0 view .LVU5 > + b bar_1 > +.LVL0: > + .cfi_endproc > +.LFE1: > + .size bar, .-bar > + .align 2 > + .p2align 4,,11 > + .type foo_1, %function > +foo_1: > +.LFB2: > + // tailcall-only.c:34:1 > + .loc 1 34 1 is_stmt 1 view -0 > + .cfi_startproc > +// BLOCK 2, count:1073741824 (estimated locally) seq:0 > +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) > + // tailcall-only.c:35:3 > + .loc 1 35 3 view .LVU7 > +// SUCC: EXIT [always] count:1073741824 (estimated locally) (ABNORMAL,SIBCALL) > + // tailcall-only.c:35:10 > + .loc 1 35 10 is_stmt 0 view .LVU8 > + b bar > +.LVL1: > + .cfi_endproc > +.LFE2: > + .size foo_1, .-foo_1 > + .align 2 > + .p2align 4,,11 > + .type foo, %function > +foo: > +.LFB3: > + // tailcall-only.c:40:1 > + .loc 1 40 1 is_stmt 1 view -0 > + .cfi_startproc > +// BLOCK 2, count:1073741824 (estimated locally) seq:0 > +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) > + // tailcall-only.c:41:3 > + .loc 1 41 3 view .LVU10 > +// SUCC: EXIT [always] count:1073741824 (estimated locally) (ABNORMAL,SIBCALL) > + // tailcall-only.c:41:10 > + .loc 1 41 10 is_stmt 0 view .LVU11 > + b foo_1 > +.LVL2: > + .cfi_endproc > +.LFE3: > + .size foo, .-foo > + .section .text.startup,"ax",@progbits > + .align 2 > + .p2align 4,,11 > + .global main > + .type main, %function > +main: > +.LFB4: > + // tailcall-only.c:46:1 > + .loc 1 46 1 is_stmt 1 view -0 > + .cfi_startproc > +// BLOCK 2, count:1073741824 (estimated locally) seq:0 > +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) > + // tailcall-only.c:47:3 > + .loc 1 47 3 view .LVU13 > + // tailcall-only.c:49:3 > + .loc 1 49 3 view .LVU14 > + // tailcall-only.c:46:1 > + .loc 1 46 1 is_stmt 0 view .LVU15 > + stp x29, x30, [sp, -16]! > + .cfi_def_cfa_offset 16 > + .cfi_offset 29, -16 > + .cfi_offset 30, -8 > + mov x29, sp > + // tailcall-only.c:49:12 > + .loc 1 49 12 view .LVU16 > + bl foo > +.LVL3: > + // DEBUG answer => x0 > + // tailcall-only.c:50:3 > + .loc 1 50 3 is_stmt 1 view .LVU17 > + // DEBUG answer => x0+0x1 > + // tailcall-only.c:52:3 > + .loc 1 52 3 view .LVU18 > + // tailcall-only.c:53:1 > + .loc 1 53 1 is_stmt 0 view .LVU19 > + add w0, w0, 1 > +.LVL4: > + // DEBUG answer => x0 > + // tailcall-only.c:53:1 > + .loc 1 53 1 view .LVU20 > + ldp x29, x30, [sp], 16 > + .cfi_restore 30 > + .cfi_restore 29 > + .cfi_def_cfa_offset 0 > +// SUCC: EXIT [always] count:1073741824 (estimated locally) > + ret > + .cfi_endproc > +.LFE4: > + .size main, .-main > + .text > +.Letext0: > + .section .debug_info,"",@progbits > +.Ldebug_info0: > + .4byte 0x11f // Length of Compilation Unit Info > + .2byte 0x4 // DWARF version number > + .4byte .Ldebug_abbrev0 // Offset Into Abbrev. Section > + .byte 0x8 // Pointer Size (in bytes) > + .uleb128 0x1 // (DIE (0xb) DW_TAG_compile_unit) > + .4byte .LASF1 // DW_AT_producer: "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" > + .byte 0xc // DW_AT_language > + .4byte .LASF2 // DW_AT_name: "tailcall-only.c" > + .4byte .LASF3 // DW_AT_comp_dir: "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > + .4byte .Ldebug_ranges0+0 // DW_AT_ranges > + .8byte 0 // DW_AT_low_pc > + .4byte .Ldebug_line0 // DW_AT_stmt_list > + .uleb128 0x2 // (DIE (0x29) DW_TAG_subprogram) > + // DW_AT_external > + .4byte .LASF4 // DW_AT_name: "main" > + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) > + .byte 0x2d // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x6d // DW_AT_type > + .8byte .LFB4 // DW_AT_low_pc > + .8byte .LFE4-.LFB4 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .4byte 0x6d // DW_AT_sibling > + .uleb128 0x3 // (DIE (0x4b) DW_TAG_variable) > + .4byte .LASF5 // DW_AT_name: "answer" > + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) > + .byte 0x2f // DW_AT_decl_line > + .byte 0x7 // DW_AT_decl_column > + .4byte 0x6d // DW_AT_type > + .4byte .LLST0 // DW_AT_location > + .4byte .LVUS0 // DW_AT_GNU_locviews > + .uleb128 0x4 // (DIE (0x5f) DW_TAG_GNU_call_site) > + .8byte .LVL3 // DW_AT_low_pc > + .4byte 0x74 // DW_AT_abstract_origin > + .byte 0 // end of children of DIE 0x29 > + .uleb128 0x5 // (DIE (0x6d) DW_TAG_base_type) > + .byte 0x4 // DW_AT_byte_size > + .byte 0x5 // DW_AT_encoding > + .ascii "int\0" // DW_AT_name > + .uleb128 0x6 // (DIE (0x74) DW_TAG_subprogram) > + .ascii "foo\0" // DW_AT_name > + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) > + .byte 0x27 // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x6d // DW_AT_type > + .8byte .LFB3 // DW_AT_low_pc > + .8byte .LFE3-.LFB3 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .4byte 0xa4 // DW_AT_sibling > + .uleb128 0x7 // (DIE (0x96) DW_TAG_GNU_call_site) > + .8byte .LVL2 // DW_AT_low_pc > + // DW_AT_GNU_tail_call > + .4byte 0xa4 // DW_AT_abstract_origin > + .byte 0 // end of children of DIE 0x74 > + .uleb128 0x8 // (DIE (0xa4) DW_TAG_subprogram) > + .4byte .LASF0 // DW_AT_name: "foo_1" > + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) > + .byte 0x21 // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x6d // DW_AT_type > + .8byte .LFB2 // DW_AT_low_pc > + .8byte .LFE2-.LFB2 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .4byte 0xd4 // DW_AT_sibling > + .uleb128 0x7 // (DIE (0xc6) DW_TAG_GNU_call_site) > + .8byte .LVL1 // DW_AT_low_pc > + // DW_AT_GNU_tail_call > + .4byte 0xd4 // DW_AT_abstract_origin > + .byte 0 // end of children of DIE 0xa4 > + .uleb128 0x6 // (DIE (0xd4) DW_TAG_subprogram) > + .ascii "bar\0" // DW_AT_name > + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) > + .byte 0x1b // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x6d // DW_AT_type > + .8byte .LFB1 // DW_AT_low_pc > + .8byte .LFE1-.LFB1 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .4byte 0x104 // DW_AT_sibling > + .uleb128 0x7 // (DIE (0xf6) DW_TAG_GNU_call_site) > + .8byte .LVL0 // DW_AT_low_pc > + // DW_AT_GNU_tail_call > + .4byte 0x104 // DW_AT_abstract_origin > + .byte 0 // end of children of DIE 0xd4 > + .uleb128 0x9 // (DIE (0x104) DW_TAG_subprogram) > + .4byte .LASF6 // DW_AT_name: "bar_1" > + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) > + .byte 0x15 // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x6d // DW_AT_type > + .8byte .LFB0 // DW_AT_low_pc > + .8byte .LFE0-.LFB0 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .byte 0 // end of children of DIE 0xb > + .section .debug_abbrev,"",@progbits > +.Ldebug_abbrev0: > + .uleb128 0x1 // (abbrev code) > + .uleb128 0x11 // (TAG: DW_TAG_compile_unit) > + .byte 0x1 // DW_children_yes > + .uleb128 0x25 // (DW_AT_producer) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x13 // (DW_AT_language) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x1b // (DW_AT_comp_dir) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x55 // (DW_AT_ranges) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x10 // (DW_AT_stmt_list) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x2 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0x1 // DW_children_yes > + .uleb128 0x3f // (DW_AT_external) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x1 // (DW_AT_sibling) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x3 // (abbrev code) > + .uleb128 0x34 // (TAG: DW_TAG_variable) > + .byte 0 // DW_children_no > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x2 // (DW_AT_location) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .uleb128 0x2137 // (DW_AT_GNU_locviews) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x4 // (abbrev code) > + .uleb128 0x4109 // (TAG: DW_TAG_GNU_call_site) > + .byte 0 // DW_children_no > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x31 // (DW_AT_abstract_origin) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x5 // (abbrev code) > + .uleb128 0x24 // (TAG: DW_TAG_base_type) > + .byte 0 // DW_children_no > + .uleb128 0xb // (DW_AT_byte_size) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3e // (DW_AT_encoding) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0x8 // (DW_FORM_string) > + .byte 0 > + .byte 0 > + .uleb128 0x6 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0x1 // DW_children_yes > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0x8 // (DW_FORM_string) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x1 // (DW_AT_sibling) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x7 // (abbrev code) > + .uleb128 0x4109 // (TAG: DW_TAG_GNU_call_site) > + .byte 0 // DW_children_no > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x2115 // (DW_AT_GNU_tail_call) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x31 // (DW_AT_abstract_origin) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x8 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0x1 // DW_children_yes > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x1 // (DW_AT_sibling) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x9 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0 // DW_children_no > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .byte 0 > + .section .debug_loc,"",@progbits > +.Ldebug_loc0: > +.LVUS0: > + .uleb128 .LVU17 // View list begin (*.LVUS0) > + .uleb128 .LVU18 // View list end (*.LVUS0) > + .uleb128 .LVU18 // View list begin (*.LVUS0) > + .uleb128 .LVU20 // View list end (*.LVUS0) > + .uleb128 .LVU20 // View list begin (*.LVUS0) > + .uleb128 0 // View list end (*.LVUS0) > +.LLST0: > + .8byte .LVL3 // Location list begin address (*.LLST0) > + .8byte .LVL3 // Location list end address (*.LLST0) > + .2byte 0x1 // Location expression size > + .byte 0x50 // DW_OP_reg0 > + .8byte .LVL3 // Location list begin address (*.LLST0) > + .8byte .LVL4 // Location list end address (*.LLST0) > + .2byte 0x3 // Location expression size > + .byte 0x70 // DW_OP_breg0 > + .sleb128 1 > + .byte 0x9f // DW_OP_stack_value > + .8byte .LVL4 // Location list begin address (*.LLST0) > + .8byte .LFE4 // Location list end address (*.LLST0) > + .2byte 0x1 // Location expression size > + .byte 0x50 // DW_OP_reg0 > + .8byte 0 // Location list terminator begin (*.LLST0) > + .8byte 0 // Location list terminator end (*.LLST0) > + .section .debug_aranges,"",@progbits > + .4byte 0x3c // Length of Address Ranges Info > + .2byte 0x2 // DWARF aranges version > + .4byte .Ldebug_info0 // Offset of Compilation Unit Info > + .byte 0x8 // Size of Address > + .byte 0 // Size of Segment Descriptor > + .2byte 0 // Pad to 16 byte boundary > + .2byte 0 > + .8byte .Ltext0 // Address > + .8byte .Letext0-.Ltext0 // Length > + .8byte .LFB4 // Address > + .8byte .LFE4-.LFB4 // Length > + .8byte 0 > + .8byte 0 > + .section .debug_ranges,"",@progbits > +.Ldebug_ranges0: > + .8byte .Ltext0 // Offset 0 > + .8byte .Letext0 > + .8byte .LFB4 // Offset 0x10 > + .8byte .LFE4 > + .8byte 0 > + .8byte 0 > + .section .debug_line,"",@progbits > +.Ldebug_line0: > + .section .debug_str,"MS",@progbits,1 > +.LASF6: > + .string "bar_1" > +.LASF2: > + .string "tailcall-only.c" > +.LASF3: > + .string "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > +.LASF5: > + .string "answer" > +.LASF4: > + .string "main" > +.LASF1: > + .string "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" > +.LASF0: > + .string "foo_1" > + .ident "GCC: (Debian 10.2.1-3) 10.2.1 20201224" > + .section .note.GNU-stack,"",@progbits > diff --git a/gdb/testsuite/gdb.btrace/aarch64-tailcall.S b/gdb/testsuite/gdb.btrace/aarch64-tailcall.S > new file mode 100644 > index 00000000000..a6b01cbccea > --- /dev/null > +++ b/gdb/testsuite/gdb.btrace/aarch64-tailcall.S > @@ -0,0 +1,409 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2013-2021 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/>. > + > + Spurious newline. > + This file has been generated on an armv8 machine using: > + gcc -S -O2 -dA -g tailcall.c -o aarch64-tailcall.S */ > + > + .arch armv8-a > + .file "tailcall.c" > + .text > +.Ltext0: > + .align 2 > + .p2align 4,,11 > + //.tune generic > + .type bar, %function > +bar: > +.LFB0: > + .file 1 "tailcall.c" > + // tailcall.c:22:1 > + .loc 1 22 1 view -0 > + .cfi_startproc > +// BLOCK 2, count:1073741824 (estimated locally) seq:0 > +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) > + // tailcall.c:23:3 > + .loc 1 23 3 view .LVU1 > + // tailcall.c:24:1 > + .loc 1 24 1 is_stmt 0 view .LVU2 > + mov w0, 42 > +// SUCC: EXIT [always] count:1073741824 (estimated locally) > + ret > + .cfi_endproc > +.LFE0: > + .size bar, .-bar > + .align 2 > + .p2align 4,,11 > + .type foo, %function > +foo: > +.LFB1: > + // tailcall.c:28:1 > + .loc 1 28 1 is_stmt 1 view -0 > + .cfi_startproc > +// BLOCK 2, count:1073741824 (estimated locally) seq:0 > +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) > + // tailcall.c:29:3 > + .loc 1 29 3 view .LVU4 > +// SUCC: EXIT [always] count:1073741824 (estimated locally) (ABNORMAL,SIBCALL) > + // tailcall.c:29:10 > + .loc 1 29 10 is_stmt 0 view .LVU5 > + b bar > +.LVL0: > + .cfi_endproc > +.LFE1: > + .size foo, .-foo > + .section .text.startup,"ax",@progbits > + .align 2 > + .p2align 4,,11 > + .global main > + .type main, %function > +main: > +.LFB2: > + // tailcall.c:34:1 > + .loc 1 34 1 is_stmt 1 view -0 > + .cfi_startproc > +// BLOCK 2, count:1073741824 (estimated locally) seq:0 > +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) > + // tailcall.c:35:3 > + .loc 1 35 3 view .LVU7 > + // tailcall.c:37:3 > + .loc 1 37 3 view .LVU8 > + // tailcall.c:34:1 > + .loc 1 34 1 is_stmt 0 view .LVU9 > + stp x29, x30, [sp, -16]! > + .cfi_def_cfa_offset 16 > + .cfi_offset 29, -16 > + .cfi_offset 30, -8 > + mov x29, sp > + // tailcall.c:37:12 > + .loc 1 37 12 view .LVU10 > + bl foo > +.LVL1: > + // DEBUG answer => x0 > + // tailcall.c:38:3 > + .loc 1 38 3 is_stmt 1 view .LVU11 > + // DEBUG answer => x0+0x1 > + // tailcall.c:40:3 > + .loc 1 40 3 view .LVU12 > + // tailcall.c:41:1 > + .loc 1 41 1 is_stmt 0 view .LVU13 > + add w0, w0, 1 > +.LVL2: > + // DEBUG answer => x0 > + // tailcall.c:41:1 > + .loc 1 41 1 view .LVU14 > + ldp x29, x30, [sp], 16 > + .cfi_restore 30 > + .cfi_restore 29 > + .cfi_def_cfa_offset 0 > +// SUCC: EXIT [always] count:1073741824 (estimated locally) > + ret > + .cfi_endproc > +.LFE2: > + .size main, .-main > + .text > +.Letext0: > + .section .debug_info,"",@progbits > +.Ldebug_info0: > + .4byte 0xbf // Length of Compilation Unit Info > + .2byte 0x4 // DWARF version number > + .4byte .Ldebug_abbrev0 // Offset Into Abbrev. Section > + .byte 0x8 // Pointer Size (in bytes) > + .uleb128 0x1 // (DIE (0xb) DW_TAG_compile_unit) > + .4byte .LASF0 // DW_AT_producer: "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" > + .byte 0xc // DW_AT_language > + .4byte .LASF1 // DW_AT_name: "tailcall.c" > + .4byte .LASF2 // DW_AT_comp_dir: "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > + .4byte .Ldebug_ranges0+0 // DW_AT_ranges > + .8byte 0 // DW_AT_low_pc > + .4byte .Ldebug_line0 // DW_AT_stmt_list > + .uleb128 0x2 // (DIE (0x29) DW_TAG_subprogram) > + // DW_AT_external > + .4byte .LASF3 // DW_AT_name: "main" > + .byte 0x1 // DW_AT_decl_file (tailcall.c) > + .byte 0x21 // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x6d // DW_AT_type > + .8byte .LFB2 // DW_AT_low_pc > + .8byte .LFE2-.LFB2 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .4byte 0x6d // DW_AT_sibling > + .uleb128 0x3 // (DIE (0x4b) DW_TAG_variable) > + .4byte .LASF4 // DW_AT_name: "answer" > + .byte 0x1 // DW_AT_decl_file (tailcall.c) > + .byte 0x23 // DW_AT_decl_line > + .byte 0x7 // DW_AT_decl_column > + .4byte 0x6d // DW_AT_type > + .4byte .LLST0 // DW_AT_location > + .4byte .LVUS0 // DW_AT_GNU_locviews > + .uleb128 0x4 // (DIE (0x5f) DW_TAG_GNU_call_site) > + .8byte .LVL1 // DW_AT_low_pc > + .4byte 0x74 // DW_AT_abstract_origin > + .byte 0 // end of children of DIE 0x29 > + .uleb128 0x5 // (DIE (0x6d) DW_TAG_base_type) > + .byte 0x4 // DW_AT_byte_size > + .byte 0x5 // DW_AT_encoding > + .ascii "int\0" // DW_AT_name > + .uleb128 0x6 // (DIE (0x74) DW_TAG_subprogram) > + .ascii "foo\0" // DW_AT_name > + .byte 0x1 // DW_AT_decl_file (tailcall.c) > + .byte 0x1b // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x6d // DW_AT_type > + .8byte .LFB1 // DW_AT_low_pc > + .8byte .LFE1-.LFB1 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .4byte 0xa4 // DW_AT_sibling > + .uleb128 0x7 // (DIE (0x96) DW_TAG_GNU_call_site) > + .8byte .LVL0 // DW_AT_low_pc > + // DW_AT_GNU_tail_call > + .4byte 0xa4 // DW_AT_abstract_origin > + .byte 0 // end of children of DIE 0x74 > + .uleb128 0x8 // (DIE (0xa4) DW_TAG_subprogram) > + .ascii "bar\0" // DW_AT_name > + .byte 0x1 // DW_AT_decl_file (tailcall.c) > + .byte 0x15 // DW_AT_decl_line > + .byte 0x1 // DW_AT_decl_column > + // DW_AT_prototyped > + .4byte 0x6d // DW_AT_type > + .8byte .LFB0 // DW_AT_low_pc > + .8byte .LFE0-.LFB0 // DW_AT_high_pc > + .uleb128 0x1 // DW_AT_frame_base > + .byte 0x9c // DW_OP_call_frame_cfa > + // DW_AT_GNU_all_call_sites > + .byte 0 // end of children of DIE 0xb > + .section .debug_abbrev,"",@progbits > +.Ldebug_abbrev0: > + .uleb128 0x1 // (abbrev code) > + .uleb128 0x11 // (TAG: DW_TAG_compile_unit) > + .byte 0x1 // DW_children_yes > + .uleb128 0x25 // (DW_AT_producer) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x13 // (DW_AT_language) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x1b // (DW_AT_comp_dir) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x55 // (DW_AT_ranges) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x10 // (DW_AT_stmt_list) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x2 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0x1 // DW_children_yes > + .uleb128 0x3f // (DW_AT_external) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x1 // (DW_AT_sibling) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x3 // (abbrev code) > + .uleb128 0x34 // (TAG: DW_TAG_variable) > + .byte 0 // DW_children_no > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0xe // (DW_FORM_strp) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x2 // (DW_AT_location) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .uleb128 0x2137 // (DW_AT_GNU_locviews) > + .uleb128 0x17 // (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x4 // (abbrev code) > + .uleb128 0x4109 // (TAG: DW_TAG_GNU_call_site) > + .byte 0 // DW_children_no > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x31 // (DW_AT_abstract_origin) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x5 // (abbrev code) > + .uleb128 0x24 // (TAG: DW_TAG_base_type) > + .byte 0 // DW_children_no > + .uleb128 0xb // (DW_AT_byte_size) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3e // (DW_AT_encoding) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0x8 // (DW_FORM_string) > + .byte 0 > + .byte 0 > + .uleb128 0x6 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0x1 // DW_children_yes > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0x8 // (DW_FORM_string) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x1 // (DW_AT_sibling) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x7 // (abbrev code) > + .uleb128 0x4109 // (TAG: DW_TAG_GNU_call_site) > + .byte 0 // DW_children_no > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x2115 // (DW_AT_GNU_tail_call) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x31 // (DW_AT_abstract_origin) > + .uleb128 0x13 // (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x8 // (abbrev code) > + .uleb128 0x2e // (TAG: DW_TAG_subprogram) > + .byte 0 // DW_children_no > + .uleb128 0x3 // (DW_AT_name) > + .uleb128 0x8 // (DW_FORM_string) > + .uleb128 0x3a // (DW_AT_decl_file) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x3b // (DW_AT_decl_line) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x39 // (DW_AT_decl_column) > + .uleb128 0xb // (DW_FORM_data1) > + .uleb128 0x27 // (DW_AT_prototyped) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .uleb128 0x49 // (DW_AT_type) > + .uleb128 0x13 // (DW_FORM_ref4) > + .uleb128 0x11 // (DW_AT_low_pc) > + .uleb128 0x1 // (DW_FORM_addr) > + .uleb128 0x12 // (DW_AT_high_pc) > + .uleb128 0x7 // (DW_FORM_data8) > + .uleb128 0x40 // (DW_AT_frame_base) > + .uleb128 0x18 // (DW_FORM_exprloc) > + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 // (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .byte 0 > + .section .debug_loc,"",@progbits > +.Ldebug_loc0: > +.LVUS0: > + .uleb128 .LVU11 // View list begin (*.LVUS0) > + .uleb128 .LVU12 // View list end (*.LVUS0) > + .uleb128 .LVU12 // View list begin (*.LVUS0) > + .uleb128 .LVU14 // View list end (*.LVUS0) > + .uleb128 .LVU14 // View list begin (*.LVUS0) > + .uleb128 0 // View list end (*.LVUS0) > +.LLST0: > + .8byte .LVL1 // Location list begin address (*.LLST0) > + .8byte .LVL1 // Location list end address (*.LLST0) > + .2byte 0x1 // Location expression size > + .byte 0x50 // DW_OP_reg0 > + .8byte .LVL1 // Location list begin address (*.LLST0) > + .8byte .LVL2 // Location list end address (*.LLST0) > + .2byte 0x3 // Location expression size > + .byte 0x70 // DW_OP_breg0 > + .sleb128 1 > + .byte 0x9f // DW_OP_stack_value > + .8byte .LVL2 // Location list begin address (*.LLST0) > + .8byte .LFE2 // Location list end address (*.LLST0) > + .2byte 0x1 // Location expression size > + .byte 0x50 // DW_OP_reg0 > + .8byte 0 // Location list terminator begin (*.LLST0) > + .8byte 0 // Location list terminator end (*.LLST0) > + .section .debug_aranges,"",@progbits > + .4byte 0x3c // Length of Address Ranges Info > + .2byte 0x2 // DWARF aranges version > + .4byte .Ldebug_info0 // Offset of Compilation Unit Info > + .byte 0x8 // Size of Address > + .byte 0 // Size of Segment Descriptor > + .2byte 0 // Pad to 16 byte boundary > + .2byte 0 > + .8byte .Ltext0 // Address > + .8byte .Letext0-.Ltext0 // Length > + .8byte .LFB2 // Address > + .8byte .LFE2-.LFB2 // Length > + .8byte 0 > + .8byte 0 > + .section .debug_ranges,"",@progbits > +.Ldebug_ranges0: > + .8byte .Ltext0 // Offset 0 > + .8byte .Letext0 > + .8byte .LFB2 // Offset 0x10 > + .8byte .LFE2 > + .8byte 0 > + .8byte 0 > + .section .debug_line,"",@progbits > +.Ldebug_line0: > + .section .debug_str,"MS",@progbits,1 > +.LASF0: > + .string "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" > +.LASF2: > + .string "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > +.LASF4: > + .string "answer" > +.LASF1: > + .string "tailcall.c" > +.LASF3: > + .string "main" > + .ident "GCC: (Debian 10.2.1-3) 10.2.1 20201224" > + .section .note.GNU-stack,"",@progbits > diff --git a/gdb/testsuite/gdb.btrace/arm-instruction_history.S b/gdb/testsuite/gdb.btrace/arm-instruction_history.S > new file mode 100644 > index 00000000000..e73ddaa9be9 > --- /dev/null > +++ b/gdb/testsuite/gdb.btrace/arm-instruction_history.S > @@ -0,0 +1,31 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2013-2021 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/>. */ > + > +.arm > +.text > +.globl loop > +.type loop, %function > +loop: > + movs r0, #2 /* bp.1 */ > +L1: > + cmp r0, #0 > + beq L2 > + subs r0, r0, #1 > + b L1 > +L2: > + bx lr /* bp.2 */ > + > diff --git a/gdb/testsuite/gdb.btrace/arm-record_goto.S b/gdb/testsuite/gdb.btrace/arm-record_goto.S > new file mode 100644 > index 00000000000..2d3a2f0c8de > --- /dev/null > +++ b/gdb/testsuite/gdb.btrace/arm-record_goto.S > @@ -0,0 +1,433 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2013-2019 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/>. > + > + Spurious newline. > + This file has been generated on an armv7 machine using: > + gcc -S -dA -g record_goto.c -o arm-record_goto.S */ > + > + .arch armv7-a > + .eabi_attribute 28, 1 @ Tag_ABI_VFP_args > + .eabi_attribute 20, 1 @ Tag_ABI_FP_denormal > + .eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions > + .eabi_attribute 23, 3 @ Tag_ABI_FP_number_model > + .eabi_attribute 24, 1 @ Tag_ABI_align8_needed > + .eabi_attribute 25, 1 @ Tag_ABI_align8_preserved > + .eabi_attribute 26, 2 @ Tag_ABI_enum_size > + .eabi_attribute 30, 6 @ Tag_ABI_optimization_goals > + .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access > + .eabi_attribute 18, 4 @ Tag_ABI_PCS_wchar_t > + .file "record_goto.c" > + .text > +.Ltext0: > + .cfi_sections .debug_frame > + .align 1 > + .global fun1 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type fun1, %function > +fun1: > +.LFB0: > + .file 1 "record_goto.c" > + @ record_goto.c:22 > + .loc 1 22 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 1, uses_anonymous_args = 0 > + @ link register save eliminated. > +@ BLOCK 2 seq:0 > +@ PRED: ENTRY (FALLTHRU) > + push {r7} > + .cfi_def_cfa_offset 4 > + .cfi_offset 7, -4 > + add r7, sp, #0 > + .cfi_def_cfa_register 7 > + @ record_goto.c:23 > + .loc 1 23 0 > + nop > + mov sp, r7 > + .cfi_def_cfa_register 13 > + @ sp needed > + ldr r7, [sp], #4 > + .cfi_restore 7 > + .cfi_def_cfa_offset 0 > +@ SUCC: EXIT [100.0%] > + bx lr > + .cfi_endproc > +.LFE0: > + .size fun1, .-fun1 > + .align 1 > + .global fun2 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type fun2, %function > +fun2: > +.LFB1: > + @ record_goto.c:27 > + .loc 1 27 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 1, uses_anonymous_args = 0 > +@ BLOCK 2 seq:0 > +@ PRED: ENTRY (FALLTHRU) > + push {r7, lr} > + .cfi_def_cfa_offset 8 > + .cfi_offset 7, -8 > + .cfi_offset 14, -4 > + add r7, sp, #0 > + .cfi_def_cfa_register 7 > + @ record_goto.c:28 > + .loc 1 28 0 > + bl fun1(PLT) > + @ record_goto.c:29 > + .loc 1 29 0 > + nop > +@ SUCC: EXIT [100.0%] > + pop {r7, pc} > + .cfi_endproc > +.LFE1: > + .size fun2, .-fun2 > + .align 1 > + .global fun3 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type fun3, %function > +fun3: > +.LFB2: > + @ record_goto.c:33 > + .loc 1 33 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 1, uses_anonymous_args = 0 > +@ BLOCK 2 seq:0 > +@ PRED: ENTRY (FALLTHRU) > + push {r7, lr} > + .cfi_def_cfa_offset 8 > + .cfi_offset 7, -8 > + .cfi_offset 14, -4 > + add r7, sp, #0 > + .cfi_def_cfa_register 7 > + @ record_goto.c:34 > + .loc 1 34 0 > + bl fun1(PLT) > + @ record_goto.c:35 > + .loc 1 35 0 > + bl fun2(PLT) > + @ record_goto.c:36 > + .loc 1 36 0 > + nop > +@ SUCC: EXIT [100.0%] > + pop {r7, pc} > + .cfi_endproc > +.LFE2: > + .size fun3, .-fun3 > + .align 1 > + .global fun4 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type fun4, %function > +fun4: > +.LFB3: > + @ record_goto.c:40 > + .loc 1 40 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 1, uses_anonymous_args = 0 > +@ BLOCK 2 seq:0 > +@ PRED: ENTRY (FALLTHRU) > + push {r7, lr} > + .cfi_def_cfa_offset 8 > + .cfi_offset 7, -8 > + .cfi_offset 14, -4 > + add r7, sp, #0 > + .cfi_def_cfa_register 7 > + @ record_goto.c:41 > + .loc 1 41 0 > + bl fun1(PLT) > + @ record_goto.c:42 > + .loc 1 42 0 > + bl fun2(PLT) > + @ record_goto.c:43 > + .loc 1 43 0 > + bl fun3(PLT) > + @ record_goto.c:44 > + .loc 1 44 0 > + nop > +@ SUCC: EXIT [100.0%] > + pop {r7, pc} > + .cfi_endproc > +.LFE3: > + .size fun4, .-fun4 > + .align 1 > + .global main > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type main, %function > +main: > +.LFB4: > + @ record_goto.c:48 > + .loc 1 48 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 1, uses_anonymous_args = 0 > +@ BLOCK 2 seq:0 > +@ PRED: ENTRY (FALLTHRU) > + push {r7, lr} > + .cfi_def_cfa_offset 8 > + .cfi_offset 7, -8 > + .cfi_offset 14, -4 > + add r7, sp, #0 > + .cfi_def_cfa_register 7 > + @ record_goto.c:49 > + .loc 1 49 0 > + bl fun4(PLT) > + @ record_goto.c:50 > + .loc 1 50 0 > + movs r3, #0 > + @ record_goto.c:51 > + .loc 1 51 0 > + mov r0, r3 > +@ SUCC: EXIT [100.0%] > + pop {r7, pc} > + .cfi_endproc > +.LFE4: > + .size main, .-main > +.Letext0: > + .section .debug_info,"",%progbits > +.Ldebug_info0: > + .4byte 0x82 @ Length of Compilation Unit Info > + .2byte 0x4 @ DWARF version number > + .4byte .Ldebug_abbrev0 @ Offset Into Abbrev. Section > + .byte 0x4 @ Pointer Size (in bytes) > + .uleb128 0x1 @ (DIE (0xb) DW_TAG_compile_unit) > + .4byte .LASF4 @ DW_AT_producer: "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -fstack-protector-strong" > + .byte 0xc @ DW_AT_language > + .4byte .LASF5 @ DW_AT_name: "record_goto.c" > + .4byte .LASF6 @ DW_AT_comp_dir: "/home/ubuntu/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > + .4byte .Ltext0 @ DW_AT_low_pc > + .4byte .Letext0-.Ltext0 @ DW_AT_high_pc > + .4byte .Ldebug_line0 @ DW_AT_stmt_list > + .uleb128 0x2 @ (DIE (0x25) DW_TAG_subprogram) > + @ DW_AT_external > + .4byte .LASF7 @ DW_AT_name: "main" > + .byte 0x1 @ DW_AT_decl_file (record_goto.c) > + .byte 0x2f @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x3a @ DW_AT_type > + .4byte .LFB4 @ DW_AT_low_pc > + .4byte .LFE4-.LFB4 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_tail_call_sites > + .uleb128 0x3 @ (DIE (0x3a) DW_TAG_base_type) > + .byte 0x4 @ DW_AT_byte_size > + .byte 0x5 @ DW_AT_encoding > + .ascii "int\0" @ DW_AT_name > + .uleb128 0x4 @ (DIE (0x41) DW_TAG_subprogram) > + @ DW_AT_external > + .4byte .LASF0 @ DW_AT_name: "fun4" > + .byte 0x1 @ DW_AT_decl_file (record_goto.c) > + .byte 0x27 @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte .LFB3 @ DW_AT_low_pc > + .4byte .LFE3-.LFB3 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_tail_call_sites > + .uleb128 0x4 @ (DIE (0x52) DW_TAG_subprogram) > + @ DW_AT_external > + .4byte .LASF1 @ DW_AT_name: "fun3" > + .byte 0x1 @ DW_AT_decl_file (record_goto.c) > + .byte 0x20 @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte .LFB2 @ DW_AT_low_pc > + .4byte .LFE2-.LFB2 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_tail_call_sites > + .uleb128 0x4 @ (DIE (0x63) DW_TAG_subprogram) > + @ DW_AT_external > + .4byte .LASF2 @ DW_AT_name: "fun2" > + .byte 0x1 @ DW_AT_decl_file (record_goto.c) > + .byte 0x1a @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte .LFB1 @ DW_AT_low_pc > + .4byte .LFE1-.LFB1 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_tail_call_sites > + .uleb128 0x5 @ (DIE (0x74) DW_TAG_subprogram) > + @ DW_AT_external > + .4byte .LASF3 @ DW_AT_name: "fun1" > + .byte 0x1 @ DW_AT_decl_file (record_goto.c) > + .byte 0x15 @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte .LFB0 @ DW_AT_low_pc > + .4byte .LFE0-.LFB0 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .byte 0 @ end of children of DIE 0xb > + .section .debug_abbrev,"",%progbits > +.Ldebug_abbrev0: > + .uleb128 0x1 @ (abbrev code) > + .uleb128 0x11 @ (TAG: DW_TAG_compile_unit) > + .byte 0x1 @ DW_children_yes > + .uleb128 0x25 @ (DW_AT_producer) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x13 @ (DW_AT_language) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x1b @ (DW_AT_comp_dir) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x10 @ (DW_AT_stmt_list) > + .uleb128 0x17 @ (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x2 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0 @ DW_children_no > + .uleb128 0x3f @ (DW_AT_external) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2116 @ (DW_AT_GNU_all_tail_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .uleb128 0x3 @ (abbrev code) > + .uleb128 0x24 @ (TAG: DW_TAG_base_type) > + .byte 0 @ DW_children_no > + .uleb128 0xb @ (DW_AT_byte_size) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3e @ (DW_AT_encoding) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0x8 @ (DW_FORM_string) > + .byte 0 > + .byte 0 > + .uleb128 0x4 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0 @ DW_children_no > + .uleb128 0x3f @ (DW_AT_external) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2116 @ (DW_AT_GNU_all_tail_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .uleb128 0x5 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0 @ DW_children_no > + .uleb128 0x3f @ (DW_AT_external) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .byte 0 > + .section .debug_aranges,"",%progbits > + .4byte 0x1c @ Length of Address Ranges Info > + .2byte 0x2 @ DWARF Version > + .4byte .Ldebug_info0 @ Offset of Compilation Unit Info > + .byte 0x4 @ Size of Address > + .byte 0 @ Size of Segment Descriptor > + .2byte 0 @ Pad to 8 byte boundary > + .2byte 0 > + .4byte .Ltext0 @ Address > + .4byte .Letext0-.Ltext0 @ Length > + .4byte 0 > + .4byte 0 > + .section .debug_line,"",%progbits > +.Ldebug_line0: > + .section .debug_str,"MS",%progbits,1 > +.LASF5: > + .ascii "record_goto.c\000" > +.LASF2: > + .ascii "fun2\000" > +.LASF6: > + .ascii "/home/ubuntu/development/gdb/binutils-gdb/gdb/tests" > + .ascii "uite/gdb.btrace\000" > +.LASF4: > + .ascii "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu" > + .ascii "=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -fstack-pro" > + .ascii "tector-strong\000" > +.LASF0: > + .ascii "fun4\000" > +.LASF3: > + .ascii "fun1\000" > +.LASF7: > + .ascii "main\000" > +.LASF1: > + .ascii "fun3\000" > + .ident "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0" > + .section .note.GNU-stack,"",%progbits > diff --git a/gdb/testsuite/gdb.btrace/arm-tailcall-only.S b/gdb/testsuite/gdb.btrace/arm-tailcall-only.S > new file mode 100644 > index 00000000000..b7f4e4a3fce > --- /dev/null > +++ b/gdb/testsuite/gdb.btrace/arm-tailcall-only.S > @@ -0,0 +1,504 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2016-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/>. > + > + Spurious newline. > + This file has been generated on an armv7 machine using: > + gcc -S -O2 -dA -g tailcall-only.c -o arm-tailcall-only.S */ > + > + .eabi_attribute 28, 1 @ Tag_ABI_VFP_args > + .eabi_attribute 20, 1 @ Tag_ABI_FP_denormal > + .eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions > + .eabi_attribute 23, 3 @ Tag_ABI_FP_number_model > + .eabi_attribute 24, 1 @ Tag_ABI_align8_needed > + .eabi_attribute 25, 1 @ Tag_ABI_align8_preserved > + .eabi_attribute 26, 2 @ Tag_ABI_enum_size > + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals > + .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access > + .eabi_attribute 18, 4 @ Tag_ABI_PCS_wchar_t > + .file "tailcall-only.c" > + .text > +.Ltext0: > + .cfi_sections .debug_frame > + .align 1 > + .p2align 2,,3 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type bar_1, %function > +bar_1: > +.LFB0: > + .file 1 "tailcall-only.c" > + @ tailcall-only.c:22 > + .loc 1 22 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 0, uses_anonymous_args = 0 > + @ link register save eliminated. > +@ BLOCK 2 freq:10000 seq:0 > +@ PRED: ENTRY [100.0%] (FALLTHRU) > + @ tailcall-only.c:24 > + .loc 1 24 0 > + movs r0, #42 > +@ SUCC: EXIT [100.0%] > + bx lr > + .cfi_endproc > +.LFE0: > + .size bar_1, .-bar_1 > + .align 1 > + .p2align 2,,3 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type bar, %function > +bar: > +.LFB1: > + @ tailcall-only.c:28 > + .loc 1 28 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 0, uses_anonymous_args = 0 > + @ link register save eliminated. > +@ BLOCK 2 freq:10000 seq:0 > +@ PRED: ENTRY [100.0%] (FALLTHRU) > +@ SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) > + @ tailcall-only.c:29 > + .loc 1 29 0 > + b bar_1(PLT) > +.LVL0: > + .cfi_endproc > +.LFE1: > + .size bar, .-bar > + .align 1 > + .p2align 2,,3 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type foo_1, %function > +foo_1: > +.LFB2: > + @ tailcall-only.c:34 > + .loc 1 34 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 0, uses_anonymous_args = 0 > + @ link register save eliminated. > +@ BLOCK 2 freq:10000 seq:0 > +@ PRED: ENTRY [100.0%] (FALLTHRU) > +@ SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) > + @ tailcall-only.c:35 > + .loc 1 35 0 > + b bar(PLT) > +.LVL1: > + .cfi_endproc > +.LFE2: > + .size foo_1, .-foo_1 > + .align 1 > + .p2align 2,,3 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type foo, %function > +foo: > +.LFB3: > + @ tailcall-only.c:40 > + .loc 1 40 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 0, uses_anonymous_args = 0 > + @ link register save eliminated. > +@ BLOCK 2 freq:10000 seq:0 > +@ PRED: ENTRY [100.0%] (FALLTHRU) > +@ SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) > + @ tailcall-only.c:41 > + .loc 1 41 0 > + b foo_1(PLT) > +.LVL2: > + .cfi_endproc > +.LFE3: > + .size foo, .-foo > + .section .text.startup,"ax",%progbits > + .align 1 > + .p2align 2,,3 > + .global main > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type main, %function > +main: > +.LFB4: > + @ tailcall-only.c:46 > + .loc 1 46 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 0, uses_anonymous_args = 0 > +@ BLOCK 2 freq:10000 seq:0 > +@ PRED: ENTRY [100.0%] (FALLTHRU) > + push {r3, lr} > + .cfi_def_cfa_offset 8 > + .cfi_offset 3, -8 > + .cfi_offset 14, -4 > + @ tailcall-only.c:49 > + .loc 1 49 0 > + bl foo(PLT) > +.LVL3: > + @ tailcall-only.c:53 > + .loc 1 53 0 > + adds r0, r0, #1 > +.LVL4: > +@ SUCC: EXIT [100.0%] > + pop {r3, pc} > + .cfi_endproc > +.LFE4: > + .size main, .-main > + .text > +.Letext0: > + .section .debug_info,"",%progbits > +.Ldebug_info0: > + .4byte 0xd9 @ Length of Compilation Unit Info > + .2byte 0x4 @ DWARF version number > + .4byte .Ldebug_abbrev0 @ Offset Into Abbrev. Section > + .byte 0x4 @ Pointer Size (in bytes) > + .uleb128 0x1 @ (DIE (0xb) DW_TAG_compile_unit) > + .4byte .LASF1 @ DW_AT_producer: "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -O2 -fstack-protector-strong" > + .byte 0xc @ DW_AT_language > + .4byte .LASF2 @ DW_AT_name: "tailcall-only.c" > + .4byte .LASF3 @ DW_AT_comp_dir: "/home/ubuntu/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > + .4byte .Ldebug_ranges0+0 @ DW_AT_ranges > + .4byte 0 @ DW_AT_low_pc > + .4byte .Ldebug_line0 @ DW_AT_stmt_list > + .uleb128 0x2 @ (DIE (0x25) DW_TAG_subprogram) > + @ DW_AT_external > + .4byte .LASF4 @ DW_AT_name: "main" > + .byte 0x1 @ DW_AT_decl_file (tailcall-only.c) > + .byte 0x2d @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x57 @ DW_AT_type > + .4byte .LFB4 @ DW_AT_low_pc > + .4byte .LFE4-.LFB4 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .4byte 0x57 @ DW_AT_sibling > + .uleb128 0x3 @ (DIE (0x3e) DW_TAG_variable) > + .4byte .LASF5 @ DW_AT_name: "answer" > + .byte 0x1 @ DW_AT_decl_file (tailcall-only.c) > + .byte 0x2f @ DW_AT_decl_line > + .4byte 0x57 @ DW_AT_type > + .4byte .LLST0 @ DW_AT_location > + .uleb128 0x4 @ (DIE (0x4d) DW_TAG_GNU_call_site) > + .4byte .LVL3 @ DW_AT_low_pc > + .4byte 0x5e @ DW_AT_abstract_origin > + .byte 0 @ end of children of DIE 0x25 > + .uleb128 0x5 @ (DIE (0x57) DW_TAG_base_type) > + .byte 0x4 @ DW_AT_byte_size > + .byte 0x5 @ DW_AT_encoding > + .ascii "int\0" @ DW_AT_name > + .uleb128 0x6 @ (DIE (0x5e) DW_TAG_subprogram) > + .ascii "foo\0" @ DW_AT_name > + .byte 0x1 @ DW_AT_decl_file (tailcall-only.c) > + .byte 0x27 @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x57 @ DW_AT_type > + .4byte .LFB3 @ DW_AT_low_pc > + .4byte .LFE3-.LFB3 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .4byte 0x81 @ DW_AT_sibling > + .uleb128 0x7 @ (DIE (0x77) DW_TAG_GNU_call_site) > + .4byte .LVL2 @ DW_AT_low_pc > + @ DW_AT_GNU_tail_call > + .4byte 0x81 @ DW_AT_abstract_origin > + .byte 0 @ end of children of DIE 0x5e > + .uleb128 0x8 @ (DIE (0x81) DW_TAG_subprogram) > + .4byte .LASF0 @ DW_AT_name: "foo_1" > + .byte 0x1 @ DW_AT_decl_file (tailcall-only.c) > + .byte 0x21 @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x57 @ DW_AT_type > + .4byte .LFB2 @ DW_AT_low_pc > + .4byte .LFE2-.LFB2 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .4byte 0xa4 @ DW_AT_sibling > + .uleb128 0x7 @ (DIE (0x9a) DW_TAG_GNU_call_site) > + .4byte .LVL1 @ DW_AT_low_pc > + @ DW_AT_GNU_tail_call > + .4byte 0xa4 @ DW_AT_abstract_origin > + .byte 0 @ end of children of DIE 0x81 > + .uleb128 0x6 @ (DIE (0xa4) DW_TAG_subprogram) > + .ascii "bar\0" @ DW_AT_name > + .byte 0x1 @ DW_AT_decl_file (tailcall-only.c) > + .byte 0x1b @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x57 @ DW_AT_type > + .4byte .LFB1 @ DW_AT_low_pc > + .4byte .LFE1-.LFB1 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .4byte 0xc7 @ DW_AT_sibling > + .uleb128 0x7 @ (DIE (0xbd) DW_TAG_GNU_call_site) > + .4byte .LVL0 @ DW_AT_low_pc > + @ DW_AT_GNU_tail_call > + .4byte 0xc7 @ DW_AT_abstract_origin > + .byte 0 @ end of children of DIE 0xa4 > + .uleb128 0x9 @ (DIE (0xc7) DW_TAG_subprogram) > + .4byte .LASF6 @ DW_AT_name: "bar_1" > + .byte 0x1 @ DW_AT_decl_file (tailcall-only.c) > + .byte 0x15 @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x57 @ DW_AT_type > + .4byte .LFB0 @ DW_AT_low_pc > + .4byte .LFE0-.LFB0 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .byte 0 @ end of children of DIE 0xb > + .section .debug_abbrev,"",%progbits > +.Ldebug_abbrev0: > + .uleb128 0x1 @ (abbrev code) > + .uleb128 0x11 @ (TAG: DW_TAG_compile_unit) > + .byte 0x1 @ DW_children_yes > + .uleb128 0x25 @ (DW_AT_producer) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x13 @ (DW_AT_language) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x1b @ (DW_AT_comp_dir) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x55 @ (DW_AT_ranges) > + .uleb128 0x17 @ (DW_FORM_sec_offset) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x10 @ (DW_AT_stmt_list) > + .uleb128 0x17 @ (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x2 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0x1 @ DW_children_yes > + .uleb128 0x3f @ (DW_AT_external) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x1 @ (DW_AT_sibling) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x3 @ (abbrev code) > + .uleb128 0x34 @ (TAG: DW_TAG_variable) > + .byte 0 @ DW_children_no > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x2 @ (DW_AT_location) > + .uleb128 0x17 @ (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x4 @ (abbrev code) > + .uleb128 0x4109 @ (TAG: DW_TAG_GNU_call_site) > + .byte 0 @ DW_children_no > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x31 @ (DW_AT_abstract_origin) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x5 @ (abbrev code) > + .uleb128 0x24 @ (TAG: DW_TAG_base_type) > + .byte 0 @ DW_children_no > + .uleb128 0xb @ (DW_AT_byte_size) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3e @ (DW_AT_encoding) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0x8 @ (DW_FORM_string) > + .byte 0 > + .byte 0 > + .uleb128 0x6 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0x1 @ DW_children_yes > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0x8 @ (DW_FORM_string) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x1 @ (DW_AT_sibling) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x7 @ (abbrev code) > + .uleb128 0x4109 @ (TAG: DW_TAG_GNU_call_site) > + .byte 0 @ DW_children_no > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x2115 @ (DW_AT_GNU_tail_call) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x31 @ (DW_AT_abstract_origin) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x8 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0x1 @ DW_children_yes > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x1 @ (DW_AT_sibling) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x9 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0 @ DW_children_no > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .byte 0 > + .section .debug_loc,"",%progbits > +.Ldebug_loc0: > +.LLST0: > + .4byte .LVL3 @ Location list begin address (*.LLST0) > + .4byte .LVL4 @ Location list end address (*.LLST0) > + .2byte 0x3 @ Location expression size > + .byte 0x70 @ DW_OP_breg0 > + .sleb128 1 > + .byte 0x9f @ DW_OP_stack_value > + .4byte .LVL4 @ Location list begin address (*.LLST0) > + .4byte .LFE4 @ Location list end address (*.LLST0) > + .2byte 0x1 @ Location expression size > + .byte 0x50 @ DW_OP_reg0 > + .4byte 0 @ Location list terminator begin (*.LLST0) > + .4byte 0 @ Location list terminator end (*.LLST0) > + .section .debug_aranges,"",%progbits > + .4byte 0x24 @ Length of Address Ranges Info > + .2byte 0x2 @ DWARF Version > + .4byte .Ldebug_info0 @ Offset of Compilation Unit Info > + .byte 0x4 @ Size of Address > + .byte 0 @ Size of Segment Descriptor > + .2byte 0 @ Pad to 8 byte boundary > + .2byte 0 > + .4byte .Ltext0 @ Address > + .4byte .Letext0-.Ltext0 @ Length > + .4byte .LFB4 @ Address > + .4byte .LFE4-.LFB4 @ Length > + .4byte 0 > + .4byte 0 > + .section .debug_ranges,"",%progbits > +.Ldebug_ranges0: > + .4byte .Ltext0 @ Offset 0 > + .4byte .Letext0 > + .4byte .LFB4 @ Offset 0x8 > + .4byte .LFE4 > + .4byte 0 > + .4byte 0 > + .section .debug_line,"",%progbits > +.Ldebug_line0: > + .section .debug_str,"MS",%progbits,1 > +.LASF2: > + .ascii "tailcall-only.c\000" > +.LASF5: > + .ascii "answer\000" > +.LASF1: > + .ascii "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu" > + .ascii "=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -O2 -fstack" > + .ascii "-protector-strong\000" > +.LASF4: > + .ascii "main\000" > +.LASF6: > + .ascii "bar_1\000" > +.LASF3: > + .ascii "/home/ubuntu/development/gdb/binutils-gdb/gdb/tests" > + .ascii "uite/gdb.btrace\000" > +.LASF0: > + .ascii "foo_1\000" > + .ident "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0" > + .section .note.GNU-stack,"",%progbits > diff --git a/gdb/testsuite/gdb.btrace/arm-tailcall.S b/gdb/testsuite/gdb.btrace/arm-tailcall.S > new file mode 100644 > index 00000000000..125b614524a > --- /dev/null > +++ b/gdb/testsuite/gdb.btrace/arm-tailcall.S > @@ -0,0 +1,391 @@ > + /* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2013-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/>. > + > + Spurious newline. > + This file has been generated on an armv7 machine using: > + gcc -S -O2 -dA -g tailcall.c -o arm-tailcall.S */ > + > + .eabi_attribute 28, 1 @ Tag_ABI_VFP_args > + .eabi_attribute 20, 1 @ Tag_ABI_FP_denormal > + .eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions > + .eabi_attribute 23, 3 @ Tag_ABI_FP_number_model > + .eabi_attribute 24, 1 @ Tag_ABI_align8_needed > + .eabi_attribute 25, 1 @ Tag_ABI_align8_preserved > + .eabi_attribute 26, 2 @ Tag_ABI_enum_size > + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals > + .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access > + .eabi_attribute 18, 4 @ Tag_ABI_PCS_wchar_t > + .file "tailcall.c" > + .text > +.Ltext0: > + .cfi_sections .debug_frame > + .align 1 > + .p2align 2,,3 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type bar, %function > +bar: > +.LFB0: > + .file 1 "tailcall.c" > + @ tailcall.c:22 > + .loc 1 22 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 0, uses_anonymous_args = 0 > + @ link register save eliminated. > +@ BLOCK 2 freq:10000 seq:0 > +@ PRED: ENTRY [100.0%] (FALLTHRU) > + @ tailcall.c:24 > + .loc 1 24 0 > + movs r0, #42 > +@ SUCC: EXIT [100.0%] > + bx lr > + .cfi_endproc > +.LFE0: > + .size bar, .-bar > + .align 1 > + .p2align 2,,3 > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type foo, %function > +foo: > +.LFB1: > + @ tailcall.c:28 > + .loc 1 28 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 0, uses_anonymous_args = 0 > + @ link register save eliminated. > +@ BLOCK 2 freq:10000 seq:0 > +@ PRED: ENTRY [100.0%] (FALLTHRU) > +@ SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) > + @ tailcall.c:29 > + .loc 1 29 0 > + b bar(PLT) > +.LVL0: > + .cfi_endproc > +.LFE1: > + .size foo, .-foo > + .section .text.startup,"ax",%progbits > + .align 1 > + .p2align 2,,3 > + .global main > + .syntax unified > + .thumb > + .thumb_func > + .fpu vfpv3-d16 > + .type main, %function > +main: > +.LFB2: > + @ tailcall.c:34 > + .loc 1 34 0 > + .cfi_startproc > + @ args = 0, pretend = 0, frame = 0 > + @ frame_needed = 0, uses_anonymous_args = 0 > +@ BLOCK 2 freq:10000 seq:0 > +@ PRED: ENTRY [100.0%] (FALLTHRU) > + push {r3, lr} > + .cfi_def_cfa_offset 8 > + .cfi_offset 3, -8 > + .cfi_offset 14, -4 > + @ tailcall.c:37 > + .loc 1 37 0 > + bl foo(PLT) > +.LVL1: > + @ tailcall.c:41 > + .loc 1 41 0 > + adds r0, r0, #1 > +.LVL2: > +@ SUCC: EXIT [100.0%] > + pop {r3, pc} > + .cfi_endproc > +.LFE2: > + .size main, .-main > + .text > +.Letext0: > + .section .debug_info,"",%progbits > +.Ldebug_info0: > + .4byte 0x93 @ Length of Compilation Unit Info > + .2byte 0x4 @ DWARF version number > + .4byte .Ldebug_abbrev0 @ Offset Into Abbrev. Section > + .byte 0x4 @ Pointer Size (in bytes) > + .uleb128 0x1 @ (DIE (0xb) DW_TAG_compile_unit) > + .4byte .LASF0 @ DW_AT_producer: "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -O2 -fstack-protector-strong" > + .byte 0xc @ DW_AT_language > + .4byte .LASF1 @ DW_AT_name: "tailcall.c" > + .4byte .LASF2 @ DW_AT_comp_dir: "/home/ubuntu/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" > + .4byte .Ldebug_ranges0+0 @ DW_AT_ranges > + .4byte 0 @ DW_AT_low_pc > + .4byte .Ldebug_line0 @ DW_AT_stmt_list > + .uleb128 0x2 @ (DIE (0x25) DW_TAG_subprogram) > + @ DW_AT_external > + .4byte .LASF3 @ DW_AT_name: "main" > + .byte 0x1 @ DW_AT_decl_file (tailcall.c) > + .byte 0x21 @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x57 @ DW_AT_type > + .4byte .LFB2 @ DW_AT_low_pc > + .4byte .LFE2-.LFB2 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .4byte 0x57 @ DW_AT_sibling > + .uleb128 0x3 @ (DIE (0x3e) DW_TAG_variable) > + .4byte .LASF4 @ DW_AT_name: "answer" > + .byte 0x1 @ DW_AT_decl_file (tailcall.c) > + .byte 0x23 @ DW_AT_decl_line > + .4byte 0x57 @ DW_AT_type > + .4byte .LLST0 @ DW_AT_location > + .uleb128 0x4 @ (DIE (0x4d) DW_TAG_GNU_call_site) > + .4byte .LVL1 @ DW_AT_low_pc > + .4byte 0x5e @ DW_AT_abstract_origin > + .byte 0 @ end of children of DIE 0x25 > + .uleb128 0x5 @ (DIE (0x57) DW_TAG_base_type) > + .byte 0x4 @ DW_AT_byte_size > + .byte 0x5 @ DW_AT_encoding > + .ascii "int\0" @ DW_AT_name > + .uleb128 0x6 @ (DIE (0x5e) DW_TAG_subprogram) > + .ascii "foo\0" @ DW_AT_name > + .byte 0x1 @ DW_AT_decl_file (tailcall.c) > + .byte 0x1b @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x57 @ DW_AT_type > + .4byte .LFB1 @ DW_AT_low_pc > + .4byte .LFE1-.LFB1 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .4byte 0x81 @ DW_AT_sibling > + .uleb128 0x7 @ (DIE (0x77) DW_TAG_GNU_call_site) > + .4byte .LVL0 @ DW_AT_low_pc > + @ DW_AT_GNU_tail_call > + .4byte 0x81 @ DW_AT_abstract_origin > + .byte 0 @ end of children of DIE 0x5e > + .uleb128 0x8 @ (DIE (0x81) DW_TAG_subprogram) > + .ascii "bar\0" @ DW_AT_name > + .byte 0x1 @ DW_AT_decl_file (tailcall.c) > + .byte 0x15 @ DW_AT_decl_line > + @ DW_AT_prototyped > + .4byte 0x57 @ DW_AT_type > + .4byte .LFB0 @ DW_AT_low_pc > + .4byte .LFE0-.LFB0 @ DW_AT_high_pc > + .uleb128 0x1 @ DW_AT_frame_base > + .byte 0x9c @ DW_OP_call_frame_cfa > + @ DW_AT_GNU_all_call_sites > + .byte 0 @ end of children of DIE 0xb > + .section .debug_abbrev,"",%progbits > +.Ldebug_abbrev0: > + .uleb128 0x1 @ (abbrev code) > + .uleb128 0x11 @ (TAG: DW_TAG_compile_unit) > + .byte 0x1 @ DW_children_yes > + .uleb128 0x25 @ (DW_AT_producer) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x13 @ (DW_AT_language) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x1b @ (DW_AT_comp_dir) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x55 @ (DW_AT_ranges) > + .uleb128 0x17 @ (DW_FORM_sec_offset) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x10 @ (DW_AT_stmt_list) > + .uleb128 0x17 @ (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x2 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0x1 @ DW_children_yes > + .uleb128 0x3f @ (DW_AT_external) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x1 @ (DW_AT_sibling) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x3 @ (abbrev code) > + .uleb128 0x34 @ (TAG: DW_TAG_variable) > + .byte 0 @ DW_children_no > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0xe @ (DW_FORM_strp) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x2 @ (DW_AT_location) > + .uleb128 0x17 @ (DW_FORM_sec_offset) > + .byte 0 > + .byte 0 > + .uleb128 0x4 @ (abbrev code) > + .uleb128 0x4109 @ (TAG: DW_TAG_GNU_call_site) > + .byte 0 @ DW_children_no > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x31 @ (DW_AT_abstract_origin) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x5 @ (abbrev code) > + .uleb128 0x24 @ (TAG: DW_TAG_base_type) > + .byte 0 @ DW_children_no > + .uleb128 0xb @ (DW_AT_byte_size) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3e @ (DW_AT_encoding) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0x8 @ (DW_FORM_string) > + .byte 0 > + .byte 0 > + .uleb128 0x6 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0x1 @ DW_children_yes > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0x8 @ (DW_FORM_string) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x1 @ (DW_AT_sibling) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x7 @ (abbrev code) > + .uleb128 0x4109 @ (TAG: DW_TAG_GNU_call_site) > + .byte 0 @ DW_children_no > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x2115 @ (DW_AT_GNU_tail_call) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x31 @ (DW_AT_abstract_origin) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .byte 0 > + .byte 0 > + .uleb128 0x8 @ (abbrev code) > + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) > + .byte 0 @ DW_children_no > + .uleb128 0x3 @ (DW_AT_name) > + .uleb128 0x8 @ (DW_FORM_string) > + .uleb128 0x3a @ (DW_AT_decl_file) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x3b @ (DW_AT_decl_line) > + .uleb128 0xb @ (DW_FORM_data1) > + .uleb128 0x27 @ (DW_AT_prototyped) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .uleb128 0x49 @ (DW_AT_type) > + .uleb128 0x13 @ (DW_FORM_ref4) > + .uleb128 0x11 @ (DW_AT_low_pc) > + .uleb128 0x1 @ (DW_FORM_addr) > + .uleb128 0x12 @ (DW_AT_high_pc) > + .uleb128 0x6 @ (DW_FORM_data4) > + .uleb128 0x40 @ (DW_AT_frame_base) > + .uleb128 0x18 @ (DW_FORM_exprloc) > + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) > + .uleb128 0x19 @ (DW_FORM_flag_present) > + .byte 0 > + .byte 0 > + .byte 0 > + .section .debug_loc,"",%progbits > +.Ldebug_loc0: > +.LLST0: > + .4byte .LVL1 @ Location list begin address (*.LLST0) > + .4byte .LVL2 @ Location list end address (*.LLST0) > + .2byte 0x3 @ Location expression size > + .byte 0x70 @ DW_OP_breg0 > + .sleb128 1 > + .byte 0x9f @ DW_OP_stack_value > + .4byte .LVL2 @ Location list begin address (*.LLST0) > + .4byte .LFE2 @ Location list end address (*.LLST0) > + .2byte 0x1 @ Location expression size > + .byte 0x50 @ DW_OP_reg0 > + .4byte 0 @ Location list terminator begin (*.LLST0) > + .4byte 0 @ Location list terminator end (*.LLST0) > + .section .debug_aranges,"",%progbits > + .4byte 0x24 @ Length of Address Ranges Info > + .2byte 0x2 @ DWARF Version > + .4byte .Ldebug_info0 @ Offset of Compilation Unit Info > + .byte 0x4 @ Size of Address > + .byte 0 @ Size of Segment Descriptor > + .2byte 0 @ Pad to 8 byte boundary > + .2byte 0 > + .4byte .Ltext0 @ Address > + .4byte .Letext0-.Ltext0 @ Length > + .4byte .LFB2 @ Address > + .4byte .LFE2-.LFB2 @ Length > + .4byte 0 > + .4byte 0 > + .section .debug_ranges,"",%progbits > +.Ldebug_ranges0: > + .4byte .Ltext0 @ Offset 0 > + .4byte .Letext0 > + .4byte .LFB2 @ Offset 0x8 > + .4byte .LFE2 > + .4byte 0 > + .4byte 0 > + .section .debug_line,"",%progbits > +.Ldebug_line0: > + .section .debug_str,"MS",%progbits,1 > +.LASF0: > + .ascii "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu" > + .ascii "=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -O2 -fstack" > + .ascii "-protector-strong\000" > +.LASF4: > + .ascii "answer\000" > +.LASF1: > + .ascii "tailcall.c\000" > +.LASF2: > + .ascii "/home/ubuntu/development/gdb/binutils-gdb/gdb/tests" > + .ascii "uite/gdb.btrace\000" > +.LASF3: > + .ascii "main\000" > + .ident "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0" > + .section .note.GNU-stack,"",%progbits > diff --git a/gdb/testsuite/gdb.btrace/buffer-size.exp b/gdb/testsuite/gdb.btrace/buffer-size.exp > index ea4e36c1593..77d7b77852a 100644 > --- a/gdb/testsuite/gdb.btrace/buffer-size.exp > +++ b/gdb/testsuite/gdb.btrace/buffer-size.exp > @@ -32,10 +32,17 @@ if ![runto_main] { > return -1 > } > > -gdb_test_no_output "set record btrace bts buffer-size 1" > -gdb_test_no_output "set record btrace pt buffer-size 1" > -gdb_test "show record btrace bts buffer-size" "The record/replay bts buffer size is 1\.\r" > -gdb_test "show record btrace pt buffer-size" "The record/replay pt buffer size is 1\.\r" > +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { > + gdb_test_no_output "set record btrace bts buffer-size 1" > + gdb_test_no_output "set record btrace pt buffer-size 1" > + gdb_test "show record btrace bts buffer-size" "The record/replay bts buffer size is 1\.\r" > + gdb_test "show record btrace pt buffer-size" "The record/replay pt buffer size is 1\.\r" > +} > + > +if {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { > + gdb_test_no_output "set record btrace etm buffer-size 1" > + gdb_test "show record btrace etm buffer-size" "The record/replay etm buffer size is 1\.\r" > +} To avoid duplication of code, I think we could simplify this by checking for the architecture and then creating a list of the btrace formats we're dealing with. Something like: set btrace_type "" if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { set btrace_type { "bts" "pt" } } elseif {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { set btrace_type { "etm" } Then have a for loop over btrace_type entries and write the tests only once... foreach_with_prefix format $btrace_format { gdb_test_no_output "set record btrace $format buffer-size 1" gdb_test "show record btrace $format buffer-size" "The record/replay $format buffer size is 1\.\r" } I'd apply this to any other cases where it is possible. That way we avoid duplicated code with hardcoded content on them, which tends to be hard to maintain and update. > > gdb_test_no_output "record btrace" > gdb_test "info record" [multi_line \ > diff --git a/gdb/testsuite/gdb.btrace/delta.exp b/gdb/testsuite/gdb.btrace/delta.exp > index 9f6d741c013..2c8bada2065 100644 > --- a/gdb/testsuite/gdb.btrace/delta.exp > +++ b/gdb/testsuite/gdb.btrace/delta.exp > @@ -58,8 +58,18 @@ proc check_trace {} { > "Recording format: .*" \ > "Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \ > ] > + if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { > gdb_test "record instruction-history /f 1" \ > "1\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov *\\\$0x0,%eax\r" > + } > + if { [istarget "arm*-*-*"] } { > + gdb_test "record instruction-history /f 1" \ > + "1\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmovs\tr3, #0\r" > + } > + if { [istarget "aarch64*-*-*"]} { > + gdb_test "record instruction-history /f 1" \ > + "1\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov\tw0, #0x0.*\r" > + } > gdb_test "record function-call-history /c 1" "1\tmain" > } > > diff --git a/gdb/testsuite/gdb.btrace/instruction_history.exp b/gdb/testsuite/gdb.btrace/instruction_history.exp > index 403085c083f..76fcadb9ac2 100644 > --- a/gdb/testsuite/gdb.btrace/instruction_history.exp > +++ b/gdb/testsuite/gdb.btrace/instruction_history.exp > @@ -21,8 +21,14 @@ if { [skip_btrace_tests] } { > unsupported "target does not support record-btrace" > return -1 > } > +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { > + standard_testfile instruction_history.c x86-instruction_history.S > +} elseif { [istarget "arm*-*-*"] } { > + standard_testfile instruction_history.c arm-instruction_history.S > +} elseif { [istarget "aarch64*-*-*"]} { > + standard_testfile instruction_history.c aarch64-instruction_history.S Same here. I'd use the conditional blocks to set the prefix for the source file, then call standard_testfile only once. > +} > > -standard_testfile .c .S > if [prepare_for_testing "failed to prepare" $testfile "$srcfile $srcfile2" {debug}] { > return -1 > } > @@ -68,39 +74,128 @@ if { $traced != 11 } { > } > > # test that we see the expected instructions > -gdb_test "record instruction-history 3,7" [multi_line \ > +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { > + gdb_test "record instruction-history 3,7" [multi_line \ > "3\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \ > "4\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ > "5\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \ > "6\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ > "7\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" \ > ] > +} > +if { [istarget "arm*-*-*"] } { > + gdb_test "record instruction-history 3,7" [multi_line \ > + "3\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ > + "4\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ > + "5\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ > + "6\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ > + "7\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ > + ] > +} > +if { [istarget "aarch64*-*-*"]} { > + gdb_test "record instruction-history 3,7" [multi_line \ > + "3\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2>.*" \ > + "4\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ > + "5\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ > + "6\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ > + "7\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2>.*\r" \ > + ] > +} > > -gdb_test "record instruction-history /f 3,+5" [multi_line \ > +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { > + gdb_test "record instruction-history /f 3,+5" [multi_line \ > "3\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \ > "4\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \ > "5\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \ > "6\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ > "7\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" \ > ] > +} > +if { [istarget "arm*-*-*"] } { > + gdb_test "record instruction-history /f 3,+5" [multi_line \ > + "3\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ > + "4\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ > + "5\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ > + "6\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ > + "7\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ > + ] > +} > +if { [istarget "aarch64*-*-*"]} { > + gdb_test "record instruction-history /f 3,+5" [multi_line \ > + "3\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2>.*" \ > + "4\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ > + "5\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ > + "6\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ > + "7\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2>.*\r" \ > + ] > +} > > -gdb_test "record instruction-history /p 7,-5" [multi_line \ > +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { > + gdb_test "record instruction-history /p 7,-5" [multi_line \ > "3\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \ > "4\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ > "5\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \ > "6\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ > "7\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" \ > ] > +} > +if { [istarget "arm*-*-*"] } { > + gdb_test "record instruction-history /p 7,-5" [multi_line \ > + "3\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ > + "4\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ > + "5\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ > + "6\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ > + "7\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ > + ] > +} > +if { [istarget "aarch64*-*-*"]} { > + gdb_test "record instruction-history /p 7,-5" [multi_line \ > + "3\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2>.*" \ > + "4\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ > + "5\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ > + "6\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ > + "7\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2>.*\r" \ > + ] > +} > > -gdb_test "record instruction-history /pf 3,7" [multi_line \ > + > +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { > + gdb_test "record instruction-history /pf 3,7" [multi_line \ > "3\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \ > "4\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \ > "5\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \ > "6\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ > "7\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" \ > ] > +} > +if { [istarget "arm*-*-*"] } { > + gdb_test "record instruction-history /pf 3,7" [multi_line \ > + "3\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ > + "4\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ > + "5\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ > + "6\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ > + "7\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ > + ] > +} > +if { [istarget "aarch64*-*-*"]} { > + gdb_test "record instruction-history /pf 3,7" [multi_line \ > + "3\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ <L2>.*" \ > + "4\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ > + "5\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ > + "6\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ > + "7\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ <L2>.*\r" \ > + ] > +} > > -gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" > +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { > + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" > +} > +if { [istarget "arm*-*-*"] } { > + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" > +} > +if { [istarget "aarch64*-*-*"]} { > + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2> // b\.none\r" > +} > > # the following tests are checking the iterators > # to avoid lots of regexps, we just check the number of lines that > diff --git a/gdb/testsuite/gdb.btrace/non-stop.exp b/gdb/testsuite/gdb.btrace/non-stop.exp > index 40cced7a8bb..58459de5359 100644 > --- a/gdb/testsuite/gdb.btrace/non-stop.exp > +++ b/gdb/testsuite/gdb.btrace/non-stop.exp > @@ -31,6 +31,12 @@ save_vars { GDBFLAGS } { > clean_restart $testfile > } > > +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { > + set loop_position 2 > +} elseif {[istarget "arm*-*-*"] || [istarget "aarch64*-*-*"]} { > + set loop_position 3 > +} > + > if ![runto_main] { > untested "failed to run to main" > return -1 > @@ -111,87 +117,99 @@ gdb_test "thread apply all info rec" ".*" > gdb_test "info threads" ".*" > > with_test_prefix "navigate" { > - gdb_test "thread apply 1 record goto 2" "$loop_line" > - gdb_test "thread apply 2 record goto 4" "$loop_line" > + gdb_test "thread apply 1 record goto $loop_position" "$loop_line" > + gdb_test "thread apply 2 record goto [expr {$loop_position + 2}]" "$loop_line" > gdb_test "thread apply 1 info record" \ > - ".*Replay in progress\. At instruction 2\." "thread 1 at insn 2" > + ".*Replay in progress\. At instruction $loop_position\." "thread 1 at insn $loop_position" > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 4\." "thread 2 at insn 4" > + ".*Replay in progress\. At instruction [expr {$loop_position + 2}]\." "thread 2 at insn [expr {$loop_position + 2}]" > > - gdb_test "thread apply all record goto 5" "$loop_line" > + gdb_test "thread apply all record goto [expr {$loop_position + 3}]" "$loop_line" > gdb_test "thread apply 1 info record" \ > - ".*Replay in progress\. At instruction 5\." "thread 1 at insn 5" > + ".*Replay in progress\. At instruction [expr {$loop_position + 3}]\." "thread 1 at insn [expr {$loop_position + 3}]" > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 5\." "thread 2 at insn 5" > + ".*Replay in progress\. At instruction [expr {$loop_position + 3}]\." "thread 2 at insn [expr {$loop_position + 3}]" > } > > with_test_prefix "step" { > + with_test_prefix "fixture" { > + gdb_test "thread apply 1 record goto [expr {$loop_position + 3}]" ".*" > + gdb_test "thread apply 2 record goto [expr {$loop_position + 3}]" ".*" > + } > with_test_prefix "thread 1" { > gdb_test "thread apply 1 stepi 2" "$loop_line" > gdb_test "thread apply 1 info record" \ > - ".*Replay in progress\. At instruction 7\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 5}]\." > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 5\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 3}]\." > } > > with_test_prefix "thread 2" { > gdb_test "thread apply 2 stepi 3" "$loop_line" > gdb_test "thread apply 1 info record" \ > - ".*Replay in progress\. At instruction 7\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 5}]\." > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 8\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 6}]\." > } > > with_test_prefix "all" { > gdb_cont_to all "stepi 4" "$loop_line" 2 > gdb_test "thread apply 1 info record" \ > - ".*Replay in progress\. At instruction 11\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 9}]\." > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 12\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 10}]\." > } > } > > with_test_prefix "reverse-step" { > + with_test_prefix "fixture" { > + gdb_test "thread apply 1 record goto [expr {$loop_position + 9}]" ".*" > + gdb_test "thread apply 2 record goto [expr {$loop_position + 10}]" ".*" > + } > with_test_prefix "thread 1" { > gdb_test "thread apply 1 reverse-stepi 2" "$loop_line" > gdb_test "thread apply 1 info record" \ > - ".*Replay in progress\. At instruction 9\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 7}]\." > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 12\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 10}]\." > } > > with_test_prefix "thread 2" { > gdb_test "thread apply 2 reverse-stepi 3" "$loop_line" > gdb_test "thread apply 1 info record" \ > - ".*Replay in progress\. At instruction 9\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 7}]\." > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 9\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 7}]\." > } > > with_test_prefix "all" { > gdb_cont_to all "reverse-stepi 4" "$loop_line" 2 > gdb_test "thread apply 1 info record" \ > - ".*Replay in progress\. At instruction 5\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 3}]\." > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 5\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 3}]\." > } > } > > with_test_prefix "continue" { > + with_test_prefix "fixture" { > + gdb_test "thread apply 1 record goto [expr {$loop_position + 3}]" ".*" > + gdb_test "thread apply 2 record goto [expr {$loop_position + 3}]" ".*" > + } > with_test_prefix "thread 1" { > with_test_prefix "continue" { > gdb_cont_to_no_history 1 "continue" 1 > gdb_test "thread apply 1 info record" \ > ".*Recorded \[0-9\]+ instructions \[^\\\r\\\n\]*" > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 5\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 3}]\." > } > with_test_prefix "reverse-continue" { > gdb_cont_to_no_history 1 "reverse-continue" 1 > gdb_test "thread apply 1 info record" \ > ".*Replay in progress\. At instruction 1\." > gdb_test "thread apply 2 info record" \ > - ".*Replay in progress\. At instruction 5\." > + ".*Replay in progress\. At instruction [expr {$loop_position + 3}]\." > } > } > > diff --git a/gdb/testsuite/gdb.btrace/record_goto.exp b/gdb/testsuite/gdb.btrace/record_goto.exp > index 75d76da1c7f..a04983a4859 100644 > --- a/gdb/testsuite/gdb.btrace/record_goto.exp > +++ b/gdb/testsuite/gdb.btrace/record_goto.exp > @@ -41,6 +41,10 @@ if [info exists COMPILE] { > } else { > standard_testfile i686-record_goto.S > } > +} elseif {[istarget "arm*-*-*"]} { > + standard_testfile arm-record_goto.S > +} elseif {[istarget "aarch64*-*-*"]} { > + standard_testfile aarch64-record_goto.S > } else { > unsupported "target architecture not supported" > return -1 > @@ -50,6 +54,126 @@ if [prepare_for_testing "failed to prepare" $testfile $srcfile $opts] { > return -1 > } > > +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { > + set function_positions(0) 19 > + set function_positions(1) 27 > + set function_positions(2) 2 > + set function_positions(end) 40 > + set function_positions(3) 39 > + > + set sequence_begin(1) 1 > + set sequence_end(1) 1 > + set sequence_begin(2) 2 > + set sequence_end(2) 4 > + set sequence_begin(3) 5 > + set sequence_end(3) 8 > + set sequence_begin(4) 9 > + set sequence_end(4) 9 > + set sequence_begin(5) 10 > + set sequence_end(5) 12 > + set sequence_begin(6) 13 > + set sequence_end(6) 16 > + set sequence_begin(7) 17 > + set sequence_end(7) 18 > + set sequence_begin(8) 19 > + set sequence_end(8) 19 > + set sequence_begin(9) 20 > + set sequence_end(9) 22 > + set sequence_begin(10) 23 > + set sequence_end(10) 26 > + set sequence_begin(11) 27 > + set sequence_end(11) 27 > + set sequence_begin(12) 28 > + set sequence_end(12) 30 > + set sequence_begin(13) 31 > + set sequence_end(13) 34 > + set sequence_begin(14) 35 > + set sequence_end(14) 36 > + set sequence_begin(15) 37 > + set sequence_end(15) 38 > + set sequence_begin(16) 39 > + set sequence_end(16) 40 > + > +} elseif {[istarget "arm*-*-*"]} { > + set function_positions(0) 23 > + set function_positions(1) 33 > + set function_positions(2) 2 > + set function_positions(end) 48 > + set function_positions(3) 47 > + > + set sequence_begin(1) 1 > + set sequence_end(1) 1 > + set sequence_begin(2) 2 > + set sequence_end(2) 4 > + set sequence_begin(3) 5 > + set sequence_end(3) 10 > + set sequence_begin(4) 11 > + set sequence_end(4) 11 > + set sequence_begin(5) 12 > + set sequence_end(5) 14 > + set sequence_begin(6) 15 > + set sequence_end(6) 20 > + set sequence_begin(7) 21 > + set sequence_end(7) 22 > + set sequence_begin(8) 23 > + set sequence_end(8) 23 > + set sequence_begin(9) 24 > + set sequence_end(9) 26 > + set sequence_begin(10) 27 > + set sequence_end(10) 32 > + set sequence_begin(11) 33 > + set sequence_end(11) 33 > + set sequence_begin(12) 34 > + set sequence_end(12) 36 > + set sequence_begin(13) 37 > + set sequence_end(13) 42 > + set sequence_begin(14) 43 > + set sequence_end(14) 44 > + set sequence_begin(15) 45 > + set sequence_end(15) 46 > + set sequence_begin(16) 47 > + set sequence_end(16) 48 > +} elseif {[istarget "aarch64*-*-*"]} { > + set function_positions(0) 16 > + set function_positions(1) 22 > + set function_positions(2) 2 > + set function_positions(end) 36 > + set function_positions(3) 35 > + > + set sequence_begin(1) 1 > + set sequence_end(1) 1 > + set sequence_begin(2) 2 > + set sequence_end(2) 4 > + set sequence_begin(3) 5 > + set sequence_end(3) 6 > + set sequence_begin(4) 7 > + set sequence_end(4) 7 > + set sequence_begin(5) 8 > + set sequence_end(5) 10 > + set sequence_begin(6) 11 > + set sequence_end(6) 12 > + set sequence_begin(7) 13 > + set sequence_end(7) 15 > + set sequence_begin(8) 16 > + set sequence_end(8) 16 > + set sequence_begin(9) 17 > + set sequence_end(9) 19 > + set sequence_begin(10) 20 > + set sequence_end(10) 21 > + set sequence_begin(11) 22 > + set sequence_end(11) 22 > + set sequence_begin(12) 23 > + set sequence_end(12) 25 > + set sequence_begin(13) 26 > + set sequence_end(13) 27 > + set sequence_begin(14) 28 > + set sequence_end(14) 30 > + set sequence_begin(15) 31 > + set sequence_end(15) 33 > + set sequence_begin(16) 34 > + set sequence_end(16) 36 > +} > + > if ![runto_main] { > untested "failed to run to main" > return -1 > @@ -65,43 +189,43 @@ gdb_test "next" > > # start by listing all functions > gdb_test "record function-call-history /ci 1, +20" [multi_line \ > - "1\tmain\tinst 1,1" \ > - "2\t fun4\tinst 2,4" \ > - "3\t fun1\tinst 5,8" \ > - "4\t fun4\tinst 9,9" \ > - "5\t fun2\tinst 10,12" \ > - "6\t fun1\tinst 13,16" \ > - "7\t fun2\tinst 17,18" \ > - "8\t fun4\tinst 19,19" \ > - "9\t fun3\tinst 20,22" \ > - "10\t fun1\tinst 23,26" \ > - "11\t fun3\tinst 27,27" \ > - "12\t fun2\tinst 28,30" \ > - "13\t fun1\tinst 31,34" \ > - "14\t fun2\tinst 35,36" \ > - "15\t fun3\tinst 37,38" \ > - "16\t fun4\tinst 39,40" \ > + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ > + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ > + "3\t fun1\tinst $sequence_begin(3),$sequence_end(3)" \ > + "4\t fun4\tinst $sequence_begin(4),$sequence_end(4)" \ > + "5\t fun2\tinst $sequence_begin(5),$sequence_end(5)" \ > + "6\t fun1\tinst $sequence_begin(6),$sequence_end(6)" \ > + "7\t fun2\tinst $sequence_begin(7),$sequence_end(7)" \ > + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ > + "9\t fun3\tinst $sequence_begin(9),$sequence_end(9)" \ > + "10\t fun1\tinst $sequence_begin(10),$sequence_end(10)" \ > + "11\t fun3\tinst $sequence_begin(11),$sequence_end(11)" \ > + "12\t fun2\tinst $sequence_begin(12),$sequence_end(12)" \ > + "13\t fun1\tinst $sequence_begin(13),$sequence_end(13)" \ > + "14\t fun2\tinst $sequence_begin(14),$sequence_end(14)" \ > + "15\t fun3\tinst $sequence_begin(15),$sequence_end(15)" \ > + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ > ] > > # let's see if we can go back in history > -gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*" > +gdb_test "record goto $function_positions(0)" ".*fun4 \\(\\) at record_goto.c:43.*" > > # the function call history should start at the new location > gdb_test "record function-call-history /ci" [multi_line \ > - "8\t fun4\tinst 19,19" \ > - "9\t fun3\tinst 20,22" \ > - "10\t fun1\tinst 23,26" \ > - ] "function-call-history from 19 forwards" > + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ > + "9\t fun3\tinst $sequence_begin(9),$sequence_end(9)" \ > + "10\t fun1\tinst $sequence_begin(10),$sequence_end(10)" \ > + ] "function-call-history from $function_positions(0) forwards" > > # the instruction history should start at the new location > gdb_test "record instruction-history" [multi_line \ > - "19.*" \ > - "20.*" \ > - "21.*" \ > - ] "instruction-history from 19 forwards" > + "$function_positions(0).*" \ > + "[expr {$function_positions(0) + 1}].*" \ > + "[expr {$function_positions(0) + 2}].*" \ > + ] "instruction-history from $function_positions(0) forwards" > > # let's go to another place in the history > -gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*" > +gdb_test "record goto $function_positions(1)" ".*fun3 \\(\\) at record_goto.c:35.*" > > # check the back trace at that location > gdb_test "backtrace" [multi_line \ > @@ -117,26 +241,26 @@ gdb_test "up" ".*main.*at record_goto.c:49.*" "up to main" > > # the function call history should start at the new location > gdb_test "record function-call-history /ci -" [multi_line \ > - "9\t fun3\tinst 20,22" \ > - "10\t fun1\tinst 23,26" \ > - "11\t fun3\tinst 27,27" \ > - ] "function-call-history from 27 backwards" > + "9\t fun3\tinst $sequence_begin(9),$sequence_end(9)" \ > + "10\t fun1\tinst $sequence_begin(10),$sequence_end(10)" \ > + "11\t fun3\tinst $sequence_begin(11),$sequence_end(11)" \ > + ] "function-call-history from $function_positions(1) backwards" > > # the instruction history should start at the new location > gdb_test "record instruction-history -" [multi_line \ > - "25.*" \ > - "26.*" \ > - "27.*" \ > - ] "instruction-history from 27 backwards" > + "[expr {$function_positions(1) - 2}].*" \ > + "[expr {$function_positions(1) - 1}].*" \ > + "$function_positions(1).*" \ > + ] "instruction-history from $function_positions(1) backwards" > > # test that we can go to the begin of the trace > gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*" > > # check that we're filling up the context correctly > gdb_test "record function-call-history /ci -" [multi_line \ > - "1\tmain\tinst 1,1" \ > - "2\t fun4\tinst 2,4" \ > - "3\t fun1\tinst 5,8" \ > + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ > + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ > + "3\t fun1\tinst $sequence_begin(3),$sequence_end(3)" \ > ] "function-call-history from begin backwards" > > # check that we're filling up the context correctly > @@ -147,52 +271,53 @@ gdb_test "record instruction-history -" [multi_line \ > ] "instruction-history from begin backwards" > > # we should get the exact same history from the first instruction > -gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*" > +gdb_test "record goto $function_positions(2)" ".*fun4 \\(\\) at record_goto.c:40.*" > > # check that we're filling up the context correctly > gdb_test "record function-call-history /ci -" [multi_line \ > - "1\tmain\tinst 1,1" \ > - "2\t fun4\tinst 2,4" \ > - "3\t fun1\tinst 5,8\r" \ > - ] "function-call-history from 2 backwards" > + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ > + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ > + "3\t fun1\tinst $sequence_begin(3),$sequence_end(3)\r" \ > + ] "function-call-history from $function_positions(2) backwards" > > # check that we're filling up the context correctly > gdb_test "record instruction-history -" [multi_line \ > "1.*" \ > "2.*" \ > "3.*" \ > - ] "instruction-history from 2 backwards" > + ] "instruction-history from $function_positions(2) backwards" > > # check that we can go to the end of the trace > gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*" > > # check that we're filling up the context correctly > gdb_test "record function-call-history /ci" [multi_line \ > - "14\t fun2\tinst 35,36" \ > - "15\t fun3\tinst 37,38" \ > - "16\t fun4\tinst 39,40" \ > + "14\t fun2\tinst $sequence_begin(14),$sequence_end(14)" \ > + "15\t fun3\tinst $sequence_begin(15),$sequence_end(15)" \ > + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ > ] "function-call-history from end forwards" > > # check that we're filling up the context correctly > +#adapt it for arm, last instruction is at pos 48 > gdb_test "record instruction-history" [multi_line \ > - "38.*" \ > - "39.*" \ > - "40.*\r" \ > + "[expr {$function_positions(end) - 2}].*" \ > + "[expr {$function_positions(end) - 1}].*" \ > + "$function_positions(end).*\r" \ > ] "instruction-history from end forwards" > > # we should get the exact same history from the second to last instruction > -gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*" > +gdb_test "record goto $function_positions(3)" ".*fun4 \\(\\) at record_goto.c:44.*" > > # check that we're filling up the context correctly > gdb_test "record function-call-history /ci" [multi_line \ > - "14\t fun2\tinst 35,36" \ > - "15\t fun3\tinst 37,38" \ > - "16\t fun4\tinst 39,40\r" \ > - ] "function-call-history from 39 forwards" > + "14\t fun2\tinst $sequence_begin(14),$sequence_end(14)" \ > + "15\t fun3\tinst $sequence_begin(15),$sequence_end(15)" \ > + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)\r" \ > + ] "function-call-history from $function_positions(3) forwards" > > # check that we're filling up the context correctly > gdb_test "record instruction-history" [multi_line \ > - "38.*" \ > - "39.*" \ > - "40.*\r" \ > - ] "instruction-history from 39 forwards" > + "[expr {$function_positions(3) - 1}].*" \ > + "$function_positions(3).*" \ > + "[expr {$function_positions(3) + 1}].*\r" \ > + ] "instruction-history from $function_positions(3) forwards" > diff --git a/gdb/testsuite/gdb.btrace/stepi.exp b/gdb/testsuite/gdb.btrace/stepi.exp > index bfb680bb30d..5b37d17ba0e 100644 > --- a/gdb/testsuite/gdb.btrace/stepi.exp > +++ b/gdb/testsuite/gdb.btrace/stepi.exp > @@ -39,6 +39,10 @@ if [info exists COMPILE] { > } else { > standard_testfile i686-record_goto.S > } > +} elseif {[istarget "arm*-*-*"]} { > + standard_testfile arm-record_goto.S > +} elseif {[istarget "aarch64*-*-*"]} { > + standard_testfile aarch64-record_goto.S > } else { > unsupported "target architecture not supported" > return -1 > @@ -48,6 +52,56 @@ if [prepare_for_testing "failed to prepare" $testfile $srcfile] { > return -1 > } > > +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { > + set instructions_count 40 > + set instruction_position(0) 39 > + set instruction_position(1) 40 > + set instruction_position(2) 1 > + set instruction_position(3) 1 > + set instruction_position(4) 22 > + set instruction_position(5) 23 > + set instruction_position(6) 22 > + set instruction_position(7) 27 > + set instruction_position(8) 22 > + set instruction_position(9) 1 > + set instruction_position(10) 1 > + set instruction_position(11) 1 > + set instruction_position(12) 2 > + set instruction_position(13) 1 > +} elseif {[istarget "arm*-*-*"]} { > + set instructions_count 48 > + set instruction_position(0) 47 > + set instruction_position(1) 48 > + set instruction_position(2) 1 > + set instruction_position(3) 1 > + set instruction_position(4) 26 > + set instruction_position(5) 27 > + set instruction_position(6) 26 > + set instruction_position(7) 33 > + set instruction_position(8) 26 > + set instruction_position(9) 1 > + set instruction_position(10) 1 > + set instruction_position(11) 1 > + set instruction_position(12) 2 > + set instruction_position(13) 1 > +} elseif {[istarget "aarch64*-*-*"]} { > + set instructions_count 36 > + set instruction_position(0) 35 > + set instruction_position(1) 36 > + set instruction_position(2) 1 > + set instruction_position(3) 1 > + set instruction_position(4) 19 > + set instruction_position(5) 20 > + set instruction_position(6) 19 > + set instruction_position(7) 22 > + set instruction_position(8) 19 > + set instruction_position(9) 1 > + set instruction_position(10) 1 > + set instruction_position(11) 1 > + set instruction_position(12) 2 > + set instruction_position(13) 1 > +} > + > if ![runto_main] { > untested "failed to run to main" > return -1 > @@ -56,10 +110,11 @@ if ![runto_main] { > global gdb_prompt > > proc check_replay_at { insn } { > + global instructions_count > gdb_test "info record" [multi_line \ > "Active record target: record-btrace" \ > ".*" \ > - "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for .*" \ > + "Recorded $instructions_count instructions in 16 functions \\\(0 gaps\\\) for .*" \ > "Replay in progress\. At instruction $insn\." \ > ] "check replay at $insn" > } > @@ -74,15 +129,14 @@ with_test_prefix "record" { > with_test_prefix "fetch" { > gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.1" > gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.2" > - > # let's check where we are in the trace > - check_replay_at 39 > + check_replay_at $instruction_position(0) > } > > # let's step forward and check again > with_test_prefix "stepi" { > gdb_test "stepi" ".*fun4\.5.*" > - check_replay_at 40 > + check_replay_at $instruction_position(1) > } > > # with the next step, we stop replaying > @@ -91,14 +145,17 @@ with_test_prefix "end" { > gdb_test "info record" [multi_line \ > "Active record target: record-btrace" \ > ".*" \ > - "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ > + "Recorded $instructions_count instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ > ] > } > > +#recover from a missing lr register in arm > +gdb_test "record goto end" > + > # let's try nexti > with_test_prefix "reverse-nexti.1" { > gdb_test "reverse-nexti" ".*main\.2.*" > - check_replay_at 1 > + check_replay_at $instruction_position(2) > } > > # we can't reverse-nexti any further > @@ -106,7 +163,7 @@ with_test_prefix "reverse-nexti.2" { > gdb_test "reverse-nexti" \ > "No more reverse-execution history\.\r\n.*main\.2.*" \ > "reverse-nexti.2" > - check_replay_at 1 > + check_replay_at $instruction_position(3) > } > > # but we can step back again > @@ -115,32 +172,32 @@ with_test_prefix "nexti" { > gdb_test "info record" [multi_line \ > "Active record target: record-btrace" \ > ".*" \ > - "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ > + "Recorded $instructions_count instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ > ] > } > > # let's step from a goto position somewhere in the middle > with_test_prefix "goto" { > - gdb_test "record goto 22" ".*fun3\.2.*" > - with_test_prefix "goto 22" { check_replay_at 22 } > + gdb_test "record goto $instruction_position(4) " ".*fun3\.2.*" > + with_test_prefix "goto $instruction_position(4) " { check_replay_at $instruction_position(4) } > > gdb_test "stepi" ".*fun1\.1.*" "stepi.3" > - with_test_prefix "stepi to 23" { check_replay_at 23 } > + with_test_prefix "stepi to $instruction_position(5)" { check_replay_at $instruction_position(5) } > > gdb_test "reverse-stepi" ".*fun3\.2.*" "reverse-stepi.3" > - with_test_prefix "reverse-stepi to 22" { check_replay_at 22 } > + with_test_prefix "reverse-stepi to $instruction_position(6)" { check_replay_at $instruction_position(6) } > > gdb_test "nexti" ".*fun3\.3.*" > - with_test_prefix "nexti to 27" { check_replay_at 27 } > + with_test_prefix "nexti to $instruction_position(7) " { check_replay_at $instruction_position(7) } > > gdb_test "reverse-nexti" ".*fun3\.2.*" "reverse-nexti.3" > - with_test_prefix "reverse-nexti to 22" { check_replay_at 22 } > + with_test_prefix "reverse-nexti to $instruction_position(8)" { check_replay_at $instruction_position(8) } > } > > # let's try to step off the left end > with_test_prefix "goto begin" { > gdb_test "record goto begin" ".*main\.2.*" > - check_replay_at 1 > + check_replay_at $instruction_position(9) > > with_test_prefix "reverse-stepi" { > gdb_test "reverse-stepi" \ > @@ -149,7 +206,7 @@ with_test_prefix "goto begin" { > gdb_test "reverse-stepi" \ > "No more reverse-execution history\.\r\n.*main\.2.*" \ > "reverse-stepi.2" > - check_replay_at 1 > + check_replay_at $instruction_position(10) > } > > with_test_prefix "reverse-nexti" { > @@ -159,13 +216,13 @@ with_test_prefix "goto begin" { > gdb_test "reverse-nexti" \ > "No more reverse-execution history\.\r\n.*main\.2.*" \ > "reverse-nexti.2" > - check_replay_at 1 > + check_replay_at $instruction_position(11) > } > > # we can step forward, though > with_test_prefix "stepi" { > gdb_test "stepi" ".*fun4\.1.*" > - check_replay_at 2 > + check_replay_at $instruction_position(12) > } > } > > @@ -178,5 +235,5 @@ with_test_prefix "reverse-stepi" { > gdb_test "reverse-stepi" \ > "No more reverse-execution history\.\r\n.*main\.2.*" \ > "reverse-stepi.3" > - check_replay_at 1 > + check_replay_at $instruction_position(13) > } > diff --git a/gdb/testsuite/gdb.btrace/tailcall-only.exp b/gdb/testsuite/gdb.btrace/tailcall-only.exp > index 510f90c9d5e..7e449ee38da 100644 > --- a/gdb/testsuite/gdb.btrace/tailcall-only.exp > +++ b/gdb/testsuite/gdb.btrace/tailcall-only.exp > @@ -43,6 +43,10 @@ if [info exists COMPILE] { > } else { > standard_testfile i686-tailcall-only.S > } > +} elseif { [istarget "arm*-*-*"] } { > + standard_testfile arm-tailcall-only.S > +} elseif {[istarget "aarch64*-*-*"]} { > + standard_testfile aarch64-tailcall-only.S > } else { > unsupported "target architecture not supported" > return -1 > @@ -62,6 +66,10 @@ gdb_test_no_output "set record function-call-history-size 0" > > # trace foo > gdb_test "step" ".*" "prepare for recording" > +# make sure we get out of function epilogue > +if { [istarget "arm*-*-*"] } { > + gdb_test "stepi" > +} > gdb_test_no_output "record btrace" > gdb_test "stepi 4" ".*" "record branch trace" > > diff --git a/gdb/testsuite/gdb.btrace/tailcall.exp b/gdb/testsuite/gdb.btrace/tailcall.exp > index 07a3ec103f4..602a9ed6fba 100644 > --- a/gdb/testsuite/gdb.btrace/tailcall.exp > +++ b/gdb/testsuite/gdb.btrace/tailcall.exp > @@ -40,6 +40,10 @@ if [info exists COMPILE] { > } else { > standard_testfile i686-tailcall.S > } > +} elseif { [istarget "arm*-*-*"] } { > + standard_testfile arm-tailcall.S > +} elseif { [istarget "aarch64*-*-*"] } { > + standard_testfile aarch64-tailcall.S > } else { > unsupported "target architecture not supported" > return -1 > @@ -48,6 +52,20 @@ if [info exists COMPILE] { > if [prepare_for_testing "failed to prepare" $testfile $srcfile $opts] { > return -1 > } > + > +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { > + set bar_return_line 24 > + set bar_return_position 4 > + set main_return_line 38 > +} elseif {[istarget "arm*-*-*"]} { > + set bar_return_line 24 > + set bar_return_position 5 > + set main_return_line 41 > + } elseif {[istarget "aarch64*-*-*"]} { > + set bar_return_line 23 > + set bar_return_position 6 > + set main_return_line 40 > +} There may be better ways to fetch this information without hardcoding it, through regular expressions and $expect_out. See, for example, gdb.base/step-over-syscall.exp and how it uses $expect_out to extract some bits of information. You could extract this information first and then store it in these variables. If the sources change, then we won't need to update the test again. If it is hardcoded, every time the source changes you need to update the test. > if ![runto_main] { > untested "failed to run to main" > return -1 > @@ -58,7 +76,17 @@ gdb_test_no_output "set record function-call-history-size 0" > > # trace the call to foo > gdb_test_no_output "record btrace" > -gdb_test "next 2" > + > +# make sure we get out of function epilogue > +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { > + gdb_test "next 2" > +} elseif {[istarget "arm*-*-*"]} { > + gdb_test "next 2" > + gdb_test "stepi" > +} elseif {[istarget "aarch64*-*-*"]} { > + gdb_test "next" > + gdb_test "stepi" > +} > > # show the flat branch trace > gdb_test "record function-call-history 1" [multi_line \ > @@ -77,11 +105,11 @@ gdb_test "record function-call-history /c 1" [multi_line \ > ] "indented" > > # go into bar > -gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*" > +gdb_test "record goto $bar_return_position" ".*bar \\(\\) at .*tailcall.c:$bar_return_line\r\n.*" > > # check the backtrace > gdb_test "backtrace" [multi_line \ > - "#0.*bar \\(\\) at tailcall.c:24" \ > + "#0.*bar \\(\\) at tailcall.c:$bar_return_line" \ > "#1.*foo \\(\\) at tailcall.c:29" \ > "#2.*main \\(\\) at tailcall.c:37" \ > "Backtrace stopped: not enough registers or memory available to unwind further" \ > @@ -93,23 +121,23 @@ gdb_test "up" "#2\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" "up to main" > gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "down to foo" > > # test stepping into and out of tailcalls. > -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ > +gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:$main_return_line\r\n.*" \ > "finish.1" > -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \ > +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:$bar_return_line\r\n.*" \ > "reverse-step.1" > gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \ > "reverse-finish.1" > gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" \ > "reverse-step.2" > -gdb_test "next" "\[^\r\n\]*38.*" \ > +gdb_test "next" "\[^\r\n\]*$main_return_line.*" \ > "next.1" > gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" \ > "reverse-next.1" > gdb_test "step" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \ > "step.1" > -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ > +gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:$main_return_line\r\n.*" \ > "finish.2" > -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \ > +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:$bar_return_line\r\n.*" \ > "reverse-step.3" > -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ > +gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:$main_return_line\r\n.*" \ > "finish.3" > diff --git a/gdb/testsuite/gdb.btrace/instruction_history.S b/gdb/testsuite/gdb.btrace/x86-instruction_history.S > similarity index 100% > rename from gdb/testsuite/gdb.btrace/instruction_history.S > rename to gdb/testsuite/gdb.btrace/x86-instruction_history.S > diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp > index 60f84d22aad..b7b11deab57 100644 > --- a/gdb/testsuite/lib/gdb.exp > +++ b/gdb/testsuite/lib/gdb.exp > @@ -3232,7 +3232,7 @@ gdb_caching_proc skip_btrace_tests { > global srcdir subdir gdb_prompt inferior_exited_re > > set me "skip_btrace_tests" > - if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } { > + if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] && ![istarget "arm*-*-*"] && ![istarget "aarch64*-*-*"]} { > verbose "$me: target does not support btrace, returning 1" 2 > return 1 > } >
hi Luis thanks for your review comments. Here is the status of the updates. The changes will be published in next version of the patch set. /Zied On 01.04.21 15:34, Luis Machado wrote: > On 3/30/21 11:52 PM, Zied Guermazi wrote: >> >> This patch extends the test suite for btrace to cover using >> ARM CoreSight traces. >> >> >> gdb/ChangeLog >>     * testsuite/lib/gdb.exp (skip_btrace_tests): enable btrace tests >>     for arm. >>     * testsuite/gdb.btrace/buffer-size.exp: enable btrace tests >>     and adapt test for arm. >>     * testsuite/gdb.btrace/delta.exp (check_trace): enable btrace tests >>     and adapt test for arm. >>     * testsuite/gdb.btrace/instruction_history.exp: enable btrace tests >>     and adapt tests for arm. >>     * testsuite/gdb.btrace/instruction_history.S: renamed to >>     x86-instruction_history.S >>     * testsuite/gdb.btrace/aarch64-instruction_history.S: New. >>     * testsuite/gdb.btrace/arm-instruction_history.S: New >>     * testsuite/gdb.btrace/non-stop.exp: enable btrace tests >>     and adapt tests for arm. >>     * testsuite/gdb.btrace/reconnect.exp: enable btrace tests >>     and adapt tests for arm. >>     * testsuite/gdb.btrace/record_goto.exp: enable btrace tests >>     and adapt tests for arm. >>     * testsuite/gdb.btrace/aarch64-record_goto.S: New. >>     * testsuite/gdb.btrace/arm-record_goto.S: New. >>     * testsuite/gdb.btrace/stepi.exp: enable btrace tests >>     and adapt tests for arm. >>     * testsuite/gdb.btrace/tailcall.exp: enable btrace tests >>     and adapt tests for arm. >>     * testsuite/gdb.btrace/aarch64-tailcall.S: New. >>     * testsuite/gdb.btrace/arm-tailcall.S: New. >>     * testsuite/gdb.btrace/tailcall-only.exp: enable btrace tests >>     and adapt tests for arm. >>     * testsuite/gdb.btrace/aarch64-tailcall-only.S: New. >>     * testsuite/gdb.btrace/arm-tailcall-only.S: New. >> >> --- >>  gdb/ChangeLog                                | 33 ++ >>  .../gdb.btrace/aarch64-instruction_history.S | 31 ++ >>  .../gdb.btrace/aarch64-record_goto.S         | 400 ++++++++++++++ >>  .../gdb.btrace/aarch64-tailcall-only.S       | 517 ++++++++++++++++++ >>  gdb/testsuite/gdb.btrace/aarch64-tailcall.S  | 409 ++++++++++++++ >>  .../gdb.btrace/arm-instruction_history.S     | 31 ++ >>  gdb/testsuite/gdb.btrace/arm-record_goto.S   | 433 +++++++++++++++ >>  gdb/testsuite/gdb.btrace/arm-tailcall-only.S | 504 +++++++++++++++++ >>  gdb/testsuite/gdb.btrace/arm-tailcall.S      | 391 +++++++++++++ >>  gdb/testsuite/gdb.btrace/buffer-size.exp     | 15 +- >>  gdb/testsuite/gdb.btrace/delta.exp           | 10 + >>  .../gdb.btrace/instruction_history.exp       | 107 +++- >>  gdb/testsuite/gdb.btrace/non-stop.exp        | 60 +- >>  gdb/testsuite/gdb.btrace/record_goto.exp     | 241 ++++++-- >>  gdb/testsuite/gdb.btrace/stepi.exp           | 95 +++- >>  gdb/testsuite/gdb.btrace/tailcall-only.exp   |  8 + >>  gdb/testsuite/gdb.btrace/tailcall.exp        | 46 +- >>  ...on_history.S => x86-instruction_history.S} |  0 >>  gdb/testsuite/lib/gdb.exp                    |  2 +- >>  19 files changed, 3215 insertions(+), 118 deletions(-) >>  create mode 100644 >> gdb/testsuite/gdb.btrace/aarch64-instruction_history.S >>  create mode 100644 gdb/testsuite/gdb.btrace/aarch64-record_goto.S >>  create mode 100644 gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S >>  create mode 100644 gdb/testsuite/gdb.btrace/aarch64-tailcall.S >>  create mode 100644 gdb/testsuite/gdb.btrace/arm-instruction_history.S >>  create mode 100644 gdb/testsuite/gdb.btrace/arm-record_goto.S >>  create mode 100644 gdb/testsuite/gdb.btrace/arm-tailcall-only.S >>  create mode 100644 gdb/testsuite/gdb.btrace/arm-tailcall.S >>  rename gdb/testsuite/gdb.btrace/{instruction_history.S => >> x86-instruction_history.S} (100%) >> >> diff --git a/gdb/ChangeLog b/gdb/ChangeLog >> index 76b413c3857..a1975363767 100644 >> --- a/gdb/ChangeLog >> +++ b/gdb/ChangeLog >> @@ -1,3 +1,36 @@ >> +2021-02-25 Zied Guermazi <zied.guermazi@trande.de> >> + >> +   * testsuite/lib/gdb.exp (skip_btrace_tests): enable btrace tests >> +   for arm. >> +   * testsuite/gdb.btrace/buffer-size.exp: enable btrace tests >> +   and adapt test for arm. >> +   * testsuite/gdb.btrace/delta.exp (check_trace): enable btrace tests >> +   and adapt test for arm. >> +   * testsuite/gdb.btrace/instruction_history.exp: enable btrace tests >> +   and adapt tests for arm. >> +   * testsuite/gdb.btrace/instruction_history.S: renamed to >> +   x86-instruction_history.S >> +   * testsuite/gdb.btrace/aarch64-instruction_history.S: New. >> +   * testsuite/gdb.btrace/arm-instruction_history.S: New >> +   * testsuite/gdb.btrace/non-stop.exp: enable btrace tests >> +   and adapt tests for arm. >> +   * testsuite/gdb.btrace/reconnect.exp: enable btrace tests >> +   and adapt tests for arm. >> +   * testsuite/gdb.btrace/record_goto.exp: enable btrace tests >> +   and adapt tests for arm. >> +   * testsuite/gdb.btrace/aarch64-record_goto.S: New. >> +   * testsuite/gdb.btrace/arm-record_goto.S: New. >> +   * testsuite/gdb.btrace/stepi.exp: enable btrace tests >> +   and adapt tests for arm. >> +   * testsuite/gdb.btrace/tailcall.exp: enable btrace tests >> +   and adapt tests for arm. >> +   * testsuite/gdb.btrace/aarch64-tailcall.S: New. >> +   * testsuite/gdb.btrace/arm-tailcall.S: New. >> +   * testsuite/gdb.btrace/tailcall-only.exp: enable btrace tests >> +   and adapt tests for arm. >> +   * testsuite/gdb.btrace/aarch64-tailcall-only.S: New. >> +   * testsuite/gdb.btrace/arm-tailcall-only.S: New. >> + >>  2021-02-25 Zied Guermazi <zied.guermazi@trande.de> >>       * btrace.c (check_xml_btrace_version): add version 1.1 >> diff --git a/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S >> b/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S >> new file mode 100644 >> index 00000000000..66490e3b23e >> --- /dev/null >> +++ b/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S >> @@ -0,0 +1,31 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> +  Copyright 2013-2021 Free Software Foundation, Inc. > > Given this is a new file and from a different architecture, we should > make the copyright year 2021. There are other cases of this in the patch. [Zied] done for all new files. > >> + >> +  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/>. */ >> +.arch armv8-a >> +.text >> +.globl loop >> +.type loop, %function >> +loop: >> +   mov x0, #2 /* bp.1 */ >> +L1: >> +   cmp x0, #0 >> +   beq L2 >> +   subs x0, x0, #1 >> +   b L1 >> +L2: >> +   ret /* bp.2 */ >> + >> + >> diff --git a/gdb/testsuite/gdb.btrace/aarch64-record_goto.S >> b/gdb/testsuite/gdb.btrace/aarch64-record_goto.S >> new file mode 100644 >> index 00000000000..be832eeb4c1 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.btrace/aarch64-record_goto.S >> @@ -0,0 +1,400 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> +  Copyright 2013-2021 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/>. >> + >> + > > Spurious newline. [Zied] done > >> +  This file has been generated on an armv8 machine using: >> +  gcc -S -dA -g record_goto.c -o aarch64-record_goto.S */ >> + >> +   .arch armv8-a >> +   .file   "record_goto.c" >> +   .text >> +.Ltext0: >> +   .align   2 >> +   .global   fun1 >> +   //.tune generic >> +   .type   fun1, %function >> +fun1: >> +.LFB0: >> +   .file 1 "record_goto.c" >> +   // record_goto.c:22:1 >> +   .loc 1 22 1 >> +   .cfi_startproc >> +// BLOCK 2 seq:0 >> +// PRED: ENTRY (FALLTHRU) >> +   // record_goto.c:23:1 >> +   .loc 1 23 1 >> +   nop >> +// SUCC: EXIT [always] >> +   ret >> +   .cfi_endproc >> +.LFE0: >> +   .size   fun1, .-fun1 >> +   .align   2 >> +   .global   fun2 >> +   .type   fun2, %function >> +fun2: >> +.LFB1: >> +   // record_goto.c:27:1 >> +   .loc 1 27 1 >> +   .cfi_startproc >> +// BLOCK 2 seq:0 >> +// PRED: ENTRY (FALLTHRU) >> +   stp   x29, x30, [sp, -16]! >> +   .cfi_def_cfa_offset 16 >> +   .cfi_offset 29, -16 >> +   .cfi_offset 30, -8 >> +   mov   x29, sp >> +   // record_goto.c:28:3 >> +   .loc 1 28 3 >> +   bl   fun1 >> +   // record_goto.c:29:1 >> +   .loc 1 29 1 >> +   nop >> +   ldp   x29, x30, [sp], 16 >> +   .cfi_restore 30 >> +   .cfi_restore 29 >> +   .cfi_def_cfa_offset 0 >> +// SUCC: EXIT [always] >> +   ret >> +   .cfi_endproc >> +.LFE1: >> +   .size   fun2, .-fun2 >> +   .align   2 >> +   .global   fun3 >> +   .type   fun3, %function >> +fun3: >> +.LFB2: >> +   // record_goto.c:33:1 >> +   .loc 1 33 1 >> +   .cfi_startproc >> +// BLOCK 2 seq:0 >> +// PRED: ENTRY (FALLTHRU) >> +   stp   x29, x30, [sp, -16]! >> +   .cfi_def_cfa_offset 16 >> +   .cfi_offset 29, -16 >> +   .cfi_offset 30, -8 >> +   mov   x29, sp >> +   // record_goto.c:34:3 >> +   .loc 1 34 3 >> +   bl   fun1 >> +   // record_goto.c:35:3 >> +   .loc 1 35 3 >> +   bl   fun2 >> +   // record_goto.c:36:1 >> +   .loc 1 36 1 >> +   nop >> +   ldp   x29, x30, [sp], 16 >> +   .cfi_restore 30 >> +   .cfi_restore 29 >> +   .cfi_def_cfa_offset 0 >> +// SUCC: EXIT [always] >> +   ret >> +   .cfi_endproc >> +.LFE2: >> +   .size   fun3, .-fun3 >> +   .align   2 >> +   .global   fun4 >> +   .type   fun4, %function >> +fun4: >> +.LFB3: >> +   // record_goto.c:40:1 >> +   .loc 1 40 1 >> +   .cfi_startproc >> +// BLOCK 2 seq:0 >> +// PRED: ENTRY (FALLTHRU) >> +   stp   x29, x30, [sp, -16]! >> +   .cfi_def_cfa_offset 16 >> +   .cfi_offset 29, -16 >> +   .cfi_offset 30, -8 >> +   mov   x29, sp >> +   // record_goto.c:41:3 >> +   .loc 1 41 3 >> +   bl   fun1 >> +   // record_goto.c:42:3 >> +   .loc 1 42 3 >> +   bl   fun2 >> +   // record_goto.c:43:3 >> +   .loc 1 43 3 >> +   bl   fun3 >> +   // record_goto.c:44:1 >> +   .loc 1 44 1 >> +   nop >> +   ldp   x29, x30, [sp], 16 >> +   .cfi_restore 30 >> +   .cfi_restore 29 >> +   .cfi_def_cfa_offset 0 >> +// SUCC: EXIT [always] >> +   ret >> +   .cfi_endproc >> +.LFE3: >> +   .size   fun4, .-fun4 >> +   .align   2 >> +   .global   main >> +   .type   main, %function >> +main: >> +.LFB4: >> +   // record_goto.c:48:1 >> +   .loc 1 48 1 >> +   .cfi_startproc >> +// BLOCK 2 seq:0 >> +// PRED: ENTRY (FALLTHRU) >> +   stp   x29, x30, [sp, -16]! >> +   .cfi_def_cfa_offset 16 >> +   .cfi_offset 29, -16 >> +   .cfi_offset 30, -8 >> +   mov   x29, sp >> +   // record_goto.c:49:3 >> +   .loc 1 49 3 >> +   bl   fun4 >> +   // record_goto.c:50:10 >> +   .loc 1 50 10 >> +   mov   w0, 0 >> +   // record_goto.c:51:1 >> +   .loc 1 51 1 >> +   ldp   x29, x30, [sp], 16 >> +   .cfi_restore 30 >> +   .cfi_restore 29 >> +   .cfi_def_cfa_offset 0 >> +// SUCC: EXIT [always] >> +   ret >> +   .cfi_endproc >> +.LFE4: >> +   .size   main, .-main >> +.Letext0: >> +   .section   .debug_info,"",@progbits >> +.Ldebug_info0: >> +   .4byte   0xb7   // Length of Compilation Unit Info >> +   .2byte   0x4   // DWARF version number >> +   .4byte   .Ldebug_abbrev0   // Offset Into Abbrev. Section >> +   .byte   0x8   // Pointer Size (in bytes) >> +   .uleb128 0x1   // (DIE (0xb) DW_TAG_compile_unit) >> +   .4byte   .LASF4   // DW_AT_producer: "GNU C17 10.2.1 20201224 >> -mlittle-endian -mabi=lp64 -g -fasynchronous-unwind-tables" >> +   .byte   0xc   // DW_AT_language >> +   .4byte   .LASF5   // DW_AT_name: "record_goto.c" >> +   .4byte   .LASF6   // DW_AT_comp_dir: >> "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +   .8byte   .Ltext0   // DW_AT_low_pc >> +   .8byte   .Letext0-.Ltext0   // DW_AT_high_pc >> +   .4byte   .Ldebug_line0   // DW_AT_stmt_list >> +   .uleb128 0x2   // (DIE (0x2d) DW_TAG_subprogram) >> +           // DW_AT_external >> +   .4byte   .LASF7   // DW_AT_name: "main" >> +   .byte   0x1   // DW_AT_decl_file (record_goto.c) >> +   .byte   0x2f   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x4b   // DW_AT_type >> +   .8byte   .LFB4   // DW_AT_low_pc >> +   .8byte   .LFE4-.LFB4   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_tail_call_sites >> +   .uleb128 0x3   // (DIE (0x4b) DW_TAG_base_type) >> +   .byte   0x4   // DW_AT_byte_size >> +   .byte   0x5   // DW_AT_encoding >> +   .ascii "int\0"   // DW_AT_name >> +   .uleb128 0x4   // (DIE (0x52) DW_TAG_subprogram) >> +           // DW_AT_external >> +   .4byte   .LASF0   // DW_AT_name: "fun4" >> +   .byte   0x1   // DW_AT_decl_file (record_goto.c) >> +   .byte   0x27   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .8byte   .LFB3   // DW_AT_low_pc >> +   .8byte   .LFE3-.LFB3   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_tail_call_sites >> +   .uleb128 0x4   // (DIE (0x6c) DW_TAG_subprogram) >> +           // DW_AT_external >> +   .4byte   .LASF1   // DW_AT_name: "fun3" >> +   .byte   0x1   // DW_AT_decl_file (record_goto.c) >> +   .byte   0x20   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .8byte   .LFB2   // DW_AT_low_pc >> +   .8byte   .LFE2-.LFB2   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_tail_call_sites >> +   .uleb128 0x4   // (DIE (0x86) DW_TAG_subprogram) >> +           // DW_AT_external >> +   .4byte   .LASF2   // DW_AT_name: "fun2" >> +   .byte   0x1   // DW_AT_decl_file (record_goto.c) >> +   .byte   0x1a   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .8byte   .LFB1   // DW_AT_low_pc >> +   .8byte   .LFE1-.LFB1   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_tail_call_sites >> +   .uleb128 0x5   // (DIE (0xa0) DW_TAG_subprogram) >> +           // DW_AT_external >> +   .4byte   .LASF3   // DW_AT_name: "fun1" >> +   .byte   0x1   // DW_AT_decl_file (record_goto.c) >> +   .byte   0x15   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .8byte   .LFB0   // DW_AT_low_pc >> +   .8byte   .LFE0-.LFB0   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .byte   0   // end of children of DIE 0xb >> +   .section   .debug_abbrev,"",@progbits >> +.Ldebug_abbrev0: >> +   .uleb128 0x1   // (abbrev code) >> +   .uleb128 0x11   // (TAG: DW_TAG_compile_unit) >> +   .byte   0x1   // DW_children_yes >> +   .uleb128 0x25   // (DW_AT_producer) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x13   // (DW_AT_language) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x1b   // (DW_AT_comp_dir) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x10   // (DW_AT_stmt_list) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x2   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x3f   // (DW_AT_external) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2116   // (DW_AT_GNU_all_tail_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x3   // (abbrev code) >> +   .uleb128 0x24   // (TAG: DW_TAG_base_type) >> +   .byte   0   // DW_children_no >> +   .uleb128 0xb   // (DW_AT_byte_size) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3e   // (DW_AT_encoding) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0x8   // (DW_FORM_string) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x4   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x3f   // (DW_AT_external) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2116   // (DW_AT_GNU_all_tail_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x5   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x3f   // (DW_AT_external) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2117   // (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .byte   0 >> +   .section   .debug_aranges,"",@progbits >> +   .4byte   0x2c   // Length of Address Ranges Info >> +   .2byte   0x2   // DWARF aranges version >> +   .4byte   .Ldebug_info0   // Offset of Compilation Unit Info >> +   .byte   0x8   // Size of Address >> +   .byte   0   // Size of Segment Descriptor >> +   .2byte   0   // Pad to 16 byte boundary >> +   .2byte   0 >> +   .8byte   .Ltext0   // Address >> +   .8byte   .Letext0-.Ltext0   // Length >> +   .8byte   0 >> +   .8byte   0 >> +   .section   .debug_line,"",@progbits >> +.Ldebug_line0: >> +   .section   .debug_str,"MS",@progbits,1 >> +.LASF5: >> +   .string   "record_goto.c" >> +.LASF4: >> +   .string   "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 >> -g -fasynchronous-unwind-tables" >> +.LASF3: >> +   .string   "fun1" >> +.LASF2: >> +   .string   "fun2" >> +.LASF0: >> +   .string   "fun4" >> +.LASF6: >> +   .string >> "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +.LASF7: >> +   .string   "main" >> +.LASF1: >> +   .string   "fun3" >> +   .ident   "GCC: (Debian 10.2.1-3) 10.2.1 20201224" >> +   .section   .note.GNU-stack,"",@progbits >> diff --git a/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S >> b/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S >> new file mode 100644 >> index 00000000000..1822385b85f >> --- /dev/null >> +++ b/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S >> @@ -0,0 +1,517 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> +  Copyright 2016-2021 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/>. >> + >> + > > Spurious newline. [Zied] done. > >> +  This file has been generated on an armv8 machine using: >> +  gcc -m32 -S -O2 -dA -g tailcall-only.c -o aarch64-tailcall-only.S >> + */ >> + >> +   .arch armv8-a >> +   .file   "tailcall-only.c" >> +   .text >> +.Ltext0: >> +   .align   2 >> +   .p2align 4,,11 >> +   //.tune generic >> +   .type   bar_1, %function >> +bar_1: >> +.LFB0: >> +   .file 1 "tailcall-only.c" >> +   // tailcall-only.c:22:1 >> +   .loc 1 22 1 view -0 >> +   .cfi_startproc >> +// BLOCK 2, count:1073741824 (estimated locally) seq:0 >> +// PRED: ENTRY [always] count:1073741824 (estimated locally) >> (FALLTHRU) >> +   // tailcall-only.c:23:3 >> +   .loc 1 23 3 view .LVU1 >> +   // tailcall-only.c:24:1 >> +   .loc 1 24 1 is_stmt 0 view .LVU2 >> +   mov   w0, 42 >> +// SUCC: EXIT [always] count:1073741824 (estimated locally) >> +   ret >> +   .cfi_endproc >> +.LFE0: >> +   .size   bar_1, .-bar_1 >> +   .align   2 >> +   .p2align 4,,11 >> +   .type   bar, %function >> +bar: >> +.LFB1: >> +   // tailcall-only.c:28:1 >> +   .loc 1 28 1 is_stmt 1 view -0 >> +   .cfi_startproc >> +// BLOCK 2, count:1073741824 (estimated locally) seq:0 >> +// PRED: ENTRY [always] count:1073741824 (estimated locally) >> (FALLTHRU) >> +   // tailcall-only.c:29:3 >> +   .loc 1 29 3 view .LVU4 >> +// SUCC: EXIT [always] count:1073741824 (estimated locally) >> (ABNORMAL,SIBCALL) >> +   // tailcall-only.c:29:10 >> +   .loc 1 29 10 is_stmt 0 view .LVU5 >> +   b   bar_1 >> +.LVL0: >> +   .cfi_endproc >> +.LFE1: >> +   .size   bar, .-bar >> +   .align   2 >> +   .p2align 4,,11 >> +   .type   foo_1, %function >> +foo_1: >> +.LFB2: >> +   // tailcall-only.c:34:1 >> +   .loc 1 34 1 is_stmt 1 view -0 >> +   .cfi_startproc >> +// BLOCK 2, count:1073741824 (estimated locally) seq:0 >> +// PRED: ENTRY [always] count:1073741824 (estimated locally) >> (FALLTHRU) >> +   // tailcall-only.c:35:3 >> +   .loc 1 35 3 view .LVU7 >> +// SUCC: EXIT [always] count:1073741824 (estimated locally) >> (ABNORMAL,SIBCALL) >> +   // tailcall-only.c:35:10 >> +   .loc 1 35 10 is_stmt 0 view .LVU8 >> +   b   bar >> +.LVL1: >> +   .cfi_endproc >> +.LFE2: >> +   .size   foo_1, .-foo_1 >> +   .align   2 >> +   .p2align 4,,11 >> +   .type   foo, %function >> +foo: >> +.LFB3: >> +   // tailcall-only.c:40:1 >> +   .loc 1 40 1 is_stmt 1 view -0 >> +   .cfi_startproc >> +// BLOCK 2, count:1073741824 (estimated locally) seq:0 >> +// PRED: ENTRY [always] count:1073741824 (estimated locally) >> (FALLTHRU) >> +   // tailcall-only.c:41:3 >> +   .loc 1 41 3 view .LVU10 >> +// SUCC: EXIT [always] count:1073741824 (estimated locally) >> (ABNORMAL,SIBCALL) >> +   // tailcall-only.c:41:10 >> +   .loc 1 41 10 is_stmt 0 view .LVU11 >> +   b   foo_1 >> +.LVL2: >> +   .cfi_endproc >> +.LFE3: >> +   .size   foo, .-foo >> +   .section   .text.startup,"ax",@progbits >> +   .align   2 >> +   .p2align 4,,11 >> +   .global   main >> +   .type   main, %function >> +main: >> +.LFB4: >> +   // tailcall-only.c:46:1 >> +   .loc 1 46 1 is_stmt 1 view -0 >> +   .cfi_startproc >> +// BLOCK 2, count:1073741824 (estimated locally) seq:0 >> +// PRED: ENTRY [always] count:1073741824 (estimated locally) >> (FALLTHRU) >> +   // tailcall-only.c:47:3 >> +   .loc 1 47 3 view .LVU13 >> +   // tailcall-only.c:49:3 >> +   .loc 1 49 3 view .LVU14 >> +   // tailcall-only.c:46:1 >> +   .loc 1 46 1 is_stmt 0 view .LVU15 >> +   stp   x29, x30, [sp, -16]! >> +   .cfi_def_cfa_offset 16 >> +   .cfi_offset 29, -16 >> +   .cfi_offset 30, -8 >> +   mov   x29, sp >> +   // tailcall-only.c:49:12 >> +   .loc 1 49 12 view .LVU16 >> +   bl   foo >> +.LVL3: >> +   // DEBUG answer => x0 >> +   // tailcall-only.c:50:3 >> +   .loc 1 50 3 is_stmt 1 view .LVU17 >> +   // DEBUG answer => x0+0x1 >> +   // tailcall-only.c:52:3 >> +   .loc 1 52 3 view .LVU18 >> +   // tailcall-only.c:53:1 >> +   .loc 1 53 1 is_stmt 0 view .LVU19 >> +   add   w0, w0, 1 >> +.LVL4: >> +   // DEBUG answer => x0 >> +   // tailcall-only.c:53:1 >> +   .loc 1 53 1 view .LVU20 >> +   ldp   x29, x30, [sp], 16 >> +   .cfi_restore 30 >> +   .cfi_restore 29 >> +   .cfi_def_cfa_offset 0 >> +// SUCC: EXIT [always] count:1073741824 (estimated locally) >> +   ret >> +   .cfi_endproc >> +.LFE4: >> +   .size   main, .-main >> +   .text >> +.Letext0: >> +   .section   .debug_info,"",@progbits >> +.Ldebug_info0: >> +   .4byte   0x11f   // Length of Compilation Unit Info >> +   .2byte   0x4   // DWARF version number >> +   .4byte   .Ldebug_abbrev0   // Offset Into Abbrev. Section >> +   .byte   0x8   // Pointer Size (in bytes) >> +   .uleb128 0x1   // (DIE (0xb) DW_TAG_compile_unit) >> +   .4byte   .LASF1   // DW_AT_producer: "GNU C17 10.2.1 20201224 >> -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" >> +   .byte   0xc   // DW_AT_language >> +   .4byte   .LASF2   // DW_AT_name: "tailcall-only.c" >> +   .4byte   .LASF3   // DW_AT_comp_dir: >> "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +   .4byte   .Ldebug_ranges0+0   // DW_AT_ranges >> +   .8byte   0   // DW_AT_low_pc >> +   .4byte   .Ldebug_line0   // DW_AT_stmt_list >> +   .uleb128 0x2   // (DIE (0x29) DW_TAG_subprogram) >> +           // DW_AT_external >> +   .4byte   .LASF4   // DW_AT_name: "main" >> +   .byte   0x1   // DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x2d   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x6d   // DW_AT_type >> +   .8byte   .LFB4   // DW_AT_low_pc >> +   .8byte   .LFE4-.LFB4   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .4byte   0x6d   // DW_AT_sibling >> +   .uleb128 0x3   // (DIE (0x4b) DW_TAG_variable) >> +   .4byte   .LASF5   // DW_AT_name: "answer" >> +   .byte   0x1   // DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x2f   // DW_AT_decl_line >> +   .byte   0x7   // DW_AT_decl_column >> +   .4byte   0x6d   // DW_AT_type >> +   .4byte   .LLST0   // DW_AT_location >> +   .4byte   .LVUS0   // DW_AT_GNU_locviews >> +   .uleb128 0x4   // (DIE (0x5f) DW_TAG_GNU_call_site) >> +   .8byte   .LVL3   // DW_AT_low_pc >> +   .4byte   0x74   // DW_AT_abstract_origin >> +   .byte   0   // end of children of DIE 0x29 >> +   .uleb128 0x5   // (DIE (0x6d) DW_TAG_base_type) >> +   .byte   0x4   // DW_AT_byte_size >> +   .byte   0x5   // DW_AT_encoding >> +   .ascii "int\0"   // DW_AT_name >> +   .uleb128 0x6   // (DIE (0x74) DW_TAG_subprogram) >> +   .ascii "foo\0"   // DW_AT_name >> +   .byte   0x1   // DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x27   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x6d   // DW_AT_type >> +   .8byte   .LFB3   // DW_AT_low_pc >> +   .8byte   .LFE3-.LFB3   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .4byte   0xa4   // DW_AT_sibling >> +   .uleb128 0x7   // (DIE (0x96) DW_TAG_GNU_call_site) >> +   .8byte   .LVL2   // DW_AT_low_pc >> +           // DW_AT_GNU_tail_call >> +   .4byte   0xa4   // DW_AT_abstract_origin >> +   .byte   0   // end of children of DIE 0x74 >> +   .uleb128 0x8   // (DIE (0xa4) DW_TAG_subprogram) >> +   .4byte   .LASF0   // DW_AT_name: "foo_1" >> +   .byte   0x1   // DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x21   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x6d   // DW_AT_type >> +   .8byte   .LFB2   // DW_AT_low_pc >> +   .8byte   .LFE2-.LFB2   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .4byte   0xd4   // DW_AT_sibling >> +   .uleb128 0x7   // (DIE (0xc6) DW_TAG_GNU_call_site) >> +   .8byte   .LVL1   // DW_AT_low_pc >> +           // DW_AT_GNU_tail_call >> +   .4byte   0xd4   // DW_AT_abstract_origin >> +   .byte   0   // end of children of DIE 0xa4 >> +   .uleb128 0x6   // (DIE (0xd4) DW_TAG_subprogram) >> +   .ascii "bar\0"   // DW_AT_name >> +   .byte   0x1   // DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x1b   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x6d   // DW_AT_type >> +   .8byte   .LFB1   // DW_AT_low_pc >> +   .8byte   .LFE1-.LFB1   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .4byte   0x104   // DW_AT_sibling >> +   .uleb128 0x7   // (DIE (0xf6) DW_TAG_GNU_call_site) >> +   .8byte   .LVL0   // DW_AT_low_pc >> +           // DW_AT_GNU_tail_call >> +   .4byte   0x104   // DW_AT_abstract_origin >> +   .byte   0   // end of children of DIE 0xd4 >> +   .uleb128 0x9   // (DIE (0x104) DW_TAG_subprogram) >> +   .4byte   .LASF6   // DW_AT_name: "bar_1" >> +   .byte   0x1   // DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x15   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x6d   // DW_AT_type >> +   .8byte   .LFB0   // DW_AT_low_pc >> +   .8byte   .LFE0-.LFB0   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .byte   0   // end of children of DIE 0xb >> +   .section   .debug_abbrev,"",@progbits >> +.Ldebug_abbrev0: >> +   .uleb128 0x1   // (abbrev code) >> +   .uleb128 0x11   // (TAG: DW_TAG_compile_unit) >> +   .byte   0x1   // DW_children_yes >> +   .uleb128 0x25   // (DW_AT_producer) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x13   // (DW_AT_language) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x1b   // (DW_AT_comp_dir) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x55   // (DW_AT_ranges) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x10   // (DW_AT_stmt_list) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x2   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0x1   // DW_children_yes >> +   .uleb128 0x3f   // (DW_AT_external) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2117   // (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x1   // (DW_AT_sibling) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x3   // (abbrev code) >> +   .uleb128 0x34   // (TAG: DW_TAG_variable) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x2   // (DW_AT_location) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .uleb128 0x2137   // (DW_AT_GNU_locviews) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x4   // (abbrev code) >> +   .uleb128 0x4109   // (TAG: DW_TAG_GNU_call_site) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x31   // (DW_AT_abstract_origin) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x5   // (abbrev code) >> +   .uleb128 0x24   // (TAG: DW_TAG_base_type) >> +   .byte   0   // DW_children_no >> +   .uleb128 0xb   // (DW_AT_byte_size) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3e   // (DW_AT_encoding) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0x8   // (DW_FORM_string) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x6   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0x1   // DW_children_yes >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0x8   // (DW_FORM_string) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2117   // (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x1   // (DW_AT_sibling) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x7   // (abbrev code) >> +   .uleb128 0x4109   // (TAG: DW_TAG_GNU_call_site) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x2115   // (DW_AT_GNU_tail_call) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x31   // (DW_AT_abstract_origin) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x8   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0x1   // DW_children_yes >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2117   // (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x1   // (DW_AT_sibling) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x9   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2117   // (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .byte   0 >> +   .section   .debug_loc,"",@progbits >> +.Ldebug_loc0: >> +.LVUS0: >> +   .uleb128 .LVU17   // View list begin (*.LVUS0) >> +   .uleb128 .LVU18   // View list end (*.LVUS0) >> +   .uleb128 .LVU18   // View list begin (*.LVUS0) >> +   .uleb128 .LVU20   // View list end (*.LVUS0) >> +   .uleb128 .LVU20   // View list begin (*.LVUS0) >> +   .uleb128 0   // View list end (*.LVUS0) >> +.LLST0: >> +   .8byte   .LVL3   // Location list begin address (*.LLST0) >> +   .8byte   .LVL3   // Location list end address (*.LLST0) >> +   .2byte   0x1   // Location expression size >> +   .byte   0x50   // DW_OP_reg0 >> +   .8byte   .LVL3   // Location list begin address (*.LLST0) >> +   .8byte   .LVL4   // Location list end address (*.LLST0) >> +   .2byte   0x3   // Location expression size >> +   .byte   0x70   // DW_OP_breg0 >> +   .sleb128 1 >> +   .byte   0x9f   // DW_OP_stack_value >> +   .8byte   .LVL4   // Location list begin address (*.LLST0) >> +   .8byte   .LFE4   // Location list end address (*.LLST0) >> +   .2byte   0x1   // Location expression size >> +   .byte   0x50   // DW_OP_reg0 >> +   .8byte   0   // Location list terminator begin (*.LLST0) >> +   .8byte   0   // Location list terminator end (*.LLST0) >> +   .section   .debug_aranges,"",@progbits >> +   .4byte   0x3c   // Length of Address Ranges Info >> +   .2byte   0x2   // DWARF aranges version >> +   .4byte   .Ldebug_info0   // Offset of Compilation Unit Info >> +   .byte   0x8   // Size of Address >> +   .byte   0   // Size of Segment Descriptor >> +   .2byte   0   // Pad to 16 byte boundary >> +   .2byte   0 >> +   .8byte   .Ltext0   // Address >> +   .8byte   .Letext0-.Ltext0   // Length >> +   .8byte   .LFB4   // Address >> +   .8byte   .LFE4-.LFB4   // Length >> +   .8byte   0 >> +   .8byte   0 >> +   .section   .debug_ranges,"",@progbits >> +.Ldebug_ranges0: >> +   .8byte   .Ltext0   // Offset 0 >> +   .8byte   .Letext0 >> +   .8byte   .LFB4   // Offset 0x10 >> +   .8byte   .LFE4 >> +   .8byte   0 >> +   .8byte   0 >> +   .section   .debug_line,"",@progbits >> +.Ldebug_line0: >> +   .section   .debug_str,"MS",@progbits,1 >> +.LASF6: >> +   .string   "bar_1" >> +.LASF2: >> +   .string   "tailcall-only.c" >> +.LASF3: >> +   .string >> "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +.LASF5: >> +   .string   "answer" >> +.LASF4: >> +   .string   "main" >> +.LASF1: >> +   .string   "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 >> -g -O2 -fasynchronous-unwind-tables" >> +.LASF0: >> +   .string   "foo_1" >> +   .ident   "GCC: (Debian 10.2.1-3) 10.2.1 20201224" >> +   .section   .note.GNU-stack,"",@progbits >> diff --git a/gdb/testsuite/gdb.btrace/aarch64-tailcall.S >> b/gdb/testsuite/gdb.btrace/aarch64-tailcall.S >> new file mode 100644 >> index 00000000000..a6b01cbccea >> --- /dev/null >> +++ b/gdb/testsuite/gdb.btrace/aarch64-tailcall.S >> @@ -0,0 +1,409 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> +  Copyright 2013-2021 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/>. >> + >> + > > Spurious newline. [Zied] done > >> +  This file has been generated on an armv8 machine using: >> +  gcc -S -O2 -dA -g tailcall.c -o aarch64-tailcall.S */ >> + >> +   .arch armv8-a >> +   .file   "tailcall.c" >> +   .text >> +.Ltext0: >> +   .align   2 >> +   .p2align 4,,11 >> +   //.tune generic >> +   .type   bar, %function >> +bar: >> +.LFB0: >> +   .file 1 "tailcall.c" >> +   // tailcall.c:22:1 >> +   .loc 1 22 1 view -0 >> +   .cfi_startproc >> +// BLOCK 2, count:1073741824 (estimated locally) seq:0 >> +// PRED: ENTRY [always] count:1073741824 (estimated locally) >> (FALLTHRU) >> +   // tailcall.c:23:3 >> +   .loc 1 23 3 view .LVU1 >> +   // tailcall.c:24:1 >> +   .loc 1 24 1 is_stmt 0 view .LVU2 >> +   mov   w0, 42 >> +// SUCC: EXIT [always] count:1073741824 (estimated locally) >> +   ret >> +   .cfi_endproc >> +.LFE0: >> +   .size   bar, .-bar >> +   .align   2 >> +   .p2align 4,,11 >> +   .type   foo, %function >> +foo: >> +.LFB1: >> +   // tailcall.c:28:1 >> +   .loc 1 28 1 is_stmt 1 view -0 >> +   .cfi_startproc >> +// BLOCK 2, count:1073741824 (estimated locally) seq:0 >> +// PRED: ENTRY [always] count:1073741824 (estimated locally) >> (FALLTHRU) >> +   // tailcall.c:29:3 >> +   .loc 1 29 3 view .LVU4 >> +// SUCC: EXIT [always] count:1073741824 (estimated locally) >> (ABNORMAL,SIBCALL) >> +   // tailcall.c:29:10 >> +   .loc 1 29 10 is_stmt 0 view .LVU5 >> +   b   bar >> +.LVL0: >> +   .cfi_endproc >> +.LFE1: >> +   .size   foo, .-foo >> +   .section   .text.startup,"ax",@progbits >> +   .align   2 >> +   .p2align 4,,11 >> +   .global   main >> +   .type   main, %function >> +main: >> +.LFB2: >> +   // tailcall.c:34:1 >> +   .loc 1 34 1 is_stmt 1 view -0 >> +   .cfi_startproc >> +// BLOCK 2, count:1073741824 (estimated locally) seq:0 >> +// PRED: ENTRY [always] count:1073741824 (estimated locally) >> (FALLTHRU) >> +   // tailcall.c:35:3 >> +   .loc 1 35 3 view .LVU7 >> +   // tailcall.c:37:3 >> +   .loc 1 37 3 view .LVU8 >> +   // tailcall.c:34:1 >> +   .loc 1 34 1 is_stmt 0 view .LVU9 >> +   stp   x29, x30, [sp, -16]! >> +   .cfi_def_cfa_offset 16 >> +   .cfi_offset 29, -16 >> +   .cfi_offset 30, -8 >> +   mov   x29, sp >> +   // tailcall.c:37:12 >> +   .loc 1 37 12 view .LVU10 >> +   bl   foo >> +.LVL1: >> +   // DEBUG answer => x0 >> +   // tailcall.c:38:3 >> +   .loc 1 38 3 is_stmt 1 view .LVU11 >> +   // DEBUG answer => x0+0x1 >> +   // tailcall.c:40:3 >> +   .loc 1 40 3 view .LVU12 >> +   // tailcall.c:41:1 >> +   .loc 1 41 1 is_stmt 0 view .LVU13 >> +   add   w0, w0, 1 >> +.LVL2: >> +   // DEBUG answer => x0 >> +   // tailcall.c:41:1 >> +   .loc 1 41 1 view .LVU14 >> +   ldp   x29, x30, [sp], 16 >> +   .cfi_restore 30 >> +   .cfi_restore 29 >> +   .cfi_def_cfa_offset 0 >> +// SUCC: EXIT [always] count:1073741824 (estimated locally) >> +   ret >> +   .cfi_endproc >> +.LFE2: >> +   .size   main, .-main >> +   .text >> +.Letext0: >> +   .section   .debug_info,"",@progbits >> +.Ldebug_info0: >> +   .4byte   0xbf   // Length of Compilation Unit Info >> +   .2byte   0x4   // DWARF version number >> +   .4byte   .Ldebug_abbrev0   // Offset Into Abbrev. Section >> +   .byte   0x8   // Pointer Size (in bytes) >> +   .uleb128 0x1   // (DIE (0xb) DW_TAG_compile_unit) >> +   .4byte   .LASF0   // DW_AT_producer: "GNU C17 10.2.1 20201224 >> -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" >> +   .byte   0xc   // DW_AT_language >> +   .4byte   .LASF1   // DW_AT_name: "tailcall.c" >> +   .4byte   .LASF2   // DW_AT_comp_dir: >> "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +   .4byte   .Ldebug_ranges0+0   // DW_AT_ranges >> +   .8byte   0   // DW_AT_low_pc >> +   .4byte   .Ldebug_line0   // DW_AT_stmt_list >> +   .uleb128 0x2   // (DIE (0x29) DW_TAG_subprogram) >> +           // DW_AT_external >> +   .4byte   .LASF3   // DW_AT_name: "main" >> +   .byte   0x1   // DW_AT_decl_file (tailcall.c) >> +   .byte   0x21   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x6d   // DW_AT_type >> +   .8byte   .LFB2   // DW_AT_low_pc >> +   .8byte   .LFE2-.LFB2   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .4byte   0x6d   // DW_AT_sibling >> +   .uleb128 0x3   // (DIE (0x4b) DW_TAG_variable) >> +   .4byte   .LASF4   // DW_AT_name: "answer" >> +   .byte   0x1   // DW_AT_decl_file (tailcall.c) >> +   .byte   0x23   // DW_AT_decl_line >> +   .byte   0x7   // DW_AT_decl_column >> +   .4byte   0x6d   // DW_AT_type >> +   .4byte   .LLST0   // DW_AT_location >> +   .4byte   .LVUS0   // DW_AT_GNU_locviews >> +   .uleb128 0x4   // (DIE (0x5f) DW_TAG_GNU_call_site) >> +   .8byte   .LVL1   // DW_AT_low_pc >> +   .4byte   0x74   // DW_AT_abstract_origin >> +   .byte   0   // end of children of DIE 0x29 >> +   .uleb128 0x5   // (DIE (0x6d) DW_TAG_base_type) >> +   .byte   0x4   // DW_AT_byte_size >> +   .byte   0x5   // DW_AT_encoding >> +   .ascii "int\0"   // DW_AT_name >> +   .uleb128 0x6   // (DIE (0x74) DW_TAG_subprogram) >> +   .ascii "foo\0"   // DW_AT_name >> +   .byte   0x1   // DW_AT_decl_file (tailcall.c) >> +   .byte   0x1b   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x6d   // DW_AT_type >> +   .8byte   .LFB1   // DW_AT_low_pc >> +   .8byte   .LFE1-.LFB1   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .4byte   0xa4   // DW_AT_sibling >> +   .uleb128 0x7   // (DIE (0x96) DW_TAG_GNU_call_site) >> +   .8byte   .LVL0   // DW_AT_low_pc >> +           // DW_AT_GNU_tail_call >> +   .4byte   0xa4   // DW_AT_abstract_origin >> +   .byte   0   // end of children of DIE 0x74 >> +   .uleb128 0x8   // (DIE (0xa4) DW_TAG_subprogram) >> +   .ascii "bar\0"   // DW_AT_name >> +   .byte   0x1   // DW_AT_decl_file (tailcall.c) >> +   .byte   0x15   // DW_AT_decl_line >> +   .byte   0x1   // DW_AT_decl_column >> +           // DW_AT_prototyped >> +   .4byte   0x6d   // DW_AT_type >> +   .8byte   .LFB0   // DW_AT_low_pc >> +   .8byte   .LFE0-.LFB0   // DW_AT_high_pc >> +   .uleb128 0x1   // DW_AT_frame_base >> +   .byte   0x9c   // DW_OP_call_frame_cfa >> +           // DW_AT_GNU_all_call_sites >> +   .byte   0   // end of children of DIE 0xb >> +   .section   .debug_abbrev,"",@progbits >> +.Ldebug_abbrev0: >> +   .uleb128 0x1   // (abbrev code) >> +   .uleb128 0x11   // (TAG: DW_TAG_compile_unit) >> +   .byte   0x1   // DW_children_yes >> +   .uleb128 0x25   // (DW_AT_producer) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x13   // (DW_AT_language) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x1b   // (DW_AT_comp_dir) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x55   // (DW_AT_ranges) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x10   // (DW_AT_stmt_list) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x2   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0x1   // DW_children_yes >> +   .uleb128 0x3f   // (DW_AT_external) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2117   // (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x1   // (DW_AT_sibling) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x3   // (abbrev code) >> +   .uleb128 0x34   // (TAG: DW_TAG_variable) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0xe   // (DW_FORM_strp) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x2   // (DW_AT_location) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .uleb128 0x2137   // (DW_AT_GNU_locviews) >> +   .uleb128 0x17   // (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x4   // (abbrev code) >> +   .uleb128 0x4109   // (TAG: DW_TAG_GNU_call_site) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x31   // (DW_AT_abstract_origin) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x5   // (abbrev code) >> +   .uleb128 0x24   // (TAG: DW_TAG_base_type) >> +   .byte   0   // DW_children_no >> +   .uleb128 0xb   // (DW_AT_byte_size) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3e   // (DW_AT_encoding) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0x8   // (DW_FORM_string) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x6   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0x1   // DW_children_yes >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0x8   // (DW_FORM_string) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2117   // (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x1   // (DW_AT_sibling) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x7   // (abbrev code) >> +   .uleb128 0x4109   // (TAG: DW_TAG_GNU_call_site) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x2115   // (DW_AT_GNU_tail_call) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x31   // (DW_AT_abstract_origin) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x8   // (abbrev code) >> +   .uleb128 0x2e   // (TAG: DW_TAG_subprogram) >> +   .byte   0   // DW_children_no >> +   .uleb128 0x3   // (DW_AT_name) >> +   .uleb128 0x8   // (DW_FORM_string) >> +   .uleb128 0x3a   // (DW_AT_decl_file) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x3b   // (DW_AT_decl_line) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x39   // (DW_AT_decl_column) >> +   .uleb128 0xb   // (DW_FORM_data1) >> +   .uleb128 0x27   // (DW_AT_prototyped) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .uleb128 0x49   // (DW_AT_type) >> +   .uleb128 0x13   // (DW_FORM_ref4) >> +   .uleb128 0x11   // (DW_AT_low_pc) >> +   .uleb128 0x1   // (DW_FORM_addr) >> +   .uleb128 0x12   // (DW_AT_high_pc) >> +   .uleb128 0x7   // (DW_FORM_data8) >> +   .uleb128 0x40   // (DW_AT_frame_base) >> +   .uleb128 0x18   // (DW_FORM_exprloc) >> +   .uleb128 0x2117   // (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   // (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .byte   0 >> +   .section   .debug_loc,"",@progbits >> +.Ldebug_loc0: >> +.LVUS0: >> +   .uleb128 .LVU11   // View list begin (*.LVUS0) >> +   .uleb128 .LVU12   // View list end (*.LVUS0) >> +   .uleb128 .LVU12   // View list begin (*.LVUS0) >> +   .uleb128 .LVU14   // View list end (*.LVUS0) >> +   .uleb128 .LVU14   // View list begin (*.LVUS0) >> +   .uleb128 0   // View list end (*.LVUS0) >> +.LLST0: >> +   .8byte   .LVL1   // Location list begin address (*.LLST0) >> +   .8byte   .LVL1   // Location list end address (*.LLST0) >> +   .2byte   0x1   // Location expression size >> +   .byte   0x50   // DW_OP_reg0 >> +   .8byte   .LVL1   // Location list begin address (*.LLST0) >> +   .8byte   .LVL2   // Location list end address (*.LLST0) >> +   .2byte   0x3   // Location expression size >> +   .byte   0x70   // DW_OP_breg0 >> +   .sleb128 1 >> +   .byte   0x9f   // DW_OP_stack_value >> +   .8byte   .LVL2   // Location list begin address (*.LLST0) >> +   .8byte   .LFE2   // Location list end address (*.LLST0) >> +   .2byte   0x1   // Location expression size >> +   .byte   0x50   // DW_OP_reg0 >> +   .8byte   0   // Location list terminator begin (*.LLST0) >> +   .8byte   0   // Location list terminator end (*.LLST0) >> +   .section   .debug_aranges,"",@progbits >> +   .4byte   0x3c   // Length of Address Ranges Info >> +   .2byte   0x2   // DWARF aranges version >> +   .4byte   .Ldebug_info0   // Offset of Compilation Unit Info >> +   .byte   0x8   // Size of Address >> +   .byte   0   // Size of Segment Descriptor >> +   .2byte   0   // Pad to 16 byte boundary >> +   .2byte   0 >> +   .8byte   .Ltext0   // Address >> +   .8byte   .Letext0-.Ltext0   // Length >> +   .8byte   .LFB2   // Address >> +   .8byte   .LFE2-.LFB2   // Length >> +   .8byte   0 >> +   .8byte   0 >> +   .section   .debug_ranges,"",@progbits >> +.Ldebug_ranges0: >> +   .8byte   .Ltext0   // Offset 0 >> +   .8byte   .Letext0 >> +   .8byte   .LFB2   // Offset 0x10 >> +   .8byte   .LFE2 >> +   .8byte   0 >> +   .8byte   0 >> +   .section   .debug_line,"",@progbits >> +.Ldebug_line0: >> +   .section   .debug_str,"MS",@progbits,1 >> +.LASF0: >> +   .string   "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 >> -g -O2 -fasynchronous-unwind-tables" >> +.LASF2: >> +   .string >> "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +.LASF4: >> +   .string   "answer" >> +.LASF1: >> +   .string   "tailcall.c" >> +.LASF3: >> +   .string   "main" >> +   .ident   "GCC: (Debian 10.2.1-3) 10.2.1 20201224" >> +   .section   .note.GNU-stack,"",@progbits >> diff --git a/gdb/testsuite/gdb.btrace/arm-instruction_history.S >> b/gdb/testsuite/gdb.btrace/arm-instruction_history.S >> new file mode 100644 >> index 00000000000..e73ddaa9be9 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.btrace/arm-instruction_history.S >> @@ -0,0 +1,31 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> +  Copyright 2013-2021 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/>. */ >> + >> +.arm >> +.text >> +.globl loop >> +.type loop, %function >> +loop: >> +   movs r0, #2 /* bp.1 */ >> +L1: >> +   cmp r0, #0 >> +   beq L2 >> +   subs r0, r0, #1 >> +   b L1 >> +L2: >> +   bx lr /* bp.2 */ >> + >> diff --git a/gdb/testsuite/gdb.btrace/arm-record_goto.S >> b/gdb/testsuite/gdb.btrace/arm-record_goto.S >> new file mode 100644 >> index 00000000000..2d3a2f0c8de >> --- /dev/null >> +++ b/gdb/testsuite/gdb.btrace/arm-record_goto.S >> @@ -0,0 +1,433 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> +  Copyright 2013-2019 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/>. >> + >> + > > Spurious newline. > [Zied] done. >> +  This file has been generated on an armv7 machine using: >> +  gcc -S -dA -g record_goto.c -o arm-record_goto.S */ >> + >> +   .arch armv7-a >> +   .eabi_attribute 28, 1   @ Tag_ABI_VFP_args >> +   .eabi_attribute 20, 1   @ Tag_ABI_FP_denormal >> +   .eabi_attribute 21, 1   @ Tag_ABI_FP_exceptions >> +   .eabi_attribute 23, 3   @ Tag_ABI_FP_number_model >> +   .eabi_attribute 24, 1   @ Tag_ABI_align8_needed >> +   .eabi_attribute 25, 1   @ Tag_ABI_align8_preserved >> +   .eabi_attribute 26, 2   @ Tag_ABI_enum_size >> +   .eabi_attribute 30, 6   @ Tag_ABI_optimization_goals >> +   .eabi_attribute 34, 1   @ Tag_CPU_unaligned_access >> +   .eabi_attribute 18, 4   @ Tag_ABI_PCS_wchar_t >> +   .file   "record_goto.c" >> +   .text >> +.Ltext0: >> +   .cfi_sections   .debug_frame >> +   .align   1 >> +   .global   fun1 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   fun1, %function >> +fun1: >> +.LFB0: >> +   .file 1 "record_goto.c" >> +   @ record_goto.c:22 >> +   .loc 1 22 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 1, uses_anonymous_args = 0 >> +   @ link register save eliminated. >> +@ BLOCK 2 seq:0 >> +@ PRED: ENTRY (FALLTHRU) >> +   push   {r7} >> +   .cfi_def_cfa_offset 4 >> +   .cfi_offset 7, -4 >> +   add   r7, sp, #0 >> +   .cfi_def_cfa_register 7 >> +   @ record_goto.c:23 >> +   .loc 1 23 0 >> +   nop >> +   mov   sp, r7 >> +   .cfi_def_cfa_register 13 >> +   @ sp needed >> +   ldr   r7, [sp], #4 >> +   .cfi_restore 7 >> +   .cfi_def_cfa_offset 0 >> +@ SUCC: EXIT [100.0%] >> +   bx   lr >> +   .cfi_endproc >> +.LFE0: >> +   .size   fun1, .-fun1 >> +   .align   1 >> +   .global   fun2 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   fun2, %function >> +fun2: >> +.LFB1: >> +   @ record_goto.c:27 >> +   .loc 1 27 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 1, uses_anonymous_args = 0 >> +@ BLOCK 2 seq:0 >> +@ PRED: ENTRY (FALLTHRU) >> +   push   {r7, lr} >> +   .cfi_def_cfa_offset 8 >> +   .cfi_offset 7, -8 >> +   .cfi_offset 14, -4 >> +   add   r7, sp, #0 >> +   .cfi_def_cfa_register 7 >> +   @ record_goto.c:28 >> +   .loc 1 28 0 >> +   bl   fun1(PLT) >> +   @ record_goto.c:29 >> +   .loc 1 29 0 >> +   nop >> +@ SUCC: EXIT [100.0%] >> +   pop   {r7, pc} >> +   .cfi_endproc >> +.LFE1: >> +   .size   fun2, .-fun2 >> +   .align   1 >> +   .global   fun3 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   fun3, %function >> +fun3: >> +.LFB2: >> +   @ record_goto.c:33 >> +   .loc 1 33 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 1, uses_anonymous_args = 0 >> +@ BLOCK 2 seq:0 >> +@ PRED: ENTRY (FALLTHRU) >> +   push   {r7, lr} >> +   .cfi_def_cfa_offset 8 >> +   .cfi_offset 7, -8 >> +   .cfi_offset 14, -4 >> +   add   r7, sp, #0 >> +   .cfi_def_cfa_register 7 >> +   @ record_goto.c:34 >> +   .loc 1 34 0 >> +   bl   fun1(PLT) >> +   @ record_goto.c:35 >> +   .loc 1 35 0 >> +   bl   fun2(PLT) >> +   @ record_goto.c:36 >> +   .loc 1 36 0 >> +   nop >> +@ SUCC: EXIT [100.0%] >> +   pop   {r7, pc} >> +   .cfi_endproc >> +.LFE2: >> +   .size   fun3, .-fun3 >> +   .align   1 >> +   .global   fun4 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   fun4, %function >> +fun4: >> +.LFB3: >> +   @ record_goto.c:40 >> +   .loc 1 40 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 1, uses_anonymous_args = 0 >> +@ BLOCK 2 seq:0 >> +@ PRED: ENTRY (FALLTHRU) >> +   push   {r7, lr} >> +   .cfi_def_cfa_offset 8 >> +   .cfi_offset 7, -8 >> +   .cfi_offset 14, -4 >> +   add   r7, sp, #0 >> +   .cfi_def_cfa_register 7 >> +   @ record_goto.c:41 >> +   .loc 1 41 0 >> +   bl   fun1(PLT) >> +   @ record_goto.c:42 >> +   .loc 1 42 0 >> +   bl   fun2(PLT) >> +   @ record_goto.c:43 >> +   .loc 1 43 0 >> +   bl   fun3(PLT) >> +   @ record_goto.c:44 >> +   .loc 1 44 0 >> +   nop >> +@ SUCC: EXIT [100.0%] >> +   pop   {r7, pc} >> +   .cfi_endproc >> +.LFE3: >> +   .size   fun4, .-fun4 >> +   .align   1 >> +   .global   main >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   main, %function >> +main: >> +.LFB4: >> +   @ record_goto.c:48 >> +   .loc 1 48 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 1, uses_anonymous_args = 0 >> +@ BLOCK 2 seq:0 >> +@ PRED: ENTRY (FALLTHRU) >> +   push   {r7, lr} >> +   .cfi_def_cfa_offset 8 >> +   .cfi_offset 7, -8 >> +   .cfi_offset 14, -4 >> +   add   r7, sp, #0 >> +   .cfi_def_cfa_register 7 >> +   @ record_goto.c:49 >> +   .loc 1 49 0 >> +   bl   fun4(PLT) >> +   @ record_goto.c:50 >> +   .loc 1 50 0 >> +   movs   r3, #0 >> +   @ record_goto.c:51 >> +   .loc 1 51 0 >> +   mov   r0, r3 >> +@ SUCC: EXIT [100.0%] >> +   pop   {r7, pc} >> +   .cfi_endproc >> +.LFE4: >> +   .size   main, .-main >> +.Letext0: >> +   .section   .debug_info,"",%progbits >> +.Ldebug_info0: >> +   .4byte   0x82   @ Length of Compilation Unit Info >> +   .2byte   0x4   @ DWARF version number >> +   .4byte   .Ldebug_abbrev0   @ Offset Into Abbrev. Section >> +   .byte   0x4   @ Pointer Size (in bytes) >> +   .uleb128 0x1   @ (DIE (0xb) DW_TAG_compile_unit) >> +   .4byte   .LASF4   @ DW_AT_producer: "GNU C11 7.4.0 >> -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb >> -mtls-dialect=gnu -g -fstack-protector-strong" >> +   .byte   0xc   @ DW_AT_language >> +   .4byte   .LASF5   @ DW_AT_name: "record_goto.c" >> +   .4byte   .LASF6   @ DW_AT_comp_dir: >> "/home/ubuntu/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +   .4byte   .Ltext0   @ DW_AT_low_pc >> +   .4byte   .Letext0-.Ltext0   @ DW_AT_high_pc >> +   .4byte   .Ldebug_line0   @ DW_AT_stmt_list >> +   .uleb128 0x2   @ (DIE (0x25) DW_TAG_subprogram) >> +           @ DW_AT_external >> +   .4byte   .LASF7   @ DW_AT_name: "main" >> +   .byte   0x1   @ DW_AT_decl_file (record_goto.c) >> +   .byte   0x2f   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x3a   @ DW_AT_type >> +   .4byte   .LFB4   @ DW_AT_low_pc >> +   .4byte   .LFE4-.LFB4   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_tail_call_sites >> +   .uleb128 0x3   @ (DIE (0x3a) DW_TAG_base_type) >> +   .byte   0x4   @ DW_AT_byte_size >> +   .byte   0x5   @ DW_AT_encoding >> +   .ascii "int\0"   @ DW_AT_name >> +   .uleb128 0x4   @ (DIE (0x41) DW_TAG_subprogram) >> +           @ DW_AT_external >> +   .4byte   .LASF0   @ DW_AT_name: "fun4" >> +   .byte   0x1   @ DW_AT_decl_file (record_goto.c) >> +   .byte   0x27   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   .LFB3   @ DW_AT_low_pc >> +   .4byte   .LFE3-.LFB3   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_tail_call_sites >> +   .uleb128 0x4   @ (DIE (0x52) DW_TAG_subprogram) >> +           @ DW_AT_external >> +   .4byte   .LASF1   @ DW_AT_name: "fun3" >> +   .byte   0x1   @ DW_AT_decl_file (record_goto.c) >> +   .byte   0x20   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   .LFB2   @ DW_AT_low_pc >> +   .4byte   .LFE2-.LFB2   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_tail_call_sites >> +   .uleb128 0x4   @ (DIE (0x63) DW_TAG_subprogram) >> +           @ DW_AT_external >> +   .4byte   .LASF2   @ DW_AT_name: "fun2" >> +   .byte   0x1   @ DW_AT_decl_file (record_goto.c) >> +   .byte   0x1a   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   .LFB1   @ DW_AT_low_pc >> +   .4byte   .LFE1-.LFB1   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_tail_call_sites >> +   .uleb128 0x5   @ (DIE (0x74) DW_TAG_subprogram) >> +           @ DW_AT_external >> +   .4byte   .LASF3   @ DW_AT_name: "fun1" >> +   .byte   0x1   @ DW_AT_decl_file (record_goto.c) >> +   .byte   0x15   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   .LFB0   @ DW_AT_low_pc >> +   .4byte   .LFE0-.LFB0   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .byte   0   @ end of children of DIE 0xb >> +   .section   .debug_abbrev,"",%progbits >> +.Ldebug_abbrev0: >> +   .uleb128 0x1   @ (abbrev code) >> +   .uleb128 0x11   @ (TAG: DW_TAG_compile_unit) >> +   .byte   0x1   @ DW_children_yes >> +   .uleb128 0x25   @ (DW_AT_producer) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x13   @ (DW_AT_language) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x1b   @ (DW_AT_comp_dir) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x10   @ (DW_AT_stmt_list) >> +   .uleb128 0x17   @ (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x2   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x3f   @ (DW_AT_external) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2116   @ (DW_AT_GNU_all_tail_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x3   @ (abbrev code) >> +   .uleb128 0x24   @ (TAG: DW_TAG_base_type) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0xb   @ (DW_AT_byte_size) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3e   @ (DW_AT_encoding) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0x8   @ (DW_FORM_string) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x4   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x3f   @ (DW_AT_external) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2116   @ (DW_AT_GNU_all_tail_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x5   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x3f   @ (DW_AT_external) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2117   @ (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .byte   0 >> +   .section   .debug_aranges,"",%progbits >> +   .4byte   0x1c   @ Length of Address Ranges Info >> +   .2byte   0x2   @ DWARF Version >> +   .4byte   .Ldebug_info0   @ Offset of Compilation Unit Info >> +   .byte   0x4   @ Size of Address >> +   .byte   0   @ Size of Segment Descriptor >> +   .2byte   0   @ Pad to 8 byte boundary >> +   .2byte   0 >> +   .4byte   .Ltext0   @ Address >> +   .4byte   .Letext0-.Ltext0   @ Length >> +   .4byte   0 >> +   .4byte   0 >> +   .section   .debug_line,"",%progbits >> +.Ldebug_line0: >> +   .section   .debug_str,"MS",%progbits,1 >> +.LASF5: >> +   .ascii   "record_goto.c\000" >> +.LASF2: >> +   .ascii   "fun2\000" >> +.LASF6: >> +   .ascii "/home/ubuntu/development/gdb/binutils-gdb/gdb/tests" >> +   .ascii   "uite/gdb.btrace\000" >> +.LASF4: >> +   .ascii   "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu" >> +   .ascii   "=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -fstack-pro" >> +   .ascii   "tector-strong\000" >> +.LASF0: >> +   .ascii   "fun4\000" >> +.LASF3: >> +   .ascii   "fun1\000" >> +.LASF7: >> +   .ascii   "main\000" >> +.LASF1: >> +   .ascii   "fun3\000" >> +   .ident   "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0" >> +   .section   .note.GNU-stack,"",%progbits >> diff --git a/gdb/testsuite/gdb.btrace/arm-tailcall-only.S >> b/gdb/testsuite/gdb.btrace/arm-tailcall-only.S >> new file mode 100644 >> index 00000000000..b7f4e4a3fce >> --- /dev/null >> +++ b/gdb/testsuite/gdb.btrace/arm-tailcall-only.S >> @@ -0,0 +1,504 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> +  Copyright 2016-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/>. >> + >> + > > Spurious newline. [Zied] done > >> +  This file has been generated on an armv7 machine using: >> +  gcc -S -O2 -dA -g tailcall-only.c -o arm-tailcall-only.S */ >> + >> +   .eabi_attribute 28, 1   @ Tag_ABI_VFP_args >> +   .eabi_attribute 20, 1   @ Tag_ABI_FP_denormal >> +   .eabi_attribute 21, 1   @ Tag_ABI_FP_exceptions >> +   .eabi_attribute 23, 3   @ Tag_ABI_FP_number_model >> +   .eabi_attribute 24, 1   @ Tag_ABI_align8_needed >> +   .eabi_attribute 25, 1   @ Tag_ABI_align8_preserved >> +   .eabi_attribute 26, 2   @ Tag_ABI_enum_size >> +   .eabi_attribute 30, 2   @ Tag_ABI_optimization_goals >> +   .eabi_attribute 34, 1   @ Tag_CPU_unaligned_access >> +   .eabi_attribute 18, 4   @ Tag_ABI_PCS_wchar_t >> +   .file   "tailcall-only.c" >> +   .text >> +.Ltext0: >> +   .cfi_sections   .debug_frame >> +   .align   1 >> +   .p2align 2,,3 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   bar_1, %function >> +bar_1: >> +.LFB0: >> +   .file 1 "tailcall-only.c" >> +   @ tailcall-only.c:22 >> +   .loc 1 22 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 0, uses_anonymous_args = 0 >> +   @ link register save eliminated. >> +@ BLOCK 2 freq:10000 seq:0 >> +@ PRED: ENTRY [100.0%] (FALLTHRU) >> +   @ tailcall-only.c:24 >> +   .loc 1 24 0 >> +   movs   r0, #42 >> +@ SUCC: EXIT [100.0%] >> +   bx   lr >> +   .cfi_endproc >> +.LFE0: >> +   .size   bar_1, .-bar_1 >> +   .align   1 >> +   .p2align 2,,3 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   bar, %function >> +bar: >> +.LFB1: >> +   @ tailcall-only.c:28 >> +   .loc 1 28 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 0, uses_anonymous_args = 0 >> +   @ link register save eliminated. >> +@ BLOCK 2 freq:10000 seq:0 >> +@ PRED: ENTRY [100.0%] (FALLTHRU) >> +@ SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) >> +   @ tailcall-only.c:29 >> +   .loc 1 29 0 >> +   b   bar_1(PLT) >> +.LVL0: >> +   .cfi_endproc >> +.LFE1: >> +   .size   bar, .-bar >> +   .align   1 >> +   .p2align 2,,3 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   foo_1, %function >> +foo_1: >> +.LFB2: >> +   @ tailcall-only.c:34 >> +   .loc 1 34 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 0, uses_anonymous_args = 0 >> +   @ link register save eliminated. >> +@ BLOCK 2 freq:10000 seq:0 >> +@ PRED: ENTRY [100.0%] (FALLTHRU) >> +@ SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) >> +   @ tailcall-only.c:35 >> +   .loc 1 35 0 >> +   b   bar(PLT) >> +.LVL1: >> +   .cfi_endproc >> +.LFE2: >> +   .size   foo_1, .-foo_1 >> +   .align   1 >> +   .p2align 2,,3 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   foo, %function >> +foo: >> +.LFB3: >> +   @ tailcall-only.c:40 >> +   .loc 1 40 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 0, uses_anonymous_args = 0 >> +   @ link register save eliminated. >> +@ BLOCK 2 freq:10000 seq:0 >> +@ PRED: ENTRY [100.0%] (FALLTHRU) >> +@ SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) >> +   @ tailcall-only.c:41 >> +   .loc 1 41 0 >> +   b   foo_1(PLT) >> +.LVL2: >> +   .cfi_endproc >> +.LFE3: >> +   .size   foo, .-foo >> +   .section   .text.startup,"ax",%progbits >> +   .align   1 >> +   .p2align 2,,3 >> +   .global   main >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   main, %function >> +main: >> +.LFB4: >> +   @ tailcall-only.c:46 >> +   .loc 1 46 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 0, uses_anonymous_args = 0 >> +@ BLOCK 2 freq:10000 seq:0 >> +@ PRED: ENTRY [100.0%] (FALLTHRU) >> +   push   {r3, lr} >> +   .cfi_def_cfa_offset 8 >> +   .cfi_offset 3, -8 >> +   .cfi_offset 14, -4 >> +   @ tailcall-only.c:49 >> +   .loc 1 49 0 >> +   bl   foo(PLT) >> +.LVL3: >> +   @ tailcall-only.c:53 >> +   .loc 1 53 0 >> +   adds   r0, r0, #1 >> +.LVL4: >> +@ SUCC: EXIT [100.0%] >> +   pop   {r3, pc} >> +   .cfi_endproc >> +.LFE4: >> +   .size   main, .-main >> +   .text >> +.Letext0: >> +   .section   .debug_info,"",%progbits >> +.Ldebug_info0: >> +   .4byte   0xd9   @ Length of Compilation Unit Info >> +   .2byte   0x4   @ DWARF version number >> +   .4byte   .Ldebug_abbrev0   @ Offset Into Abbrev. Section >> +   .byte   0x4   @ Pointer Size (in bytes) >> +   .uleb128 0x1   @ (DIE (0xb) DW_TAG_compile_unit) >> +   .4byte   .LASF1   @ DW_AT_producer: "GNU C11 7.4.0 >> -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb >> -mtls-dialect=gnu -g -O2 -fstack-protector-strong" >> +   .byte   0xc   @ DW_AT_language >> +   .4byte   .LASF2   @ DW_AT_name: "tailcall-only.c" >> +   .4byte   .LASF3   @ DW_AT_comp_dir: >> "/home/ubuntu/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +   .4byte   .Ldebug_ranges0+0   @ DW_AT_ranges >> +   .4byte   0   @ DW_AT_low_pc >> +   .4byte   .Ldebug_line0   @ DW_AT_stmt_list >> +   .uleb128 0x2   @ (DIE (0x25) DW_TAG_subprogram) >> +           @ DW_AT_external >> +   .4byte   .LASF4   @ DW_AT_name: "main" >> +   .byte   0x1   @ DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x2d   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LFB4   @ DW_AT_low_pc >> +   .4byte   .LFE4-.LFB4   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .4byte   0x57   @ DW_AT_sibling >> +   .uleb128 0x3   @ (DIE (0x3e) DW_TAG_variable) >> +   .4byte   .LASF5   @ DW_AT_name: "answer" >> +   .byte   0x1   @ DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x2f   @ DW_AT_decl_line >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LLST0   @ DW_AT_location >> +   .uleb128 0x4   @ (DIE (0x4d) DW_TAG_GNU_call_site) >> +   .4byte   .LVL3   @ DW_AT_low_pc >> +   .4byte   0x5e   @ DW_AT_abstract_origin >> +   .byte   0   @ end of children of DIE 0x25 >> +   .uleb128 0x5   @ (DIE (0x57) DW_TAG_base_type) >> +   .byte   0x4   @ DW_AT_byte_size >> +   .byte   0x5   @ DW_AT_encoding >> +   .ascii "int\0"   @ DW_AT_name >> +   .uleb128 0x6   @ (DIE (0x5e) DW_TAG_subprogram) >> +   .ascii "foo\0"   @ DW_AT_name >> +   .byte   0x1   @ DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x27   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LFB3   @ DW_AT_low_pc >> +   .4byte   .LFE3-.LFB3   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .4byte   0x81   @ DW_AT_sibling >> +   .uleb128 0x7   @ (DIE (0x77) DW_TAG_GNU_call_site) >> +   .4byte   .LVL2   @ DW_AT_low_pc >> +           @ DW_AT_GNU_tail_call >> +   .4byte   0x81   @ DW_AT_abstract_origin >> +   .byte   0   @ end of children of DIE 0x5e >> +   .uleb128 0x8   @ (DIE (0x81) DW_TAG_subprogram) >> +   .4byte   .LASF0   @ DW_AT_name: "foo_1" >> +   .byte   0x1   @ DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x21   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LFB2   @ DW_AT_low_pc >> +   .4byte   .LFE2-.LFB2   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .4byte   0xa4   @ DW_AT_sibling >> +   .uleb128 0x7   @ (DIE (0x9a) DW_TAG_GNU_call_site) >> +   .4byte   .LVL1   @ DW_AT_low_pc >> +           @ DW_AT_GNU_tail_call >> +   .4byte   0xa4   @ DW_AT_abstract_origin >> +   .byte   0   @ end of children of DIE 0x81 >> +   .uleb128 0x6   @ (DIE (0xa4) DW_TAG_subprogram) >> +   .ascii "bar\0"   @ DW_AT_name >> +   .byte   0x1   @ DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x1b   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LFB1   @ DW_AT_low_pc >> +   .4byte   .LFE1-.LFB1   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .4byte   0xc7   @ DW_AT_sibling >> +   .uleb128 0x7   @ (DIE (0xbd) DW_TAG_GNU_call_site) >> +   .4byte   .LVL0   @ DW_AT_low_pc >> +           @ DW_AT_GNU_tail_call >> +   .4byte   0xc7   @ DW_AT_abstract_origin >> +   .byte   0   @ end of children of DIE 0xa4 >> +   .uleb128 0x9   @ (DIE (0xc7) DW_TAG_subprogram) >> +   .4byte   .LASF6   @ DW_AT_name: "bar_1" >> +   .byte   0x1   @ DW_AT_decl_file (tailcall-only.c) >> +   .byte   0x15   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LFB0   @ DW_AT_low_pc >> +   .4byte   .LFE0-.LFB0   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .byte   0   @ end of children of DIE 0xb >> +   .section   .debug_abbrev,"",%progbits >> +.Ldebug_abbrev0: >> +   .uleb128 0x1   @ (abbrev code) >> +   .uleb128 0x11   @ (TAG: DW_TAG_compile_unit) >> +   .byte   0x1   @ DW_children_yes >> +   .uleb128 0x25   @ (DW_AT_producer) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x13   @ (DW_AT_language) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x1b   @ (DW_AT_comp_dir) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x55   @ (DW_AT_ranges) >> +   .uleb128 0x17   @ (DW_FORM_sec_offset) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x10   @ (DW_AT_stmt_list) >> +   .uleb128 0x17   @ (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x2   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0x1   @ DW_children_yes >> +   .uleb128 0x3f   @ (DW_AT_external) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2117   @ (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x1   @ (DW_AT_sibling) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x3   @ (abbrev code) >> +   .uleb128 0x34   @ (TAG: DW_TAG_variable) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x2   @ (DW_AT_location) >> +   .uleb128 0x17   @ (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x4   @ (abbrev code) >> +   .uleb128 0x4109   @ (TAG: DW_TAG_GNU_call_site) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x31   @ (DW_AT_abstract_origin) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x5   @ (abbrev code) >> +   .uleb128 0x24   @ (TAG: DW_TAG_base_type) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0xb   @ (DW_AT_byte_size) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3e   @ (DW_AT_encoding) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0x8   @ (DW_FORM_string) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x6   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0x1   @ DW_children_yes >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0x8   @ (DW_FORM_string) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2117   @ (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x1   @ (DW_AT_sibling) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x7   @ (abbrev code) >> +   .uleb128 0x4109   @ (TAG: DW_TAG_GNU_call_site) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x2115   @ (DW_AT_GNU_tail_call) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x31   @ (DW_AT_abstract_origin) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x8   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0x1   @ DW_children_yes >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2117   @ (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x1   @ (DW_AT_sibling) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x9   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2117   @ (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .byte   0 >> +   .section   .debug_loc,"",%progbits >> +.Ldebug_loc0: >> +.LLST0: >> +   .4byte   .LVL3   @ Location list begin address (*.LLST0) >> +   .4byte   .LVL4   @ Location list end address (*.LLST0) >> +   .2byte   0x3   @ Location expression size >> +   .byte   0x70   @ DW_OP_breg0 >> +   .sleb128 1 >> +   .byte   0x9f   @ DW_OP_stack_value >> +   .4byte   .LVL4   @ Location list begin address (*.LLST0) >> +   .4byte   .LFE4   @ Location list end address (*.LLST0) >> +   .2byte   0x1   @ Location expression size >> +   .byte   0x50   @ DW_OP_reg0 >> +   .4byte   0   @ Location list terminator begin (*.LLST0) >> +   .4byte   0   @ Location list terminator end (*.LLST0) >> +   .section   .debug_aranges,"",%progbits >> +   .4byte   0x24   @ Length of Address Ranges Info >> +   .2byte   0x2   @ DWARF Version >> +   .4byte   .Ldebug_info0   @ Offset of Compilation Unit Info >> +   .byte   0x4   @ Size of Address >> +   .byte   0   @ Size of Segment Descriptor >> +   .2byte   0   @ Pad to 8 byte boundary >> +   .2byte   0 >> +   .4byte   .Ltext0   @ Address >> +   .4byte   .Letext0-.Ltext0   @ Length >> +   .4byte   .LFB4   @ Address >> +   .4byte   .LFE4-.LFB4   @ Length >> +   .4byte   0 >> +   .4byte   0 >> +   .section   .debug_ranges,"",%progbits >> +.Ldebug_ranges0: >> +   .4byte   .Ltext0   @ Offset 0 >> +   .4byte   .Letext0 >> +   .4byte   .LFB4   @ Offset 0x8 >> +   .4byte   .LFE4 >> +   .4byte   0 >> +   .4byte   0 >> +   .section   .debug_line,"",%progbits >> +.Ldebug_line0: >> +   .section   .debug_str,"MS",%progbits,1 >> +.LASF2: >> +   .ascii   "tailcall-only.c\000" >> +.LASF5: >> +   .ascii   "answer\000" >> +.LASF1: >> +   .ascii   "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu" >> +   .ascii   "=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -O2 -fstack" >> +   .ascii   "-protector-strong\000" >> +.LASF4: >> +   .ascii   "main\000" >> +.LASF6: >> +   .ascii   "bar_1\000" >> +.LASF3: >> +   .ascii "/home/ubuntu/development/gdb/binutils-gdb/gdb/tests" >> +   .ascii   "uite/gdb.btrace\000" >> +.LASF0: >> +   .ascii   "foo_1\000" >> +   .ident   "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0" >> +   .section   .note.GNU-stack,"",%progbits >> diff --git a/gdb/testsuite/gdb.btrace/arm-tailcall.S >> b/gdb/testsuite/gdb.btrace/arm-tailcall.S >> new file mode 100644 >> index 00000000000..125b614524a >> --- /dev/null >> +++ b/gdb/testsuite/gdb.btrace/arm-tailcall.S >> @@ -0,0 +1,391 @@ >> + /* This testcase is part of GDB, the GNU debugger. >> + >> +  Copyright 2013-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/>. >> + >> + > > Spurious newline. [Zied] done. > >> +  This file has been generated on an armv7 machine using: >> +  gcc -S -O2 -dA -g tailcall.c -o arm-tailcall.S */ >> + >> +   .eabi_attribute 28, 1   @ Tag_ABI_VFP_args >> +   .eabi_attribute 20, 1   @ Tag_ABI_FP_denormal >> +   .eabi_attribute 21, 1   @ Tag_ABI_FP_exceptions >> +   .eabi_attribute 23, 3   @ Tag_ABI_FP_number_model >> +   .eabi_attribute 24, 1   @ Tag_ABI_align8_needed >> +   .eabi_attribute 25, 1   @ Tag_ABI_align8_preserved >> +   .eabi_attribute 26, 2   @ Tag_ABI_enum_size >> +   .eabi_attribute 30, 2   @ Tag_ABI_optimization_goals >> +   .eabi_attribute 34, 1   @ Tag_CPU_unaligned_access >> +   .eabi_attribute 18, 4   @ Tag_ABI_PCS_wchar_t >> +   .file   "tailcall.c" >> +   .text >> +.Ltext0: >> +   .cfi_sections   .debug_frame >> +   .align   1 >> +   .p2align 2,,3 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   bar, %function >> +bar: >> +.LFB0: >> +   .file 1 "tailcall.c" >> +   @ tailcall.c:22 >> +   .loc 1 22 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 0, uses_anonymous_args = 0 >> +   @ link register save eliminated. >> +@ BLOCK 2 freq:10000 seq:0 >> +@ PRED: ENTRY [100.0%] (FALLTHRU) >> +   @ tailcall.c:24 >> +   .loc 1 24 0 >> +   movs   r0, #42 >> +@ SUCC: EXIT [100.0%] >> +   bx   lr >> +   .cfi_endproc >> +.LFE0: >> +   .size   bar, .-bar >> +   .align   1 >> +   .p2align 2,,3 >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   foo, %function >> +foo: >> +.LFB1: >> +   @ tailcall.c:28 >> +   .loc 1 28 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 0, uses_anonymous_args = 0 >> +   @ link register save eliminated. >> +@ BLOCK 2 freq:10000 seq:0 >> +@ PRED: ENTRY [100.0%] (FALLTHRU) >> +@ SUCC: EXIT [100.0%] (ABNORMAL,SIBCALL) >> +   @ tailcall.c:29 >> +   .loc 1 29 0 >> +   b   bar(PLT) >> +.LVL0: >> +   .cfi_endproc >> +.LFE1: >> +   .size   foo, .-foo >> +   .section   .text.startup,"ax",%progbits >> +   .align   1 >> +   .p2align 2,,3 >> +   .global   main >> +   .syntax unified >> +   .thumb >> +   .thumb_func >> +   .fpu vfpv3-d16 >> +   .type   main, %function >> +main: >> +.LFB2: >> +   @ tailcall.c:34 >> +   .loc 1 34 0 >> +   .cfi_startproc >> +   @ args = 0, pretend = 0, frame = 0 >> +   @ frame_needed = 0, uses_anonymous_args = 0 >> +@ BLOCK 2 freq:10000 seq:0 >> +@ PRED: ENTRY [100.0%] (FALLTHRU) >> +   push   {r3, lr} >> +   .cfi_def_cfa_offset 8 >> +   .cfi_offset 3, -8 >> +   .cfi_offset 14, -4 >> +   @ tailcall.c:37 >> +   .loc 1 37 0 >> +   bl   foo(PLT) >> +.LVL1: >> +   @ tailcall.c:41 >> +   .loc 1 41 0 >> +   adds   r0, r0, #1 >> +.LVL2: >> +@ SUCC: EXIT [100.0%] >> +   pop   {r3, pc} >> +   .cfi_endproc >> +.LFE2: >> +   .size   main, .-main >> +   .text >> +.Letext0: >> +   .section   .debug_info,"",%progbits >> +.Ldebug_info0: >> +   .4byte   0x93   @ Length of Compilation Unit Info >> +   .2byte   0x4   @ DWARF version number >> +   .4byte   .Ldebug_abbrev0   @ Offset Into Abbrev. Section >> +   .byte   0x4   @ Pointer Size (in bytes) >> +   .uleb128 0x1   @ (DIE (0xb) DW_TAG_compile_unit) >> +   .4byte   .LASF0   @ DW_AT_producer: "GNU C11 7.4.0 >> -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb >> -mtls-dialect=gnu -g -O2 -fstack-protector-strong" >> +   .byte   0xc   @ DW_AT_language >> +   .4byte   .LASF1   @ DW_AT_name: "tailcall.c" >> +   .4byte   .LASF2   @ DW_AT_comp_dir: >> "/home/ubuntu/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" >> +   .4byte   .Ldebug_ranges0+0   @ DW_AT_ranges >> +   .4byte   0   @ DW_AT_low_pc >> +   .4byte   .Ldebug_line0   @ DW_AT_stmt_list >> +   .uleb128 0x2   @ (DIE (0x25) DW_TAG_subprogram) >> +           @ DW_AT_external >> +   .4byte   .LASF3   @ DW_AT_name: "main" >> +   .byte   0x1   @ DW_AT_decl_file (tailcall.c) >> +   .byte   0x21   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LFB2   @ DW_AT_low_pc >> +   .4byte   .LFE2-.LFB2   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .4byte   0x57   @ DW_AT_sibling >> +   .uleb128 0x3   @ (DIE (0x3e) DW_TAG_variable) >> +   .4byte   .LASF4   @ DW_AT_name: "answer" >> +   .byte   0x1   @ DW_AT_decl_file (tailcall.c) >> +   .byte   0x23   @ DW_AT_decl_line >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LLST0   @ DW_AT_location >> +   .uleb128 0x4   @ (DIE (0x4d) DW_TAG_GNU_call_site) >> +   .4byte   .LVL1   @ DW_AT_low_pc >> +   .4byte   0x5e   @ DW_AT_abstract_origin >> +   .byte   0   @ end of children of DIE 0x25 >> +   .uleb128 0x5   @ (DIE (0x57) DW_TAG_base_type) >> +   .byte   0x4   @ DW_AT_byte_size >> +   .byte   0x5   @ DW_AT_encoding >> +   .ascii "int\0"   @ DW_AT_name >> +   .uleb128 0x6   @ (DIE (0x5e) DW_TAG_subprogram) >> +   .ascii "foo\0"   @ DW_AT_name >> +   .byte   0x1   @ DW_AT_decl_file (tailcall.c) >> +   .byte   0x1b   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LFB1   @ DW_AT_low_pc >> +   .4byte   .LFE1-.LFB1   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .4byte   0x81   @ DW_AT_sibling >> +   .uleb128 0x7   @ (DIE (0x77) DW_TAG_GNU_call_site) >> +   .4byte   .LVL0   @ DW_AT_low_pc >> +           @ DW_AT_GNU_tail_call >> +   .4byte   0x81   @ DW_AT_abstract_origin >> +   .byte   0   @ end of children of DIE 0x5e >> +   .uleb128 0x8   @ (DIE (0x81) DW_TAG_subprogram) >> +   .ascii "bar\0"   @ DW_AT_name >> +   .byte   0x1   @ DW_AT_decl_file (tailcall.c) >> +   .byte   0x15   @ DW_AT_decl_line >> +           @ DW_AT_prototyped >> +   .4byte   0x57   @ DW_AT_type >> +   .4byte   .LFB0   @ DW_AT_low_pc >> +   .4byte   .LFE0-.LFB0   @ DW_AT_high_pc >> +   .uleb128 0x1   @ DW_AT_frame_base >> +   .byte   0x9c   @ DW_OP_call_frame_cfa >> +           @ DW_AT_GNU_all_call_sites >> +   .byte   0   @ end of children of DIE 0xb >> +   .section   .debug_abbrev,"",%progbits >> +.Ldebug_abbrev0: >> +   .uleb128 0x1   @ (abbrev code) >> +   .uleb128 0x11   @ (TAG: DW_TAG_compile_unit) >> +   .byte   0x1   @ DW_children_yes >> +   .uleb128 0x25   @ (DW_AT_producer) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x13   @ (DW_AT_language) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x1b   @ (DW_AT_comp_dir) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x55   @ (DW_AT_ranges) >> +   .uleb128 0x17   @ (DW_FORM_sec_offset) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x10   @ (DW_AT_stmt_list) >> +   .uleb128 0x17   @ (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x2   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0x1   @ DW_children_yes >> +   .uleb128 0x3f   @ (DW_AT_external) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2117   @ (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x1   @ (DW_AT_sibling) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x3   @ (abbrev code) >> +   .uleb128 0x34   @ (TAG: DW_TAG_variable) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0xe   @ (DW_FORM_strp) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x2   @ (DW_AT_location) >> +   .uleb128 0x17   @ (DW_FORM_sec_offset) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x4   @ (abbrev code) >> +   .uleb128 0x4109   @ (TAG: DW_TAG_GNU_call_site) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x31   @ (DW_AT_abstract_origin) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x5   @ (abbrev code) >> +   .uleb128 0x24   @ (TAG: DW_TAG_base_type) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0xb   @ (DW_AT_byte_size) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3e   @ (DW_AT_encoding) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0x8   @ (DW_FORM_string) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x6   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0x1   @ DW_children_yes >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0x8   @ (DW_FORM_string) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2117   @ (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x1   @ (DW_AT_sibling) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x7   @ (abbrev code) >> +   .uleb128 0x4109   @ (TAG: DW_TAG_GNU_call_site) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x2115   @ (DW_AT_GNU_tail_call) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x31   @ (DW_AT_abstract_origin) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .byte   0 >> +   .byte   0 >> +   .uleb128 0x8   @ (abbrev code) >> +   .uleb128 0x2e   @ (TAG: DW_TAG_subprogram) >> +   .byte   0   @ DW_children_no >> +   .uleb128 0x3   @ (DW_AT_name) >> +   .uleb128 0x8   @ (DW_FORM_string) >> +   .uleb128 0x3a   @ (DW_AT_decl_file) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x3b   @ (DW_AT_decl_line) >> +   .uleb128 0xb   @ (DW_FORM_data1) >> +   .uleb128 0x27   @ (DW_AT_prototyped) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .uleb128 0x49   @ (DW_AT_type) >> +   .uleb128 0x13   @ (DW_FORM_ref4) >> +   .uleb128 0x11   @ (DW_AT_low_pc) >> +   .uleb128 0x1   @ (DW_FORM_addr) >> +   .uleb128 0x12   @ (DW_AT_high_pc) >> +   .uleb128 0x6   @ (DW_FORM_data4) >> +   .uleb128 0x40   @ (DW_AT_frame_base) >> +   .uleb128 0x18   @ (DW_FORM_exprloc) >> +   .uleb128 0x2117   @ (DW_AT_GNU_all_call_sites) >> +   .uleb128 0x19   @ (DW_FORM_flag_present) >> +   .byte   0 >> +   .byte   0 >> +   .byte   0 >> +   .section   .debug_loc,"",%progbits >> +.Ldebug_loc0: >> +.LLST0: >> +   .4byte   .LVL1   @ Location list begin address (*.LLST0) >> +   .4byte   .LVL2   @ Location list end address (*.LLST0) >> +   .2byte   0x3   @ Location expression size >> +   .byte   0x70   @ DW_OP_breg0 >> +   .sleb128 1 >> +   .byte   0x9f   @ DW_OP_stack_value >> +   .4byte   .LVL2   @ Location list begin address (*.LLST0) >> +   .4byte   .LFE2   @ Location list end address (*.LLST0) >> +   .2byte   0x1   @ Location expression size >> +   .byte   0x50   @ DW_OP_reg0 >> +   .4byte   0   @ Location list terminator begin (*.LLST0) >> +   .4byte   0   @ Location list terminator end (*.LLST0) >> +   .section   .debug_aranges,"",%progbits >> +   .4byte   0x24   @ Length of Address Ranges Info >> +   .2byte   0x2   @ DWARF Version >> +   .4byte   .Ldebug_info0   @ Offset of Compilation Unit Info >> +   .byte   0x4   @ Size of Address >> +   .byte   0   @ Size of Segment Descriptor >> +   .2byte   0   @ Pad to 8 byte boundary >> +   .2byte   0 >> +   .4byte   .Ltext0   @ Address >> +   .4byte   .Letext0-.Ltext0   @ Length >> +   .4byte   .LFB2   @ Address >> +   .4byte   .LFE2-.LFB2   @ Length >> +   .4byte   0 >> +   .4byte   0 >> +   .section   .debug_ranges,"",%progbits >> +.Ldebug_ranges0: >> +   .4byte   .Ltext0   @ Offset 0 >> +   .4byte   .Letext0 >> +   .4byte   .LFB2   @ Offset 0x8 >> +   .4byte   .LFE2 >> +   .4byte   0 >> +   .4byte   0 >> +   .section   .debug_line,"",%progbits >> +.Ldebug_line0: >> +   .section   .debug_str,"MS",%progbits,1 >> +.LASF0: >> +   .ascii   "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu" >> +   .ascii   "=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -O2 -fstack" >> +   .ascii   "-protector-strong\000" >> +.LASF4: >> +   .ascii   "answer\000" >> +.LASF1: >> +   .ascii   "tailcall.c\000" >> +.LASF2: >> +   .ascii "/home/ubuntu/development/gdb/binutils-gdb/gdb/tests" >> +   .ascii   "uite/gdb.btrace\000" >> +.LASF3: >> +   .ascii   "main\000" >> +   .ident   "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0" >> +   .section   .note.GNU-stack,"",%progbits >> diff --git a/gdb/testsuite/gdb.btrace/buffer-size.exp >> b/gdb/testsuite/gdb.btrace/buffer-size.exp >> index ea4e36c1593..77d7b77852a 100644 >> --- a/gdb/testsuite/gdb.btrace/buffer-size.exp >> +++ b/gdb/testsuite/gdb.btrace/buffer-size.exp >> @@ -32,10 +32,17 @@ if ![runto_main] { >>      return -1 >>  } >>  -gdb_test_no_output "set record btrace bts buffer-size 1" >> -gdb_test_no_output "set record btrace pt buffer-size 1" >> -gdb_test "show record btrace bts buffer-size" "The record/replay bts >> buffer size is 1\.\r" >> -gdb_test "show record btrace pt buffer-size" "The record/replay pt >> buffer size is 1\.\r" >> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >> +   gdb_test_no_output "set record btrace bts buffer-size 1" >> +   gdb_test_no_output "set record btrace pt buffer-size 1" >> +   gdb_test "show record btrace bts buffer-size" "The record/replay >> bts buffer size is 1\.\r" >> +   gdb_test "show record btrace pt buffer-size" "The record/replay >> pt buffer size is 1\.\r" >> +} >> + >> +if {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { >> +   gdb_test_no_output "set record btrace etm buffer-size 1" >> +   gdb_test "show record btrace etm buffer-size" "The record/replay >> etm buffer size is 1\.\r" >> +} > > To avoid duplication of code, I think we could simplify this by > checking for the architecture and then creating a list of the btrace > formats we're dealing with. Something like: > > set btrace_type "" > if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >    set btrace_type { "bts" "pt" } > } elseif {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { >    set btrace_type { "etm" } > > Then have a for loop over btrace_type entries and write the tests only > once... > > foreach_with_prefix format $btrace_format { >    gdb_test_no_output "set record btrace $format buffer-size 1" >    gdb_test "show record btrace $format buffer-size" "The > record/replay $format buffer size is 1\.\r" > } > [Zied] done. thanks for the hint. > I'd apply this to any other cases where it is possible. That way we > avoid duplicated code with hardcoded content on them, which tends to > be hard to maintain and update. [Zied] I did not find other tests with specific btrace format > >>   gdb_test_no_output "record btrace" >>  gdb_test "info record" [multi_line \ >> diff --git a/gdb/testsuite/gdb.btrace/delta.exp >> b/gdb/testsuite/gdb.btrace/delta.exp >> index 9f6d741c013..2c8bada2065 100644 >> --- a/gdb/testsuite/gdb.btrace/delta.exp >> +++ b/gdb/testsuite/gdb.btrace/delta.exp >> @@ -58,8 +58,18 @@ proc check_trace {} { >>      "Recording format: .*" \ >>      "Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \ >>      ] >> + if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>      gdb_test "record instruction-history /f 1" \ >>        "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov *\\\$0x0,%eax\r" >> + } >> + if { [istarget "arm*-*-*"] } { >> +   gdb_test "record instruction-history /f 1" \ >> +     "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmovs\tr3, #0\r" >> + } >> + if { [istarget "aarch64*-*-*"]} { >> +   gdb_test "record instruction-history /f 1" \ >> +     "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov\tw0, #0x0.*\r" >> + } >>    gdb_test "record function-call-history /c 1" "1\tmain" >>  } >>  diff --git a/gdb/testsuite/gdb.btrace/instruction_history.exp >> b/gdb/testsuite/gdb.btrace/instruction_history.exp >> index 403085c083f..76fcadb9ac2 100644 >> --- a/gdb/testsuite/gdb.btrace/instruction_history.exp >> +++ b/gdb/testsuite/gdb.btrace/instruction_history.exp >> @@ -21,8 +21,14 @@ if { [skip_btrace_tests] } { >>      unsupported "target does not support record-btrace" >>      return -1 >>  } >> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >> + standard_testfile instruction_history.c x86-instruction_history.S >> +} elseif { [istarget "arm*-*-*"] } { >> + standard_testfile instruction_history.c arm-instruction_history.S >> +} elseif { [istarget "aarch64*-*-*"]} { >> + standard_testfile instruction_history.c aarch64-instruction_history.S > > Same here. I'd use the conditional blocks to set the prefix for the > source file, then call standard_testfile only once. > >> +} >>  -standard_testfile .c .S >>  if [prepare_for_testing "failed to prepare" $testfile "$srcfile >> $srcfile2" {debug}] { >>      return -1 >>  } >> @@ -68,39 +74,128 @@ if { $traced != 11 } { >>  } >>   # test that we see the expected instructions >> -gdb_test "record instruction-history 3,7" [multi_line \ >> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >> + gdb_test "record instruction-history 3,7" [multi_line \ >>      "3\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>" \ >>      "4\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ >>      "5\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>" \ >>      "6\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>      "7\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>\r" \ >>      ] >> +} >> +if { [istarget "arm*-*-*"] } { >> + gdb_test "record instruction-history 3,7" [multi_line \ >> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ >> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >> +   ] >> +} >> +if { [istarget "aarch64*-*-*"]} { >> + gdb_test "record instruction-history 3,7" [multi_line \ >> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >> <L2>.*" \ >> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >> <L2>.*\r" \ >> +   ] >> +} >>  -gdb_test "record instruction-history /f 3,+5" [multi_line \ >> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>      "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>" \ >>      "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec   %eax" \ >>      "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>" \ >>      "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>      "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>\r" \ >>      ] >> +} >> +if { [istarget "arm*-*-*"] } { >> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ >> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >> +   ] >> +} >> +if { [istarget "aarch64*-*-*"]} { >> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2>.*" \ >> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >> <L2>.*\r" \ >> +   ] >> +} >>  -gdb_test "record instruction-history /p 7,-5" [multi_line \ >> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>      "3\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>" \ >>      "4\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ >>      "5\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>" \ >>      "6\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>      "7\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>\r" \ >>      ] >> +} >> +if { [istarget "arm*-*-*"] } { >> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ >> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >> +   ] >> +} >> +if { [istarget "aarch64*-*-*"]} { >> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >> <L2>.*" \ >> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >> <L2>.*\r" \ >> +   ] >> +} >>  -gdb_test "record instruction-history /pf 3,7" [multi_line \ >> + >> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>      "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>" \ >>      "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec   %eax" \ >>      "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>" \ >>      "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>      "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>\r" \ >>      ] >> +} >> +if { [istarget "arm*-*-*"] } { >> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ >> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >> +   ] >> +} >> +if { [istarget "aarch64*-*-*"]} { >> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ >> <L2>.*" \ >> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ >> <L2>.*\r" \ >> +   ] >> +} >>  -gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>:\tje    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" >> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >> <loop\\+\[0-9\]+>:\tje    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" >> +} >> +if { [istarget "arm*-*-*"] } { >> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >> <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" >> +} >> +if { [istarget "aarch64*-*-*"]} { >> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >> <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2> // b\.none\r" >> +} >>   # the following tests are checking the iterators >>  # to avoid lots of regexps, we just check the number of lines that >> diff --git a/gdb/testsuite/gdb.btrace/non-stop.exp >> b/gdb/testsuite/gdb.btrace/non-stop.exp >> index 40cced7a8bb..58459de5359 100644 >> --- a/gdb/testsuite/gdb.btrace/non-stop.exp >> +++ b/gdb/testsuite/gdb.btrace/non-stop.exp >> @@ -31,6 +31,12 @@ save_vars { GDBFLAGS } { >>      clean_restart $testfile >>  } >>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >> +   set loop_position 2 >> +} elseif {[istarget "arm*-*-*"] || [istarget "aarch64*-*-*"]} { >> +   set loop_position 3 >> +} >> + >>  if ![runto_main] { >>      untested "failed to run to main" >>      return -1 >> @@ -111,87 +117,99 @@ gdb_test "thread apply all info rec" ".*" >>  gdb_test "info threads" ".*" >>   with_test_prefix "navigate" { >> -   gdb_test "thread apply 1 record goto 2" "$loop_line" >> -   gdb_test "thread apply 2 record goto 4" "$loop_line" >> +   gdb_test "thread apply 1 record goto $loop_position" "$loop_line" >> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >> 2}]" "$loop_line" >>      gdb_test "thread apply 1 info record" \ >> -       ".*Replay in progress\. At instruction 2\." "thread 1 at >> insn 2" >> +       ".*Replay in progress\. At instruction $loop_position\." >> "thread 1 at insn $loop_position" >>      gdb_test "thread apply 2 info record" \ >> -       ".*Replay in progress\. At instruction 4\." "thread 2 at >> insn 4" >> +       ".*Replay in progress\. At instruction [expr >> {$loop_position + 2}]\." "thread 2 at insn [expr {$loop_position + 2}]" >>  -   gdb_test "thread apply all record goto 5" "$loop_line" >> +   gdb_test "thread apply all record goto [expr {$loop_position + >> 3}]" "$loop_line" >>      gdb_test "thread apply 1 info record" \ >> -       ".*Replay in progress\. At instruction 5\." "thread 1 at >> insn 5" >> +       ".*Replay in progress\. At instruction [expr >> {$loop_position + 3}]\." "thread 1 at insn [expr {$loop_position + 3}]" >>      gdb_test "thread apply 2 info record" \ >> -       ".*Replay in progress\. At instruction 5\." "thread 2 at >> insn 5" >> +       ".*Replay in progress\. At instruction [expr >> {$loop_position + 3}]\." "thread 2 at insn [expr {$loop_position + 3}]" >>  } >>   with_test_prefix "step" { >> +   with_test_prefix "fixture" { >> +   gdb_test "thread apply 1 record goto [expr {$loop_position + >> 3}]" ".*" >> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >> 3}]" ".*" >> +   } >>      with_test_prefix "thread 1" { >>          gdb_test "thread apply 1 stepi 2" "$loop_line" >>          gdb_test "thread apply 1 info record" \ >> -           ".*Replay in progress\. At instruction 7\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 5}]\." >>          gdb_test "thread apply 2 info record" \ >> -           ".*Replay in progress\. At instruction 5\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 3}]\." >>      } >>       with_test_prefix "thread 2" { >>          gdb_test "thread apply 2 stepi 3" "$loop_line" >>          gdb_test "thread apply 1 info record" \ >> -           ".*Replay in progress\. At instruction 7\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 5}]\." >>          gdb_test "thread apply 2 info record" \ >> -           ".*Replay in progress\. At instruction 8\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 6}]\." >>      } >>       with_test_prefix "all" { >>          gdb_cont_to all "stepi 4" "$loop_line" 2 >>          gdb_test "thread apply 1 info record" \ >> -           ".*Replay in progress\. At instruction 11\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 9}]\." >>          gdb_test "thread apply 2 info record" \ >> -           ".*Replay in progress\. At instruction 12\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 10}]\." >>      } >>  } >>   with_test_prefix "reverse-step" { >> +   with_test_prefix "fixture" { >> +       gdb_test "thread apply 1 record goto [expr {$loop_position + >> 9}]" ".*" >> +       gdb_test "thread apply 2 record goto [expr {$loop_position + >> 10}]" ".*" >> +   } >>      with_test_prefix "thread 1" { >>          gdb_test "thread apply 1 reverse-stepi 2" "$loop_line" >>          gdb_test "thread apply 1 info record" \ >> -           ".*Replay in progress\. At instruction 9\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 7}]\." >>          gdb_test "thread apply 2 info record" \ >> -           ".*Replay in progress\. At instruction 12\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 10}]\." >>      } >>       with_test_prefix "thread 2" { >>          gdb_test "thread apply 2 reverse-stepi 3" "$loop_line" >>          gdb_test "thread apply 1 info record" \ >> -           ".*Replay in progress\. At instruction 9\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 7}]\." >>          gdb_test "thread apply 2 info record" \ >> -           ".*Replay in progress\. At instruction 9\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 7}]\." >>      } >>       with_test_prefix "all" { >>          gdb_cont_to all "reverse-stepi 4" "$loop_line" 2 >>          gdb_test "thread apply 1 info record" \ >> -           ".*Replay in progress\. At instruction 5\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 3}]\." >>          gdb_test "thread apply 2 info record" \ >> -           ".*Replay in progress\. At instruction 5\." >> +           ".*Replay in progress\. At instruction [expr >> {$loop_position + 3}]\." >>      } >>  } >>   with_test_prefix "continue" { >> +   with_test_prefix "fixture" { >> +   gdb_test "thread apply 1 record goto [expr {$loop_position + >> 3}]" ".*" >> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >> 3}]" ".*" >> +   } >>      with_test_prefix "thread 1" { >>      with_test_prefix "continue" { >>          gdb_cont_to_no_history 1 "continue" 1 >>          gdb_test "thread apply 1 info record" \ >>          ".*Recorded \[0-9\]+ instructions \[^\\\r\\\n\]*" >>          gdb_test "thread apply 2 info record" \ >> -       ".*Replay in progress\. At instruction 5\." >> +       ".*Replay in progress\. At instruction [expr >> {$loop_position + 3}]\." >>      } >>      with_test_prefix "reverse-continue" { >>          gdb_cont_to_no_history 1 "reverse-continue" 1 >>          gdb_test "thread apply 1 info record" \ >>          ".*Replay in progress\. At instruction 1\." >>          gdb_test "thread apply 2 info record" \ >> -       ".*Replay in progress\. At instruction 5\." >> +       ".*Replay in progress\. At instruction [expr >> {$loop_position + 3}]\." >>      } >>      } >>  diff --git a/gdb/testsuite/gdb.btrace/record_goto.exp >> b/gdb/testsuite/gdb.btrace/record_goto.exp >> index 75d76da1c7f..a04983a4859 100644 >> --- a/gdb/testsuite/gdb.btrace/record_goto.exp >> +++ b/gdb/testsuite/gdb.btrace/record_goto.exp >> @@ -41,6 +41,10 @@ if [info exists COMPILE] { >>      } else { >>          standard_testfile i686-record_goto.S >>      } >> +} elseif {[istarget "arm*-*-*"]} { >> +   standard_testfile arm-record_goto.S >> +} elseif {[istarget "aarch64*-*-*"]} { >> +   standard_testfile aarch64-record_goto.S >>  } else { >>      unsupported "target architecture not supported" >>      return -1 >> @@ -50,6 +54,126 @@ if [prepare_for_testing "failed to prepare" >> $testfile $srcfile $opts] { >>      return -1 >>  } >>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >> +   set function_positions(0) 19 >> +   set function_positions(1) 27 >> +   set function_positions(2) 2 >> +   set function_positions(end) 40 >> +   set function_positions(3) 39 >> + >> +   set sequence_begin(1) 1 >> +   set sequence_end(1) 1 >> +   set sequence_begin(2) 2 >> +   set sequence_end(2) 4 >> +   set sequence_begin(3) 5 >> +   set sequence_end(3) 8 >> +   set sequence_begin(4) 9 >> +   set sequence_end(4) 9 >> +   set sequence_begin(5) 10 >> +   set sequence_end(5) 12 >> +   set sequence_begin(6) 13 >> +   set sequence_end(6) 16 >> +   set sequence_begin(7) 17 >> +   set sequence_end(7) 18 >> +   set sequence_begin(8) 19 >> +   set sequence_end(8) 19 >> +   set sequence_begin(9) 20 >> +   set sequence_end(9) 22 >> +   set sequence_begin(10) 23 >> +   set sequence_end(10) 26 >> +   set sequence_begin(11) 27 >> +   set sequence_end(11) 27 >> +   set sequence_begin(12) 28 >> +   set sequence_end(12) 30 >> +   set sequence_begin(13) 31 >> +   set sequence_end(13) 34 >> +   set sequence_begin(14) 35 >> +   set sequence_end(14) 36 >> +   set sequence_begin(15) 37 >> +   set sequence_end(15) 38 >> +   set sequence_begin(16) 39 >> +   set sequence_end(16) 40 >> + >> +} elseif {[istarget "arm*-*-*"]} { >> +   set function_positions(0) 23 >> +   set function_positions(1) 33 >> +   set function_positions(2) 2 >> +   set function_positions(end) 48 >> +   set function_positions(3) 47 >> + >> +   set sequence_begin(1) 1 >> +   set sequence_end(1) 1 >> +   set sequence_begin(2) 2 >> +   set sequence_end(2) 4 >> +   set sequence_begin(3) 5 >> +   set sequence_end(3) 10 >> +   set sequence_begin(4) 11 >> +   set sequence_end(4) 11 >> +   set sequence_begin(5) 12 >> +   set sequence_end(5) 14 >> +   set sequence_begin(6) 15 >> +   set sequence_end(6) 20 >> +   set sequence_begin(7) 21 >> +   set sequence_end(7) 22 >> +   set sequence_begin(8) 23 >> +   set sequence_end(8) 23 >> +   set sequence_begin(9) 24 >> +   set sequence_end(9) 26 >> +   set sequence_begin(10) 27 >> +   set sequence_end(10) 32 >> +   set sequence_begin(11) 33 >> +   set sequence_end(11) 33 >> +   set sequence_begin(12) 34 >> +   set sequence_end(12) 36 >> +   set sequence_begin(13) 37 >> +   set sequence_end(13) 42 >> +   set sequence_begin(14) 43 >> +   set sequence_end(14) 44 >> +   set sequence_begin(15) 45 >> +   set sequence_end(15) 46 >> +   set sequence_begin(16) 47 >> +   set sequence_end(16) 48 >> +} elseif {[istarget "aarch64*-*-*"]} { >> +   set function_positions(0) 16 >> +   set function_positions(1) 22 >> +   set function_positions(2) 2 >> +   set function_positions(end) 36 >> +   set function_positions(3) 35 >> + >> +   set sequence_begin(1) 1 >> +   set sequence_end(1) 1 >> +   set sequence_begin(2) 2 >> +   set sequence_end(2) 4 >> +   set sequence_begin(3) 5 >> +   set sequence_end(3) 6 >> +   set sequence_begin(4) 7 >> +   set sequence_end(4) 7 >> +   set sequence_begin(5) 8 >> +   set sequence_end(5) 10 >> +   set sequence_begin(6) 11 >> +   set sequence_end(6) 12 >> +   set sequence_begin(7) 13 >> +   set sequence_end(7) 15 >> +   set sequence_begin(8) 16 >> +   set sequence_end(8) 16 >> +   set sequence_begin(9) 17 >> +   set sequence_end(9) 19 >> +   set sequence_begin(10) 20 >> +   set sequence_end(10) 21 >> +   set sequence_begin(11) 22 >> +   set sequence_end(11) 22 >> +   set sequence_begin(12) 23 >> +   set sequence_end(12) 25 >> +   set sequence_begin(13) 26 >> +   set sequence_end(13) 27 >> +   set sequence_begin(14) 28 >> +   set sequence_end(14) 30 >> +   set sequence_begin(15) 31 >> +   set sequence_end(15) 33 >> +   set sequence_begin(16) 34 >> +   set sequence_end(16) 36 >> +} >> + >>  if ![runto_main] { >>      untested "failed to run to main" >>      return -1 >> @@ -65,43 +189,43 @@ gdb_test "next" >>   # start by listing all functions >>  gdb_test "record function-call-history /ci 1, +20" [multi_line \ >> - "1\tmain\tinst 1,1" \ >> - "2\t fun4\tinst 2,4" \ >> - "3\t   fun1\tinst 5,8" \ >> - "4\t fun4\tinst 9,9" \ >> - "5\t   fun2\tinst 10,12" \ >> - "6\t     fun1\tinst 13,16" \ >> - "7\t   fun2\tinst 17,18" \ >> - "8\t fun4\tinst 19,19" \ >> - "9\t   fun3\tinst 20,22" \ >> - "10\t     fun1\tinst 23,26" \ >> - "11\t   fun3\tinst 27,27" \ >> - "12\t     fun2\tinst 28,30" \ >> - "13\t       fun1\tinst 31,34" \ >> - "14\t     fun2\tinst 35,36" \ >> - "15\t   fun3\tinst 37,38" \ >> - "16\t fun4\tinst 39,40" \ >> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)" \ >> + "4\t fun4\tinst $sequence_begin(4),$sequence_end(4)" \ >> + "5\t   fun2\tinst $sequence_begin(5),$sequence_end(5)" \ >> + "6\t     fun1\tinst $sequence_begin(6),$sequence_end(6)" \ >> + "7\t   fun2\tinst $sequence_begin(7),$sequence_end(7)" \ >> + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ >> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >> + "11\t   fun3\tinst $sequence_begin(11),$sequence_end(11)" \ >> + "12\t     fun2\tinst $sequence_begin(12),$sequence_end(12)" \ >> + "13\t       fun1\tinst $sequence_begin(13),$sequence_end(13)" \ >> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ >>    ] >>   # let's see if we can go back in history >> -gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*" >> +gdb_test "record goto $function_positions(0)" ".*fun4 \\(\\) at >> record_goto.c:43.*" >>   # the function call history should start at the new location >>  gdb_test "record function-call-history /ci" [multi_line \ >> - "8\t fun4\tinst 19,19" \ >> - "9\t   fun3\tinst 20,22" \ >> - "10\t     fun1\tinst 23,26" \ >> - ] "function-call-history from 19 forwards" >> + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ >> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >> + ] "function-call-history from $function_positions(0) forwards" >>   # the instruction history should start at the new location >>  gdb_test "record instruction-history" [multi_line \ >> - "19.*" \ >> - "20.*" \ >> - "21.*" \ >> - ] "instruction-history from 19 forwards" >> + "$function_positions(0).*" \ >> + "[expr {$function_positions(0) + 1}].*" \ >> + "[expr {$function_positions(0) + 2}].*" \ >> + ] "instruction-history from $function_positions(0) forwards" >>   # let's go to another place in the history >> -gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*" >> +gdb_test "record goto $function_positions(1)" ".*fun3 \\(\\) at >> record_goto.c:35.*" >>   # check the back trace at that location >>  gdb_test "backtrace" [multi_line \ >> @@ -117,26 +241,26 @@ gdb_test "up" ".*main.*at record_goto.c:49.*" >> "up to main" >>   # the function call history should start at the new location >>  gdb_test "record function-call-history /ci -" [multi_line \ >> - "9\t   fun3\tinst 20,22" \ >> - "10\t     fun1\tinst 23,26" \ >> - "11\t   fun3\tinst 27,27" \ >> - ] "function-call-history from 27 backwards" >> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >> + "11\t   fun3\tinst $sequence_begin(11),$sequence_end(11)" \ >> + ] "function-call-history from $function_positions(1) backwards" >>   # the instruction history should start at the new location >>  gdb_test "record instruction-history -" [multi_line \ >> - "25.*" \ >> - "26.*" \ >> - "27.*" \ >> - ] "instruction-history from 27 backwards" >> + "[expr {$function_positions(1) - 2}].*" \ >> + "[expr {$function_positions(1) - 1}].*" \ >> + "$function_positions(1).*" \ >> + ] "instruction-history from $function_positions(1) backwards" >>   # test that we can go to the begin of the trace >>  gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*" >>   # check that we're filling up the context correctly >>  gdb_test "record function-call-history /ci -" [multi_line \ >> - "1\tmain\tinst 1,1" \ >> - "2\t fun4\tinst 2,4" \ >> - "3\t   fun1\tinst 5,8" \ >> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)" \ >>    ] "function-call-history from begin backwards" >>   # check that we're filling up the context correctly >> @@ -147,52 +271,53 @@ gdb_test "record instruction-history -" >> [multi_line \ >>    ] "instruction-history from begin backwards" >>   # we should get the exact same history from the first instruction >> -gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*" >> +gdb_test "record goto $function_positions(2)" ".*fun4 \\(\\) at >> record_goto.c:40.*" >>   # check that we're filling up the context correctly >>  gdb_test "record function-call-history /ci -" [multi_line \ >> - "1\tmain\tinst 1,1" \ >> - "2\t fun4\tinst 2,4" \ >> - "3\t   fun1\tinst 5,8\r" \ >> - ] "function-call-history from 2 backwards" >> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)\r" \ >> + ] "function-call-history from $function_positions(2) backwards" >>   # check that we're filling up the context correctly >>  gdb_test "record instruction-history -" [multi_line \ >>    "1.*" \ >>    "2.*" \ >>    "3.*" \ >> - ] "instruction-history from 2 backwards" >> + ] "instruction-history from $function_positions(2) backwards" >>   # check that we can go to the end of the trace >>  gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*" >>   # check that we're filling up the context correctly >>  gdb_test "record function-call-history /ci" [multi_line \ >> - "14\t     fun2\tinst 35,36" \ >> - "15\t   fun3\tinst 37,38" \ >> - "16\t fun4\tinst 39,40" \ >> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ >>    ] "function-call-history from end forwards" >>   # check that we're filling up the context correctly >> +#adapt it for arm, last instruction is at pos 48 >>  gdb_test "record instruction-history" [multi_line \ >> - "38.*" \ >> - "39.*" \ >> - "40.*\r" \ >> + "[expr {$function_positions(end) - 2}].*" \ >> + "[expr {$function_positions(end) - 1}].*" \ >> + "$function_positions(end).*\r" \ >>    ] "instruction-history from end forwards" >>   # we should get the exact same history from the second to last >> instruction >> -gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*" >> +gdb_test "record goto $function_positions(3)" ".*fun4 \\(\\) at >> record_goto.c:44.*" >>   # check that we're filling up the context correctly >>  gdb_test "record function-call-history /ci" [multi_line \ >> - "14\t     fun2\tinst 35,36" \ >> - "15\t   fun3\tinst 37,38" \ >> - "16\t fun4\tinst 39,40\r" \ >> - ] "function-call-history from 39 forwards" >> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)\r" \ >> + ] "function-call-history from $function_positions(3) forwards" >>   # check that we're filling up the context correctly >>  gdb_test "record instruction-history" [multi_line \ >> - "38.*" \ >> - "39.*" \ >> - "40.*\r" \ >> - ] "instruction-history from 39 forwards" >> + "[expr {$function_positions(3) - 1}].*" \ >> + "$function_positions(3).*" \ >> + "[expr {$function_positions(3) + 1}].*\r" \ >> + ] "instruction-history from $function_positions(3) forwards" >> diff --git a/gdb/testsuite/gdb.btrace/stepi.exp >> b/gdb/testsuite/gdb.btrace/stepi.exp >> index bfb680bb30d..5b37d17ba0e 100644 >> --- a/gdb/testsuite/gdb.btrace/stepi.exp >> +++ b/gdb/testsuite/gdb.btrace/stepi.exp >> @@ -39,6 +39,10 @@ if [info exists COMPILE] { >>      } else { >>          standard_testfile i686-record_goto.S >>      } >> +} elseif {[istarget "arm*-*-*"]} { >> +   standard_testfile arm-record_goto.S >> +} elseif {[istarget "aarch64*-*-*"]} { >> +   standard_testfile aarch64-record_goto.S >>  } else { >>      unsupported "target architecture not supported" >>      return -1 >> @@ -48,6 +52,56 @@ if [prepare_for_testing "failed to prepare" >> $testfile $srcfile] { >>      return -1 >>  } >>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >> +   set instructions_count 40 >> +   set instruction_position(0) 39 >> +   set instruction_position(1) 40 >> +   set instruction_position(2) 1 >> +   set instruction_position(3) 1 >> +   set instruction_position(4) 22 >> +   set instruction_position(5) 23 >> +   set instruction_position(6) 22 >> +   set instruction_position(7) 27 >> +   set instruction_position(8) 22 >> +   set instruction_position(9) 1 >> +   set instruction_position(10) 1 >> +   set instruction_position(11) 1 >> +   set instruction_position(12) 2 >> +   set instruction_position(13) 1 >> +} elseif {[istarget "arm*-*-*"]} { >> +   set instructions_count 48 >> +   set instruction_position(0) 47 >> +   set instruction_position(1) 48 >> +   set instruction_position(2) 1 >> +   set instruction_position(3) 1 >> +   set instruction_position(4) 26 >> +   set instruction_position(5) 27 >> +   set instruction_position(6) 26 >> +   set instruction_position(7) 33 >> +   set instruction_position(8) 26 >> +   set instruction_position(9) 1 >> +   set instruction_position(10) 1 >> +   set instruction_position(11) 1 >> +   set instruction_position(12) 2 >> +   set instruction_position(13) 1 >> +} elseif {[istarget "aarch64*-*-*"]} { >> +   set instructions_count 36 >> +   set instruction_position(0) 35 >> +   set instruction_position(1) 36 >> +   set instruction_position(2) 1 >> +   set instruction_position(3) 1 >> +   set instruction_position(4) 19 >> +   set instruction_position(5) 20 >> +   set instruction_position(6) 19 >> +   set instruction_position(7) 22 >> +   set instruction_position(8) 19 >> +   set instruction_position(9) 1 >> +   set instruction_position(10) 1 >> +   set instruction_position(11) 1 >> +   set instruction_position(12) 2 >> +   set instruction_position(13) 1 >> +} >> + >>  if ![runto_main] { >>      untested "failed to run to main" >>      return -1 >> @@ -56,10 +110,11 @@ if ![runto_main] { >>  global gdb_prompt >>   proc check_replay_at { insn } { >> + global instructions_count >>    gdb_test "info record" [multi_line \ >>      "Active record target: record-btrace" \ >>      ".*" \ >> -   "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for .*" \ >> +   "Recorded $instructions_count instructions in 16 functions \\\(0 >> gaps\\\) for .*" \ >>      "Replay in progress\. At instruction $insn\." \ >>      ] "check replay at $insn" >>  } >> @@ -74,15 +129,14 @@ with_test_prefix "record" { >>  with_test_prefix "fetch" { >>      gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.1" >>      gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.2" >> - >>      # let's check where we are in the trace >> -   check_replay_at 39 >> +   check_replay_at $instruction_position(0) >>  } >>   # let's step forward and check again >>  with_test_prefix "stepi" { >>      gdb_test "stepi" ".*fun4\.5.*" >> -   check_replay_at 40 >> +   check_replay_at $instruction_position(1) >>  } >>   # with the next step, we stop replaying >> @@ -91,14 +145,17 @@ with_test_prefix "end" { >>      gdb_test "info record" [multi_line \ >>        "Active record target: record-btrace" \ >>        ".*" \ >> -     "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >> \[^\\\r\\\n\]*" \ >> +     "Recorded $instructions_count instructions in 16 functions >> \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ >>    ] >>  } >>  +#recover from a missing lr register in arm >> +gdb_test "record goto end" >> + >>  # let's try nexti >>  with_test_prefix "reverse-nexti.1" { >>      gdb_test "reverse-nexti" ".*main\.2.*" >> -   check_replay_at 1 >> +   check_replay_at $instruction_position(2) >>  } >>   # we can't reverse-nexti any further >> @@ -106,7 +163,7 @@ with_test_prefix "reverse-nexti.2" { >>      gdb_test "reverse-nexti" \ >>      "No more reverse-execution history\.\r\n.*main\.2.*" \ >>      "reverse-nexti.2" >> -   check_replay_at 1 >> +   check_replay_at $instruction_position(3) >>  } >>   # but we can step back again >> @@ -115,32 +172,32 @@ with_test_prefix "nexti" { >>      gdb_test "info record" [multi_line \ >>        "Active record target: record-btrace" \ >>        ".*" \ >> -     "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >> \[^\\\r\\\n\]*" \ >> +     "Recorded $instructions_count instructions in 16 functions >> \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ >>                     ] >>  } >>   # let's step from a goto position somewhere in the middle >>  with_test_prefix "goto" { >> -   gdb_test "record goto 22" ".*fun3\.2.*" >> -   with_test_prefix "goto 22" { check_replay_at 22 } >> +   gdb_test "record goto $instruction_position(4) " ".*fun3\.2.*" >> +   with_test_prefix "goto $instruction_position(4) " { >> check_replay_at $instruction_position(4) } >>       gdb_test "stepi" ".*fun1\.1.*" "stepi.3" >> -   with_test_prefix "stepi to 23" { check_replay_at 23 } >> +   with_test_prefix "stepi to $instruction_position(5)" { >> check_replay_at $instruction_position(5) } >>       gdb_test "reverse-stepi" ".*fun3\.2.*" "reverse-stepi.3" >> -   with_test_prefix "reverse-stepi to 22" { check_replay_at 22 } >> +   with_test_prefix "reverse-stepi to $instruction_position(6)" { >> check_replay_at $instruction_position(6) } >>       gdb_test "nexti" ".*fun3\.3.*" >> -   with_test_prefix "nexti to 27" { check_replay_at 27 } >> +   with_test_prefix "nexti to $instruction_position(7) " { >> check_replay_at $instruction_position(7) } >>       gdb_test "reverse-nexti" ".*fun3\.2.*" "reverse-nexti.3" >> -   with_test_prefix "reverse-nexti to 22" { check_replay_at 22 } >> +   with_test_prefix "reverse-nexti to $instruction_position(8)" { >> check_replay_at $instruction_position(8) } >>  } >>   # let's try to step off the left end >>  with_test_prefix "goto begin" { >>      gdb_test "record goto begin" ".*main\.2.*" >> -   check_replay_at 1 >> +   check_replay_at $instruction_position(9) >>       with_test_prefix "reverse-stepi" { >>      gdb_test "reverse-stepi" \ >> @@ -149,7 +206,7 @@ with_test_prefix "goto begin" { >>      gdb_test "reverse-stepi" \ >>          "No more reverse-execution history\.\r\n.*main\.2.*" \ >>          "reverse-stepi.2" >> -   check_replay_at 1 >> +   check_replay_at $instruction_position(10) >>      } >>       with_test_prefix "reverse-nexti" { >> @@ -159,13 +216,13 @@ with_test_prefix "goto begin" { >>      gdb_test "reverse-nexti" \ >>          "No more reverse-execution history\.\r\n.*main\.2.*" \ >>          "reverse-nexti.2" >> -   check_replay_at 1 >> +   check_replay_at $instruction_position(11) >>      } >>       # we can step forward, though >>      with_test_prefix "stepi" { >>      gdb_test "stepi" ".*fun4\.1.*" >> -   check_replay_at 2 >> +   check_replay_at $instruction_position(12) >>      } >>  } >>  @@ -178,5 +235,5 @@ with_test_prefix "reverse-stepi" { >>      gdb_test "reverse-stepi" \ >>      "No more reverse-execution history\.\r\n.*main\.2.*" \ >>      "reverse-stepi.3" >> -   check_replay_at 1 >> +   check_replay_at $instruction_position(13) >>  } >> diff --git a/gdb/testsuite/gdb.btrace/tailcall-only.exp >> b/gdb/testsuite/gdb.btrace/tailcall-only.exp >> index 510f90c9d5e..7e449ee38da 100644 >> --- a/gdb/testsuite/gdb.btrace/tailcall-only.exp >> +++ b/gdb/testsuite/gdb.btrace/tailcall-only.exp >> @@ -43,6 +43,10 @@ if [info exists COMPILE] { >>      } else { >>          standard_testfile i686-tailcall-only.S >>      } >> +} elseif { [istarget "arm*-*-*"] } { >> + standard_testfile arm-tailcall-only.S >> +} elseif {[istarget "aarch64*-*-*"]} { >> + standard_testfile aarch64-tailcall-only.S >>  } else { >>      unsupported "target architecture not supported" >>      return -1 >> @@ -62,6 +66,10 @@ gdb_test_no_output "set record >> function-call-history-size 0" >>   # trace foo >>  gdb_test "step" ".*" "prepare for recording" >> +# make sure we get out of function epilogue >> +if { [istarget "arm*-*-*"] } { >> + gdb_test "stepi" >> +} >>  gdb_test_no_output "record btrace" >>  gdb_test "stepi 4" ".*" "record branch trace" >>  diff --git a/gdb/testsuite/gdb.btrace/tailcall.exp >> b/gdb/testsuite/gdb.btrace/tailcall.exp >> index 07a3ec103f4..602a9ed6fba 100644 >> --- a/gdb/testsuite/gdb.btrace/tailcall.exp >> +++ b/gdb/testsuite/gdb.btrace/tailcall.exp >> @@ -40,6 +40,10 @@ if [info exists COMPILE] { >>      } else { >>          standard_testfile i686-tailcall.S >>      } >> +} elseif { [istarget "arm*-*-*"] } { >> + standard_testfile arm-tailcall.S >> +} elseif { [istarget "aarch64*-*-*"] } { >> + standard_testfile aarch64-tailcall.S >>  } else { >>      unsupported "target architecture not supported" >>      return -1 >> @@ -48,6 +52,20 @@ if [info exists COMPILE] { >>  if [prepare_for_testing "failed to prepare" $testfile $srcfile >> $opts] { >>      return -1 >>  } >> + >> +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >> +   set bar_return_line 24 >> +   set bar_return_position 4 >> +   set main_return_line 38 >> +} elseif {[istarget "arm*-*-*"]} { >> +   set bar_return_line 24 >> +   set bar_return_position 5 >> +   set main_return_line 41 >> +   } elseif {[istarget "aarch64*-*-*"]} { >> +   set bar_return_line 23 >> +   set bar_return_position 6 >> +   set main_return_line 40 >> +} > > There may be better ways to fetch this information without hardcoding > it, through regular expressions and $expect_out. See, for example, > gdb.base/step-over-syscall.exp and how it uses $expect_out to extract > some bits of information. > > You could extract this information first and then store it in these > variables. If the sources change, then we won't need to update the > test again. > > If it is hardcoded, every time the source changes you need to update > the test. > [Zied] I will appreciate extracting this information from the elf file. Problem is that according to the architecture, the last line number before the function returns can change slightly. Can you please explain further how to use $expect_out to get the line number. >>  if ![runto_main] { >>      untested "failed to run to main" >>      return -1 >> @@ -58,7 +76,17 @@ gdb_test_no_output "set record >> function-call-history-size 0" >>   # trace the call to foo >>  gdb_test_no_output "record btrace" >> -gdb_test "next 2" >> + >> +# make sure we get out of function epilogue >> +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >> +   gdb_test "next 2" >> +} elseif {[istarget "arm*-*-*"]} { >> + gdb_test "next 2" >> + gdb_test "stepi" >> +} elseif {[istarget "aarch64*-*-*"]} { >> + gdb_test "next" >> + gdb_test "stepi" >> +} >>   # show the flat branch trace >>  gdb_test "record function-call-history 1" [multi_line \ >> @@ -77,11 +105,11 @@ gdb_test "record function-call-history /c 1" >> [multi_line \ >>    ] "indented" >>   # go into bar >> -gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*" >> +gdb_test "record goto $bar_return_position" ".*bar \\(\\) at >> .*tailcall.c:$bar_return_line\r\n.*" >>   # check the backtrace >>  gdb_test "backtrace" [multi_line \ >> - "#0.*bar \\(\\) at tailcall.c:24" \ >> + "#0.*bar \\(\\) at tailcall.c:$bar_return_line" \ >>    "#1.*foo \\(\\) at tailcall.c:29" \ >>    "#2.*main \\(\\) at tailcall.c:37" \ >>    "Backtrace stopped: not enough registers or memory available to >> unwind further" \ >> @@ -93,23 +121,23 @@ gdb_test "up" "#2\[^\r\n\]*main \\(\\) at >> tailcall.c:37\r\n.*" "up to main" >>  gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" >> "down to foo" >>   # test stepping into and out of tailcalls. >> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >> tailcall.c:$main_return_line\r\n.*" \ >>      "finish.1" >> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \ >> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >> tailcall.c:$bar_return_line\r\n.*" \ >>      "reverse-step.1" >>  gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at >> tailcall.c:29\r\n.*" \ >>      "reverse-finish.1" >>  gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at >> tailcall.c:37\r\n.*" \ >>      "reverse-step.2" >> -gdb_test "next" "\[^\r\n\]*38.*" \ >> +gdb_test "next" "\[^\r\n\]*$main_return_line.*" \ >>      "next.1" >>  gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at >> tailcall.c:37\r\n.*" \ >>      "reverse-next.1" >>  gdb_test "step" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \ >>      "step.1" >> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >> tailcall.c:$main_return_line\r\n.*" \ >>      "finish.2" >> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \ >> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >> tailcall.c:$bar_return_line\r\n.*" \ >>      "reverse-step.3" >> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >> tailcall.c:$main_return_line\r\n.*" \ >>      "finish.3" >> diff --git a/gdb/testsuite/gdb.btrace/instruction_history.S >> b/gdb/testsuite/gdb.btrace/x86-instruction_history.S >> similarity index 100% >> rename from gdb/testsuite/gdb.btrace/instruction_history.S >> rename to gdb/testsuite/gdb.btrace/x86-instruction_history.S >> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp >> index 60f84d22aad..b7b11deab57 100644 >> --- a/gdb/testsuite/lib/gdb.exp >> +++ b/gdb/testsuite/lib/gdb.exp >> @@ -3232,7 +3232,7 @@ gdb_caching_proc skip_btrace_tests { >>      global srcdir subdir gdb_prompt inferior_exited_re >>       set me "skip_btrace_tests" >> -   if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } { >> +   if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] && >> ![istarget "arm*-*-*"] && ![istarget "aarch64*-*-*"]} { >>          verbose "$me: target does not support btrace, returning 1" 2 >>          return 1 >>      } >> >
On 4/4/21 4:30 PM, Zied Guermazi wrote: > hi Luis > > thanks for your review comments. Here is the status of the updates. The > changes will be published in next version of the patch set. > > /Zied > > On 01.04.21 15:34, Luis Machado wrote: >> On 3/30/21 11:52 PM, Zied Guermazi wrote: >>> diff --git a/gdb/testsuite/gdb.btrace/buffer-size.exp >>> b/gdb/testsuite/gdb.btrace/buffer-size.exp >>> index ea4e36c1593..77d7b77852a 100644 >>> --- a/gdb/testsuite/gdb.btrace/buffer-size.exp >>> +++ b/gdb/testsuite/gdb.btrace/buffer-size.exp >>> @@ -32,10 +32,17 @@ if ![runto_main] { >>>      return -1 >>>  } >>>  -gdb_test_no_output "set record btrace bts buffer-size 1" >>> -gdb_test_no_output "set record btrace pt buffer-size 1" >>> -gdb_test "show record btrace bts buffer-size" "The record/replay bts >>> buffer size is 1\.\r" >>> -gdb_test "show record btrace pt buffer-size" "The record/replay pt >>> buffer size is 1\.\r" >>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>> +   gdb_test_no_output "set record btrace bts buffer-size 1" >>> +   gdb_test_no_output "set record btrace pt buffer-size 1" >>> +   gdb_test "show record btrace bts buffer-size" "The record/replay >>> bts buffer size is 1\.\r" >>> +   gdb_test "show record btrace pt buffer-size" "The record/replay >>> pt buffer size is 1\.\r" >>> +} >>> + >>> +if {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { >>> +   gdb_test_no_output "set record btrace etm buffer-size 1" >>> +   gdb_test "show record btrace etm buffer-size" "The record/replay >>> etm buffer size is 1\.\r" >>> +} >> >> To avoid duplication of code, I think we could simplify this by >> checking for the architecture and then creating a list of the btrace >> formats we're dealing with. Something like: >> >> set btrace_type "" >> if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>    set btrace_type { "bts" "pt" } >> } elseif {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { >>    set btrace_type { "etm" } >> >> Then have a for loop over btrace_type entries and write the tests only >> once... >> >> foreach_with_prefix format $btrace_format { >>    gdb_test_no_output "set record btrace $format buffer-size 1" >>    gdb_test "show record btrace $format buffer-size" "The >> record/replay $format buffer size is 1\.\r" >> } >> > [Zied] done. thanks for the hint. >> I'd apply this to any other cases where it is possible. That way we >> avoid duplicated code with hardcoded content on them, which tends to >> be hard to maintain and update. > [Zied] I did not find other tests with specific btrace format There seems to be other cases in the patch. >> >>>   gdb_test_no_output "record btrace" >>>  gdb_test "info record" [multi_line \ >>> diff --git a/gdb/testsuite/gdb.btrace/delta.exp >>> b/gdb/testsuite/gdb.btrace/delta.exp >>> index 9f6d741c013..2c8bada2065 100644 >>> --- a/gdb/testsuite/gdb.btrace/delta.exp >>> +++ b/gdb/testsuite/gdb.btrace/delta.exp >>> @@ -58,8 +58,18 @@ proc check_trace {} { >>>      "Recording format: .*" \ >>>      "Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \ >>>      ] >>> + if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>      gdb_test "record instruction-history /f 1" \ >>>        "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov *\\\$0x0,%eax\r" >>> + } >>> + if { [istarget "arm*-*-*"] } { >>> +   gdb_test "record instruction-history /f 1" \ >>> +     "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmovs\tr3, #0\r" >>> + } >>> + if { [istarget "aarch64*-*-*"]} { >>> +   gdb_test "record instruction-history /f 1" \ >>> +     "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov\tw0, #0x0.*\r" >>> + } >>>    gdb_test "record function-call-history /c 1" "1\tmain" Here, for example. You could avoid duplicating the gdb_test invocation and, instead, set the expected pattern for each architecture. That way you only need to modify the expected pattern, leaving the gdb_test invocation intact. >>>  } >>>  diff --git a/gdb/testsuite/gdb.btrace/instruction_history.exp >>> b/gdb/testsuite/gdb.btrace/instruction_history.exp >>> index 403085c083f..76fcadb9ac2 100644 >>> --- a/gdb/testsuite/gdb.btrace/instruction_history.exp >>> +++ b/gdb/testsuite/gdb.btrace/instruction_history.exp >>> @@ -21,8 +21,14 @@ if { [skip_btrace_tests] } { >>>      unsupported "target does not support record-btrace" >>>      return -1 >>>  } >>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>> + standard_testfile instruction_history.c x86-instruction_history.S >>> +} elseif { [istarget "arm*-*-*"] } { >>> + standard_testfile instruction_history.c arm-instruction_history.S >>> +} elseif { [istarget "aarch64*-*-*"]} { >>> + standard_testfile instruction_history.c aarch64-instruction_history.S >> >> Same here. I'd use the conditional blocks to set the prefix for the >> source file, then call standard_testfile only once. As I mentioned before... You could set the prefix depending on the architecture (x86/arm/aarch64) and only invoke standard_testfile once. >> >>> +} >>>  -standard_testfile .c .S >>>  if [prepare_for_testing "failed to prepare" $testfile "$srcfile >>> $srcfile2" {debug}] { >>>      return -1 >>>  } >>> @@ -68,39 +74,128 @@ if { $traced != 11 } { >>>  } >>>   # test that we see the expected instructions >>> -gdb_test "record instruction-history 3,7" [multi_line \ >>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>> + gdb_test "record instruction-history 3,7" [multi_line \ >>>      "3\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>" \ >>>      "4\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ >>>      "5\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>" \ >>>      "6\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>      "7\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>\r" \ >>>      ] >>> +} >>> +if { [istarget "arm*-*-*"] } { >>> + gdb_test "record instruction-history 3,7" [multi_line \ >>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >>> +   ] >>> +} >>> +if { [istarget "aarch64*-*-*"]} { >>> + gdb_test "record instruction-history 3,7" [multi_line \ >>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>> <L2>.*" \ >>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>> <L2>.*\r" \ >>> +   ] >>> +} Here as well. Basically, anywhere where you have to differentiate between x86/arm/aarch64, if possible, try to set patterns and invoke the commands only once using the pattern contained in a variable set conditionally. >>>  -gdb_test "record instruction-history /f 3,+5" [multi_line \ >>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>      "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>" \ >>>      "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec   %eax" \ >>>      "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>" \ >>>      "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>      "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>\r" \ >>>      ] >>> +} >>> +if { [istarget "arm*-*-*"] } { >>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >>> +   ] >>> +} >>> +if { [istarget "aarch64*-*-*"]} { >>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2>.*" \ >>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>> <L2>.*\r" \ >>> +   ] >>> +} >>>  -gdb_test "record instruction-history /p 7,-5" [multi_line \ >>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>      "3\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>" \ >>>      "4\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ >>>      "5\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>" \ >>>      "6\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>      "7\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>\r" \ >>>      ] >>> +} >>> +if { [istarget "arm*-*-*"] } { >>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >>> +   ] >>> +} >>> +if { [istarget "aarch64*-*-*"]} { >>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>> <L2>.*" \ >>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>> <L2>.*\r" \ >>> +   ] >>> +} >>>  -gdb_test "record instruction-history /pf 3,7" [multi_line \ >>> + >>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>      "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>" \ >>>      "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec   %eax" \ >>>      "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>" \ >>>      "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>      "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>\r" \ >>>      ] >>> +} >>> +if { [istarget "arm*-*-*"] } { >>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >>> +   ] >>> +} >>> +if { [istarget "aarch64*-*-*"]} { >>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ >>> <L2>.*" \ >>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ >>> <L2>.*\r" \ >>> +   ] >>> +} >>>  -gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>:\tje    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" >>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>> <loop\\+\[0-9\]+>:\tje    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" >>> +} >>> +if { [istarget "arm*-*-*"] } { >>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>> <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" >>> +} >>> +if { [istarget "aarch64*-*-*"]} { >>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>> <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2> // b\.none\r" >>> +} >>>   # the following tests are checking the iterators >>>  # to avoid lots of regexps, we just check the number of lines that >>> diff --git a/gdb/testsuite/gdb.btrace/non-stop.exp >>> b/gdb/testsuite/gdb.btrace/non-stop.exp >>> index 40cced7a8bb..58459de5359 100644 >>> --- a/gdb/testsuite/gdb.btrace/non-stop.exp >>> +++ b/gdb/testsuite/gdb.btrace/non-stop.exp >>> @@ -31,6 +31,12 @@ save_vars { GDBFLAGS } { >>>      clean_restart $testfile >>>  } >>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>> +   set loop_position 2 >>> +} elseif {[istarget "arm*-*-*"] || [istarget "aarch64*-*-*"]} { >>> +   set loop_position 3 >>> +} >>> + >>>  if ![runto_main] { >>>      untested "failed to run to main" >>>      return -1 >>> @@ -111,87 +117,99 @@ gdb_test "thread apply all info rec" ".*" >>>  gdb_test "info threads" ".*" >>>   with_test_prefix "navigate" { >>> -   gdb_test "thread apply 1 record goto 2" "$loop_line" >>> -   gdb_test "thread apply 2 record goto 4" "$loop_line" >>> +   gdb_test "thread apply 1 record goto $loop_position" "$loop_line" >>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>> 2}]" "$loop_line" >>>      gdb_test "thread apply 1 info record" \ >>> -       ".*Replay in progress\. At instruction 2\." "thread 1 at >>> insn 2" >>> +       ".*Replay in progress\. At instruction $loop_position\." >>> "thread 1 at insn $loop_position" >>>      gdb_test "thread apply 2 info record" \ >>> -       ".*Replay in progress\. At instruction 4\." "thread 2 at >>> insn 4" >>> +       ".*Replay in progress\. At instruction [expr >>> {$loop_position + 2}]\." "thread 2 at insn [expr {$loop_position + 2}]" >>>  -   gdb_test "thread apply all record goto 5" "$loop_line" >>> +   gdb_test "thread apply all record goto [expr {$loop_position + >>> 3}]" "$loop_line" >>>      gdb_test "thread apply 1 info record" \ >>> -       ".*Replay in progress\. At instruction 5\." "thread 1 at >>> insn 5" >>> +       ".*Replay in progress\. At instruction [expr >>> {$loop_position + 3}]\." "thread 1 at insn [expr {$loop_position + 3}]" >>>      gdb_test "thread apply 2 info record" \ >>> -       ".*Replay in progress\. At instruction 5\." "thread 2 at >>> insn 5" >>> +       ".*Replay in progress\. At instruction [expr >>> {$loop_position + 3}]\." "thread 2 at insn [expr {$loop_position + 3}]" >>>  } >>>   with_test_prefix "step" { >>> +   with_test_prefix "fixture" { >>> +   gdb_test "thread apply 1 record goto [expr {$loop_position + >>> 3}]" ".*" >>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>> 3}]" ".*" >>> +   } >>>      with_test_prefix "thread 1" { >>>          gdb_test "thread apply 1 stepi 2" "$loop_line" >>>          gdb_test "thread apply 1 info record" \ >>> -           ".*Replay in progress\. At instruction 7\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 5}]\." >>>          gdb_test "thread apply 2 info record" \ >>> -           ".*Replay in progress\. At instruction 5\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 3}]\." >>>      } >>>       with_test_prefix "thread 2" { >>>          gdb_test "thread apply 2 stepi 3" "$loop_line" >>>          gdb_test "thread apply 1 info record" \ >>> -           ".*Replay in progress\. At instruction 7\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 5}]\." >>>          gdb_test "thread apply 2 info record" \ >>> -           ".*Replay in progress\. At instruction 8\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 6}]\." >>>      } >>>       with_test_prefix "all" { >>>          gdb_cont_to all "stepi 4" "$loop_line" 2 >>>          gdb_test "thread apply 1 info record" \ >>> -           ".*Replay in progress\. At instruction 11\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 9}]\." >>>          gdb_test "thread apply 2 info record" \ >>> -           ".*Replay in progress\. At instruction 12\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 10}]\." >>>      } >>>  } >>>   with_test_prefix "reverse-step" { >>> +   with_test_prefix "fixture" { >>> +       gdb_test "thread apply 1 record goto [expr {$loop_position + >>> 9}]" ".*" >>> +       gdb_test "thread apply 2 record goto [expr {$loop_position + >>> 10}]" ".*" >>> +   } >>>      with_test_prefix "thread 1" { >>>          gdb_test "thread apply 1 reverse-stepi 2" "$loop_line" >>>          gdb_test "thread apply 1 info record" \ >>> -           ".*Replay in progress\. At instruction 9\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 7}]\." >>>          gdb_test "thread apply 2 info record" \ >>> -           ".*Replay in progress\. At instruction 12\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 10}]\." >>>      } >>>       with_test_prefix "thread 2" { >>>          gdb_test "thread apply 2 reverse-stepi 3" "$loop_line" >>>          gdb_test "thread apply 1 info record" \ >>> -           ".*Replay in progress\. At instruction 9\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 7}]\." >>>          gdb_test "thread apply 2 info record" \ >>> -           ".*Replay in progress\. At instruction 9\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 7}]\." >>>      } >>>       with_test_prefix "all" { >>>          gdb_cont_to all "reverse-stepi 4" "$loop_line" 2 >>>          gdb_test "thread apply 1 info record" \ >>> -           ".*Replay in progress\. At instruction 5\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 3}]\." >>>          gdb_test "thread apply 2 info record" \ >>> -           ".*Replay in progress\. At instruction 5\." >>> +           ".*Replay in progress\. At instruction [expr >>> {$loop_position + 3}]\." >>>      } >>>  } >>>   with_test_prefix "continue" { >>> +   with_test_prefix "fixture" { >>> +   gdb_test "thread apply 1 record goto [expr {$loop_position + >>> 3}]" ".*" >>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>> 3}]" ".*" >>> +   } >>>      with_test_prefix "thread 1" { >>>      with_test_prefix "continue" { >>>          gdb_cont_to_no_history 1 "continue" 1 >>>          gdb_test "thread apply 1 info record" \ >>>          ".*Recorded \[0-9\]+ instructions \[^\\\r\\\n\]*" >>>          gdb_test "thread apply 2 info record" \ >>> -       ".*Replay in progress\. At instruction 5\." >>> +       ".*Replay in progress\. At instruction [expr >>> {$loop_position + 3}]\." >>>      } >>>      with_test_prefix "reverse-continue" { >>>          gdb_cont_to_no_history 1 "reverse-continue" 1 >>>          gdb_test "thread apply 1 info record" \ >>>          ".*Replay in progress\. At instruction 1\." >>>          gdb_test "thread apply 2 info record" \ >>> -       ".*Replay in progress\. At instruction 5\." >>> +       ".*Replay in progress\. At instruction [expr >>> {$loop_position + 3}]\." >>>      } >>>      } >>>  diff --git a/gdb/testsuite/gdb.btrace/record_goto.exp >>> b/gdb/testsuite/gdb.btrace/record_goto.exp >>> index 75d76da1c7f..a04983a4859 100644 >>> --- a/gdb/testsuite/gdb.btrace/record_goto.exp >>> +++ b/gdb/testsuite/gdb.btrace/record_goto.exp >>> @@ -41,6 +41,10 @@ if [info exists COMPILE] { >>>      } else { >>>          standard_testfile i686-record_goto.S >>>      } >>> +} elseif {[istarget "arm*-*-*"]} { >>> +   standard_testfile arm-record_goto.S >>> +} elseif {[istarget "aarch64*-*-*"]} { >>> +   standard_testfile aarch64-record_goto.S >>>  } else { >>>      unsupported "target architecture not supported" >>>      return -1 >>> @@ -50,6 +54,126 @@ if [prepare_for_testing "failed to prepare" >>> $testfile $srcfile $opts] { >>>      return -1 >>>  } >>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>> +   set function_positions(0) 19 >>> +   set function_positions(1) 27 >>> +   set function_positions(2) 2 >>> +   set function_positions(end) 40 >>> +   set function_positions(3) 39 >>> + >>> +   set sequence_begin(1) 1 >>> +   set sequence_end(1) 1 >>> +   set sequence_begin(2) 2 >>> +   set sequence_end(2) 4 >>> +   set sequence_begin(3) 5 >>> +   set sequence_end(3) 8 >>> +   set sequence_begin(4) 9 >>> +   set sequence_end(4) 9 >>> +   set sequence_begin(5) 10 >>> +   set sequence_end(5) 12 >>> +   set sequence_begin(6) 13 >>> +   set sequence_end(6) 16 >>> +   set sequence_begin(7) 17 >>> +   set sequence_end(7) 18 >>> +   set sequence_begin(8) 19 >>> +   set sequence_end(8) 19 >>> +   set sequence_begin(9) 20 >>> +   set sequence_end(9) 22 >>> +   set sequence_begin(10) 23 >>> +   set sequence_end(10) 26 >>> +   set sequence_begin(11) 27 >>> +   set sequence_end(11) 27 >>> +   set sequence_begin(12) 28 >>> +   set sequence_end(12) 30 >>> +   set sequence_begin(13) 31 >>> +   set sequence_end(13) 34 >>> +   set sequence_begin(14) 35 >>> +   set sequence_end(14) 36 >>> +   set sequence_begin(15) 37 >>> +   set sequence_end(15) 38 >>> +   set sequence_begin(16) 39 >>> +   set sequence_end(16) 40 >>> + >>> +} elseif {[istarget "arm*-*-*"]} { >>> +   set function_positions(0) 23 >>> +   set function_positions(1) 33 >>> +   set function_positions(2) 2 >>> +   set function_positions(end) 48 >>> +   set function_positions(3) 47 >>> + >>> +   set sequence_begin(1) 1 >>> +   set sequence_end(1) 1 >>> +   set sequence_begin(2) 2 >>> +   set sequence_end(2) 4 >>> +   set sequence_begin(3) 5 >>> +   set sequence_end(3) 10 >>> +   set sequence_begin(4) 11 >>> +   set sequence_end(4) 11 >>> +   set sequence_begin(5) 12 >>> +   set sequence_end(5) 14 >>> +   set sequence_begin(6) 15 >>> +   set sequence_end(6) 20 >>> +   set sequence_begin(7) 21 >>> +   set sequence_end(7) 22 >>> +   set sequence_begin(8) 23 >>> +   set sequence_end(8) 23 >>> +   set sequence_begin(9) 24 >>> +   set sequence_end(9) 26 >>> +   set sequence_begin(10) 27 >>> +   set sequence_end(10) 32 >>> +   set sequence_begin(11) 33 >>> +   set sequence_end(11) 33 >>> +   set sequence_begin(12) 34 >>> +   set sequence_end(12) 36 >>> +   set sequence_begin(13) 37 >>> +   set sequence_end(13) 42 >>> +   set sequence_begin(14) 43 >>> +   set sequence_end(14) 44 >>> +   set sequence_begin(15) 45 >>> +   set sequence_end(15) 46 >>> +   set sequence_begin(16) 47 >>> +   set sequence_end(16) 48 >>> +} elseif {[istarget "aarch64*-*-*"]} { >>> +   set function_positions(0) 16 >>> +   set function_positions(1) 22 >>> +   set function_positions(2) 2 >>> +   set function_positions(end) 36 >>> +   set function_positions(3) 35 >>> + >>> +   set sequence_begin(1) 1 >>> +   set sequence_end(1) 1 >>> +   set sequence_begin(2) 2 >>> +   set sequence_end(2) 4 >>> +   set sequence_begin(3) 5 >>> +   set sequence_end(3) 6 >>> +   set sequence_begin(4) 7 >>> +   set sequence_end(4) 7 >>> +   set sequence_begin(5) 8 >>> +   set sequence_end(5) 10 >>> +   set sequence_begin(6) 11 >>> +   set sequence_end(6) 12 >>> +   set sequence_begin(7) 13 >>> +   set sequence_end(7) 15 >>> +   set sequence_begin(8) 16 >>> +   set sequence_end(8) 16 >>> +   set sequence_begin(9) 17 >>> +   set sequence_end(9) 19 >>> +   set sequence_begin(10) 20 >>> +   set sequence_end(10) 21 >>> +   set sequence_begin(11) 22 >>> +   set sequence_end(11) 22 >>> +   set sequence_begin(12) 23 >>> +   set sequence_end(12) 25 >>> +   set sequence_begin(13) 26 >>> +   set sequence_end(13) 27 >>> +   set sequence_begin(14) 28 >>> +   set sequence_end(14) 30 >>> +   set sequence_begin(15) 31 >>> +   set sequence_end(15) 33 >>> +   set sequence_begin(16) 34 >>> +   set sequence_end(16) 36 >>> +} >>> + >>>  if ![runto_main] { >>>      untested "failed to run to main" >>>      return -1 >>> @@ -65,43 +189,43 @@ gdb_test "next" >>>   # start by listing all functions >>>  gdb_test "record function-call-history /ci 1, +20" [multi_line \ >>> - "1\tmain\tinst 1,1" \ >>> - "2\t fun4\tinst 2,4" \ >>> - "3\t   fun1\tinst 5,8" \ >>> - "4\t fun4\tinst 9,9" \ >>> - "5\t   fun2\tinst 10,12" \ >>> - "6\t     fun1\tinst 13,16" \ >>> - "7\t   fun2\tinst 17,18" \ >>> - "8\t fun4\tinst 19,19" \ >>> - "9\t   fun3\tinst 20,22" \ >>> - "10\t     fun1\tinst 23,26" \ >>> - "11\t   fun3\tinst 27,27" \ >>> - "12\t     fun2\tinst 28,30" \ >>> - "13\t       fun1\tinst 31,34" \ >>> - "14\t     fun2\tinst 35,36" \ >>> - "15\t   fun3\tinst 37,38" \ >>> - "16\t fun4\tinst 39,40" \ >>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)" \ >>> + "4\t fun4\tinst $sequence_begin(4),$sequence_end(4)" \ >>> + "5\t   fun2\tinst $sequence_begin(5),$sequence_end(5)" \ >>> + "6\t     fun1\tinst $sequence_begin(6),$sequence_end(6)" \ >>> + "7\t   fun2\tinst $sequence_begin(7),$sequence_end(7)" \ >>> + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ >>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>> + "11\t   fun3\tinst $sequence_begin(11),$sequence_end(11)" \ >>> + "12\t     fun2\tinst $sequence_begin(12),$sequence_end(12)" \ >>> + "13\t       fun1\tinst $sequence_begin(13),$sequence_end(13)" \ >>> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ >>>    ] >>>   # let's see if we can go back in history >>> -gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*" >>> +gdb_test "record goto $function_positions(0)" ".*fun4 \\(\\) at >>> record_goto.c:43.*" >>>   # the function call history should start at the new location >>>  gdb_test "record function-call-history /ci" [multi_line \ >>> - "8\t fun4\tinst 19,19" \ >>> - "9\t   fun3\tinst 20,22" \ >>> - "10\t     fun1\tinst 23,26" \ >>> - ] "function-call-history from 19 forwards" >>> + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ >>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>> + ] "function-call-history from $function_positions(0) forwards" >>>   # the instruction history should start at the new location >>>  gdb_test "record instruction-history" [multi_line \ >>> - "19.*" \ >>> - "20.*" \ >>> - "21.*" \ >>> - ] "instruction-history from 19 forwards" >>> + "$function_positions(0).*" \ >>> + "[expr {$function_positions(0) + 1}].*" \ >>> + "[expr {$function_positions(0) + 2}].*" \ >>> + ] "instruction-history from $function_positions(0) forwards" >>>   # let's go to another place in the history >>> -gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*" >>> +gdb_test "record goto $function_positions(1)" ".*fun3 \\(\\) at >>> record_goto.c:35.*" >>>   # check the back trace at that location >>>  gdb_test "backtrace" [multi_line \ >>> @@ -117,26 +241,26 @@ gdb_test "up" ".*main.*at record_goto.c:49.*" >>> "up to main" >>>   # the function call history should start at the new location >>>  gdb_test "record function-call-history /ci -" [multi_line \ >>> - "9\t   fun3\tinst 20,22" \ >>> - "10\t     fun1\tinst 23,26" \ >>> - "11\t   fun3\tinst 27,27" \ >>> - ] "function-call-history from 27 backwards" >>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>> + "11\t   fun3\tinst $sequence_begin(11),$sequence_end(11)" \ >>> + ] "function-call-history from $function_positions(1) backwards" >>>   # the instruction history should start at the new location >>>  gdb_test "record instruction-history -" [multi_line \ >>> - "25.*" \ >>> - "26.*" \ >>> - "27.*" \ >>> - ] "instruction-history from 27 backwards" >>> + "[expr {$function_positions(1) - 2}].*" \ >>> + "[expr {$function_positions(1) - 1}].*" \ >>> + "$function_positions(1).*" \ >>> + ] "instruction-history from $function_positions(1) backwards" >>>   # test that we can go to the begin of the trace >>>  gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*" >>>   # check that we're filling up the context correctly >>>  gdb_test "record function-call-history /ci -" [multi_line \ >>> - "1\tmain\tinst 1,1" \ >>> - "2\t fun4\tinst 2,4" \ >>> - "3\t   fun1\tinst 5,8" \ >>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)" \ >>>    ] "function-call-history from begin backwards" >>>   # check that we're filling up the context correctly >>> @@ -147,52 +271,53 @@ gdb_test "record instruction-history -" >>> [multi_line \ >>>    ] "instruction-history from begin backwards" >>>   # we should get the exact same history from the first instruction >>> -gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*" >>> +gdb_test "record goto $function_positions(2)" ".*fun4 \\(\\) at >>> record_goto.c:40.*" >>>   # check that we're filling up the context correctly >>>  gdb_test "record function-call-history /ci -" [multi_line \ >>> - "1\tmain\tinst 1,1" \ >>> - "2\t fun4\tinst 2,4" \ >>> - "3\t   fun1\tinst 5,8\r" \ >>> - ] "function-call-history from 2 backwards" >>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)\r" \ >>> + ] "function-call-history from $function_positions(2) backwards" >>>   # check that we're filling up the context correctly >>>  gdb_test "record instruction-history -" [multi_line \ >>>    "1.*" \ >>>    "2.*" \ >>>    "3.*" \ >>> - ] "instruction-history from 2 backwards" >>> + ] "instruction-history from $function_positions(2) backwards" >>>   # check that we can go to the end of the trace >>>  gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*" >>>   # check that we're filling up the context correctly >>>  gdb_test "record function-call-history /ci" [multi_line \ >>> - "14\t     fun2\tinst 35,36" \ >>> - "15\t   fun3\tinst 37,38" \ >>> - "16\t fun4\tinst 39,40" \ >>> + "14\t    �� fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ >>>    ] "function-call-history from end forwards" >>>   # check that we're filling up the context correctly >>> +#adapt it for arm, last instruction is at pos 48 >>>  gdb_test "record instruction-history" [multi_line \ >>> - "38.*" \ >>> - "39.*" \ >>> - "40.*\r" \ >>> + "[expr {$function_positions(end) - 2}].*" \ >>> + "[expr {$function_positions(end) - 1}].*" \ >>> + "$function_positions(end).*\r" \ >>>    ] "instruction-history from end forwards" >>>   # we should get the exact same history from the second to last >>> instruction >>> -gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*" >>> +gdb_test "record goto $function_positions(3)" ".*fun4 \\(\\) at >>> record_goto.c:44.*" >>>   # check that we're filling up the context correctly >>>  gdb_test "record function-call-history /ci" [multi_line \ >>> - "14\t     fun2\tinst 35,36" \ >>> - "15\t   fun3\tinst 37,38" \ >>> - "16\t fun4\tinst 39,40\r" \ >>> - ] "function-call-history from 39 forwards" >>> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)\r" \ >>> + ] "function-call-history from $function_positions(3) forwards" >>>   # check that we're filling up the context correctly >>>  gdb_test "record instruction-history" [multi_line \ >>> - "38.*" \ >>> - "39.*" \ >>> - "40.*\r" \ >>> - ] "instruction-history from 39 forwards" >>> + "[expr {$function_positions(3) - 1}].*" \ >>> + "$function_positions(3).*" \ >>> + "[expr {$function_positions(3) + 1}].*\r" \ >>> + ] "instruction-history from $function_positions(3) forwards" >>> diff --git a/gdb/testsuite/gdb.btrace/stepi.exp >>> b/gdb/testsuite/gdb.btrace/stepi.exp >>> index bfb680bb30d..5b37d17ba0e 100644 >>> --- a/gdb/testsuite/gdb.btrace/stepi.exp >>> +++ b/gdb/testsuite/gdb.btrace/stepi.exp >>> @@ -39,6 +39,10 @@ if [info exists COMPILE] { >>>      } else { >>>          standard_testfile i686-record_goto.S >>>      } >>> +} elseif {[istarget "arm*-*-*"]} { >>> +   standard_testfile arm-record_goto.S >>> +} elseif {[istarget "aarch64*-*-*"]} { >>> +   standard_testfile aarch64-record_goto.S >>>  } else { >>>      unsupported "target architecture not supported" >>>      return -1 >>> @@ -48,6 +52,56 @@ if [prepare_for_testing "failed to prepare" >>> $testfile $srcfile] { >>>      return -1 >>>  } >>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>> +   set instructions_count 40 >>> +   set instruction_position(0) 39 >>> +   set instruction_position(1) 40 >>> +   set instruction_position(2) 1 >>> +   set instruction_position(3) 1 >>> +   set instruction_position(4) 22 >>> +   set instruction_position(5) 23 >>> +   set instruction_position(6) 22 >>> +   set instruction_position(7) 27 >>> +   set instruction_position(8) 22 >>> +   set instruction_position(9) 1 >>> +   set instruction_position(10) 1 >>> +   set instruction_position(11) 1 >>> +   set instruction_position(12) 2 >>> +   set instruction_position(13) 1 >>> +} elseif {[istarget "arm*-*-*"]} { >>> +   set instructions_count 48 >>> +   set instruction_position(0) 47 >>> +   set instruction_position(1) 48 >>> +   set instruction_position(2) 1 >>> +   set instruction_position(3) 1 >>> +   set instruction_position(4) 26 >>> +   set instruction_position(5) 27 >>> +   set instruction_position(6) 26 >>> +   set instruction_position(7) 33 >>> +   set instruction_position(8) 26 >>> +   set instruction_position(9) 1 >>> +   set instruction_position(10) 1 >>> +   set instruction_position(11) 1 >>> +   set instruction_position(12) 2 >>> +   set instruction_position(13) 1 >>> +} elseif {[istarget "aarch64*-*-*"]} { >>> +   set instructions_count 36 >>> +   set instruction_position(0) 35 >>> +   set instruction_position(1) 36 >>> +   set instruction_position(2) 1 >>> +   set instruction_position(3) 1 >>> +   set instruction_position(4) 19 >>> +   set instruction_position(5) 20 >>> +   set instruction_position(6) 19 >>> +   set instruction_position(7) 22 >>> +   set instruction_position(8) 19 >>> +   set instruction_position(9) 1 >>> +   set instruction_position(10) 1 >>> +   set instruction_position(11) 1 >>> +   set instruction_position(12) 2 >>> +   set instruction_position(13) 1 >>> +} >>> + >>>  if ![runto_main] { >>>      untested "failed to run to main" >>>      return -1 >>> @@ -56,10 +110,11 @@ if ![runto_main] { >>>  global gdb_prompt >>>   proc check_replay_at { insn } { >>> + global instructions_count >>>    gdb_test "info record" [multi_line \ >>>      "Active record target: record-btrace" \ >>>      ".*" \ >>> -   "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for .*" \ >>> +   "Recorded $instructions_count instructions in 16 functions \\\(0 >>> gaps\\\) for .*" \ >>>      "Replay in progress\. At instruction $insn\." \ >>>      ] "check replay at $insn" >>>  } >>> @@ -74,15 +129,14 @@ with_test_prefix "record" { >>>  with_test_prefix "fetch" { >>>      gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.1" >>>      gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.2" >>> - >>>      # let's check where we are in the trace >>> -   check_replay_at 39 >>> +   check_replay_at $instruction_position(0) >>>  } >>>   # let's step forward and check again >>>  with_test_prefix "stepi" { >>>      gdb_test "stepi" ".*fun4\.5.*" >>> -   check_replay_at 40 >>> +   check_replay_at $instruction_position(1) >>>  } >>>   # with the next step, we stop replaying >>> @@ -91,14 +145,17 @@ with_test_prefix "end" { >>>      gdb_test "info record" [multi_line \ >>>        "Active record target: record-btrace" \ >>>        ".*" \ >>> -     "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >>> \[^\\\r\\\n\]*" \ >>> +     "Recorded $instructions_count instructions in 16 functions >>> \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ >>>    ] >>>  } >>>  +#recover from a missing lr register in arm >>> +gdb_test "record goto end" >>> + >>>  # let's try nexti >>>  with_test_prefix "reverse-nexti.1" { >>>      gdb_test "reverse-nexti" ".*main\.2.*" >>> -   check_replay_at 1 >>> +   check_replay_at $instruction_position(2) >>>  } >>>   # we can't reverse-nexti any further >>> @@ -106,7 +163,7 @@ with_test_prefix "reverse-nexti.2" { >>>      gdb_test "reverse-nexti" \ >>>      "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>      "reverse-nexti.2" >>> -   check_replay_at 1 >>> +   check_replay_at $instruction_position(3) >>>  } >>>   # but we can step back again >>> @@ -115,32 +172,32 @@ with_test_prefix "nexti" { >>>      gdb_test "info record" [multi_line \ >>>        "Active record target: record-btrace" \ >>>        ".*" \ >>> -     "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >>> \[^\\\r\\\n\]*" \ >>> +     "Recorded $instructions_count instructions in 16 functions >>> \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ >>>                     ] >>>  } >>>   # let's step from a goto position somewhere in the middle >>>  with_test_prefix "goto" { >>> -   gdb_test "record goto 22" ".*fun3\.2.*" >>> -   with_test_prefix "goto 22" { check_replay_at 22 } >>> +   gdb_test "record goto $instruction_position(4) " ".*fun3\.2.*" >>> +   with_test_prefix "goto $instruction_position(4) " { >>> check_replay_at $instruction_position(4) } >>>       gdb_test "stepi" ".*fun1\.1.*" "stepi.3" >>> -   with_test_prefix "stepi to 23" { check_replay_at 23 } >>> +   with_test_prefix "stepi to $instruction_position(5)" { >>> check_replay_at $instruction_position(5) } >>>       gdb_test "reverse-stepi" ".*fun3\.2.*" "reverse-stepi.3" >>> -   with_test_prefix "reverse-stepi to 22" { check_replay_at 22 } >>> +   with_test_prefix "reverse-stepi to $instruction_position(6)" { >>> check_replay_at $instruction_position(6) } >>>       gdb_test "nexti" ".*fun3\.3.*" >>> -   with_test_prefix "nexti to 27" { check_replay_at 27 } >>> +   with_test_prefix "nexti to $instruction_position(7) " { >>> check_replay_at $instruction_position(7) } >>>       gdb_test "reverse-nexti" ".*fun3\.2.*" "reverse-nexti.3" >>> -   with_test_prefix "reverse-nexti to 22" { check_replay_at 22 } >>> +   with_test_prefix "reverse-nexti to $instruction_position(8)" { >>> check_replay_at $instruction_position(8) } >>>  } >>>   # let's try to step off the left end >>>  with_test_prefix "goto begin" { >>>      gdb_test "record goto begin" ".*main\.2.*" >>> -   check_replay_at 1 >>> +   check_replay_at $instruction_position(9) >>>       with_test_prefix "reverse-stepi" { >>>      gdb_test "reverse-stepi" \ >>> @@ -149,7 +206,7 @@ with_test_prefix "goto begin" { >>>      gdb_test "reverse-stepi" \ >>>          "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>          "reverse-stepi.2" >>> -   check_replay_at 1 >>> +   check_replay_at $instruction_position(10) >>>      } >>>       with_test_prefix "reverse-nexti" { >>> @@ -159,13 +216,13 @@ with_test_prefix "goto begin" { >>>      gdb_test "reverse-nexti" \ >>>          "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>          "reverse-nexti.2" >>> -   check_replay_at 1 >>> +   check_replay_at $instruction_position(11) >>>      } >>>       # we can step forward, though >>>      with_test_prefix "stepi" { >>>      gdb_test "stepi" ".*fun4\.1.*" >>> -   check_replay_at 2 >>> +   check_replay_at $instruction_position(12) >>>      } >>>  } >>>  @@ -178,5 +235,5 @@ with_test_prefix "reverse-stepi" { >>>      gdb_test "reverse-stepi" \ >>>      "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>      "reverse-stepi.3" >>> -   check_replay_at 1 >>> +   check_replay_at $instruction_position(13) >>>  } >>> diff --git a/gdb/testsuite/gdb.btrace/tailcall-only.exp >>> b/gdb/testsuite/gdb.btrace/tailcall-only.exp >>> index 510f90c9d5e..7e449ee38da 100644 >>> --- a/gdb/testsuite/gdb.btrace/tailcall-only.exp >>> +++ b/gdb/testsuite/gdb.btrace/tailcall-only.exp >>> @@ -43,6 +43,10 @@ if [info exists COMPILE] { >>>      } else { >>>          standard_testfile i686-tailcall-only.S >>>      } >>> +} elseif { [istarget "arm*-*-*"] } { >>> + standard_testfile arm-tailcall-only.S >>> +} elseif {[istarget "aarch64*-*-*"]} { >>> + standard_testfile aarch64-tailcall-only.S >>>  } else { >>>      unsupported "target architecture not supported" >>>      return -1 >>> @@ -62,6 +66,10 @@ gdb_test_no_output "set record >>> function-call-history-size 0" >>>   # trace foo >>>  gdb_test "step" ".*" "prepare for recording" >>> +# make sure we get out of function epilogue >>> +if { [istarget "arm*-*-*"] } { >>> + gdb_test "stepi" >>> +} >>>  gdb_test_no_output "record btrace" >>>  gdb_test "stepi 4" ".*" "record branch trace" >>>  diff --git a/gdb/testsuite/gdb.btrace/tailcall.exp >>> b/gdb/testsuite/gdb.btrace/tailcall.exp >>> index 07a3ec103f4..602a9ed6fba 100644 >>> --- a/gdb/testsuite/gdb.btrace/tailcall.exp >>> +++ b/gdb/testsuite/gdb.btrace/tailcall.exp >>> @@ -40,6 +40,10 @@ if [info exists COMPILE] { >>>      } else { >>>          standard_testfile i686-tailcall.S >>>      } >>> +} elseif { [istarget "arm*-*-*"] } { >>> + standard_testfile arm-tailcall.S >>> +} elseif { [istarget "aarch64*-*-*"] } { >>> + standard_testfile aarch64-tailcall.S >>>  } else { >>>      unsupported "target architecture not supported" >>>      return -1 >>> @@ -48,6 +52,20 @@ if [info exists COMPILE] { >>>  if [prepare_for_testing "failed to prepare" $testfile $srcfile >>> $opts] { >>>      return -1 >>>  } >>> + >>> +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>> +   set bar_return_line 24 >>> +   set bar_return_position 4 >>> +   set main_return_line 38 >>> +} elseif {[istarget "arm*-*-*"]} { >>> +   set bar_return_line 24 >>> +   set bar_return_position 5 >>> +   set main_return_line 41 >>> +   } elseif {[istarget "aarch64*-*-*"]} { >>> +   set bar_return_line 23 >>> +   set bar_return_position 6 >>> +   set main_return_line 40 >>> +} >> >> There may be better ways to fetch this information without hardcoding >> it, through regular expressions and $expect_out. See, for example, >> gdb.base/step-over-syscall.exp and how it uses $expect_out to extract >> some bits of information. >> >> You could extract this information first and then store it in these >> variables. If the sources change, then we won't need to update the >> test again. >> >> If it is hardcoded, every time the source changes you need to update >> the test. >> > [Zied] I will appreciate extracting this information from the elf file. > Problem is that according to the architecture, the last line number > before the function returns can change slightly. Can you please explain > further how to use $expect_out to get the line number. Extracting from the ELF file is not a good approach. Instead, you should first run the test, stopping at each of these places of interest (bar return, main return etc) and record the line number and position in some way. Using regular expressions you can extract the line number the program stopped at, for example. Then you do another run and actually test the btrace functionality. If it is not possible to determine some of these fields dynamically, then using the conditional blocks is an acceptable approach. But you should be aware that different compiler versions may generate different code. So this particular test will only work for this particular .S file. >>>  if ![runto_main] { >>>      untested "failed to run to main" >>>      return -1 >>> @@ -58,7 +76,17 @@ gdb_test_no_output "set record >>> function-call-history-size 0" >>>   # trace the call to foo >>>  gdb_test_no_output "record btrace" >>> -gdb_test "next 2" >>> + >>> +# make sure we get out of function epilogue >>> +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>> +   gdb_test "next 2" >>> +} elseif {[istarget "arm*-*-*"]} { >>> + gdb_test "next 2" >>> + gdb_test "stepi" >>> +} elseif {[istarget "aarch64*-*-*"]} { >>> + gdb_test "next" >>> + gdb_test "stepi" >>> +} The above will make the test complicated to follow, because it does something different for different architectures. If the program is not stopping at the right location, it is best to work with breakpoints to force it to stop there instead of playing with next/stepi calls. >>>   # show the flat branch trace >>>  gdb_test "record function-call-history 1" [multi_line \ >>> @@ -77,11 +105,11 @@ gdb_test "record function-call-history /c 1" >>> [multi_line \ >>>    ] "indented" >>>   # go into bar >>> -gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*" >>> +gdb_test "record goto $bar_return_position" ".*bar \\(\\) at >>> .*tailcall.c:$bar_return_line\r\n.*" >>>   # check the backtrace >>>  gdb_test "backtrace" [multi_line \ >>> - "#0.*bar \\(\\) at tailcall.c:24" \ >>> + "#0.*bar \\(\\) at tailcall.c:$bar_return_line" \ >>>    "#1.*foo \\(\\) at tailcall.c:29" \ >>>    "#2.*main \\(\\) at tailcall.c:37" \ >>>    "Backtrace stopped: not enough registers or memory available to >>> unwind further" \ >>> @@ -93,23 +121,23 @@ gdb_test "up" "#2\[^\r\n\]*main \\(\\) at >>> tailcall.c:37\r\n.*" "up to main" >>>  gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" >>> "down to foo" >>>   # test stepping into and out of tailcalls. >>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>> tailcall.c:$main_return_line\r\n.*" \ >>>      "finish.1" >>> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \ >>> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>> tailcall.c:$bar_return_line\r\n.*" \ >>>      "reverse-step.1" >>>  gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at >>> tailcall.c:29\r\n.*" \ >>>      "reverse-finish.1" >>>  gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at >>> tailcall.c:37\r\n.*" \ >>>      "reverse-step.2" >>> -gdb_test "next" "\[^\r\n\]*38.*" \ >>> +gdb_test "next" "\[^\r\n\]*$main_return_line.*" \ >>>      "next.1" >>>  gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at >>> tailcall.c:37\r\n.*" \ >>>      "reverse-next.1" >>>  gdb_test "step" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \ >>>      "step.1" >>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>> tailcall.c:$main_return_line\r\n.*" \ >>>      "finish.2" >>> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" \ >>> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>> tailcall.c:$bar_return_line\r\n.*" \ >>>      "reverse-step.3" >>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>> tailcall.c:$main_return_line\r\n.*" \ >>>      "finish.3" >>> diff --git a/gdb/testsuite/gdb.btrace/instruction_history.S >>> b/gdb/testsuite/gdb.btrace/x86-instruction_history.S >>> similarity index 100% >>> rename from gdb/testsuite/gdb.btrace/instruction_history.S >>> rename to gdb/testsuite/gdb.btrace/x86-instruction_history.S >>> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp >>> index 60f84d22aad..b7b11deab57 100644 >>> --- a/gdb/testsuite/lib/gdb.exp >>> +++ b/gdb/testsuite/lib/gdb.exp >>> @@ -3232,7 +3232,7 @@ gdb_caching_proc skip_btrace_tests { >>>      global srcdir subdir gdb_prompt inferior_exited_re >>>       set me "skip_btrace_tests" >>> -   if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } { >>> +   if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] && >>> ![istarget "arm*-*-*"] && ![istarget "aarch64*-*-*"]} { >>>          verbose "$me: target does not support btrace, returning 1" 2 >>>          return 1 >>>      } >>> >> >
hi Luis, here is the status of the updates. Kind Regards Zied Guermazi On 06.04.21 15:09, Luis Machado wrote: > On 4/4/21 4:30 PM, Zied Guermazi wrote: >> hi Luis >> >> thanks for your review comments. Here is the status of the updates. >> The changes will be published in next version of the patch set. >> >> /Zied >> >> On 01.04.21 15:34, Luis Machado wrote: >>> On 3/30/21 11:52 PM, Zied Guermazi wrote: >>>> diff --git a/gdb/testsuite/gdb.btrace/buffer-size.exp >>>> b/gdb/testsuite/gdb.btrace/buffer-size.exp >>>> index ea4e36c1593..77d7b77852a 100644 >>>> --- a/gdb/testsuite/gdb.btrace/buffer-size.exp >>>> +++ b/gdb/testsuite/gdb.btrace/buffer-size.exp >>>> @@ -32,10 +32,17 @@ if ![runto_main] { >>>>      return -1 >>>>  } >>>>  -gdb_test_no_output "set record btrace bts buffer-size 1" >>>> -gdb_test_no_output "set record btrace pt buffer-size 1" >>>> -gdb_test "show record btrace bts buffer-size" "The record/replay >>>> bts buffer size is 1\.\r" >>>> -gdb_test "show record btrace pt buffer-size" "The record/replay pt >>>> buffer size is 1\.\r" >>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>> +   gdb_test_no_output "set record btrace bts buffer-size 1" >>>> +   gdb_test_no_output "set record btrace pt buffer-size 1" >>>> +   gdb_test "show record btrace bts buffer-size" "The >>>> record/replay bts buffer size is 1\.\r" >>>> +   gdb_test "show record btrace pt buffer-size" "The >>>> record/replay pt buffer size is 1\.\r" >>>> +} >>>> + >>>> +if {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { >>>> +   gdb_test_no_output "set record btrace etm buffer-size 1" >>>> +   gdb_test "show record btrace etm buffer-size" "The >>>> record/replay etm buffer size is 1\.\r" >>>> +} >>> >>> To avoid duplication of code, I think we could simplify this by >>> checking for the architecture and then creating a list of the btrace >>> formats we're dealing with. Something like: >>> >>> set btrace_type "" >>> if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>    set btrace_type { "bts" "pt" } >>> } elseif {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { >>>    set btrace_type { "etm" } >>> >>> Then have a for loop over btrace_type entries and write the tests >>> only once... >>> >>> foreach_with_prefix format $btrace_format { >>>    gdb_test_no_output "set record btrace $format buffer-size 1" >>>    gdb_test "show record btrace $format buffer-size" "The >>> record/replay $format buffer size is 1\.\r" >>> } >>> >> [Zied] done. thanks for the hint. >>> I'd apply this to any other cases where it is possible. That way we >>> avoid duplicated code with hardcoded content on them, which tends to >>> be hard to maintain and update. >> [Zied] I did not find other tests with specific btrace format > > There seems to be other cases in the patch. > >>> >>>>   gdb_test_no_output "record btrace" >>>>  gdb_test "info record" [multi_line \ >>>> diff --git a/gdb/testsuite/gdb.btrace/delta.exp >>>> b/gdb/testsuite/gdb.btrace/delta.exp >>>> index 9f6d741c013..2c8bada2065 100644 >>>> --- a/gdb/testsuite/gdb.btrace/delta.exp >>>> +++ b/gdb/testsuite/gdb.btrace/delta.exp >>>> @@ -58,8 +58,18 @@ proc check_trace {} { >>>>      "Recording format: .*" \ >>>>      "Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \ >>>>      ] >>>> + if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>>      gdb_test "record instruction-history /f 1" \ >>>>        "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov *\\\$0x0,%eax\r" >>>> + } >>>> + if { [istarget "arm*-*-*"] } { >>>> +   gdb_test "record instruction-history /f 1" \ >>>> +     "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmovs\tr3, #0\r" >>>> + } >>>> + if { [istarget "aarch64*-*-*"]} { >>>> +   gdb_test "record instruction-history /f 1" \ >>>> +     "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov\tw0, #0x0.*\r" >>>> + } >>>>    gdb_test "record function-call-history /c 1" "1\tmain" > > Here, for example. You could avoid duplicating the gdb_test invocation > and, instead, set the expected pattern for each architecture. That way > you only need to modify the expected pattern, leaving the gdb_test > invocation intact. > [Zied] Done >>>>  } >>>>  diff --git a/gdb/testsuite/gdb.btrace/instruction_history.exp >>>> b/gdb/testsuite/gdb.btrace/instruction_history.exp >>>> index 403085c083f..76fcadb9ac2 100644 >>>> --- a/gdb/testsuite/gdb.btrace/instruction_history.exp >>>> +++ b/gdb/testsuite/gdb.btrace/instruction_history.exp >>>> @@ -21,8 +21,14 @@ if { [skip_btrace_tests] } { >>>>      unsupported "target does not support record-btrace" >>>>      return -1 >>>>  } >>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>> + standard_testfile instruction_history.c x86-instruction_history.S >>>> +} elseif { [istarget "arm*-*-*"] } { >>>> + standard_testfile instruction_history.c arm-instruction_history.S >>>> +} elseif { [istarget "aarch64*-*-*"]} { >>>> + standard_testfile instruction_history.c >>>> aarch64-instruction_history.S >>> >>> Same here. I'd use the conditional blocks to set the prefix for the >>> source file, then call standard_testfile only once. > > As I mentioned before... You could set the prefix depending on the > architecture (x86/arm/aarch64) and only invoke standard_testfile once. [Zied] done > >>> >>>> +} >>>>  -standard_testfile .c .S >>>>  if [prepare_for_testing "failed to prepare" $testfile "$srcfile >>>> $srcfile2" {debug}] { >>>>      return -1 >>>>  } >>>> @@ -68,39 +74,128 @@ if { $traced != 11 } { >>>>  } >>>>   # test that we see the expected instructions >>>> -gdb_test "record instruction-history 3,7" [multi_line \ >>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>> + gdb_test "record instruction-history 3,7" [multi_line \ >>>>      "3\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>" \ >>>>      "4\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ >>>>      "5\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>" \ >>>>      "6\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>>      "7\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>\r" \ >>>>      ] >>>> +} >>>> +if { [istarget "arm*-*-*"] } { >>>> + gdb_test "record instruction-history 3,7" [multi_line \ >>>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ >>>> <L2>\r" \ >>>> +   ] >>>> +} >>>> +if { [istarget "aarch64*-*-*"]} { >>>> + gdb_test "record instruction-history 3,7" [multi_line \ >>>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>> <L2>.*" \ >>>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>> <L2>.*\r" \ >>>> +   ] >>>> +} > > Here as well. Basically, anywhere where you have to differentiate > between x86/arm/aarch64, if possible, try to set patterns and invoke > the commands only once using the pattern contained in a variable set > conditionally. [Zied] done > >>>>  -gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>>      "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>" \ >>>>      "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \ >>>>      "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>" \ >>>>      "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>>      "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>\r" \ >>>>      ] >>>> +} >>>> +if { [istarget "arm*-*-*"] } { >>>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >>>> +   ] >>>> +} >>>> +if { [istarget "aarch64*-*-*"]} { >>>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>> <L2>.*" \ >>>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>> <L2>.*\r" \ >>>> +   ] >>>> +} >>>>  -gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>>      "3\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>" \ >>>>      "4\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ >>>>      "5\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>" \ >>>>      "6\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>>      "7\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>\r" \ >>>>      ] >>>> +} >>>> +if { [istarget "arm*-*-*"] } { >>>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ >>>> <L2>\r" \ >>>> +   ] >>>> +} >>>> +if { [istarget "aarch64*-*-*"]} { >>>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>> <L2>.*" \ >>>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>> <L2>.*\r" \ >>>> +   ] >>>> +} >>>>  -gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>> + >>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>>      "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>" \ >>>>      "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \ >>>>      "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>" \ >>>>      "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>>      "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>\r" \ >>>>      ] >>>> +} >>>> +if { [istarget "arm*-*-*"] } { >>>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >>>> +   ] >>>> +} >>>> +if { [istarget "aarch64*-*-*"]} { >>>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ >>>> <L2>.*" \ >>>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ >>>> <L2>.*\r" \ >>>> +   ] >>>> +} >>>>  -gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>:\tje    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" >>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>>> <loop\\+\[0-9\]+>:\tje    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" >>>> +} >>>> +if { [istarget "arm*-*-*"] } { >>>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>>> <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" >>>> +} >>>> +if { [istarget "aarch64*-*-*"]} { >>>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>>> <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2> // b\.none\r" >>>> +} >>>>   # the following tests are checking the iterators >>>>  # to avoid lots of regexps, we just check the number of lines that >>>> diff --git a/gdb/testsuite/gdb.btrace/non-stop.exp >>>> b/gdb/testsuite/gdb.btrace/non-stop.exp >>>> index 40cced7a8bb..58459de5359 100644 >>>> --- a/gdb/testsuite/gdb.btrace/non-stop.exp >>>> +++ b/gdb/testsuite/gdb.btrace/non-stop.exp >>>> @@ -31,6 +31,12 @@ save_vars { GDBFLAGS } { >>>>      clean_restart $testfile >>>>  } >>>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>> +   set loop_position 2 >>>> +} elseif {[istarget "arm*-*-*"] || [istarget "aarch64*-*-*"]} { >>>> +   set loop_position 3 >>>> +} >>>> + >>>>  if ![runto_main] { >>>>      untested "failed to run to main" >>>>      return -1 >>>> @@ -111,87 +117,99 @@ gdb_test "thread apply all info rec" ".*" >>>>  gdb_test "info threads" ".*" >>>>   with_test_prefix "navigate" { >>>> -   gdb_test "thread apply 1 record goto 2" "$loop_line" >>>> -   gdb_test "thread apply 2 record goto 4" "$loop_line" >>>> +   gdb_test "thread apply 1 record goto $loop_position" "$loop_line" >>>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>>> 2}]" "$loop_line" >>>>      gdb_test "thread apply 1 info record" \ >>>> -       ".*Replay in progress\. At instruction 2\." "thread 1 at >>>> insn 2" >>>> +       ".*Replay in progress\. At instruction $loop_position\." >>>> "thread 1 at insn $loop_position" >>>>      gdb_test "thread apply 2 info record" \ >>>> -       ".*Replay in progress\. At instruction 4\." "thread 2 at >>>> insn 4" >>>> +       ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 2}]\." "thread 2 at insn [expr {$loop_position + >>>> 2}]" >>>>  -   gdb_test "thread apply all record goto 5" "$loop_line" >>>> +   gdb_test "thread apply all record goto [expr {$loop_position + >>>> 3}]" "$loop_line" >>>>      gdb_test "thread apply 1 info record" \ >>>> -       ".*Replay in progress\. At instruction 5\." "thread 1 at >>>> insn 5" >>>> +       ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 3}]\." "thread 1 at insn [expr {$loop_position + >>>> 3}]" >>>>      gdb_test "thread apply 2 info record" \ >>>> -       ".*Replay in progress\. At instruction 5\." "thread 2 at >>>> insn 5" >>>> +       ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 3}]\." "thread 2 at insn [expr {$loop_position + >>>> 3}]" >>>>  } >>>>   with_test_prefix "step" { >>>> +   with_test_prefix "fixture" { >>>> +   gdb_test "thread apply 1 record goto [expr {$loop_position + >>>> 3}]" ".*" >>>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>>> 3}]" ".*" >>>> +   } >>>>      with_test_prefix "thread 1" { >>>>          gdb_test "thread apply 1 stepi 2" "$loop_line" >>>>          gdb_test "thread apply 1 info record" \ >>>> -           ".*Replay in progress\. At instruction 7\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 5}]\." >>>>          gdb_test "thread apply 2 info record" \ >>>> -           ".*Replay in progress\. At instruction 5\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 3}]\." >>>>      } >>>>       with_test_prefix "thread 2" { >>>>          gdb_test "thread apply 2 stepi 3" "$loop_line" >>>>          gdb_test "thread apply 1 info record" \ >>>> -           ".*Replay in progress\. At instruction 7\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 5}]\." >>>>          gdb_test "thread apply 2 info record" \ >>>> -           ".*Replay in progress\. At instruction 8\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 6}]\." >>>>      } >>>>       with_test_prefix "all" { >>>>          gdb_cont_to all "stepi 4" "$loop_line" 2 >>>>          gdb_test "thread apply 1 info record" \ >>>> -           ".*Replay in progress\. At instruction 11\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 9}]\." >>>>          gdb_test "thread apply 2 info record" \ >>>> -           ".*Replay in progress\. At instruction 12\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 10}]\." >>>>      } >>>>  } >>>>   with_test_prefix "reverse-step" { >>>> +   with_test_prefix "fixture" { >>>> +       gdb_test "thread apply 1 record goto [expr {$loop_position >>>> + 9}]" ".*" >>>> +       gdb_test "thread apply 2 record goto [expr {$loop_position >>>> + 10}]" ".*" >>>> +   } >>>>      with_test_prefix "thread 1" { >>>>          gdb_test "thread apply 1 reverse-stepi 2" "$loop_line" >>>>          gdb_test "thread apply 1 info record" \ >>>> -           ".*Replay in progress\. At instruction 9\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 7}]\." >>>>          gdb_test "thread apply 2 info record" \ >>>> -           ".*Replay in progress\. At instruction 12\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 10}]\." >>>>      } >>>>       with_test_prefix "thread 2" { >>>>          gdb_test "thread apply 2 reverse-stepi 3" "$loop_line" >>>>          gdb_test "thread apply 1 info record" \ >>>> -           ".*Replay in progress\. At instruction 9\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 7}]\." >>>>          gdb_test "thread apply 2 info record" \ >>>> -           ".*Replay in progress\. At instruction 9\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 7}]\." >>>>      } >>>>       with_test_prefix "all" { >>>>          gdb_cont_to all "reverse-stepi 4" "$loop_line" 2 >>>>          gdb_test "thread apply 1 info record" \ >>>> -           ".*Replay in progress\. At instruction 5\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 3}]\." >>>>          gdb_test "thread apply 2 info record" \ >>>> -           ".*Replay in progress\. At instruction 5\." >>>> +           ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 3}]\." >>>>      } >>>>  } >>>>   with_test_prefix "continue" { >>>> +   with_test_prefix "fixture" { >>>> +   gdb_test "thread apply 1 record goto [expr {$loop_position + >>>> 3}]" ".*" >>>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>>> 3}]" ".*" >>>> +   } >>>>      with_test_prefix "thread 1" { >>>>      with_test_prefix "continue" { >>>>          gdb_cont_to_no_history 1 "continue" 1 >>>>          gdb_test "thread apply 1 info record" \ >>>>          ".*Recorded \[0-9\]+ instructions \[^\\\r\\\n\]*" >>>>          gdb_test "thread apply 2 info record" \ >>>> -       ".*Replay in progress\. At instruction 5\." >>>> +       ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 3}]\." >>>>      } >>>>      with_test_prefix "reverse-continue" { >>>>          gdb_cont_to_no_history 1 "reverse-continue" 1 >>>>          gdb_test "thread apply 1 info record" \ >>>>          ".*Replay in progress\. At instruction 1\." >>>>          gdb_test "thread apply 2 info record" \ >>>> -       ".*Replay in progress\. At instruction 5\." >>>> +       ".*Replay in progress\. At instruction [expr >>>> {$loop_position + 3}]\." >>>>      } >>>>      } >>>>  diff --git a/gdb/testsuite/gdb.btrace/record_goto.exp >>>> b/gdb/testsuite/gdb.btrace/record_goto.exp >>>> index 75d76da1c7f..a04983a4859 100644 >>>> --- a/gdb/testsuite/gdb.btrace/record_goto.exp >>>> +++ b/gdb/testsuite/gdb.btrace/record_goto.exp >>>> @@ -41,6 +41,10 @@ if [info exists COMPILE] { >>>>      } else { >>>>          standard_testfile i686-record_goto.S >>>>      } >>>> +} elseif {[istarget "arm*-*-*"]} { >>>> +   standard_testfile arm-record_goto.S >>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>> +   standard_testfile aarch64-record_goto.S >>>>  } else { >>>>      unsupported "target architecture not supported" >>>>      return -1 >>>> @@ -50,6 +54,126 @@ if [prepare_for_testing "failed to prepare" >>>> $testfile $srcfile $opts] { >>>>      return -1 >>>>  } >>>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>> +   set function_positions(0) 19 >>>> +   set function_positions(1) 27 >>>> +   set function_positions(2) 2 >>>> +   set function_positions(end) 40 >>>> +   set function_positions(3) 39 >>>> + >>>> +   set sequence_begin(1) 1 >>>> +   set sequence_end(1) 1 >>>> +   set sequence_begin(2) 2 >>>> +   set sequence_end(2) 4 >>>> +   set sequence_begin(3) 5 >>>> +   set sequence_end(3) 8 >>>> +   set sequence_begin(4) 9 >>>> +   set sequence_end(4) 9 >>>> +   set sequence_begin(5) 10 >>>> +   set sequence_end(5) 12 >>>> +   set sequence_begin(6) 13 >>>> +   set sequence_end(6) 16 >>>> +   set sequence_begin(7) 17 >>>> +   set sequence_end(7) 18 >>>> +   set sequence_begin(8) 19 >>>> +   set sequence_end(8) 19 >>>> +   set sequence_begin(9) 20 >>>> +   set sequence_end(9) 22 >>>> +   set sequence_begin(10) 23 >>>> +   set sequence_end(10) 26 >>>> +   set sequence_begin(11) 27 >>>> +   set sequence_end(11) 27 >>>> +   set sequence_begin(12) 28 >>>> +   set sequence_end(12) 30 >>>> +   set sequence_begin(13) 31 >>>> +   set sequence_end(13) 34 >>>> +   set sequence_begin(14) 35 >>>> +   set sequence_end(14) 36 >>>> +   set sequence_begin(15) 37 >>>> +   set sequence_end(15) 38 >>>> +   set sequence_begin(16) 39 >>>> +   set sequence_end(16) 40 >>>> + >>>> +} elseif {[istarget "arm*-*-*"]} { >>>> +   set function_positions(0) 23 >>>> +   set function_positions(1) 33 >>>> +   set function_positions(2) 2 >>>> +   set function_positions(end) 48 >>>> +   set function_positions(3) 47 >>>> + >>>> +   set sequence_begin(1) 1 >>>> +   set sequence_end(1) 1 >>>> +   set sequence_begin(2) 2 >>>> +   set sequence_end(2) 4 >>>> +   set sequence_begin(3) 5 >>>> +   set sequence_end(3) 10 >>>> +   set sequence_begin(4) 11 >>>> +   set sequence_end(4) 11 >>>> +   set sequence_begin(5) 12 >>>> +   set sequence_end(5) 14 >>>> +   set sequence_begin(6) 15 >>>> +   set sequence_end(6) 20 >>>> +   set sequence_begin(7) 21 >>>> +   set sequence_end(7) 22 >>>> +   set sequence_begin(8) 23 >>>> +   set sequence_end(8) 23 >>>> +   set sequence_begin(9) 24 >>>> +   set sequence_end(9) 26 >>>> +   set sequence_begin(10) 27 >>>> +   set sequence_end(10) 32 >>>> +   set sequence_begin(11) 33 >>>> +   set sequence_end(11) 33 >>>> +   set sequence_begin(12) 34 >>>> +   set sequence_end(12) 36 >>>> +   set sequence_begin(13) 37 >>>> +   set sequence_end(13) 42 >>>> +   set sequence_begin(14) 43 >>>> +   set sequence_end(14) 44 >>>> +   set sequence_begin(15) 45 >>>> +   set sequence_end(15) 46 >>>> +   set sequence_begin(16) 47 >>>> +   set sequence_end(16) 48 >>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>> +   set function_positions(0) 16 >>>> +   set function_positions(1) 22 >>>> +   set function_positions(2) 2 >>>> +   set function_positions(end) 36 >>>> +   set function_positions(3) 35 >>>> + >>>> +   set sequence_begin(1) 1 >>>> +   set sequence_end(1) 1 >>>> +   set sequence_begin(2) 2 >>>> +   set sequence_end(2) 4 >>>> +   set sequence_begin(3) 5 >>>> +   set sequence_end(3) 6 >>>> +   set sequence_begin(4) 7 >>>> +   set sequence_end(4) 7 >>>> +   set sequence_begin(5) 8 >>>> +   set sequence_end(5) 10 >>>> +   set sequence_begin(6) 11 >>>> +   set sequence_end(6) 12 >>>> +   set sequence_begin(7) 13 >>>> +   set sequence_end(7) 15 >>>> +   set sequence_begin(8) 16 >>>> +   set sequence_end(8) 16 >>>> +   set sequence_begin(9) 17 >>>> +   set sequence_end(9) 19 >>>> +   set sequence_begin(10) 20 >>>> +   set sequence_end(10) 21 >>>> +   set sequence_begin(11) 22 >>>> +   set sequence_end(11) 22 >>>> +   set sequence_begin(12) 23 >>>> +   set sequence_end(12) 25 >>>> +   set sequence_begin(13) 26 >>>> +   set sequence_end(13) 27 >>>> +   set sequence_begin(14) 28 >>>> +   set sequence_end(14) 30 >>>> +   set sequence_begin(15) 31 >>>> +   set sequence_end(15) 33 >>>> +   set sequence_begin(16) 34 >>>> +   set sequence_end(16) 36 >>>> +} >>>> + >>>>  if ![runto_main] { >>>>      untested "failed to run to main" >>>>      return -1 >>>> @@ -65,43 +189,43 @@ gdb_test "next" >>>>   # start by listing all functions >>>>  gdb_test "record function-call-history /ci 1, +20" [multi_line \ >>>> - "1\tmain\tinst 1,1" \ >>>> - "2\t fun4\tinst 2,4" \ >>>> - "3\t   fun1\tinst 5,8" \ >>>> - "4\t fun4\tinst 9,9" \ >>>> - "5\t   fun2\tinst 10,12" \ >>>> - "6\t     fun1\tinst 13,16" \ >>>> - "7\t   fun2\tinst 17,18" \ >>>> - "8\t fun4\tinst 19,19" \ >>>> - "9\t   fun3\tinst 20,22" \ >>>> - "10\t     fun1\tinst 23,26" \ >>>> - "11\t   fun3\tinst 27,27" \ >>>> - "12\t     fun2\tinst 28,30" \ >>>> - "13\t       fun1\tinst 31,34" \ >>>> - "14\t     fun2\tinst 35,36" \ >>>> - "15\t   fun3\tinst 37,38" \ >>>> - "16\t fun4\tinst 39,40" \ >>>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)" \ >>>> + "4\t fun4\tinst $sequence_begin(4),$sequence_end(4)" \ >>>> + "5\t   fun2\tinst $sequence_begin(5),$sequence_end(5)" \ >>>> + "6\t     fun1\tinst $sequence_begin(6),$sequence_end(6)" \ >>>> + "7\t   fun2\tinst $sequence_begin(7),$sequence_end(7)" \ >>>> + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ >>>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>>> + "11\t   fun3\tinst $sequence_begin(11),$sequence_end(11)" \ >>>> + "12\t     fun2\tinst $sequence_begin(12),$sequence_end(12)" \ >>>> + "13\t       fun1\tinst $sequence_begin(13),$sequence_end(13)" \ >>>> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ >>>>    ] >>>>   # let's see if we can go back in history >>>> -gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*" >>>> +gdb_test "record goto $function_positions(0)" ".*fun4 \\(\\) at >>>> record_goto.c:43.*" >>>>   # the function call history should start at the new location >>>>  gdb_test "record function-call-history /ci" [multi_line \ >>>> - "8\t fun4\tinst 19,19" \ >>>> - "9\t   fun3\tinst 20,22" \ >>>> - "10\t     fun1\tinst 23,26" \ >>>> - ] "function-call-history from 19 forwards" >>>> + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ >>>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>>> + ] "function-call-history from $function_positions(0) forwards" >>>>   # the instruction history should start at the new location >>>>  gdb_test "record instruction-history" [multi_line \ >>>> - "19.*" \ >>>> - "20.*" \ >>>> - "21.*" \ >>>> - ] "instruction-history from 19 forwards" >>>> + "$function_positions(0).*" \ >>>> + "[expr {$function_positions(0) + 1}].*" \ >>>> + "[expr {$function_positions(0) + 2}].*" \ >>>> + ] "instruction-history from $function_positions(0) forwards" >>>>   # let's go to another place in the history >>>> -gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*" >>>> +gdb_test "record goto $function_positions(1)" ".*fun3 \\(\\) at >>>> record_goto.c:35.*" >>>>   # check the back trace at that location >>>>  gdb_test "backtrace" [multi_line \ >>>> @@ -117,26 +241,26 @@ gdb_test "up" ".*main.*at record_goto.c:49.*" >>>> "up to main" >>>>   # the function call history should start at the new location >>>>  gdb_test "record function-call-history /ci -" [multi_line \ >>>> - "9\t   fun3\tinst 20,22" \ >>>> - "10\t     fun1\tinst 23,26" \ >>>> - "11\t   fun3\tinst 27,27" \ >>>> - ] "function-call-history from 27 backwards" >>>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>>> + "11\t   fun3\tinst $sequence_begin(11),$sequence_end(11)" \ >>>> + ] "function-call-history from $function_positions(1) backwards" >>>>   # the instruction history should start at the new location >>>>  gdb_test "record instruction-history -" [multi_line \ >>>> - "25.*" \ >>>> - "26.*" \ >>>> - "27.*" \ >>>> - ] "instruction-history from 27 backwards" >>>> + "[expr {$function_positions(1) - 2}].*" \ >>>> + "[expr {$function_positions(1) - 1}].*" \ >>>> + "$function_positions(1).*" \ >>>> + ] "instruction-history from $function_positions(1) backwards" >>>>   # test that we can go to the begin of the trace >>>>  gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*" >>>>   # check that we're filling up the context correctly >>>>  gdb_test "record function-call-history /ci -" [multi_line \ >>>> - "1\tmain\tinst 1,1" \ >>>> - "2\t fun4\tinst 2,4" \ >>>> - "3\t   fun1\tinst 5,8" \ >>>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)" \ >>>>    ] "function-call-history from begin backwards" >>>>   # check that we're filling up the context correctly >>>> @@ -147,52 +271,53 @@ gdb_test "record instruction-history -" >>>> [multi_line \ >>>>    ] "instruction-history from begin backwards" >>>>   # we should get the exact same history from the first instruction >>>> -gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*" >>>> +gdb_test "record goto $function_positions(2)" ".*fun4 \\(\\) at >>>> record_goto.c:40.*" >>>>   # check that we're filling up the context correctly >>>>  gdb_test "record function-call-history /ci -" [multi_line \ >>>> - "1\tmain\tinst 1,1" \ >>>> - "2\t fun4\tinst 2,4" \ >>>> - "3\t   fun1\tinst 5,8\r" \ >>>> - ] "function-call-history from 2 backwards" >>>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)\r" \ >>>> + ] "function-call-history from $function_positions(2) backwards" >>>>   # check that we're filling up the context correctly >>>>  gdb_test "record instruction-history -" [multi_line \ >>>>    "1.*" \ >>>>    "2.*" \ >>>>    "3.*" \ >>>> - ] "instruction-history from 2 backwards" >>>> + ] "instruction-history from $function_positions(2) backwards" >>>>   # check that we can go to the end of the trace >>>>  gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*" >>>>   # check that we're filling up the context correctly >>>>  gdb_test "record function-call-history /ci" [multi_line \ >>>> - "14\t     fun2\tinst 35,36" \ >>>> - "15\t   fun3\tinst 37,38" \ >>>> - "16\t fun4\tinst 39,40" \ >>>> + "14\t    �� fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ >>>>    ] "function-call-history from end forwards" >>>>   # check that we're filling up the context correctly >>>> +#adapt it for arm, last instruction is at pos 48 >>>>  gdb_test "record instruction-history" [multi_line \ >>>> - "38.*" \ >>>> - "39.*" \ >>>> - "40.*\r" \ >>>> + "[expr {$function_positions(end) - 2}].*" \ >>>> + "[expr {$function_positions(end) - 1}].*" \ >>>> + "$function_positions(end).*\r" \ >>>>    ] "instruction-history from end forwards" >>>>   # we should get the exact same history from the second to last >>>> instruction >>>> -gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*" >>>> +gdb_test "record goto $function_positions(3)" ".*fun4 \\(\\) at >>>> record_goto.c:44.*" >>>>   # check that we're filling up the context correctly >>>>  gdb_test "record function-call-history /ci" [multi_line \ >>>> - "14\t     fun2\tinst 35,36" \ >>>> - "15\t   fun3\tinst 37,38" \ >>>> - "16\t fun4\tinst 39,40\r" \ >>>> - ] "function-call-history from 39 forwards" >>>> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)\r" \ >>>> + ] "function-call-history from $function_positions(3) forwards" >>>>   # check that we're filling up the context correctly >>>>  gdb_test "record instruction-history" [multi_line \ >>>> - "38.*" \ >>>> - "39.*" \ >>>> - "40.*\r" \ >>>> - ] "instruction-history from 39 forwards" >>>> + "[expr {$function_positions(3) - 1}].*" \ >>>> + "$function_positions(3).*" \ >>>> + "[expr {$function_positions(3) + 1}].*\r" \ >>>> + ] "instruction-history from $function_positions(3) forwards" >>>> diff --git a/gdb/testsuite/gdb.btrace/stepi.exp >>>> b/gdb/testsuite/gdb.btrace/stepi.exp >>>> index bfb680bb30d..5b37d17ba0e 100644 >>>> --- a/gdb/testsuite/gdb.btrace/stepi.exp >>>> +++ b/gdb/testsuite/gdb.btrace/stepi.exp >>>> @@ -39,6 +39,10 @@ if [info exists COMPILE] { >>>>      } else { >>>>          standard_testfile i686-record_goto.S >>>>      } >>>> +} elseif {[istarget "arm*-*-*"]} { >>>> +   standard_testfile arm-record_goto.S >>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>> +   standard_testfile aarch64-record_goto.S >>>>  } else { >>>>      unsupported "target architecture not supported" >>>>      return -1 >>>> @@ -48,6 +52,56 @@ if [prepare_for_testing "failed to prepare" >>>> $testfile $srcfile] { >>>>      return -1 >>>>  } >>>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>> +   set instructions_count 40 >>>> +   set instruction_position(0) 39 >>>> +   set instruction_position(1) 40 >>>> +   set instruction_position(2) 1 >>>> +   set instruction_position(3) 1 >>>> +   set instruction_position(4) 22 >>>> +   set instruction_position(5) 23 >>>> +   set instruction_position(6) 22 >>>> +   set instruction_position(7) 27 >>>> +   set instruction_position(8) 22 >>>> +   set instruction_position(9) 1 >>>> +   set instruction_position(10) 1 >>>> +   set instruction_position(11) 1 >>>> +   set instruction_position(12) 2 >>>> +   set instruction_position(13) 1 >>>> +} elseif {[istarget "arm*-*-*"]} { >>>> +   set instructions_count 48 >>>> +   set instruction_position(0) 47 >>>> +   set instruction_position(1) 48 >>>> +   set instruction_position(2) 1 >>>> +   set instruction_position(3) 1 >>>> +   set instruction_position(4) 26 >>>> +   set instruction_position(5) 27 >>>> +   set instruction_position(6) 26 >>>> +   set instruction_position(7) 33 >>>> +   set instruction_position(8) 26 >>>> +   set instruction_position(9) 1 >>>> +   set instruction_position(10) 1 >>>> +   set instruction_position(11) 1 >>>> +   set instruction_position(12) 2 >>>> +   set instruction_position(13) 1 >>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>> +   set instructions_count 36 >>>> +   set instruction_position(0) 35 >>>> +   set instruction_position(1) 36 >>>> +   set instruction_position(2) 1 >>>> +   set instruction_position(3) 1 >>>> +   set instruction_position(4) 19 >>>> +   set instruction_position(5) 20 >>>> +   set instruction_position(6) 19 >>>> +   set instruction_position(7) 22 >>>> +   set instruction_position(8) 19 >>>> +   set instruction_position(9) 1 >>>> +   set instruction_position(10) 1 >>>> +   set instruction_position(11) 1 >>>> +   set instruction_position(12) 2 >>>> +   set instruction_position(13) 1 >>>> +} >>>> + >>>>  if ![runto_main] { >>>>      untested "failed to run to main" >>>>      return -1 >>>> @@ -56,10 +110,11 @@ if ![runto_main] { >>>>  global gdb_prompt >>>>   proc check_replay_at { insn } { >>>> + global instructions_count >>>>    gdb_test "info record" [multi_line \ >>>>      "Active record target: record-btrace" \ >>>>      ".*" \ >>>> -   "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >>>> .*" \ >>>> +   "Recorded $instructions_count instructions in 16 functions >>>> \\\(0 gaps\\\) for .*" \ >>>>      "Replay in progress\. At instruction $insn\." \ >>>>      ] "check replay at $insn" >>>>  } >>>> @@ -74,15 +129,14 @@ with_test_prefix "record" { >>>>  with_test_prefix "fetch" { >>>>      gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.1" >>>>      gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.2" >>>> - >>>>      # let's check where we are in the trace >>>> -   check_replay_at 39 >>>> +   check_replay_at $instruction_position(0) >>>>  } >>>>   # let's step forward and check again >>>>  with_test_prefix "stepi" { >>>>      gdb_test "stepi" ".*fun4\.5.*" >>>> -   check_replay_at 40 >>>> +   check_replay_at $instruction_position(1) >>>>  } >>>>   # with the next step, we stop replaying >>>> @@ -91,14 +145,17 @@ with_test_prefix "end" { >>>>      gdb_test "info record" [multi_line \ >>>>        "Active record target: record-btrace" \ >>>>        ".*" \ >>>> -     "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >>>> \[^\\\r\\\n\]*" \ >>>> +     "Recorded $instructions_count instructions in 16 functions >>>> \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ >>>>    ] >>>>  } >>>>  +#recover from a missing lr register in arm >>>> +gdb_test "record goto end" >>>> + >>>>  # let's try nexti >>>>  with_test_prefix "reverse-nexti.1" { >>>>      gdb_test "reverse-nexti" ".*main\.2.*" >>>> -   check_replay_at 1 >>>> +   check_replay_at $instruction_position(2) >>>>  } >>>>   # we can't reverse-nexti any further >>>> @@ -106,7 +163,7 @@ with_test_prefix "reverse-nexti.2" { >>>>      gdb_test "reverse-nexti" \ >>>>      "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>>      "reverse-nexti.2" >>>> -   check_replay_at 1 >>>> +   check_replay_at $instruction_position(3) >>>>  } >>>>   # but we can step back again >>>> @@ -115,32 +172,32 @@ with_test_prefix "nexti" { >>>>      gdb_test "info record" [multi_line \ >>>>        "Active record target: record-btrace" \ >>>>        ".*" \ >>>> -     "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >>>> \[^\\\r\\\n\]*" \ >>>> +     "Recorded $instructions_count instructions in 16 functions >>>> \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ >>>>                     ] >>>>  } >>>>   # let's step from a goto position somewhere in the middle >>>>  with_test_prefix "goto" { >>>> -   gdb_test "record goto 22" ".*fun3\.2.*" >>>> -   with_test_prefix "goto 22" { check_replay_at 22 } >>>> +   gdb_test "record goto $instruction_position(4) " ".*fun3\.2.*" >>>> +   with_test_prefix "goto $instruction_position(4) " { >>>> check_replay_at $instruction_position(4) } >>>>       gdb_test "stepi" ".*fun1\.1.*" "stepi.3" >>>> -   with_test_prefix "stepi to 23" { check_replay_at 23 } >>>> +   with_test_prefix "stepi to $instruction_position(5)" { >>>> check_replay_at $instruction_position(5) } >>>>       gdb_test "reverse-stepi" ".*fun3\.2.*" "reverse-stepi.3" >>>> -   with_test_prefix "reverse-stepi to 22" { check_replay_at 22 } >>>> +   with_test_prefix "reverse-stepi to $instruction_position(6)" { >>>> check_replay_at $instruction_position(6) } >>>>       gdb_test "nexti" ".*fun3\.3.*" >>>> -   with_test_prefix "nexti to 27" { check_replay_at 27 } >>>> +   with_test_prefix "nexti to $instruction_position(7) " { >>>> check_replay_at $instruction_position(7) } >>>>       gdb_test "reverse-nexti" ".*fun3\.2.*" "reverse-nexti.3" >>>> -   with_test_prefix "reverse-nexti to 22" { check_replay_at 22 } >>>> +   with_test_prefix "reverse-nexti to $instruction_position(8)" { >>>> check_replay_at $instruction_position(8) } >>>>  } >>>>   # let's try to step off the left end >>>>  with_test_prefix "goto begin" { >>>>      gdb_test "record goto begin" ".*main\.2.*" >>>> -   check_replay_at 1 >>>> +   check_replay_at $instruction_position(9) >>>>       with_test_prefix "reverse-stepi" { >>>>      gdb_test "reverse-stepi" \ >>>> @@ -149,7 +206,7 @@ with_test_prefix "goto begin" { >>>>      gdb_test "reverse-stepi" \ >>>>          "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>>          "reverse-stepi.2" >>>> -   check_replay_at 1 >>>> +   check_replay_at $instruction_position(10) >>>>      } >>>>       with_test_prefix "reverse-nexti" { >>>> @@ -159,13 +216,13 @@ with_test_prefix "goto begin" { >>>>      gdb_test "reverse-nexti" \ >>>>          "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>>          "reverse-nexti.2" >>>> -   check_replay_at 1 >>>> +   check_replay_at $instruction_position(11) >>>>      } >>>>       # we can step forward, though >>>>      with_test_prefix "stepi" { >>>>      gdb_test "stepi" ".*fun4\.1.*" >>>> -   check_replay_at 2 >>>> +   check_replay_at $instruction_position(12) >>>>      } >>>>  } >>>>  @@ -178,5 +235,5 @@ with_test_prefix "reverse-stepi" { >>>>      gdb_test "reverse-stepi" \ >>>>      "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>>      "reverse-stepi.3" >>>> -   check_replay_at 1 >>>> +   check_replay_at $instruction_position(13) >>>>  } >>>> diff --git a/gdb/testsuite/gdb.btrace/tailcall-only.exp >>>> b/gdb/testsuite/gdb.btrace/tailcall-only.exp >>>> index 510f90c9d5e..7e449ee38da 100644 >>>> --- a/gdb/testsuite/gdb.btrace/tailcall-only.exp >>>> +++ b/gdb/testsuite/gdb.btrace/tailcall-only.exp >>>> @@ -43,6 +43,10 @@ if [info exists COMPILE] { >>>>      } else { >>>>          standard_testfile i686-tailcall-only.S >>>>      } >>>> +} elseif { [istarget "arm*-*-*"] } { >>>> + standard_testfile arm-tailcall-only.S >>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>> + standard_testfile aarch64-tailcall-only.S >>>>  } else { >>>>      unsupported "target architecture not supported" >>>>      return -1 >>>> @@ -62,6 +66,10 @@ gdb_test_no_output "set record >>>> function-call-history-size 0" >>>>   # trace foo >>>>  gdb_test "step" ".*" "prepare for recording" >>>> +# make sure we get out of function epilogue >>>> +if { [istarget "arm*-*-*"] } { >>>> + gdb_test "stepi" >>>> +} >>>>  gdb_test_no_output "record btrace" >>>>  gdb_test "stepi 4" ".*" "record branch trace" >>>>  diff --git a/gdb/testsuite/gdb.btrace/tailcall.exp >>>> b/gdb/testsuite/gdb.btrace/tailcall.exp >>>> index 07a3ec103f4..602a9ed6fba 100644 >>>> --- a/gdb/testsuite/gdb.btrace/tailcall.exp >>>> +++ b/gdb/testsuite/gdb.btrace/tailcall.exp >>>> @@ -40,6 +40,10 @@ if [info exists COMPILE] { >>>>      } else { >>>>          standard_testfile i686-tailcall.S >>>>      } >>>> +} elseif { [istarget "arm*-*-*"] } { >>>> + standard_testfile arm-tailcall.S >>>> +} elseif { [istarget "aarch64*-*-*"] } { >>>> + standard_testfile aarch64-tailcall.S >>>>  } else { >>>>      unsupported "target architecture not supported" >>>>      return -1 >>>> @@ -48,6 +52,20 @@ if [info exists COMPILE] { >>>>  if [prepare_for_testing "failed to prepare" $testfile $srcfile >>>> $opts] { >>>>      return -1 >>>>  } >>>> + >>>> +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>> +   set bar_return_line 24 >>>> +   set bar_return_position 4 >>>> +   set main_return_line 38 >>>> +} elseif {[istarget "arm*-*-*"]} { >>>> +   set bar_return_line 24 >>>> +   set bar_return_position 5 >>>> +   set main_return_line 41 >>>> +   } elseif {[istarget "aarch64*-*-*"]} { >>>> +   set bar_return_line 23 >>>> +   set bar_return_position 6 >>>> +   set main_return_line 40 >>>> +} >>> >>> There may be better ways to fetch this information without >>> hardcoding it, through regular expressions and $expect_out. See, for >>> example, gdb.base/step-over-syscall.exp and how it uses $expect_out >>> to extract some bits of information. >>> >>> You could extract this information first and then store it in these >>> variables. If the sources change, then we won't need to update the >>> test again. >>> >>> If it is hardcoded, every time the source changes you need to update >>> the test. >>> >> [Zied] I will appreciate extracting this information from the elf >> file. Problem is that according to the architecture, the last line >> number before the function returns can change slightly. Can you >> please explain further how to use $expect_out to get the line number. > > Extracting from the ELF file is not a good approach. Instead, you > should first run the test, stopping at each of these places of > interest (bar return, main return etc) and record the line number and > position in some way. Using regular expressions you can extract the > line number the program stopped at, for example. Then you do another > run and actually test the btrace functionality. > > If it is not possible to determine some of these fields dynamically, > then using the conditional blocks is an acceptable approach. > > But you should be aware that different compiler versions may generate > different code. So this particular test will only work for this > particular .S file. [Zied] can you please provide an example > >>>>  if ![runto_main] { >>>>      untested "failed to run to main" >>>>      return -1 >>>> @@ -58,7 +76,17 @@ gdb_test_no_output "set record >>>> function-call-history-size 0" >>>>   # trace the call to foo >>>>  gdb_test_no_output "record btrace" >>>> -gdb_test "next 2" >>>> + >>>> +# make sure we get out of function epilogue >>>> +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>> +   gdb_test "next 2" >>>> +} elseif {[istarget "arm*-*-*"]} { >>>> + gdb_test "next 2" >>>> + gdb_test "stepi" >>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>> + gdb_test "next" >>>> + gdb_test "stepi" >>>> +} > > The above will make the test complicated to follow, because it does > something different for different architectures. > > If the program is not stopping at the right location, it is best to > work with breakpoints to force it to stop there instead of playing > with next/stepi calls. > [Zied] it is a bit more complicated. in fact, we should land at the return instruction from the function main (line 41 in tailcall.c). but gdb in aarch64 does not accept to set the breakpoint with following message (gdb) b 41 No line 41 in the current file. Make breakpoint pending on future shared library load? (y or [n]) y Breakpoint 2 (41) pending. >>>>   # show the flat branch trace >>>>  gdb_test "record function-call-history 1" [multi_line \ >>>> @@ -77,11 +105,11 @@ gdb_test "record function-call-history /c 1" >>>> [multi_line \ >>>>    ] "indented" >>>>   # go into bar >>>> -gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*" >>>> +gdb_test "record goto $bar_return_position" ".*bar \\(\\) at >>>> .*tailcall.c:$bar_return_line\r\n.*" >>>>   # check the backtrace >>>>  gdb_test "backtrace" [multi_line \ >>>> - "#0.*bar \\(\\) at tailcall.c:24" \ >>>> + "#0.*bar \\(\\) at tailcall.c:$bar_return_line" \ >>>>    "#1.*foo \\(\\) at tailcall.c:29" \ >>>>    "#2.*main \\(\\) at tailcall.c:37" \ >>>>    "Backtrace stopped: not enough registers or memory available to >>>> unwind further" \ >>>> @@ -93,23 +121,23 @@ gdb_test "up" "#2\[^\r\n\]*main \\(\\) at >>>> tailcall.c:37\r\n.*" "up to main" >>>>  gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" >>>> "down to foo" >>>>   # test stepping into and out of tailcalls. >>>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>>> tailcall.c:$main_return_line\r\n.*" \ >>>>      "finish.1" >>>> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>>> tailcall.c:24\r\n.*" \ >>>> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>>> tailcall.c:$bar_return_line\r\n.*" \ >>>>      "reverse-step.1" >>>>  gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at >>>> tailcall.c:29\r\n.*" \ >>>>      "reverse-finish.1" >>>>  gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at >>>> tailcall.c:37\r\n.*" \ >>>>      "reverse-step.2" >>>> -gdb_test "next" "\[^\r\n\]*38.*" \ >>>> +gdb_test "next" "\[^\r\n\]*$main_return_line.*" \ >>>>      "next.1" >>>>  gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at >>>> tailcall.c:37\r\n.*" \ >>>>      "reverse-next.1" >>>>  gdb_test "step" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \ >>>>      "step.1" >>>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>>> tailcall.c:$main_return_line\r\n.*" \ >>>>      "finish.2" >>>> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>>> tailcall.c:24\r\n.*" \ >>>> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>>> tailcall.c:$bar_return_line\r\n.*" \ >>>>      "reverse-step.3" >>>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>>> tailcall.c:$main_return_line\r\n.*" \ >>>>      "finish.3" >>>> diff --git a/gdb/testsuite/gdb.btrace/instruction_history.S >>>> b/gdb/testsuite/gdb.btrace/x86-instruction_history.S >>>> similarity index 100% >>>> rename from gdb/testsuite/gdb.btrace/instruction_history.S >>>> rename to gdb/testsuite/gdb.btrace/x86-instruction_history.S >>>> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp >>>> index 60f84d22aad..b7b11deab57 100644 >>>> --- a/gdb/testsuite/lib/gdb.exp >>>> +++ b/gdb/testsuite/lib/gdb.exp >>>> @@ -3232,7 +3232,7 @@ gdb_caching_proc skip_btrace_tests { >>>>      global srcdir subdir gdb_prompt inferior_exited_re >>>>       set me "skip_btrace_tests" >>>> -   if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } { >>>> +   if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] && >>>> ![istarget "arm*-*-*"] && ![istarget "aarch64*-*-*"]} { >>>>          verbose "$me: target does not support btrace, returning >>>> 1" 2 >>>>          return 1 >>>>      } >>>> >>> >> -- *Zied Guermazi* founder Trande UG Leuschnerstraße 2 69469 Weinheim/Germany Mobile: +491722645127 mailto:zied.guermazi@trande.de *Trande UG* Leuschnerstraße 2, D-69469 Weinheim; Telefon: +491722645127 Sitz der Gesellschaft: Weinheim- Registergericht: AG Mannheim HRB 736209 - Geschäftsführung: Zied Guermazi *Confidentiality Note* This message is intended only for the use of the named recipient(s) and may contain confidential and/or privileged information. If you are not the intended recipient, please contact the sender and delete the message. Any unauthorized use of the information contained in this message is prohibited.
On 4/9/21 4:34 PM, Zied Guermazi wrote: > hi Luis, > > here is the status of the updates. > > Kind Regards > > Zied Guermazi > > On 06.04.21 15:09, Luis Machado wrote: >> On 4/4/21 4:30 PM, Zied Guermazi wrote: >>> hi Luis >>> >>> thanks for your review comments. Here is the status of the updates. >>> The changes will be published in next version of the patch set. >>> >>> /Zied >>> >>> On 01.04.21 15:34, Luis Machado wrote: >>>> On 3/30/21 11:52 PM, Zied Guermazi wrote: >>>>> diff --git a/gdb/testsuite/gdb.btrace/buffer-size.exp >>>>> b/gdb/testsuite/gdb.btrace/buffer-size.exp >>>>> index ea4e36c1593..77d7b77852a 100644 >>>>> --- a/gdb/testsuite/gdb.btrace/buffer-size.exp >>>>> +++ b/gdb/testsuite/gdb.btrace/buffer-size.exp >>>>> @@ -32,10 +32,17 @@ if ![runto_main] { >>>>>      return -1 >>>>>  } >>>>>  -gdb_test_no_output "set record btrace bts buffer-size 1" >>>>> -gdb_test_no_output "set record btrace pt buffer-size 1" >>>>> -gdb_test "show record btrace bts buffer-size" "The record/replay >>>>> bts buffer size is 1\.\r" >>>>> -gdb_test "show record btrace pt buffer-size" "The record/replay pt >>>>> buffer size is 1\.\r" >>>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>>> +   gdb_test_no_output "set record btrace bts buffer-size 1" >>>>> +   gdb_test_no_output "set record btrace pt buffer-size 1" >>>>> +   gdb_test "show record btrace bts buffer-size" "The >>>>> record/replay bts buffer size is 1\.\r" >>>>> +   gdb_test "show record btrace pt buffer-size" "The >>>>> record/replay pt buffer size is 1\.\r" >>>>> +} >>>>> + >>>>> +if {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { >>>>> +   gdb_test_no_output "set record btrace etm buffer-size 1" >>>>> +   gdb_test "show record btrace etm buffer-size" "The >>>>> record/replay etm buffer size is 1\.\r" >>>>> +} >>>> >>>> To avoid duplication of code, I think we could simplify this by >>>> checking for the architecture and then creating a list of the btrace >>>> formats we're dealing with. Something like: >>>> >>>> set btrace_type "" >>>> if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>>    set btrace_type { "bts" "pt" } >>>> } elseif {[istarget "arm*-*-*"]|| [istarget "aarch64*-*-*"]} { >>>>    set btrace_type { "etm" } >>>> >>>> Then have a for loop over btrace_type entries and write the tests >>>> only once... >>>> >>>> foreach_with_prefix format $btrace_format { >>>>    gdb_test_no_output "set record btrace $format buffer-size 1" >>>>    gdb_test "show record btrace $format buffer-size" "The >>>> record/replay $format buffer size is 1\.\r" >>>> } >>>> >>> [Zied] done. thanks for the hint. >>>> I'd apply this to any other cases where it is possible. That way we >>>> avoid duplicated code with hardcoded content on them, which tends to >>>> be hard to maintain and update. >>> [Zied] I did not find other tests with specific btrace format >> >> There seems to be other cases in the patch. >> >>>> >>>>>   gdb_test_no_output "record btrace" >>>>>  gdb_test "info record" [multi_line \ >>>>> diff --git a/gdb/testsuite/gdb.btrace/delta.exp >>>>> b/gdb/testsuite/gdb.btrace/delta.exp >>>>> index 9f6d741c013..2c8bada2065 100644 >>>>> --- a/gdb/testsuite/gdb.btrace/delta.exp >>>>> +++ b/gdb/testsuite/gdb.btrace/delta.exp >>>>> @@ -58,8 +58,18 @@ proc check_trace {} { >>>>>      "Recording format: .*" \ >>>>>      "Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \ >>>>>      ] >>>>> + if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>>>      gdb_test "record instruction-history /f 1" \ >>>>>        "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov *\\\$0x0,%eax\r" >>>>> + } >>>>> + if { [istarget "arm*-*-*"] } { >>>>> +   gdb_test "record instruction-history /f 1" \ >>>>> +     "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmovs\tr3, #0\r" >>>>> + } >>>>> + if { [istarget "aarch64*-*-*"]} { >>>>> +   gdb_test "record instruction-history /f 1" \ >>>>> +     "1\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov\tw0, #0x0.*\r" >>>>> + } >>>>>    gdb_test "record function-call-history /c 1" "1\tmain" >> >> Here, for example. You could avoid duplicating the gdb_test invocation >> and, instead, set the expected pattern for each architecture. That way >> you only need to modify the expected pattern, leaving the gdb_test >> invocation intact. >> > [Zied] Done >>>>>  } >>>>>  diff --git a/gdb/testsuite/gdb.btrace/instruction_history.exp >>>>> b/gdb/testsuite/gdb.btrace/instruction_history.exp >>>>> index 403085c083f..76fcadb9ac2 100644 >>>>> --- a/gdb/testsuite/gdb.btrace/instruction_history.exp >>>>> +++ b/gdb/testsuite/gdb.btrace/instruction_history.exp >>>>> @@ -21,8 +21,14 @@ if { [skip_btrace_tests] } { >>>>>      unsupported "target does not support record-btrace" >>>>>      return -1 >>>>>  } >>>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>>> + standard_testfile instruction_history.c x86-instruction_history.S >>>>> +} elseif { [istarget "arm*-*-*"] } { >>>>> + standard_testfile instruction_history.c arm-instruction_history.S >>>>> +} elseif { [istarget "aarch64*-*-*"]} { >>>>> + standard_testfile instruction_history.c >>>>> aarch64-instruction_history.S >>>> >>>> Same here. I'd use the conditional blocks to set the prefix for the >>>> source file, then call standard_testfile only once. >> >> As I mentioned before... You could set the prefix depending on the >> architecture (x86/arm/aarch64) and only invoke standard_testfile once. > [Zied] done >> >>>> >>>>> +} >>>>>  -standard_testfile .c .S >>>>>  if [prepare_for_testing "failed to prepare" $testfile "$srcfile >>>>> $srcfile2" {debug}] { >>>>>      return -1 >>>>>  } >>>>> @@ -68,39 +74,128 @@ if { $traced != 11 } { >>>>>  } >>>>>   # test that we see the expected instructions >>>>> -gdb_test "record instruction-history 3,7" [multi_line \ >>>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>>> + gdb_test "record instruction-history 3,7" [multi_line \ >>>>>      "3\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>" \ >>>>>      "4\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ >>>>>      "5\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>" \ >>>>>      "6\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>>>      "7\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>\r" \ >>>>>      ] >>>>> +} >>>>> +if { [istarget "arm*-*-*"] } { >>>>> + gdb_test "record instruction-history 3,7" [multi_line \ >>>>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>>>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>>>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>>>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>>>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ >>>>> <L2>\r" \ >>>>> +   ] >>>>> +} >>>>> +if { [istarget "aarch64*-*-*"]} { >>>>> + gdb_test "record instruction-history 3,7" [multi_line \ >>>>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>>> <L2>.*" \ >>>>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>>>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>>>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>>>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>>> <L2>.*\r" \ >>>>> +   ] >>>>> +} >> >> Here as well. Basically, anywhere where you have to differentiate >> between x86/arm/aarch64, if possible, try to set patterns and invoke >> the commands only once using the pattern contained in a variable set >> conditionally. > [Zied] done >> >>>>>  -gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>>>      "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>" \ >>>>>      "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \ >>>>>      "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>" \ >>>>>      "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>>>      "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>\r" \ >>>>>      ] >>>>> +} >>>>> +if { [istarget "arm*-*-*"] } { >>>>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>>>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>>>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>>>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>>>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >>>>> +   ] >>>>> +} >>>>> +if { [istarget "aarch64*-*-*"]} { >>>>> + gdb_test "record instruction-history /f 3,+5" [multi_line \ >>>>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>>> <L2>.*" \ >>>>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>>>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>>>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>>>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>>> <L2>.*\r" \ >>>>> +   ] >>>>> +} >>>>>  -gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>>>      "3\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>" \ >>>>>      "4\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \ >>>>>      "5\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>" \ >>>>>      "6\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>>>      "7\t  0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>\r" \ >>>>>      ] >>>>> +} >>>>> +if { [istarget "arm*-*-*"] } { >>>>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>>>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>>>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>>>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>>>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ >>>>> <L2>\r" \ >>>>> +   ] >>>>> +} >>>>> +if { [istarget "aarch64*-*-*"]} { >>>>> + gdb_test "record instruction-history /p 7,-5" [multi_line \ >>>>> +   "3\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>>> <L2>.*" \ >>>>> +   "4\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>>>> +   "5\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>>>> +   "6\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>>>> +   "7\t  0x\[0-9a-f\]+ <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ >>>>> <L2>.*\r" \ >>>>> +   ] >>>>> +} >>>>>  -gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>>> + >>>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>>>      "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>" \ >>>>>      "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \ >>>>>      "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>" \ >>>>>      "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \ >>>>>      "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>\r" \ >>>>>      ] >>>>> +} >>>>> +if { [istarget "arm*-*-*"] } { >>>>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>" \ >>>>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tr0, r0, #1" \ >>>>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>" \ >>>>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tr0, #0" \ >>>>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" \ >>>>> +   ] >>>>> +} >>>>> +if { [istarget "aarch64*-*-*"]} { >>>>> + gdb_test "record instruction-history /pf 3,7" [multi_line \ >>>>> +   "3\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ >>>>> <L2>.*" \ >>>>> +   "4\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tsubs\tx0, x0, #0x1.*" \ >>>>> +   "5\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\t0x\[0-9a-f\]+ <L1>.*" \ >>>>> +   "6\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp\tx0, #0x0.*" \ >>>>> +   "7\t  0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tb\\.eq\t0x\[0-9a-f\]+ >>>>> <L2>.*\r" \ >>>>> +   ] >>>>> +} >>>>>  -gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>:\tje    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" >>>>> +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { >>>>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>>>> <loop\\+\[0-9\]+>:\tje    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" >>>>> +} >>>>> +if { [istarget "arm*-*-*"] } { >>>>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>>>> <L1\\+\[0-9\]+>:\tbeq\t0x\[0-9a-f\]+ <L2>\r" >>>>> +} >>>>> +if { [istarget "aarch64*-*-*"]} { >>>>> + gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ >>>>> <L1\\+\[0-9\]+>:\tb\.eq\t0x\[0-9a-f\]+ <L2> // b\.none\r" >>>>> +} >>>>>   # the following tests are checking the iterators >>>>>  # to avoid lots of regexps, we just check the number of lines that >>>>> diff --git a/gdb/testsuite/gdb.btrace/non-stop.exp >>>>> b/gdb/testsuite/gdb.btrace/non-stop.exp >>>>> index 40cced7a8bb..58459de5359 100644 >>>>> --- a/gdb/testsuite/gdb.btrace/non-stop.exp >>>>> +++ b/gdb/testsuite/gdb.btrace/non-stop.exp >>>>> @@ -31,6 +31,12 @@ save_vars { GDBFLAGS } { >>>>>      clean_restart $testfile >>>>>  } >>>>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>>> +   set loop_position 2 >>>>> +} elseif {[istarget "arm*-*-*"] || [istarget "aarch64*-*-*"]} { >>>>> +   set loop_position 3 >>>>> +} >>>>> + >>>>>  if ![runto_main] { >>>>>      untested "failed to run to main" >>>>>      return -1 >>>>> @@ -111,87 +117,99 @@ gdb_test "thread apply all info rec" ".*" >>>>>  gdb_test "info threads" ".*" >>>>>   with_test_prefix "navigate" { >>>>> -   gdb_test "thread apply 1 record goto 2" "$loop_line" >>>>> -   gdb_test "thread apply 2 record goto 4" "$loop_line" >>>>> +   gdb_test "thread apply 1 record goto $loop_position" "$loop_line" >>>>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>>>> 2}]" "$loop_line" >>>>>      gdb_test "thread apply 1 info record" \ >>>>> -       ".*Replay in progress\. At instruction 2\." "thread 1 at >>>>> insn 2" >>>>> +       ".*Replay in progress\. At instruction $loop_position\." >>>>> "thread 1 at insn $loop_position" >>>>>      gdb_test "thread apply 2 info record" \ >>>>> -       ".*Replay in progress\. At instruction 4\." "thread 2 at >>>>> insn 4" >>>>> +       ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 2}]\." "thread 2 at insn [expr {$loop_position + >>>>> 2}]" >>>>>  -   gdb_test "thread apply all record goto 5" "$loop_line" >>>>> +   gdb_test "thread apply all record goto [expr {$loop_position + >>>>> 3}]" "$loop_line" >>>>>      gdb_test "thread apply 1 info record" \ >>>>> -       ".*Replay in progress\. At instruction 5\." "thread 1 at >>>>> insn 5" >>>>> +       ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 3}]\." "thread 1 at insn [expr {$loop_position + >>>>> 3}]" >>>>>      gdb_test "thread apply 2 info record" \ >>>>> -       ".*Replay in progress\. At instruction 5\." "thread 2 at >>>>> insn 5" >>>>> +       ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 3}]\." "thread 2 at insn [expr {$loop_position + >>>>> 3}]" >>>>>  } >>>>>   with_test_prefix "step" { >>>>> +   with_test_prefix "fixture" { >>>>> +   gdb_test "thread apply 1 record goto [expr {$loop_position + >>>>> 3}]" ".*" >>>>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>>>> 3}]" ".*" >>>>> +   } >>>>>      with_test_prefix "thread 1" { >>>>>          gdb_test "thread apply 1 stepi 2" "$loop_line" >>>>>          gdb_test "thread apply 1 info record" \ >>>>> -           ".*Replay in progress\. At instruction 7\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 5}]\." >>>>>          gdb_test "thread apply 2 info record" \ >>>>> -           ".*Replay in progress\. At instruction 5\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 3}]\." >>>>>      } >>>>>       with_test_prefix "thread 2" { >>>>>          gdb_test "thread apply 2 stepi 3" "$loop_line" >>>>>          gdb_test "thread apply 1 info record" \ >>>>> -           ".*Replay in progress\. At instruction 7\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 5}]\." >>>>>          gdb_test "thread apply 2 info record" \ >>>>> -           ".*Replay in progress\. At instruction 8\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 6}]\." >>>>>      } >>>>>       with_test_prefix "all" { >>>>>          gdb_cont_to all "stepi 4" "$loop_line" 2 >>>>>          gdb_test "thread apply 1 info record" \ >>>>> -           ".*Replay in progress\. At instruction 11\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 9}]\." >>>>>          gdb_test "thread apply 2 info record" \ >>>>> -           ".*Replay in progress\. At instruction 12\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 10}]\." >>>>>      } >>>>>  } >>>>>   with_test_prefix "reverse-step" { >>>>> +   with_test_prefix "fixture" { >>>>> +       gdb_test "thread apply 1 record goto [expr {$loop_position >>>>> + 9}]" ".*" >>>>> +       gdb_test "thread apply 2 record goto [expr {$loop_position >>>>> + 10}]" ".*" >>>>> +   } >>>>>      with_test_prefix "thread 1" { >>>>>          gdb_test "thread apply 1 reverse-stepi 2" "$loop_line" >>>>>          gdb_test "thread apply 1 info record" \ >>>>> -           ".*Replay in progress\. At instruction 9\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 7}]\." >>>>>          gdb_test "thread apply 2 info record" \ >>>>> -           ".*Replay in progress\. At instruction 12\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 10}]\." >>>>>      } >>>>>       with_test_prefix "thread 2" { >>>>>          gdb_test "thread apply 2 reverse-stepi 3" "$loop_line" >>>>>          gdb_test "thread apply 1 info record" \ >>>>> -           ".*Replay in progress\. At instruction 9\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 7}]\." >>>>>          gdb_test "thread apply 2 info record" \ >>>>> -           ".*Replay in progress\. At instruction 9\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 7}]\." >>>>>      } >>>>>       with_test_prefix "all" { >>>>>          gdb_cont_to all "reverse-stepi 4" "$loop_line" 2 >>>>>          gdb_test "thread apply 1 info record" \ >>>>> -           ".*Replay in progress\. At instruction 5\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 3}]\." >>>>>          gdb_test "thread apply 2 info record" \ >>>>> -           ".*Replay in progress\. At instruction 5\." >>>>> +           ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 3}]\." >>>>>      } >>>>>  } >>>>>   with_test_prefix "continue" { >>>>> +   with_test_prefix "fixture" { >>>>> +   gdb_test "thread apply 1 record goto [expr {$loop_position + >>>>> 3}]" ".*" >>>>> +   gdb_test "thread apply 2 record goto [expr {$loop_position + >>>>> 3}]" ".*" >>>>> +   } >>>>>      with_test_prefix "thread 1" { >>>>>      with_test_prefix "continue" { >>>>>          gdb_cont_to_no_history 1 "continue" 1 >>>>>          gdb_test "thread apply 1 info record" \ >>>>>          ".*Recorded \[0-9\]+ instructions \[^\\\r\\\n\]*" >>>>>          gdb_test "thread apply 2 info record" \ >>>>> -       ".*Replay in progress\. At instruction 5\." >>>>> +       ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 3}]\." >>>>>      } >>>>>      with_test_prefix "reverse-continue" { >>>>>          gdb_cont_to_no_history 1 "reverse-continue" 1 >>>>>          gdb_test "thread apply 1 info record" \ >>>>>          ".*Replay in progress\. At instruction 1\." >>>>>          gdb_test "thread apply 2 info record" \ >>>>> -       ".*Replay in progress\. At instruction 5\." >>>>> +       ".*Replay in progress\. At instruction [expr >>>>> {$loop_position + 3}]\." >>>>>      } >>>>>      } >>>>>  diff --git a/gdb/testsuite/gdb.btrace/record_goto.exp >>>>> b/gdb/testsuite/gdb.btrace/record_goto.exp >>>>> index 75d76da1c7f..a04983a4859 100644 >>>>> --- a/gdb/testsuite/gdb.btrace/record_goto.exp >>>>> +++ b/gdb/testsuite/gdb.btrace/record_goto.exp >>>>> @@ -41,6 +41,10 @@ if [info exists COMPILE] { >>>>>      } else { >>>>>          standard_testfile i686-record_goto.S >>>>>      } >>>>> +} elseif {[istarget "arm*-*-*"]} { >>>>> +   standard_testfile arm-record_goto.S >>>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>>> +   standard_testfile aarch64-record_goto.S >>>>>  } else { >>>>>      unsupported "target architecture not supported" >>>>>      return -1 >>>>> @@ -50,6 +54,126 @@ if [prepare_for_testing "failed to prepare" >>>>> $testfile $srcfile $opts] { >>>>>      return -1 >>>>>  } >>>>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>>> +   set function_positions(0) 19 >>>>> +   set function_positions(1) 27 >>>>> +   set function_positions(2) 2 >>>>> +   set function_positions(end) 40 >>>>> +   set function_positions(3) 39 >>>>> + >>>>> +   set sequence_begin(1) 1 >>>>> +   set sequence_end(1) 1 >>>>> +   set sequence_begin(2) 2 >>>>> +   set sequence_end(2) 4 >>>>> +   set sequence_begin(3) 5 >>>>> +   set sequence_end(3) 8 >>>>> +   set sequence_begin(4) 9 >>>>> +   set sequence_end(4) 9 >>>>> +   set sequence_begin(5) 10 >>>>> +   set sequence_end(5) 12 >>>>> +   set sequence_begin(6) 13 >>>>> +   set sequence_end(6) 16 >>>>> +   set sequence_begin(7) 17 >>>>> +   set sequence_end(7) 18 >>>>> +   set sequence_begin(8) 19 >>>>> +   set sequence_end(8) 19 >>>>> +   set sequence_begin(9) 20 >>>>> +   set sequence_end(9) 22 >>>>> +   set sequence_begin(10) 23 >>>>> +   set sequence_end(10) 26 >>>>> +   set sequence_begin(11) 27 >>>>> +   set sequence_end(11) 27 >>>>> +   set sequence_begin(12) 28 >>>>> +   set sequence_end(12) 30 >>>>> +   set sequence_begin(13) 31 >>>>> +   set sequence_end(13) 34 >>>>> +   set sequence_begin(14) 35 >>>>> +   set sequence_end(14) 36 >>>>> +   set sequence_begin(15) 37 >>>>> +   set sequence_end(15) 38 >>>>> +   set sequence_begin(16) 39 >>>>> +   set sequence_end(16) 40 >>>>> + >>>>> +} elseif {[istarget "arm*-*-*"]} { >>>>> +   set function_positions(0) 23 >>>>> +   set function_positions(1) 33 >>>>> +   set function_positions(2) 2 >>>>> +   set function_positions(end) 48 >>>>> +   set function_positions(3) 47 >>>>> + >>>>> +   set sequence_begin(1) 1 >>>>> +   set sequence_end(1) 1 >>>>> +   set sequence_begin(2) 2 >>>>> +   set sequence_end(2) 4 >>>>> +   set sequence_begin(3) 5 >>>>> +   set sequence_end(3) 10 >>>>> +   set sequence_begin(4) 11 >>>>> +   set sequence_end(4) 11 >>>>> +   set sequence_begin(5) 12 >>>>> +   set sequence_end(5) 14 >>>>> +   set sequence_begin(6) 15 >>>>> +   set sequence_end(6) 20 >>>>> +   set sequence_begin(7) 21 >>>>> +   set sequence_end(7) 22 >>>>> +   set sequence_begin(8) 23 >>>>> +   set sequence_end(8) 23 >>>>> +   set sequence_begin(9) 24 >>>>> +   set sequence_end(9) 26 >>>>> +   set sequence_begin(10) 27 >>>>> +   set sequence_end(10) 32 >>>>> +   set sequence_begin(11) 33 >>>>> +   set sequence_end(11) 33 >>>>> +   set sequence_begin(12) 34 >>>>> +   set sequence_end(12) 36 >>>>> +   set sequence_begin(13) 37 >>>>> +   set sequence_end(13) 42 >>>>> +   set sequence_begin(14) 43 >>>>> +   set sequence_end(14) 44 >>>>> +   set sequence_begin(15) 45 >>>>> +   set sequence_end(15) 46 >>>>> +   set sequence_begin(16) 47 >>>>> +   set sequence_end(16) 48 >>>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>>> +   set function_positions(0) 16 >>>>> +   set function_positions(1) 22 >>>>> +   set function_positions(2) 2 >>>>> +   set function_positions(end) 36 >>>>> +   set function_positions(3) 35 >>>>> + >>>>> +   set sequence_begin(1) 1 >>>>> +   set sequence_end(1) 1 >>>>> +   set sequence_begin(2) 2 >>>>> +   set sequence_end(2) 4 >>>>> +   set sequence_begin(3) 5 >>>>> +   set sequence_end(3) 6 >>>>> +   set sequence_begin(4) 7 >>>>> +   set sequence_end(4) 7 >>>>> +   set sequence_begin(5) 8 >>>>> +   set sequence_end(5) 10 >>>>> +   set sequence_begin(6) 11 >>>>> +   set sequence_end(6) 12 >>>>> +   set sequence_begin(7) 13 >>>>> +   set sequence_end(7) 15 >>>>> +   set sequence_begin(8) 16 >>>>> +   set sequence_end(8) 16 >>>>> +   set sequence_begin(9) 17 >>>>> +   set sequence_end(9) 19 >>>>> +   set sequence_begin(10) 20 >>>>> +   set sequence_end(10) 21 >>>>> +   set sequence_begin(11) 22 >>>>> +   set sequence_end(11) 22 >>>>> +   set sequence_begin(12) 23 >>>>> +   set sequence_end(12) 25 >>>>> +   set sequence_begin(13) 26 >>>>> +   set sequence_end(13) 27 >>>>> +   set sequence_begin(14) 28 >>>>> +   set sequence_end(14) 30 >>>>> +   set sequence_begin(15) 31 >>>>> +   set sequence_end(15) 33 >>>>> +   set sequence_begin(16) 34 >>>>> +   set sequence_end(16) 36 >>>>> +} >>>>> + >>>>>  if ![runto_main] { >>>>>      untested "failed to run to main" >>>>>      return -1 >>>>> @@ -65,43 +189,43 @@ gdb_test "next" >>>>>   # start by listing all functions >>>>>  gdb_test "record function-call-history /ci 1, +20" [multi_line \ >>>>> - "1\tmain\tinst 1,1" \ >>>>> - "2\t fun4\tinst 2,4" \ >>>>> - "3\t   fun1\tinst 5,8" \ >>>>> - "4\t fun4\tinst 9,9" \ >>>>> - "5\t   fun2\tinst 10,12" \ >>>>> - "6\t     fun1\tinst 13,16" \ >>>>> - "7\t   fun2\tinst 17,18" \ >>>>> - "8\t fun4\tinst 19,19" \ >>>>> - "9\t   fun3\tinst 20,22" \ >>>>> - "10\t     fun1\tinst 23,26" \ >>>>> - "11\t   fun3\tinst 27,27" \ >>>>> - "12\t     fun2\tinst 28,30" \ >>>>> - "13\t       fun1\tinst 31,34" \ >>>>> - "14\t     fun2\tinst 35,36" \ >>>>> - "15\t   fun3\tinst 37,38" \ >>>>> - "16\t fun4\tinst 39,40" \ >>>>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>>>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>>>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)" \ >>>>> + "4\t fun4\tinst $sequence_begin(4),$sequence_end(4)" \ >>>>> + "5\t   fun2\tinst $sequence_begin(5),$sequence_end(5)" \ >>>>> + "6\t     fun1\tinst $sequence_begin(6),$sequence_end(6)" \ >>>>> + "7\t   fun2\tinst $sequence_begin(7),$sequence_end(7)" \ >>>>> + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ >>>>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>>>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>>>> + "11\t   fun3\tinst $sequence_begin(11),$sequence_end(11)" \ >>>>> + "12\t     fun2\tinst $sequence_begin(12),$sequence_end(12)" \ >>>>> + "13\t       fun1\tinst $sequence_begin(13),$sequence_end(13)" \ >>>>> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>>>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>>>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ >>>>>    ] >>>>>   # let's see if we can go back in history >>>>> -gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*" >>>>> +gdb_test "record goto $function_positions(0)" ".*fun4 \\(\\) at >>>>> record_goto.c:43.*" >>>>>   # the function call history should start at the new location >>>>>  gdb_test "record function-call-history /ci" [multi_line \ >>>>> - "8\t fun4\tinst 19,19" \ >>>>> - "9\t   fun3\tinst 20,22" \ >>>>> - "10\t     fun1\tinst 23,26" \ >>>>> - ] "function-call-history from 19 forwards" >>>>> + "8\t fun4\tinst $sequence_begin(8),$sequence_end(8)" \ >>>>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>>>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>>>> + ] "function-call-history from $function_positions(0) forwards" >>>>>   # the instruction history should start at the new location >>>>>  gdb_test "record instruction-history" [multi_line \ >>>>> - "19.*" \ >>>>> - "20.*" \ >>>>> - "21.*" \ >>>>> - ] "instruction-history from 19 forwards" >>>>> + "$function_positions(0).*" \ >>>>> + "[expr {$function_positions(0) + 1}].*" \ >>>>> + "[expr {$function_positions(0) + 2}].*" \ >>>>> + ] "instruction-history from $function_positions(0) forwards" >>>>>   # let's go to another place in the history >>>>> -gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*" >>>>> +gdb_test "record goto $function_positions(1)" ".*fun3 \\(\\) at >>>>> record_goto.c:35.*" >>>>>   # check the back trace at that location >>>>>  gdb_test "backtrace" [multi_line \ >>>>> @@ -117,26 +241,26 @@ gdb_test "up" ".*main.*at record_goto.c:49.*" >>>>> "up to main" >>>>>   # the function call history should start at the new location >>>>>  gdb_test "record function-call-history /ci -" [multi_line \ >>>>> - "9\t   fun3\tinst 20,22" \ >>>>> - "10\t     fun1\tinst 23,26" \ >>>>> - "11\t   fun3\tinst 27,27" \ >>>>> - ] "function-call-history from 27 backwards" >>>>> + "9\t   fun3\tinst $sequence_begin(9),$sequence_end(9)" \ >>>>> + "10\t     fun1\tinst $sequence_begin(10),$sequence_end(10)" \ >>>>> + "11\t   fun3\tinst $sequence_begin(11),$sequence_end(11)" \ >>>>> + ] "function-call-history from $function_positions(1) backwards" >>>>>   # the instruction history should start at the new location >>>>>  gdb_test "record instruction-history -" [multi_line \ >>>>> - "25.*" \ >>>>> - "26.*" \ >>>>> - "27.*" \ >>>>> - ] "instruction-history from 27 backwards" >>>>> + "[expr {$function_positions(1) - 2}].*" \ >>>>> + "[expr {$function_positions(1) - 1}].*" \ >>>>> + "$function_positions(1).*" \ >>>>> + ] "instruction-history from $function_positions(1) backwards" >>>>>   # test that we can go to the begin of the trace >>>>>  gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*" >>>>>   # check that we're filling up the context correctly >>>>>  gdb_test "record function-call-history /ci -" [multi_line \ >>>>> - "1\tmain\tinst 1,1" \ >>>>> - "2\t fun4\tinst 2,4" \ >>>>> - "3\t   fun1\tinst 5,8" \ >>>>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>>>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>>>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)" \ >>>>>    ] "function-call-history from begin backwards" >>>>>   # check that we're filling up the context correctly >>>>> @@ -147,52 +271,53 @@ gdb_test "record instruction-history -" >>>>> [multi_line \ >>>>>    ] "instruction-history from begin backwards" >>>>>   # we should get the exact same history from the first instruction >>>>> -gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*" >>>>> +gdb_test "record goto $function_positions(2)" ".*fun4 \\(\\) at >>>>> record_goto.c:40.*" >>>>>   # check that we're filling up the context correctly >>>>>  gdb_test "record function-call-history /ci -" [multi_line \ >>>>> - "1\tmain\tinst 1,1" \ >>>>> - "2\t fun4\tinst 2,4" \ >>>>> - "3\t   fun1\tinst 5,8\r" \ >>>>> - ] "function-call-history from 2 backwards" >>>>> + "1\tmain\tinst $sequence_begin(1),$sequence_end(1)" \ >>>>> + "2\t fun4\tinst $sequence_begin(2),$sequence_end(2)" \ >>>>> + "3\t   fun1\tinst $sequence_begin(3),$sequence_end(3)\r" \ >>>>> + ] "function-call-history from $function_positions(2) backwards" >>>>>   # check that we're filling up the context correctly >>>>>  gdb_test "record instruction-history -" [multi_line \ >>>>>    "1.*" \ >>>>>    "2.*" \ >>>>>    "3.*" \ >>>>> - ] "instruction-history from 2 backwards" >>>>> + ] "instruction-history from $function_positions(2) backwards" >>>>>   # check that we can go to the end of the trace >>>>>  gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*" >>>>>   # check that we're filling up the context correctly >>>>>  gdb_test "record function-call-history /ci" [multi_line \ >>>>> - "14\t     fun2\tinst 35,36" \ >>>>> - "15\t   fun3\tinst 37,38" \ >>>>> - "16\t fun4\tinst 39,40" \ >>>>> + "14\t    �� fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>>>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>>>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)" \ >>>>>    ] "function-call-history from end forwards" >>>>>   # check that we're filling up the context correctly >>>>> +#adapt it for arm, last instruction is at pos 48 >>>>>  gdb_test "record instruction-history" [multi_line \ >>>>> - "38.*" \ >>>>> - "39.*" \ >>>>> - "40.*\r" \ >>>>> + "[expr {$function_positions(end) - 2}].*" \ >>>>> + "[expr {$function_positions(end) - 1}].*" \ >>>>> + "$function_positions(end).*\r" \ >>>>>    ] "instruction-history from end forwards" >>>>>   # we should get the exact same history from the second to last >>>>> instruction >>>>> -gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*" >>>>> +gdb_test "record goto $function_positions(3)" ".*fun4 \\(\\) at >>>>> record_goto.c:44.*" >>>>>   # check that we're filling up the context correctly >>>>>  gdb_test "record function-call-history /ci" [multi_line \ >>>>> - "14\t     fun2\tinst 35,36" \ >>>>> - "15\t   fun3\tinst 37,38" \ >>>>> - "16\t fun4\tinst 39,40\r" \ >>>>> - ] "function-call-history from 39 forwards" >>>>> + "14\t     fun2\tinst $sequence_begin(14),$sequence_end(14)" \ >>>>> + "15\t   fun3\tinst $sequence_begin(15),$sequence_end(15)" \ >>>>> + "16\t fun4\tinst $sequence_begin(16),$sequence_end(16)\r" \ >>>>> + ] "function-call-history from $function_positions(3) forwards" >>>>>   # check that we're filling up the context correctly >>>>>  gdb_test "record instruction-history" [multi_line \ >>>>> - "38.*" \ >>>>> - "39.*" \ >>>>> - "40.*\r" \ >>>>> - ] "instruction-history from 39 forwards" >>>>> + "[expr {$function_positions(3) - 1}].*" \ >>>>> + "$function_positions(3).*" \ >>>>> + "[expr {$function_positions(3) + 1}].*\r" \ >>>>> + ] "instruction-history from $function_positions(3) forwards" >>>>> diff --git a/gdb/testsuite/gdb.btrace/stepi.exp >>>>> b/gdb/testsuite/gdb.btrace/stepi.exp >>>>> index bfb680bb30d..5b37d17ba0e 100644 >>>>> --- a/gdb/testsuite/gdb.btrace/stepi.exp >>>>> +++ b/gdb/testsuite/gdb.btrace/stepi.exp >>>>> @@ -39,6 +39,10 @@ if [info exists COMPILE] { >>>>>      } else { >>>>>          standard_testfile i686-record_goto.S >>>>>      } >>>>> +} elseif {[istarget "arm*-*-*"]} { >>>>> +   standard_testfile arm-record_goto.S >>>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>>> +   standard_testfile aarch64-record_goto.S >>>>>  } else { >>>>>      unsupported "target architecture not supported" >>>>>      return -1 >>>>> @@ -48,6 +52,56 @@ if [prepare_for_testing "failed to prepare" >>>>> $testfile $srcfile] { >>>>>      return -1 >>>>>  } >>>>>  +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>>> +   set instructions_count 40 >>>>> +   set instruction_position(0) 39 >>>>> +   set instruction_position(1) 40 >>>>> +   set instruction_position(2) 1 >>>>> +   set instruction_position(3) 1 >>>>> +   set instruction_position(4) 22 >>>>> +   set instruction_position(5) 23 >>>>> +   set instruction_position(6) 22 >>>>> +   set instruction_position(7) 27 >>>>> +   set instruction_position(8) 22 >>>>> +   set instruction_position(9) 1 >>>>> +   set instruction_position(10) 1 >>>>> +   set instruction_position(11) 1 >>>>> +   set instruction_position(12) 2 >>>>> +   set instruction_position(13) 1 >>>>> +} elseif {[istarget "arm*-*-*"]} { >>>>> +   set instructions_count 48 >>>>> +   set instruction_position(0) 47 >>>>> +   set instruction_position(1) 48 >>>>> +   set instruction_position(2) 1 >>>>> +   set instruction_position(3) 1 >>>>> +   set instruction_position(4) 26 >>>>> +   set instruction_position(5) 27 >>>>> +   set instruction_position(6) 26 >>>>> +   set instruction_position(7) 33 >>>>> +   set instruction_position(8) 26 >>>>> +   set instruction_position(9) 1 >>>>> +   set instruction_position(10) 1 >>>>> +   set instruction_position(11) 1 >>>>> +   set instruction_position(12) 2 >>>>> +   set instruction_position(13) 1 >>>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>>> +   set instructions_count 36 >>>>> +   set instruction_position(0) 35 >>>>> +   set instruction_position(1) 36 >>>>> +   set instruction_position(2) 1 >>>>> +   set instruction_position(3) 1 >>>>> +   set instruction_position(4) 19 >>>>> +   set instruction_position(5) 20 >>>>> +   set instruction_position(6) 19 >>>>> +   set instruction_position(7) 22 >>>>> +   set instruction_position(8) 19 >>>>> +   set instruction_position(9) 1 >>>>> +   set instruction_position(10) 1 >>>>> +   set instruction_position(11) 1 >>>>> +   set instruction_position(12) 2 >>>>> +   set instruction_position(13) 1 >>>>> +} >>>>> + >>>>>  if ![runto_main] { >>>>>      untested "failed to run to main" >>>>>      return -1 >>>>> @@ -56,10 +110,11 @@ if ![runto_main] { >>>>>  global gdb_prompt >>>>>   proc check_replay_at { insn } { >>>>> + global instructions_count >>>>>    gdb_test "info record" [multi_line \ >>>>>      "Active record target: record-btrace" \ >>>>>      ".*" \ >>>>> -   "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >>>>> .*" \ >>>>> +   "Recorded $instructions_count instructions in 16 functions >>>>> \\\(0 gaps\\\) for .*" \ >>>>>      "Replay in progress\. At instruction $insn\." \ >>>>>      ] "check replay at $insn" >>>>>  } >>>>> @@ -74,15 +129,14 @@ with_test_prefix "record" { >>>>>  with_test_prefix "fetch" { >>>>>      gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.1" >>>>>      gdb_test "reverse-stepi" ".*fun4\.5.*" "reverse-stepi.2" >>>>> - >>>>>      # let's check where we are in the trace >>>>> -   check_replay_at 39 >>>>> +   check_replay_at $instruction_position(0) >>>>>  } >>>>>   # let's step forward and check again >>>>>  with_test_prefix "stepi" { >>>>>      gdb_test "stepi" ".*fun4\.5.*" >>>>> -   check_replay_at 40 >>>>> +   check_replay_at $instruction_position(1) >>>>>  } >>>>>   # with the next step, we stop replaying >>>>> @@ -91,14 +145,17 @@ with_test_prefix "end" { >>>>>      gdb_test "info record" [multi_line \ >>>>>        "Active record target: record-btrace" \ >>>>>        ".*" \ >>>>> -     "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >>>>> \[^\\\r\\\n\]*" \ >>>>> +     "Recorded $instructions_count instructions in 16 functions >>>>> \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ >>>>>    ] >>>>>  } >>>>>  +#recover from a missing lr register in arm >>>>> +gdb_test "record goto end" >>>>> + >>>>>  # let's try nexti >>>>>  with_test_prefix "reverse-nexti.1" { >>>>>      gdb_test "reverse-nexti" ".*main\.2.*" >>>>> -   check_replay_at 1 >>>>> +   check_replay_at $instruction_position(2) >>>>>  } >>>>>   # we can't reverse-nexti any further >>>>> @@ -106,7 +163,7 @@ with_test_prefix "reverse-nexti.2" { >>>>>      gdb_test "reverse-nexti" \ >>>>>      "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>>>      "reverse-nexti.2" >>>>> -   check_replay_at 1 >>>>> +   check_replay_at $instruction_position(3) >>>>>  } >>>>>   # but we can step back again >>>>> @@ -115,32 +172,32 @@ with_test_prefix "nexti" { >>>>>      gdb_test "info record" [multi_line \ >>>>>        "Active record target: record-btrace" \ >>>>>        ".*" \ >>>>> -     "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for >>>>> \[^\\\r\\\n\]*" \ >>>>> +     "Recorded $instructions_count instructions in 16 functions >>>>> \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \ >>>>>                     ] >>>>>  } >>>>>   # let's step from a goto position somewhere in the middle >>>>>  with_test_prefix "goto" { >>>>> -   gdb_test "record goto 22" ".*fun3\.2.*" >>>>> -   with_test_prefix "goto 22" { check_replay_at 22 } >>>>> +   gdb_test "record goto $instruction_position(4) " ".*fun3\.2.*" >>>>> +   with_test_prefix "goto $instruction_position(4) " { >>>>> check_replay_at $instruction_position(4) } >>>>>       gdb_test "stepi" ".*fun1\.1.*" "stepi.3" >>>>> -   with_test_prefix "stepi to 23" { check_replay_at 23 } >>>>> +   with_test_prefix "stepi to $instruction_position(5)" { >>>>> check_replay_at $instruction_position(5) } >>>>>       gdb_test "reverse-stepi" ".*fun3\.2.*" "reverse-stepi.3" >>>>> -   with_test_prefix "reverse-stepi to 22" { check_replay_at 22 } >>>>> +   with_test_prefix "reverse-stepi to $instruction_position(6)" { >>>>> check_replay_at $instruction_position(6) } >>>>>       gdb_test "nexti" ".*fun3\.3.*" >>>>> -   with_test_prefix "nexti to 27" { check_replay_at 27 } >>>>> +   with_test_prefix "nexti to $instruction_position(7) " { >>>>> check_replay_at $instruction_position(7) } >>>>>       gdb_test "reverse-nexti" ".*fun3\.2.*" "reverse-nexti.3" >>>>> -   with_test_prefix "reverse-nexti to 22" { check_replay_at 22 } >>>>> +   with_test_prefix "reverse-nexti to $instruction_position(8)" { >>>>> check_replay_at $instruction_position(8) } >>>>>  } >>>>>   # let's try to step off the left end >>>>>  with_test_prefix "goto begin" { >>>>>      gdb_test "record goto begin" ".*main\.2.*" >>>>> -   check_replay_at 1 >>>>> +   check_replay_at $instruction_position(9) >>>>>       with_test_prefix "reverse-stepi" { >>>>>      gdb_test "reverse-stepi" \ >>>>> @@ -149,7 +206,7 @@ with_test_prefix "goto begin" { >>>>>      gdb_test "reverse-stepi" \ >>>>>          "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>>>          "reverse-stepi.2" >>>>> -   check_replay_at 1 >>>>> +   check_replay_at $instruction_position(10) >>>>>      } >>>>>       with_test_prefix "reverse-nexti" { >>>>> @@ -159,13 +216,13 @@ with_test_prefix "goto begin" { >>>>>      gdb_test "reverse-nexti" \ >>>>>          "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>>>          "reverse-nexti.2" >>>>> -   check_replay_at 1 >>>>> +   check_replay_at $instruction_position(11) >>>>>      } >>>>>       # we can step forward, though >>>>>      with_test_prefix "stepi" { >>>>>      gdb_test "stepi" ".*fun4\.1.*" >>>>> -   check_replay_at 2 >>>>> +   check_replay_at $instruction_position(12) >>>>>      } >>>>>  } >>>>>  @@ -178,5 +235,5 @@ with_test_prefix "reverse-stepi" { >>>>>      gdb_test "reverse-stepi" \ >>>>>      "No more reverse-execution history\.\r\n.*main\.2.*" \ >>>>>      "reverse-stepi.3" >>>>> -   check_replay_at 1 >>>>> +   check_replay_at $instruction_position(13) >>>>>  } >>>>> diff --git a/gdb/testsuite/gdb.btrace/tailcall-only.exp >>>>> b/gdb/testsuite/gdb.btrace/tailcall-only.exp >>>>> index 510f90c9d5e..7e449ee38da 100644 >>>>> --- a/gdb/testsuite/gdb.btrace/tailcall-only.exp >>>>> +++ b/gdb/testsuite/gdb.btrace/tailcall-only.exp >>>>> @@ -43,6 +43,10 @@ if [info exists COMPILE] { >>>>>      } else { >>>>>          standard_testfile i686-tailcall-only.S >>>>>      } >>>>> +} elseif { [istarget "arm*-*-*"] } { >>>>> + standard_testfile arm-tailcall-only.S >>>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>>> + standard_testfile aarch64-tailcall-only.S >>>>>  } else { >>>>>      unsupported "target architecture not supported" >>>>>      return -1 >>>>> @@ -62,6 +66,10 @@ gdb_test_no_output "set record >>>>> function-call-history-size 0" >>>>>   # trace foo >>>>>  gdb_test "step" ".*" "prepare for recording" >>>>> +# make sure we get out of function epilogue >>>>> +if { [istarget "arm*-*-*"] } { >>>>> + gdb_test "stepi" >>>>> +} >>>>>  gdb_test_no_output "record btrace" >>>>>  gdb_test "stepi 4" ".*" "record branch trace" >>>>>  diff --git a/gdb/testsuite/gdb.btrace/tailcall.exp >>>>> b/gdb/testsuite/gdb.btrace/tailcall.exp >>>>> index 07a3ec103f4..602a9ed6fba 100644 >>>>> --- a/gdb/testsuite/gdb.btrace/tailcall.exp >>>>> +++ b/gdb/testsuite/gdb.btrace/tailcall.exp >>>>> @@ -40,6 +40,10 @@ if [info exists COMPILE] { >>>>>      } else { >>>>>          standard_testfile i686-tailcall.S >>>>>      } >>>>> +} elseif { [istarget "arm*-*-*"] } { >>>>> + standard_testfile arm-tailcall.S >>>>> +} elseif { [istarget "aarch64*-*-*"] } { >>>>> + standard_testfile aarch64-tailcall.S >>>>>  } else { >>>>>      unsupported "target architecture not supported" >>>>>      return -1 >>>>> @@ -48,6 +52,20 @@ if [info exists COMPILE] { >>>>>  if [prepare_for_testing "failed to prepare" $testfile $srcfile >>>>> $opts] { >>>>>      return -1 >>>>>  } >>>>> + >>>>> +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>>> +   set bar_return_line 24 >>>>> +   set bar_return_position 4 >>>>> +   set main_return_line 38 >>>>> +} elseif {[istarget "arm*-*-*"]} { >>>>> +   set bar_return_line 24 >>>>> +   set bar_return_position 5 >>>>> +   set main_return_line 41 >>>>> +   } elseif {[istarget "aarch64*-*-*"]} { >>>>> +   set bar_return_line 23 >>>>> +   set bar_return_position 6 >>>>> +   set main_return_line 40 >>>>> +} >>>> >>>> There may be better ways to fetch this information without >>>> hardcoding it, through regular expressions and $expect_out. See, for >>>> example, gdb.base/step-over-syscall.exp and how it uses $expect_out >>>> to extract some bits of information. >>>> >>>> You could extract this information first and then store it in these >>>> variables. If the sources change, then we won't need to update the >>>> test again. >>>> >>>> If it is hardcoded, every time the source changes you need to update >>>> the test. >>>> >>> [Zied] I will appreciate extracting this information from the elf >>> file. Problem is that according to the architecture, the last line >>> number before the function returns can change slightly. Can you >>> please explain further how to use $expect_out to get the line number. >> >> Extracting from the ELF file is not a good approach. Instead, you >> should first run the test, stopping at each of these places of >> interest (bar return, main return etc) and record the line number and >> position in some way. Using regular expressions you can extract the >> line number the program stopped at, for example. Then you do another >> run and actually test the btrace functionality. >> >> If it is not possible to determine some of these fields dynamically, >> then using the conditional blocks is an acceptable approach. >> >> But you should be aware that different compiler versions may generate >> different code. So this particular test will only work for this >> particular .S file. > [Zied] can you please provide an example See below for an explanation of how this could be achieved. Instead of handling instructions, you could extract bar_return_line, bar_return_position and main_return_line dynamically using the same approach gdb.base/step-over-syscall.exp uses to match instructions. In summary, you run to bar then you next/nexti/step/stepi until you return from it. When you do return from it, you know what the return line is. >> >>>>>  if ![runto_main] { >>>>>      untested "failed to run to main" >>>>>      return -1 >>>>> @@ -58,7 +76,17 @@ gdb_test_no_output "set record >>>>> function-call-history-size 0" >>>>>   # trace the call to foo >>>>>  gdb_test_no_output "record btrace" >>>>> -gdb_test "next 2" >>>>> + >>>>> +# make sure we get out of function epilogue >>>>> +if {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { >>>>> +   gdb_test "next 2" >>>>> +} elseif {[istarget "arm*-*-*"]} { >>>>> + gdb_test "next 2" >>>>> + gdb_test "stepi" >>>>> +} elseif {[istarget "aarch64*-*-*"]} { >>>>> + gdb_test "next" >>>>> + gdb_test "stepi" >>>>> +} >> >> The above will make the test complicated to follow, because it does >> something different for different architectures. >> >> If the program is not stopping at the right location, it is best to >> work with breakpoints to force it to stop there instead of playing >> with next/stepi calls. >> > [Zied] it is a bit more complicated. in fact, we should land at the > return instruction from the function main (line 41 in tailcall.c). but > gdb in aarch64 does not accept to set the breakpoint with following message > > (gdb) b 41 > No line 41 in the current file. > Make breakpoint pending on future shared library load? (y or [n]) y > Breakpoint 2 (41) pending. That's due to differences in how the compiler generates code for each architecture. Ideally, you'd inspect "main" and figure out what instruction you want to stop at before adding the breakpoint there and running the program. I'm not too familiar with what the test wants to accomplish, so it is hard to give concrete suggestions here. You can take a look at the gdb.base/step-over-syscall.exp for an example of how we set instruction patterns for each architecture (syscall instructions) and then proceed to look for those and doing as many stepi's as needed to get there. There are no guarantees the compiler won't try to generate more instructions close to the end of "main", and that may break the test since it assumes you only need to "next" twice and "stepi" once to get there. I think you need to assess if having a common test for all architectures is still reasonable. Otherwise, if it gets too complex and hard to maintain, it may be best to have a separate aarch64/arm test. > > >>>>>   # show the flat branch trace >>>>>  gdb_test "record function-call-history 1" [multi_line \ >>>>> @@ -77,11 +105,11 @@ gdb_test "record function-call-history /c 1" >>>>> [multi_line \ >>>>>    ] "indented" >>>>>   # go into bar >>>>> -gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*" >>>>> +gdb_test "record goto $bar_return_position" ".*bar \\(\\) at >>>>> .*tailcall.c:$bar_return_line\r\n.*" >>>>>   # check the backtrace >>>>>  gdb_test "backtrace" [multi_line \ >>>>> - "#0.*bar \\(\\) at tailcall.c:24" \ >>>>> + "#0.*bar \\(\\) at tailcall.c:$bar_return_line" \ >>>>>    "#1.*foo \\(\\) at tailcall.c:29" \ >>>>>    "#2.*main \\(\\) at tailcall.c:37" \ >>>>>    "Backtrace stopped: not enough registers or memory available to >>>>> unwind further" \ >>>>> @@ -93,23 +121,23 @@ gdb_test "up" "#2\[^\r\n\]*main \\(\\) at >>>>> tailcall.c:37\r\n.*" "up to main" >>>>>  gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" >>>>> "down to foo" >>>>>   # test stepping into and out of tailcalls. >>>>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>>>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>>>> tailcall.c:$main_return_line\r\n.*" \ >>>>>      "finish.1" >>>>> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>>>> tailcall.c:24\r\n.*" \ >>>>> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>>>> tailcall.c:$bar_return_line\r\n.*" \ >>>>>      "reverse-step.1" >>>>>  gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at >>>>> tailcall.c:29\r\n.*" \ >>>>>      "reverse-finish.1" >>>>>  gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at >>>>> tailcall.c:37\r\n.*" \ >>>>>      "reverse-step.2" >>>>> -gdb_test "next" "\[^\r\n\]*38.*" \ >>>>> +gdb_test "next" "\[^\r\n\]*$main_return_line.*" \ >>>>>      "next.1" >>>>>  gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at >>>>> tailcall.c:37\r\n.*" \ >>>>>      "reverse-next.1" >>>>>  gdb_test "step" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" \ >>>>>      "step.1" >>>>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>>>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>>>> tailcall.c:$main_return_line\r\n.*" \ >>>>>      "finish.2" >>>>> -gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>>>> tailcall.c:24\r\n.*" \ >>>>> +gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at >>>>> tailcall.c:$bar_return_line\r\n.*" \ >>>>>      "reverse-step.3" >>>>> -gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" \ >>>>> +gdb_test "finish" "\[^\r\n\]*main \\(\\) at >>>>> tailcall.c:$main_return_line\r\n.*" \ >>>>>      "finish.3" >>>>> diff --git a/gdb/testsuite/gdb.btrace/instruction_history.S >>>>> b/gdb/testsuite/gdb.btrace/x86-instruction_history.S >>>>> similarity index 100% >>>>> rename from gdb/testsuite/gdb.btrace/instruction_history.S >>>>> rename to gdb/testsuite/gdb.btrace/x86-instruction_history.S >>>>> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp >>>>> index 60f84d22aad..b7b11deab57 100644 >>>>> --- a/gdb/testsuite/lib/gdb.exp >>>>> +++ b/gdb/testsuite/lib/gdb.exp >>>>> @@ -3232,7 +3232,7 @@ gdb_caching_proc skip_btrace_tests { >>>>>      global srcdir subdir gdb_prompt inferior_exited_re >>>>>       set me "skip_btrace_tests" >>>>> -   if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } { >>>>> +   if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] && >>>>> ![istarget "arm*-*-*"] && ![istarget "aarch64*-*-*"]} { >>>>>          verbose "$me: target does not support btrace, returning >>>>> 1" 2 >>>>>          return 1 >>>>>      } >>>>> >>>> >>> > -- > > *Zied Guermazi* > founder > > Trande UG > Leuschnerstraße 2 > 69469 Weinheim/Germany > > Mobile: +491722645127 > mailto:zied.guermazi@trande.de <mailto:zied.guermazi@trande.de> > > *Trande UG* > Leuschnerstraße 2, D-69469 Weinheim; Telefon: +491722645127 > Sitz der Gesellschaft: Weinheim- Registergericht: AG Mannheim HRB 736209 > - Geschäftsführung: Zied Guermazi > > *Confidentiality Note* > This message is intended only for the use of the named recipient(s) and > may contain confidential and/or privileged information. If you are not > the intended recipient, please contact the sender and delete the > message. Any unauthorized use of the information contained in this > message is prohibited. > >
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 76b413c3857..a1975363767 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,36 @@ +2021-02-25 Zied Guermazi <zied.guermazi@trande.de> + + * testsuite/lib/gdb.exp (skip_btrace_tests): enable btrace tests + for arm. + * testsuite/gdb.btrace/buffer-size.exp: enable btrace tests + and adapt test for arm. + * testsuite/gdb.btrace/delta.exp (check_trace): enable btrace tests + and adapt test for arm. + * testsuite/gdb.btrace/instruction_history.exp: enable btrace tests + and adapt tests for arm. + * testsuite/gdb.btrace/instruction_history.S: renamed to + x86-instruction_history.S + * testsuite/gdb.btrace/aarch64-instruction_history.S: New. + * testsuite/gdb.btrace/arm-instruction_history.S: New + * testsuite/gdb.btrace/non-stop.exp: enable btrace tests + and adapt tests for arm. + * testsuite/gdb.btrace/reconnect.exp: enable btrace tests + and adapt tests for arm. + * testsuite/gdb.btrace/record_goto.exp: enable btrace tests + and adapt tests for arm. + * testsuite/gdb.btrace/aarch64-record_goto.S: New. + * testsuite/gdb.btrace/arm-record_goto.S: New. + * testsuite/gdb.btrace/stepi.exp: enable btrace tests + and adapt tests for arm. + * testsuite/gdb.btrace/tailcall.exp: enable btrace tests + and adapt tests for arm. + * testsuite/gdb.btrace/aarch64-tailcall.S: New. + * testsuite/gdb.btrace/arm-tailcall.S: New. + * testsuite/gdb.btrace/tailcall-only.exp: enable btrace tests + and adapt tests for arm. + * testsuite/gdb.btrace/aarch64-tailcall-only.S: New. + * testsuite/gdb.btrace/arm-tailcall-only.S: New. + 2021-02-25 Zied Guermazi <zied.guermazi@trande.de> * btrace.c (check_xml_btrace_version): add version 1.1 diff --git a/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S b/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S new file mode 100644 index 00000000000..66490e3b23e --- /dev/null +++ b/gdb/testsuite/gdb.btrace/aarch64-instruction_history.S @@ -0,0 +1,31 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013-2021 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/>. */ +.arch armv8-a +.text +.globl loop +.type loop, %function +loop: + mov x0, #2 /* bp.1 */ +L1: + cmp x0, #0 + beq L2 + subs x0, x0, #1 + b L1 +L2: + ret /* bp.2 */ + + diff --git a/gdb/testsuite/gdb.btrace/aarch64-record_goto.S b/gdb/testsuite/gdb.btrace/aarch64-record_goto.S new file mode 100644 index 00000000000..be832eeb4c1 --- /dev/null +++ b/gdb/testsuite/gdb.btrace/aarch64-record_goto.S @@ -0,0 +1,400 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013-2021 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 has been generated on an armv8 machine using: + gcc -S -dA -g record_goto.c -o aarch64-record_goto.S */ + + .arch armv8-a + .file "record_goto.c" + .text +.Ltext0: + .align 2 + .global fun1 + //.tune generic + .type fun1, %function +fun1: +.LFB0: + .file 1 "record_goto.c" + // record_goto.c:22:1 + .loc 1 22 1 + .cfi_startproc +// BLOCK 2 seq:0 +// PRED: ENTRY (FALLTHRU) + // record_goto.c:23:1 + .loc 1 23 1 + nop +// SUCC: EXIT [always] + ret + .cfi_endproc +.LFE0: + .size fun1, .-fun1 + .align 2 + .global fun2 + .type fun2, %function +fun2: +.LFB1: + // record_goto.c:27:1 + .loc 1 27 1 + .cfi_startproc +// BLOCK 2 seq:0 +// PRED: ENTRY (FALLTHRU) + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x29, sp + // record_goto.c:28:3 + .loc 1 28 3 + bl fun1 + // record_goto.c:29:1 + .loc 1 29 1 + nop + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 +// SUCC: EXIT [always] + ret + .cfi_endproc +.LFE1: + .size fun2, .-fun2 + .align 2 + .global fun3 + .type fun3, %function +fun3: +.LFB2: + // record_goto.c:33:1 + .loc 1 33 1 + .cfi_startproc +// BLOCK 2 seq:0 +// PRED: ENTRY (FALLTHRU) + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x29, sp + // record_goto.c:34:3 + .loc 1 34 3 + bl fun1 + // record_goto.c:35:3 + .loc 1 35 3 + bl fun2 + // record_goto.c:36:1 + .loc 1 36 1 + nop + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 +// SUCC: EXIT [always] + ret + .cfi_endproc +.LFE2: + .size fun3, .-fun3 + .align 2 + .global fun4 + .type fun4, %function +fun4: +.LFB3: + // record_goto.c:40:1 + .loc 1 40 1 + .cfi_startproc +// BLOCK 2 seq:0 +// PRED: ENTRY (FALLTHRU) + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x29, sp + // record_goto.c:41:3 + .loc 1 41 3 + bl fun1 + // record_goto.c:42:3 + .loc 1 42 3 + bl fun2 + // record_goto.c:43:3 + .loc 1 43 3 + bl fun3 + // record_goto.c:44:1 + .loc 1 44 1 + nop + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 +// SUCC: EXIT [always] + ret + .cfi_endproc +.LFE3: + .size fun4, .-fun4 + .align 2 + .global main + .type main, %function +main: +.LFB4: + // record_goto.c:48:1 + .loc 1 48 1 + .cfi_startproc +// BLOCK 2 seq:0 +// PRED: ENTRY (FALLTHRU) + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x29, sp + // record_goto.c:49:3 + .loc 1 49 3 + bl fun4 + // record_goto.c:50:10 + .loc 1 50 10 + mov w0, 0 + // record_goto.c:51:1 + .loc 1 51 1 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 +// SUCC: EXIT [always] + ret + .cfi_endproc +.LFE4: + .size main, .-main +.Letext0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .4byte 0xb7 // Length of Compilation Unit Info + .2byte 0x4 // DWARF version number + .4byte .Ldebug_abbrev0 // Offset Into Abbrev. Section + .byte 0x8 // Pointer Size (in bytes) + .uleb128 0x1 // (DIE (0xb) DW_TAG_compile_unit) + .4byte .LASF4 // DW_AT_producer: "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -fasynchronous-unwind-tables" + .byte 0xc // DW_AT_language + .4byte .LASF5 // DW_AT_name: "record_goto.c" + .4byte .LASF6 // DW_AT_comp_dir: "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" + .8byte .Ltext0 // DW_AT_low_pc + .8byte .Letext0-.Ltext0 // DW_AT_high_pc + .4byte .Ldebug_line0 // DW_AT_stmt_list + .uleb128 0x2 // (DIE (0x2d) DW_TAG_subprogram) + // DW_AT_external + .4byte .LASF7 // DW_AT_name: "main" + .byte 0x1 // DW_AT_decl_file (record_goto.c) + .byte 0x2f // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x4b // DW_AT_type + .8byte .LFB4 // DW_AT_low_pc + .8byte .LFE4-.LFB4 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_tail_call_sites + .uleb128 0x3 // (DIE (0x4b) DW_TAG_base_type) + .byte 0x4 // DW_AT_byte_size + .byte 0x5 // DW_AT_encoding + .ascii "int\0" // DW_AT_name + .uleb128 0x4 // (DIE (0x52) DW_TAG_subprogram) + // DW_AT_external + .4byte .LASF0 // DW_AT_name: "fun4" + .byte 0x1 // DW_AT_decl_file (record_goto.c) + .byte 0x27 // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .8byte .LFB3 // DW_AT_low_pc + .8byte .LFE3-.LFB3 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_tail_call_sites + .uleb128 0x4 // (DIE (0x6c) DW_TAG_subprogram) + // DW_AT_external + .4byte .LASF1 // DW_AT_name: "fun3" + .byte 0x1 // DW_AT_decl_file (record_goto.c) + .byte 0x20 // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .8byte .LFB2 // DW_AT_low_pc + .8byte .LFE2-.LFB2 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_tail_call_sites + .uleb128 0x4 // (DIE (0x86) DW_TAG_subprogram) + // DW_AT_external + .4byte .LASF2 // DW_AT_name: "fun2" + .byte 0x1 // DW_AT_decl_file (record_goto.c) + .byte 0x1a // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .8byte .LFB1 // DW_AT_low_pc + .8byte .LFE1-.LFB1 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_tail_call_sites + .uleb128 0x5 // (DIE (0xa0) DW_TAG_subprogram) + // DW_AT_external + .4byte .LASF3 // DW_AT_name: "fun1" + .byte 0x1 // DW_AT_decl_file (record_goto.c) + .byte 0x15 // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .8byte .LFB0 // DW_AT_low_pc + .8byte .LFE0-.LFB0 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .byte 0 // end of children of DIE 0xb + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 // (abbrev code) + .uleb128 0x11 // (TAG: DW_TAG_compile_unit) + .byte 0x1 // DW_children_yes + .uleb128 0x25 // (DW_AT_producer) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x13 // (DW_AT_language) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x1b // (DW_AT_comp_dir) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x10 // (DW_AT_stmt_list) + .uleb128 0x17 // (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x2 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0 // DW_children_no + .uleb128 0x3f // (DW_AT_external) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2116 // (DW_AT_GNU_all_tail_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .byte 0 + .byte 0 + .uleb128 0x3 // (abbrev code) + .uleb128 0x24 // (TAG: DW_TAG_base_type) + .byte 0 // DW_children_no + .uleb128 0xb // (DW_AT_byte_size) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3e // (DW_AT_encoding) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0x8 // (DW_FORM_string) + .byte 0 + .byte 0 + .uleb128 0x4 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0 // DW_children_no + .uleb128 0x3f // (DW_AT_external) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2116 // (DW_AT_GNU_all_tail_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .byte 0 + .byte 0 + .uleb128 0x5 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0 // DW_children_no + .uleb128 0x3f // (DW_AT_external) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .byte 0 + .byte 0 + .byte 0 + .section .debug_aranges,"",@progbits + .4byte 0x2c // Length of Address Ranges Info + .2byte 0x2 // DWARF aranges version + .4byte .Ldebug_info0 // Offset of Compilation Unit Info + .byte 0x8 // Size of Address + .byte 0 // Size of Segment Descriptor + .2byte 0 // Pad to 16 byte boundary + .2byte 0 + .8byte .Ltext0 // Address + .8byte .Letext0-.Ltext0 // Length + .8byte 0 + .8byte 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF5: + .string "record_goto.c" +.LASF4: + .string "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -fasynchronous-unwind-tables" +.LASF3: + .string "fun1" +.LASF2: + .string "fun2" +.LASF0: + .string "fun4" +.LASF6: + .string "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" +.LASF7: + .string "main" +.LASF1: + .string "fun3" + .ident "GCC: (Debian 10.2.1-3) 10.2.1 20201224" + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S b/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S new file mode 100644 index 00000000000..1822385b85f --- /dev/null +++ b/gdb/testsuite/gdb.btrace/aarch64-tailcall-only.S @@ -0,0 +1,517 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2016-2021 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 has been generated on an armv8 machine using: + gcc -m32 -S -O2 -dA -g tailcall-only.c -o aarch64-tailcall-only.S + */ + + .arch armv8-a + .file "tailcall-only.c" + .text +.Ltext0: + .align 2 + .p2align 4,,11 + //.tune generic + .type bar_1, %function +bar_1: +.LFB0: + .file 1 "tailcall-only.c" + // tailcall-only.c:22:1 + .loc 1 22 1 view -0 + .cfi_startproc +// BLOCK 2, count:1073741824 (estimated locally) seq:0 +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) + // tailcall-only.c:23:3 + .loc 1 23 3 view .LVU1 + // tailcall-only.c:24:1 + .loc 1 24 1 is_stmt 0 view .LVU2 + mov w0, 42 +// SUCC: EXIT [always] count:1073741824 (estimated locally) + ret + .cfi_endproc +.LFE0: + .size bar_1, .-bar_1 + .align 2 + .p2align 4,,11 + .type bar, %function +bar: +.LFB1: + // tailcall-only.c:28:1 + .loc 1 28 1 is_stmt 1 view -0 + .cfi_startproc +// BLOCK 2, count:1073741824 (estimated locally) seq:0 +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) + // tailcall-only.c:29:3 + .loc 1 29 3 view .LVU4 +// SUCC: EXIT [always] count:1073741824 (estimated locally) (ABNORMAL,SIBCALL) + // tailcall-only.c:29:10 + .loc 1 29 10 is_stmt 0 view .LVU5 + b bar_1 +.LVL0: + .cfi_endproc +.LFE1: + .size bar, .-bar + .align 2 + .p2align 4,,11 + .type foo_1, %function +foo_1: +.LFB2: + // tailcall-only.c:34:1 + .loc 1 34 1 is_stmt 1 view -0 + .cfi_startproc +// BLOCK 2, count:1073741824 (estimated locally) seq:0 +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) + // tailcall-only.c:35:3 + .loc 1 35 3 view .LVU7 +// SUCC: EXIT [always] count:1073741824 (estimated locally) (ABNORMAL,SIBCALL) + // tailcall-only.c:35:10 + .loc 1 35 10 is_stmt 0 view .LVU8 + b bar +.LVL1: + .cfi_endproc +.LFE2: + .size foo_1, .-foo_1 + .align 2 + .p2align 4,,11 + .type foo, %function +foo: +.LFB3: + // tailcall-only.c:40:1 + .loc 1 40 1 is_stmt 1 view -0 + .cfi_startproc +// BLOCK 2, count:1073741824 (estimated locally) seq:0 +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) + // tailcall-only.c:41:3 + .loc 1 41 3 view .LVU10 +// SUCC: EXIT [always] count:1073741824 (estimated locally) (ABNORMAL,SIBCALL) + // tailcall-only.c:41:10 + .loc 1 41 10 is_stmt 0 view .LVU11 + b foo_1 +.LVL2: + .cfi_endproc +.LFE3: + .size foo, .-foo + .section .text.startup,"ax",@progbits + .align 2 + .p2align 4,,11 + .global main + .type main, %function +main: +.LFB4: + // tailcall-only.c:46:1 + .loc 1 46 1 is_stmt 1 view -0 + .cfi_startproc +// BLOCK 2, count:1073741824 (estimated locally) seq:0 +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) + // tailcall-only.c:47:3 + .loc 1 47 3 view .LVU13 + // tailcall-only.c:49:3 + .loc 1 49 3 view .LVU14 + // tailcall-only.c:46:1 + .loc 1 46 1 is_stmt 0 view .LVU15 + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x29, sp + // tailcall-only.c:49:12 + .loc 1 49 12 view .LVU16 + bl foo +.LVL3: + // DEBUG answer => x0 + // tailcall-only.c:50:3 + .loc 1 50 3 is_stmt 1 view .LVU17 + // DEBUG answer => x0+0x1 + // tailcall-only.c:52:3 + .loc 1 52 3 view .LVU18 + // tailcall-only.c:53:1 + .loc 1 53 1 is_stmt 0 view .LVU19 + add w0, w0, 1 +.LVL4: + // DEBUG answer => x0 + // tailcall-only.c:53:1 + .loc 1 53 1 view .LVU20 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 +// SUCC: EXIT [always] count:1073741824 (estimated locally) + ret + .cfi_endproc +.LFE4: + .size main, .-main + .text +.Letext0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .4byte 0x11f // Length of Compilation Unit Info + .2byte 0x4 // DWARF version number + .4byte .Ldebug_abbrev0 // Offset Into Abbrev. Section + .byte 0x8 // Pointer Size (in bytes) + .uleb128 0x1 // (DIE (0xb) DW_TAG_compile_unit) + .4byte .LASF1 // DW_AT_producer: "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" + .byte 0xc // DW_AT_language + .4byte .LASF2 // DW_AT_name: "tailcall-only.c" + .4byte .LASF3 // DW_AT_comp_dir: "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" + .4byte .Ldebug_ranges0+0 // DW_AT_ranges + .8byte 0 // DW_AT_low_pc + .4byte .Ldebug_line0 // DW_AT_stmt_list + .uleb128 0x2 // (DIE (0x29) DW_TAG_subprogram) + // DW_AT_external + .4byte .LASF4 // DW_AT_name: "main" + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) + .byte 0x2d // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x6d // DW_AT_type + .8byte .LFB4 // DW_AT_low_pc + .8byte .LFE4-.LFB4 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .4byte 0x6d // DW_AT_sibling + .uleb128 0x3 // (DIE (0x4b) DW_TAG_variable) + .4byte .LASF5 // DW_AT_name: "answer" + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) + .byte 0x2f // DW_AT_decl_line + .byte 0x7 // DW_AT_decl_column + .4byte 0x6d // DW_AT_type + .4byte .LLST0 // DW_AT_location + .4byte .LVUS0 // DW_AT_GNU_locviews + .uleb128 0x4 // (DIE (0x5f) DW_TAG_GNU_call_site) + .8byte .LVL3 // DW_AT_low_pc + .4byte 0x74 // DW_AT_abstract_origin + .byte 0 // end of children of DIE 0x29 + .uleb128 0x5 // (DIE (0x6d) DW_TAG_base_type) + .byte 0x4 // DW_AT_byte_size + .byte 0x5 // DW_AT_encoding + .ascii "int\0" // DW_AT_name + .uleb128 0x6 // (DIE (0x74) DW_TAG_subprogram) + .ascii "foo\0" // DW_AT_name + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) + .byte 0x27 // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x6d // DW_AT_type + .8byte .LFB3 // DW_AT_low_pc + .8byte .LFE3-.LFB3 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .4byte 0xa4 // DW_AT_sibling + .uleb128 0x7 // (DIE (0x96) DW_TAG_GNU_call_site) + .8byte .LVL2 // DW_AT_low_pc + // DW_AT_GNU_tail_call + .4byte 0xa4 // DW_AT_abstract_origin + .byte 0 // end of children of DIE 0x74 + .uleb128 0x8 // (DIE (0xa4) DW_TAG_subprogram) + .4byte .LASF0 // DW_AT_name: "foo_1" + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) + .byte 0x21 // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x6d // DW_AT_type + .8byte .LFB2 // DW_AT_low_pc + .8byte .LFE2-.LFB2 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .4byte 0xd4 // DW_AT_sibling + .uleb128 0x7 // (DIE (0xc6) DW_TAG_GNU_call_site) + .8byte .LVL1 // DW_AT_low_pc + // DW_AT_GNU_tail_call + .4byte 0xd4 // DW_AT_abstract_origin + .byte 0 // end of children of DIE 0xa4 + .uleb128 0x6 // (DIE (0xd4) DW_TAG_subprogram) + .ascii "bar\0" // DW_AT_name + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) + .byte 0x1b // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x6d // DW_AT_type + .8byte .LFB1 // DW_AT_low_pc + .8byte .LFE1-.LFB1 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .4byte 0x104 // DW_AT_sibling + .uleb128 0x7 // (DIE (0xf6) DW_TAG_GNU_call_site) + .8byte .LVL0 // DW_AT_low_pc + // DW_AT_GNU_tail_call + .4byte 0x104 // DW_AT_abstract_origin + .byte 0 // end of children of DIE 0xd4 + .uleb128 0x9 // (DIE (0x104) DW_TAG_subprogram) + .4byte .LASF6 // DW_AT_name: "bar_1" + .byte 0x1 // DW_AT_decl_file (tailcall-only.c) + .byte 0x15 // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x6d // DW_AT_type + .8byte .LFB0 // DW_AT_low_pc + .8byte .LFE0-.LFB0 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .byte 0 // end of children of DIE 0xb + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 // (abbrev code) + .uleb128 0x11 // (TAG: DW_TAG_compile_unit) + .byte 0x1 // DW_children_yes + .uleb128 0x25 // (DW_AT_producer) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x13 // (DW_AT_language) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x1b // (DW_AT_comp_dir) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x55 // (DW_AT_ranges) + .uleb128 0x17 // (DW_FORM_sec_offset) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x10 // (DW_AT_stmt_list) + .uleb128 0x17 // (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x2 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0x1 // DW_children_yes + .uleb128 0x3f // (DW_AT_external) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x1 // (DW_AT_sibling) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x3 // (abbrev code) + .uleb128 0x34 // (TAG: DW_TAG_variable) + .byte 0 // DW_children_no + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x2 // (DW_AT_location) + .uleb128 0x17 // (DW_FORM_sec_offset) + .uleb128 0x2137 // (DW_AT_GNU_locviews) + .uleb128 0x17 // (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x4 // (abbrev code) + .uleb128 0x4109 // (TAG: DW_TAG_GNU_call_site) + .byte 0 // DW_children_no + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x31 // (DW_AT_abstract_origin) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x5 // (abbrev code) + .uleb128 0x24 // (TAG: DW_TAG_base_type) + .byte 0 // DW_children_no + .uleb128 0xb // (DW_AT_byte_size) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3e // (DW_AT_encoding) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0x8 // (DW_FORM_string) + .byte 0 + .byte 0 + .uleb128 0x6 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0x1 // DW_children_yes + .uleb128 0x3 // (DW_AT_name) + .uleb128 0x8 // (DW_FORM_string) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x1 // (DW_AT_sibling) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x7 // (abbrev code) + .uleb128 0x4109 // (TAG: DW_TAG_GNU_call_site) + .byte 0 // DW_children_no + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x2115 // (DW_AT_GNU_tail_call) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x31 // (DW_AT_abstract_origin) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x8 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0x1 // DW_children_yes + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x1 // (DW_AT_sibling) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x9 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0 // DW_children_no + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LVUS0: + .uleb128 .LVU17 // View list begin (*.LVUS0) + .uleb128 .LVU18 // View list end (*.LVUS0) + .uleb128 .LVU18 // View list begin (*.LVUS0) + .uleb128 .LVU20 // View list end (*.LVUS0) + .uleb128 .LVU20 // View list begin (*.LVUS0) + .uleb128 0 // View list end (*.LVUS0) +.LLST0: + .8byte .LVL3 // Location list begin address (*.LLST0) + .8byte .LVL3 // Location list end address (*.LLST0) + .2byte 0x1 // Location expression size + .byte 0x50 // DW_OP_reg0 + .8byte .LVL3 // Location list begin address (*.LLST0) + .8byte .LVL4 // Location list end address (*.LLST0) + .2byte 0x3 // Location expression size + .byte 0x70 // DW_OP_breg0 + .sleb128 1 + .byte 0x9f // DW_OP_stack_value + .8byte .LVL4 // Location list begin address (*.LLST0) + .8byte .LFE4 // Location list end address (*.LLST0) + .2byte 0x1 // Location expression size + .byte 0x50 // DW_OP_reg0 + .8byte 0 // Location list terminator begin (*.LLST0) + .8byte 0 // Location list terminator end (*.LLST0) + .section .debug_aranges,"",@progbits + .4byte 0x3c // Length of Address Ranges Info + .2byte 0x2 // DWARF aranges version + .4byte .Ldebug_info0 // Offset of Compilation Unit Info + .byte 0x8 // Size of Address + .byte 0 // Size of Segment Descriptor + .2byte 0 // Pad to 16 byte boundary + .2byte 0 + .8byte .Ltext0 // Address + .8byte .Letext0-.Ltext0 // Length + .8byte .LFB4 // Address + .8byte .LFE4-.LFB4 // Length + .8byte 0 + .8byte 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .8byte .Ltext0 // Offset 0 + .8byte .Letext0 + .8byte .LFB4 // Offset 0x10 + .8byte .LFE4 + .8byte 0 + .8byte 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF6: + .string "bar_1" +.LASF2: + .string "tailcall-only.c" +.LASF3: + .string "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" +.LASF5: + .string "answer" +.LASF4: + .string "main" +.LASF1: + .string "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" +.LASF0: + .string "foo_1" + .ident "GCC: (Debian 10.2.1-3) 10.2.1 20201224" + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.btrace/aarch64-tailcall.S b/gdb/testsuite/gdb.btrace/aarch64-tailcall.S new file mode 100644 index 00000000000..a6b01cbccea --- /dev/null +++ b/gdb/testsuite/gdb.btrace/aarch64-tailcall.S @@ -0,0 +1,409 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013-2021 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 has been generated on an armv8 machine using: + gcc -S -O2 -dA -g tailcall.c -o aarch64-tailcall.S */ + + .arch armv8-a + .file "tailcall.c" + .text +.Ltext0: + .align 2 + .p2align 4,,11 + //.tune generic + .type bar, %function +bar: +.LFB0: + .file 1 "tailcall.c" + // tailcall.c:22:1 + .loc 1 22 1 view -0 + .cfi_startproc +// BLOCK 2, count:1073741824 (estimated locally) seq:0 +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) + // tailcall.c:23:3 + .loc 1 23 3 view .LVU1 + // tailcall.c:24:1 + .loc 1 24 1 is_stmt 0 view .LVU2 + mov w0, 42 +// SUCC: EXIT [always] count:1073741824 (estimated locally) + ret + .cfi_endproc +.LFE0: + .size bar, .-bar + .align 2 + .p2align 4,,11 + .type foo, %function +foo: +.LFB1: + // tailcall.c:28:1 + .loc 1 28 1 is_stmt 1 view -0 + .cfi_startproc +// BLOCK 2, count:1073741824 (estimated locally) seq:0 +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) + // tailcall.c:29:3 + .loc 1 29 3 view .LVU4 +// SUCC: EXIT [always] count:1073741824 (estimated locally) (ABNORMAL,SIBCALL) + // tailcall.c:29:10 + .loc 1 29 10 is_stmt 0 view .LVU5 + b bar +.LVL0: + .cfi_endproc +.LFE1: + .size foo, .-foo + .section .text.startup,"ax",@progbits + .align 2 + .p2align 4,,11 + .global main + .type main, %function +main: +.LFB2: + // tailcall.c:34:1 + .loc 1 34 1 is_stmt 1 view -0 + .cfi_startproc +// BLOCK 2, count:1073741824 (estimated locally) seq:0 +// PRED: ENTRY [always] count:1073741824 (estimated locally) (FALLTHRU) + // tailcall.c:35:3 + .loc 1 35 3 view .LVU7 + // tailcall.c:37:3 + .loc 1 37 3 view .LVU8 + // tailcall.c:34:1 + .loc 1 34 1 is_stmt 0 view .LVU9 + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + mov x29, sp + // tailcall.c:37:12 + .loc 1 37 12 view .LVU10 + bl foo +.LVL1: + // DEBUG answer => x0 + // tailcall.c:38:3 + .loc 1 38 3 is_stmt 1 view .LVU11 + // DEBUG answer => x0+0x1 + // tailcall.c:40:3 + .loc 1 40 3 view .LVU12 + // tailcall.c:41:1 + .loc 1 41 1 is_stmt 0 view .LVU13 + add w0, w0, 1 +.LVL2: + // DEBUG answer => x0 + // tailcall.c:41:1 + .loc 1 41 1 view .LVU14 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 +// SUCC: EXIT [always] count:1073741824 (estimated locally) + ret + .cfi_endproc +.LFE2: + .size main, .-main + .text +.Letext0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .4byte 0xbf // Length of Compilation Unit Info + .2byte 0x4 // DWARF version number + .4byte .Ldebug_abbrev0 // Offset Into Abbrev. Section + .byte 0x8 // Pointer Size (in bytes) + .uleb128 0x1 // (DIE (0xb) DW_TAG_compile_unit) + .4byte .LASF0 // DW_AT_producer: "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" + .byte 0xc // DW_AT_language + .4byte .LASF1 // DW_AT_name: "tailcall.c" + .4byte .LASF2 // DW_AT_comp_dir: "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" + .4byte .Ldebug_ranges0+0 // DW_AT_ranges + .8byte 0 // DW_AT_low_pc + .4byte .Ldebug_line0 // DW_AT_stmt_list + .uleb128 0x2 // (DIE (0x29) DW_TAG_subprogram) + // DW_AT_external + .4byte .LASF3 // DW_AT_name: "main" + .byte 0x1 // DW_AT_decl_file (tailcall.c) + .byte 0x21 // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x6d // DW_AT_type + .8byte .LFB2 // DW_AT_low_pc + .8byte .LFE2-.LFB2 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .4byte 0x6d // DW_AT_sibling + .uleb128 0x3 // (DIE (0x4b) DW_TAG_variable) + .4byte .LASF4 // DW_AT_name: "answer" + .byte 0x1 // DW_AT_decl_file (tailcall.c) + .byte 0x23 // DW_AT_decl_line + .byte 0x7 // DW_AT_decl_column + .4byte 0x6d // DW_AT_type + .4byte .LLST0 // DW_AT_location + .4byte .LVUS0 // DW_AT_GNU_locviews + .uleb128 0x4 // (DIE (0x5f) DW_TAG_GNU_call_site) + .8byte .LVL1 // DW_AT_low_pc + .4byte 0x74 // DW_AT_abstract_origin + .byte 0 // end of children of DIE 0x29 + .uleb128 0x5 // (DIE (0x6d) DW_TAG_base_type) + .byte 0x4 // DW_AT_byte_size + .byte 0x5 // DW_AT_encoding + .ascii "int\0" // DW_AT_name + .uleb128 0x6 // (DIE (0x74) DW_TAG_subprogram) + .ascii "foo\0" // DW_AT_name + .byte 0x1 // DW_AT_decl_file (tailcall.c) + .byte 0x1b // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x6d // DW_AT_type + .8byte .LFB1 // DW_AT_low_pc + .8byte .LFE1-.LFB1 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .4byte 0xa4 // DW_AT_sibling + .uleb128 0x7 // (DIE (0x96) DW_TAG_GNU_call_site) + .8byte .LVL0 // DW_AT_low_pc + // DW_AT_GNU_tail_call + .4byte 0xa4 // DW_AT_abstract_origin + .byte 0 // end of children of DIE 0x74 + .uleb128 0x8 // (DIE (0xa4) DW_TAG_subprogram) + .ascii "bar\0" // DW_AT_name + .byte 0x1 // DW_AT_decl_file (tailcall.c) + .byte 0x15 // DW_AT_decl_line + .byte 0x1 // DW_AT_decl_column + // DW_AT_prototyped + .4byte 0x6d // DW_AT_type + .8byte .LFB0 // DW_AT_low_pc + .8byte .LFE0-.LFB0 // DW_AT_high_pc + .uleb128 0x1 // DW_AT_frame_base + .byte 0x9c // DW_OP_call_frame_cfa + // DW_AT_GNU_all_call_sites + .byte 0 // end of children of DIE 0xb + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 // (abbrev code) + .uleb128 0x11 // (TAG: DW_TAG_compile_unit) + .byte 0x1 // DW_children_yes + .uleb128 0x25 // (DW_AT_producer) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x13 // (DW_AT_language) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x1b // (DW_AT_comp_dir) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x55 // (DW_AT_ranges) + .uleb128 0x17 // (DW_FORM_sec_offset) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x10 // (DW_AT_stmt_list) + .uleb128 0x17 // (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x2 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0x1 // DW_children_yes + .uleb128 0x3f // (DW_AT_external) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x1 // (DW_AT_sibling) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x3 // (abbrev code) + .uleb128 0x34 // (TAG: DW_TAG_variable) + .byte 0 // DW_children_no + .uleb128 0x3 // (DW_AT_name) + .uleb128 0xe // (DW_FORM_strp) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x2 // (DW_AT_location) + .uleb128 0x17 // (DW_FORM_sec_offset) + .uleb128 0x2137 // (DW_AT_GNU_locviews) + .uleb128 0x17 // (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x4 // (abbrev code) + .uleb128 0x4109 // (TAG: DW_TAG_GNU_call_site) + .byte 0 // DW_children_no + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x31 // (DW_AT_abstract_origin) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x5 // (abbrev code) + .uleb128 0x24 // (TAG: DW_TAG_base_type) + .byte 0 // DW_children_no + .uleb128 0xb // (DW_AT_byte_size) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3e // (DW_AT_encoding) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3 // (DW_AT_name) + .uleb128 0x8 // (DW_FORM_string) + .byte 0 + .byte 0 + .uleb128 0x6 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0x1 // DW_children_yes + .uleb128 0x3 // (DW_AT_name) + .uleb128 0x8 // (DW_FORM_string) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x1 // (DW_AT_sibling) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x7 // (abbrev code) + .uleb128 0x4109 // (TAG: DW_TAG_GNU_call_site) + .byte 0 // DW_children_no + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x2115 // (DW_AT_GNU_tail_call) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x31 // (DW_AT_abstract_origin) + .uleb128 0x13 // (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x8 // (abbrev code) + .uleb128 0x2e // (TAG: DW_TAG_subprogram) + .byte 0 // DW_children_no + .uleb128 0x3 // (DW_AT_name) + .uleb128 0x8 // (DW_FORM_string) + .uleb128 0x3a // (DW_AT_decl_file) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x3b // (DW_AT_decl_line) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x39 // (DW_AT_decl_column) + .uleb128 0xb // (DW_FORM_data1) + .uleb128 0x27 // (DW_AT_prototyped) + .uleb128 0x19 // (DW_FORM_flag_present) + .uleb128 0x49 // (DW_AT_type) + .uleb128 0x13 // (DW_FORM_ref4) + .uleb128 0x11 // (DW_AT_low_pc) + .uleb128 0x1 // (DW_FORM_addr) + .uleb128 0x12 // (DW_AT_high_pc) + .uleb128 0x7 // (DW_FORM_data8) + .uleb128 0x40 // (DW_AT_frame_base) + .uleb128 0x18 // (DW_FORM_exprloc) + .uleb128 0x2117 // (DW_AT_GNU_all_call_sites) + .uleb128 0x19 // (DW_FORM_flag_present) + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LVUS0: + .uleb128 .LVU11 // View list begin (*.LVUS0) + .uleb128 .LVU12 // View list end (*.LVUS0) + .uleb128 .LVU12 // View list begin (*.LVUS0) + .uleb128 .LVU14 // View list end (*.LVUS0) + .uleb128 .LVU14 // View list begin (*.LVUS0) + .uleb128 0 // View list end (*.LVUS0) +.LLST0: + .8byte .LVL1 // Location list begin address (*.LLST0) + .8byte .LVL1 // Location list end address (*.LLST0) + .2byte 0x1 // Location expression size + .byte 0x50 // DW_OP_reg0 + .8byte .LVL1 // Location list begin address (*.LLST0) + .8byte .LVL2 // Location list end address (*.LLST0) + .2byte 0x3 // Location expression size + .byte 0x70 // DW_OP_breg0 + .sleb128 1 + .byte 0x9f // DW_OP_stack_value + .8byte .LVL2 // Location list begin address (*.LLST0) + .8byte .LFE2 // Location list end address (*.LLST0) + .2byte 0x1 // Location expression size + .byte 0x50 // DW_OP_reg0 + .8byte 0 // Location list terminator begin (*.LLST0) + .8byte 0 // Location list terminator end (*.LLST0) + .section .debug_aranges,"",@progbits + .4byte 0x3c // Length of Address Ranges Info + .2byte 0x2 // DWARF aranges version + .4byte .Ldebug_info0 // Offset of Compilation Unit Info + .byte 0x8 // Size of Address + .byte 0 // Size of Segment Descriptor + .2byte 0 // Pad to 16 byte boundary + .2byte 0 + .8byte .Ltext0 // Address + .8byte .Letext0-.Ltext0 // Length + .8byte .LFB2 // Address + .8byte .LFE2-.LFB2 // Length + .8byte 0 + .8byte 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .8byte .Ltext0 // Offset 0 + .8byte .Letext0 + .8byte .LFB2 // Offset 0x10 + .8byte .LFE2 + .8byte 0 + .8byte 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF0: + .string "GNU C17 10.2.1 20201224 -mlittle-endian -mabi=lp64 -g -O2 -fasynchronous-unwind-tables" +.LASF2: + .string "/home/linaro/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" +.LASF4: + .string "answer" +.LASF1: + .string "tailcall.c" +.LASF3: + .string "main" + .ident "GCC: (Debian 10.2.1-3) 10.2.1 20201224" + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.btrace/arm-instruction_history.S b/gdb/testsuite/gdb.btrace/arm-instruction_history.S new file mode 100644 index 00000000000..e73ddaa9be9 --- /dev/null +++ b/gdb/testsuite/gdb.btrace/arm-instruction_history.S @@ -0,0 +1,31 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013-2021 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/>. */ + +.arm +.text +.globl loop +.type loop, %function +loop: + movs r0, #2 /* bp.1 */ +L1: + cmp r0, #0 + beq L2 + subs r0, r0, #1 + b L1 +L2: + bx lr /* bp.2 */ + diff --git a/gdb/testsuite/gdb.btrace/arm-record_goto.S b/gdb/testsuite/gdb.btrace/arm-record_goto.S new file mode 100644 index 00000000000..2d3a2f0c8de --- /dev/null +++ b/gdb/testsuite/gdb.btrace/arm-record_goto.S @@ -0,0 +1,433 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013-2019 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 has been generated on an armv7 machine using: + gcc -S -dA -g record_goto.c -o arm-record_goto.S */ + + .arch armv7-a + .eabi_attribute 28, 1 @ Tag_ABI_VFP_args + .eabi_attribute 20, 1 @ Tag_ABI_FP_denormal + .eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions + .eabi_attribute 23, 3 @ Tag_ABI_FP_number_model + .eabi_attribute 24, 1 @ Tag_ABI_align8_needed + .eabi_attribute 25, 1 @ Tag_ABI_align8_preserved + .eabi_attribute 26, 2 @ Tag_ABI_enum_size + .eabi_attribute 30, 6 @ Tag_ABI_optimization_goals + .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access + .eabi_attribute 18, 4 @ Tag_ABI_PCS_wchar_t + .file "record_goto.c" + .text +.Ltext0: + .cfi_sections .debug_frame + .align 1 + .global fun1 + .syntax unified + .thumb + .thumb_func + .fpu vfpv3-d16 + .type fun1, %function +fun1: +.LFB0: + .file 1 "record_goto.c" + @ record_goto.c:22 + .loc 1 22 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 1, uses_anonymous_args = 0 + @ link register save eliminated. +@ BLOCK 2 seq:0 +@ PRED: ENTRY (FALLTHRU) + push {r7} + .cfi_def_cfa_offset 4 + .cfi_offset 7, -4 + add r7, sp, #0 + .cfi_def_cfa_register 7 + @ record_goto.c:23 + .loc 1 23 0 + nop + mov sp, r7 + .cfi_def_cfa_register 13 + @ sp needed + ldr r7, [sp], #4 + .cfi_restore 7 + .cfi_def_cfa_offset 0 +@ SUCC: EXIT [100.0%] + bx lr + .cfi_endproc +.LFE0: + .size fun1, .-fun1 + .align 1 + .global fun2 + .syntax unified + .thumb + .thumb_func + .fpu vfpv3-d16 + .type fun2, %function +fun2: +.LFB1: + @ record_goto.c:27 + .loc 1 27 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 1, uses_anonymous_args = 0 +@ BLOCK 2 seq:0 +@ PRED: ENTRY (FALLTHRU) + push {r7, lr} + .cfi_def_cfa_offset 8 + .cfi_offset 7, -8 + .cfi_offset 14, -4 + add r7, sp, #0 + .cfi_def_cfa_register 7 + @ record_goto.c:28 + .loc 1 28 0 + bl fun1(PLT) + @ record_goto.c:29 + .loc 1 29 0 + nop +@ SUCC: EXIT [100.0%] + pop {r7, pc} + .cfi_endproc +.LFE1: + .size fun2, .-fun2 + .align 1 + .global fun3 + .syntax unified + .thumb + .thumb_func + .fpu vfpv3-d16 + .type fun3, %function +fun3: +.LFB2: + @ record_goto.c:33 + .loc 1 33 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 1, uses_anonymous_args = 0 +@ BLOCK 2 seq:0 +@ PRED: ENTRY (FALLTHRU) + push {r7, lr} + .cfi_def_cfa_offset 8 + .cfi_offset 7, -8 + .cfi_offset 14, -4 + add r7, sp, #0 + .cfi_def_cfa_register 7 + @ record_goto.c:34 + .loc 1 34 0 + bl fun1(PLT) + @ record_goto.c:35 + .loc 1 35 0 + bl fun2(PLT) + @ record_goto.c:36 + .loc 1 36 0 + nop +@ SUCC: EXIT [100.0%] + pop {r7, pc} + .cfi_endproc +.LFE2: + .size fun3, .-fun3 + .align 1 + .global fun4 + .syntax unified + .thumb + .thumb_func + .fpu vfpv3-d16 + .type fun4, %function +fun4: +.LFB3: + @ record_goto.c:40 + .loc 1 40 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 1, uses_anonymous_args = 0 +@ BLOCK 2 seq:0 +@ PRED: ENTRY (FALLTHRU) + push {r7, lr} + .cfi_def_cfa_offset 8 + .cfi_offset 7, -8 + .cfi_offset 14, -4 + add r7, sp, #0 + .cfi_def_cfa_register 7 + @ record_goto.c:41 + .loc 1 41 0 + bl fun1(PLT) + @ record_goto.c:42 + .loc 1 42 0 + bl fun2(PLT) + @ record_goto.c:43 + .loc 1 43 0 + bl fun3(PLT) + @ record_goto.c:44 + .loc 1 44 0 + nop +@ SUCC: EXIT [100.0%] + pop {r7, pc} + .cfi_endproc +.LFE3: + .size fun4, .-fun4 + .align 1 + .global main + .syntax unified + .thumb + .thumb_func + .fpu vfpv3-d16 + .type main, %function +main: +.LFB4: + @ record_goto.c:48 + .loc 1 48 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 1, uses_anonymous_args = 0 +@ BLOCK 2 seq:0 +@ PRED: ENTRY (FALLTHRU) + push {r7, lr} + .cfi_def_cfa_offset 8 + .cfi_offset 7, -8 + .cfi_offset 14, -4 + add r7, sp, #0 + .cfi_def_cfa_register 7 + @ record_goto.c:49 + .loc 1 49 0 + bl fun4(PLT) + @ record_goto.c:50 + .loc 1 50 0 + movs r3, #0 + @ record_goto.c:51 + .loc 1 51 0 + mov r0, r3 +@ SUCC: EXIT [100.0%] + pop {r7, pc} + .cfi_endproc +.LFE4: + .size main, .-main +.Letext0: + .section .debug_info,"",%progbits +.Ldebug_info0: + .4byte 0x82 @ Length of Compilation Unit Info + .2byte 0x4 @ DWARF version number + .4byte .Ldebug_abbrev0 @ Offset Into Abbrev. Section + .byte 0x4 @ Pointer Size (in bytes) + .uleb128 0x1 @ (DIE (0xb) DW_TAG_compile_unit) + .4byte .LASF4 @ DW_AT_producer: "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -fstack-protector-strong" + .byte 0xc @ DW_AT_language + .4byte .LASF5 @ DW_AT_name: "record_goto.c" + .4byte .LASF6 @ DW_AT_comp_dir: "/home/ubuntu/development/gdb/binutils-gdb/gdb/testsuite/gdb.btrace" + .4byte .Ltext0 @ DW_AT_low_pc + .4byte .Letext0-.Ltext0 @ DW_AT_high_pc + .4byte .Ldebug_line0 @ DW_AT_stmt_list + .uleb128 0x2 @ (DIE (0x25) DW_TAG_subprogram) + @ DW_AT_external + .4byte .LASF7 @ DW_AT_name: "main" + .byte 0x1 @ DW_AT_decl_file (record_goto.c) + .byte 0x2f @ DW_AT_decl_line + @ DW_AT_prototyped + .4byte 0x3a @ DW_AT_type + .4byte .LFB4 @ DW_AT_low_pc + .4byte .LFE4-.LFB4 @ DW_AT_high_pc + .uleb128 0x1 @ DW_AT_frame_base + .byte 0x9c @ DW_OP_call_frame_cfa + @ DW_AT_GNU_all_tail_call_sites + .uleb128 0x3 @ (DIE (0x3a) DW_TAG_base_type) + .byte 0x4 @ DW_AT_byte_size + .byte 0x5 @ DW_AT_encoding + .ascii "int\0" @ DW_AT_name + .uleb128 0x4 @ (DIE (0x41) DW_TAG_subprogram) + @ DW_AT_external + .4byte .LASF0 @ DW_AT_name: "fun4" + .byte 0x1 @ DW_AT_decl_file (record_goto.c) + .byte 0x27 @ DW_AT_decl_line + @ DW_AT_prototyped + .4byte .LFB3 @ DW_AT_low_pc + .4byte .LFE3-.LFB3 @ DW_AT_high_pc + .uleb128 0x1 @ DW_AT_frame_base + .byte 0x9c @ DW_OP_call_frame_cfa + @ DW_AT_GNU_all_tail_call_sites + .uleb128 0x4 @ (DIE (0x52) DW_TAG_subprogram) + @ DW_AT_external + .4byte .LASF1 @ DW_AT_name: "fun3" + .byte 0x1 @ DW_AT_decl_file (record_goto.c) + .byte 0x20 @ DW_AT_decl_line + @ DW_AT_prototyped + .4byte .LFB2 @ DW_AT_low_pc + .4byte .LFE2-.LFB2 @ DW_AT_high_pc + .uleb128 0x1 @ DW_AT_frame_base + .byte 0x9c @ DW_OP_call_frame_cfa + @ DW_AT_GNU_all_tail_call_sites + .uleb128 0x4 @ (DIE (0x63) DW_TAG_subprogram) + @ DW_AT_external + .4byte .LASF2 @ DW_AT_name: "fun2" + .byte 0x1 @ DW_AT_decl_file (record_goto.c) + .byte 0x1a @ DW_AT_decl_line + @ DW_AT_prototyped + .4byte .LFB1 @ DW_AT_low_pc + .4byte .LFE1-.LFB1 @ DW_AT_high_pc + .uleb128 0x1 @ DW_AT_frame_base + .byte 0x9c @ DW_OP_call_frame_cfa + @ DW_AT_GNU_all_tail_call_sites + .uleb128 0x5 @ (DIE (0x74) DW_TAG_subprogram) + @ DW_AT_external + .4byte .LASF3 @ DW_AT_name: "fun1" + .byte 0x1 @ DW_AT_decl_file (record_goto.c) + .byte 0x15 @ DW_AT_decl_line + @ DW_AT_prototyped + .4byte .LFB0 @ DW_AT_low_pc + .4byte .LFE0-.LFB0 @ DW_AT_high_pc + .uleb128 0x1 @ DW_AT_frame_base + .byte 0x9c @ DW_OP_call_frame_cfa + @ DW_AT_GNU_all_call_sites + .byte 0 @ end of children of DIE 0xb + .section .debug_abbrev,"",%progbits +.Ldebug_abbrev0: + .uleb128 0x1 @ (abbrev code) + .uleb128 0x11 @ (TAG: DW_TAG_compile_unit) + .byte 0x1 @ DW_children_yes + .uleb128 0x25 @ (DW_AT_producer) + .uleb128 0xe @ (DW_FORM_strp) + .uleb128 0x13 @ (DW_AT_language) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x3 @ (DW_AT_name) + .uleb128 0xe @ (DW_FORM_strp) + .uleb128 0x1b @ (DW_AT_comp_dir) + .uleb128 0xe @ (DW_FORM_strp) + .uleb128 0x11 @ (DW_AT_low_pc) + .uleb128 0x1 @ (DW_FORM_addr) + .uleb128 0x12 @ (DW_AT_high_pc) + .uleb128 0x6 @ (DW_FORM_data4) + .uleb128 0x10 @ (DW_AT_stmt_list) + .uleb128 0x17 @ (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x2 @ (abbrev code) + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) + .byte 0 @ DW_children_no + .uleb128 0x3f @ (DW_AT_external) + .uleb128 0x19 @ (DW_FORM_flag_present) + .uleb128 0x3 @ (DW_AT_name) + .uleb128 0xe @ (DW_FORM_strp) + .uleb128 0x3a @ (DW_AT_decl_file) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x3b @ (DW_AT_decl_line) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x27 @ (DW_AT_prototyped) + .uleb128 0x19 @ (DW_FORM_flag_present) + .uleb128 0x49 @ (DW_AT_type) + .uleb128 0x13 @ (DW_FORM_ref4) + .uleb128 0x11 @ (DW_AT_low_pc) + .uleb128 0x1 @ (DW_FORM_addr) + .uleb128 0x12 @ (DW_AT_high_pc) + .uleb128 0x6 @ (DW_FORM_data4) + .uleb128 0x40 @ (DW_AT_frame_base) + .uleb128 0x18 @ (DW_FORM_exprloc) + .uleb128 0x2116 @ (DW_AT_GNU_all_tail_call_sites) + .uleb128 0x19 @ (DW_FORM_flag_present) + .byte 0 + .byte 0 + .uleb128 0x3 @ (abbrev code) + .uleb128 0x24 @ (TAG: DW_TAG_base_type) + .byte 0 @ DW_children_no + .uleb128 0xb @ (DW_AT_byte_size) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x3e @ (DW_AT_encoding) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x3 @ (DW_AT_name) + .uleb128 0x8 @ (DW_FORM_string) + .byte 0 + .byte 0 + .uleb128 0x4 @ (abbrev code) + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) + .byte 0 @ DW_children_no + .uleb128 0x3f @ (DW_AT_external) + .uleb128 0x19 @ (DW_FORM_flag_present) + .uleb128 0x3 @ (DW_AT_name) + .uleb128 0xe @ (DW_FORM_strp) + .uleb128 0x3a @ (DW_AT_decl_file) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x3b @ (DW_AT_decl_line) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x27 @ (DW_AT_prototyped) + .uleb128 0x19 @ (DW_FORM_flag_present) + .uleb128 0x11 @ (DW_AT_low_pc) + .uleb128 0x1 @ (DW_FORM_addr) + .uleb128 0x12 @ (DW_AT_high_pc) + .uleb128 0x6 @ (DW_FORM_data4) + .uleb128 0x40 @ (DW_AT_frame_base) + .uleb128 0x18 @ (DW_FORM_exprloc) + .uleb128 0x2116 @ (DW_AT_GNU_all_tail_call_sites) + .uleb128 0x19 @ (DW_FORM_flag_present) + .byte 0 + .byte 0 + .uleb128 0x5 @ (abbrev code) + .uleb128 0x2e @ (TAG: DW_TAG_subprogram) + .byte 0 @ DW_children_no + .uleb128 0x3f @ (DW_AT_external) + .uleb128 0x19 @ (DW_FORM_flag_present) + .uleb128 0x3 @ (DW_AT_name) + .uleb128 0xe @ (DW_FORM_strp) + .uleb128 0x3a @ (DW_AT_decl_file) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x3b @ (DW_AT_decl_line) + .uleb128 0xb @ (DW_FORM_data1) + .uleb128 0x27 @ (DW_AT_prototyped) + .uleb128 0x19 @ (DW_FORM_flag_present) + .uleb128 0x11 @ (DW_AT_low_pc) + .uleb128 0x1 @ (DW_FORM_addr) + .uleb128 0x12 @ (DW_AT_high_pc) + .uleb128 0x6 @ (DW_FORM_data4) + .uleb128 0x40 @ (DW_AT_frame_base) + .uleb128 0x18 @ (DW_FORM_exprloc) + .uleb128 0x2117 @ (DW_AT_GNU_all_call_sites) + .uleb128 0x19 @ (DW_FORM_flag_present) + .byte 0 + .byte 0 + .byte 0 + .section .debug_aranges,"",%progbits + .4byte 0x1c @ Length of Address Ranges Info + .2byte 0x2 @ DWARF Version + .4byte .Ldebug_info0 @ Offset of Compilation Unit Info + .byte 0x4 @ Size of Address + .byte 0 @ Size of Segment Descriptor + .2byte 0 @ Pad to 8 byte boundary + .2byte 0 + .4byte .Ltext0 @ Address + .4byte .Letext0-.Ltext0 @ Length + .4byte 0 + .4byte 0 + .section .debug_line,"",%progbits +.Ldebug_line0: + .section .debug_str,"MS",%progbits,1 +.LASF5: + .ascii "record_goto.c\000" +.LASF2: + .ascii "fun2\000" +.LASF6: + .ascii "/home/ubuntu/development/gdb/binutils-gdb/gdb/tests" + .ascii "uite/gdb.btrace\000" +.LASF4: + .ascii "GNU C11 7.4.0 -march=armv7-a -mfloat-abi=hard -mfpu" + .ascii "=vfpv3-d16 -mthumb -mtls-dialect=gnu -g -fstack-pro" + .ascii "tector-strong\000" +.LASF0: + .ascii "fun4\000" +.LASF3: + .ascii "fun1\000" +.LASF7: + .ascii "main\000" +.LASF1: + .ascii "fun3\000" + .ident "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0" + .section .note.GNU-stack,"",%progbits diff --git a/gdb/testsuite/gdb.btrace/arm-tailcall-only.S b/gdb/testsuite/gdb.btrace/arm-tailcall-only.S new file mode 100644 index 00000000000..b7f4e4a3fce --- /dev/null +++ b/gdb/testsuite/gdb.btrace/arm-tailcall-only.S @@ -0,0 +1,504 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2016-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 has been generated on an armv7 machine using: + gcc -S -O2 -dA -g tailcall-only.c -o arm-tailcall-only.S */ + + .eabi_attribute 28, 1 @ Tag_ABI_VFP_args + .eabi_attribute 20, 1 @ Tag_ABI_FP_denormal + .eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions + .eabi_attribute 23, 3 @ Tag_ABI_FP_number_model + .eabi_attribute 24, 1 @ Tag_ABI_align8_needed + .eabi_attribute 25, 1 @ Tag_ABI_align8_preserved + .eabi_attribute 26, 2 @ Tag_ABI_enum_size + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals + .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access + .eabi_attribute 18, 4 @ Ta