From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14507 invoked by alias); 2 May 2013 12:03:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 14468 invoked by uid 89); 2 May 2013 12:03:51 -0000 X-Spam-SWARE-Status: No, score=-8.4 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,RP_MATCHES_RCVD,TW_OV,TW_XB,TW_XZ autolearn=ham version=3.3.1 Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Thu, 02 May 2013 12:03:47 +0000 Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 02 May 2013 05:03:46 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by azsmga001.ch.intel.com with ESMTP; 02 May 2013 05:03:44 -0700 Received: from ulslx001.iul.intel.com (ulslx001.iul.intel.com [172.28.207.63]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id r42C3fU4019553; Thu, 2 May 2013 13:03:42 +0100 Received: from ulslx001.iul.intel.com (localhost [127.0.0.1]) by ulslx001.iul.intel.com with ESMTP id r42C3e7E021570; Thu, 2 May 2013 14:03:40 +0200 Received: (from mmetzger@localhost) by ulslx001.iul.intel.com with id r42C3e7D021566; Thu, 2 May 2013 14:03:40 +0200 From: Markus Metzger To: jan.kratochvil@redhat.com Cc: gdb-patches@sourceware.org, Eli Zaretskii , Christian Himpel Subject: [PATCH 14/15] record-btrace: add record goto target methods Date: Thu, 02 May 2013 12:03:00 -0000 Message-Id: <1367496216-21217-15-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1367496216-21217-1-git-send-email-markus.t.metzger@intel.com> References: <1367496216-21217-1-git-send-email-markus.t.metzger@intel.com> X-SW-Source: 2013-05/txt/msg00016.txt.bz2 CC: Eli Zaretskii CC: Christian Himpel 2013-05-02 Markus Metzger * record-btrace.c (record_btrace_set_replay, record_btrace_goto_begin, record_btrace_goto_end, record_btrace_goto): New. (init_record_btrace_ops): Initialize them. * NEWS: Announce it. testsuite/ * gdb.btrace/Makefile.in (EXECUTABLES): Add record_goto. * gdb.btrace/record_goto.c: New. * gdb.btrace/record_goto.exp: New. * gdb.btrace/x86-record_goto.S: New. --- gdb/NEWS | 2 + gdb/record-btrace.c | 91 ++++++++ gdb/testsuite/gdb.btrace/Makefile.in | 2 +- gdb/testsuite/gdb.btrace/record_goto.c | 51 +++++ gdb/testsuite/gdb.btrace/record_goto.exp | 153 +++++++++++++ gdb/testsuite/gdb.btrace/x86-record_goto.S | 332 ++++++++++++++++++++++++++++ 6 files changed, 630 insertions(+), 1 deletions(-) create mode 100644 gdb/testsuite/gdb.btrace/record_goto.c create mode 100644 gdb/testsuite/gdb.btrace/record_goto.exp create mode 100644 gdb/testsuite/gdb.btrace/x86-record_goto.S diff --git a/gdb/NEWS b/gdb/NEWS index 2eeb59d..ba17f7d 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -3,6 +3,8 @@ *** Changes since GDB 7.6 +* The btrace record target supports the 'record goto' command. + * The command 'record function-call-history' supports a new modifier '/c' to indent the function names based on their call stack depth. The fields for the '/i' and '/l' modifier have been reordered. diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index a16e7ea..388c2d7 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -1047,6 +1047,94 @@ record_btrace_wait (struct target_ops *ops, ptid_t ptid, return t->to_wait (t, ptid, status, options); } +/* Set the replay branch trace instruction iterator. */ + +static void +record_btrace_set_replay (struct btrace_thread_info *btinfo, + const struct btrace_insn_iterator *it) +{ + if (it == NULL || it->function == NULL) + { + if (btinfo->replay == NULL) + return; + + xfree (btinfo->replay); + btinfo->replay = NULL; + } + else + { + if (btinfo->replay == NULL) + btinfo->replay = xzalloc (sizeof (*btinfo->replay)); + else if (btrace_insn_cmp (btinfo->replay, it) == 0) + return; + + *btinfo->replay = *it; + } + + /* Clear the function call and instruction histories so we start anew + from the new replay position. */ + xfree (btinfo->insn_history); + xfree (btinfo->call_history); + + btinfo->insn_history = NULL; + btinfo->call_history = NULL; + + registers_changed (); + reinit_frame_cache (); + print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC); +} + +/* The to_goto_record_begin method of target record-btrace. */ + +static void +record_btrace_goto_begin (void) +{ + struct btrace_thread_info *btinfo; + struct btrace_insn_iterator begin; + + btinfo = require_btrace (); + + btrace_insn_begin (&begin, btinfo); + record_btrace_set_replay (btinfo, &begin); +} + +/* The to_goto_record_end method of target record-btrace. */ + +static void +record_btrace_goto_end (void) +{ + struct btrace_thread_info *btinfo; + + btinfo = require_btrace (); + + record_btrace_set_replay (btinfo, NULL); +} + +/* The to_goto_record method of target record-btrace. */ + +static void +record_btrace_goto (ULONGEST insn) +{ + struct btrace_thread_info *btinfo; + struct btrace_insn_iterator it; + unsigned int number; + int found; + + number = (unsigned int) insn; + + /* Check for wrap-arounds. */ + if (number != insn) + error (_("Instruction number out of range.")); + + btinfo = require_btrace (); + + found = btrace_find_insn_by_number (&it, btinfo, number); + if (found == 0) + error (_("No such instruction.")); + + record_btrace_set_replay (btinfo, &it); +} + /* Initialize the record-btrace target ops. */ static void @@ -1081,6 +1169,9 @@ init_record_btrace_ops (void) ops->to_get_unwinder = &record_btrace_frame_unwind; ops->to_resume = record_btrace_resume; ops->to_wait = record_btrace_wait; + ops->to_goto_record_begin = record_btrace_goto_begin; + ops->to_goto_record_end = record_btrace_goto_end; + ops->to_goto_record = record_btrace_goto; ops->to_stratum = record_stratum; ops->to_magic = OPS_MAGIC; } diff --git a/gdb/testsuite/gdb.btrace/Makefile.in b/gdb/testsuite/gdb.btrace/Makefile.in index 5c70700..aa2820a 100644 --- a/gdb/testsuite/gdb.btrace/Makefile.in +++ b/gdb/testsuite/gdb.btrace/Makefile.in @@ -2,7 +2,7 @@ VPATH = @srcdir@ srcdir = @srcdir@ EXECUTABLES = enable function_call_history instruction_history tailcall \ - exception + exception record_goto MISCELLANEOUS = diff --git a/gdb/testsuite/gdb.btrace/record_goto.c b/gdb/testsuite/gdb.btrace/record_goto.c new file mode 100644 index 0000000..1250708 --- /dev/null +++ b/gdb/testsuite/gdb.btrace/record_goto.c @@ -0,0 +1,51 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013 Free Software Foundation, Inc. + + Contributed by Intel Corp. + + 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 . */ + +void +fun1 (void) +{ +} + +void +fun2 (void) +{ + fun1 (); +} + +void +fun3 (void) +{ + fun1 (); + fun2 (); +} + +void +fun4 (void) +{ + fun1 (); + fun2 (); + fun3 (); +} + +int +main (void) +{ + fun4 (); + return 0; +} diff --git a/gdb/testsuite/gdb.btrace/record_goto.exp b/gdb/testsuite/gdb.btrace/record_goto.exp new file mode 100644 index 0000000..008d956 --- /dev/null +++ b/gdb/testsuite/gdb.btrace/record_goto.exp @@ -0,0 +1,153 @@ +# This testcase is part of GDB, the GNU debugger. +# +# Copyright 2013 Free Software Foundation, Inc. +# +# Contributed by Intel Corp. +# +# 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 . + +# check for btrace support +if { [skip_btrace_tests] } { return -1 } + +# start inferior +standard_testfile x86-record_goto.S +if [prepare_for_testing tailcall.exp $testfile $srcfile] { + return -1 +} +if ![runto_main] { + return -1 +} + +# we want a small context sizes to simplify the test +gdb_test_no_output "set record instruction-history-size 3" +gdb_test_no_output "set record function-call-history-size 3" + +# trace the call to the test function +gdb_test_no_output "record btrace" +gdb_test "next" + +# start by listing all functions +gdb_test "record function-call-history /ci 0, +20" " +0\t fun4\tinst 0,2\r +1\t fun1\tinst 3,6\r +2\t fun4\tinst 7,7\r +3\t fun2\tinst 8,10\r +4\t fun1\tinst 11,14\r +5\t fun2\tinst 15,16\r +6\t fun4\tinst 17,17\r +7\t fun3\tinst 18,20\r +8\t fun1\tinst 21,24\r +9\t fun3\tinst 25,25\r +10\t fun2\tinst 26,28\r +11\t fun1\tinst 29,32\r +12\t fun2\tinst 33,34\r +13\t fun3\tinst 35,36\r +14\t fun4\tinst 37,38\r +15\tmain\tinst 39,39" "record_goto - list all functions" + +# let's see if we can go back in history +gdb_test "record goto 17" " +.*fun4 \\(\\) at record_goto.c:43.*" "record_goto - goto 17" + +# the function call history should start at the new location +gdb_test "record function-call-history /ci" " +6\t fun4\tinst 17,17\r +7\t fun3\tinst 18,20\r +8\t fun1\tinst 21,24" "record_goto - function-call-history from 17 forwards" + +# the instruciton history should start at the new location +gdb_test "record instruction-history" " +17.*\r +18.*\r +19.*\r" "record_goto - instruciton-history from 17 forwards" + +# let's go to another place in the history +gdb_test "record goto 25" " +.*fun3 \\(\\) at record_goto.c:35.*" "record_goto - goto 25" + +# the function call history should start at the new location +gdb_test "record function-call-history /ci -" " +7\t fun3\tinst 18,20\r +8\t fun1\tinst 21,24\r +9\t fun3\tinst 25,25" "record_goto - function-call-history from 25 backwards" + +# the instruciton history should start at the new location +gdb_test "record instruction-history -" " +23.*\r +24.*\r +25.*\r" "record_goto - instruciton-history from 25 backwards" + +# test that we can go to the begin of the trace +gdb_test "record goto begin" " +.*fun4 \\(\\) at record_goto.c:40.*" "record_goto - goto begin" + +# check that we're filling up the context correctly +gdb_test "record function-call-history /ci -" " +0\t fun4\tinst 0,2\r +1\t fun1\tinst 3,6\r +2\t fun4\tinst 7,7" "record_goto - function-call-history from begin backwards" + +# check that we're filling up the context correctly +gdb_test "record instruction-history -" " +0.*\r +1.*\r +2.*\r" "record_goto - instruciton-history from begin backwards" + +# we should get the exact same history from the first instruction +gdb_test "record goto 1" " +.*fun4 \\(\\) at record_goto.c:40.*" "record_goto - goto 1" + +# check that we're filling up the context correctly +gdb_test "record function-call-history /ci -" " +0\t fun4\tinst 0,2\r +1\t fun1\tinst 3,6\r +2\t fun4\tinst 7,7" "record_goto - function-call-history from 1 backwards" + +# check that we're filling up the context correctly +gdb_test "record instruction-history -" " +0.*\r +1.*\r +2.*\r" "record_goto - instruciton-history from 1 backwards" + +# check that we can go to the end of the trace +gdb_test "record goto end" " +.*main \\(\\) at record_goto.c:50.*" "record_goto - goto end" + +# check that we're filling up the context correctly +gdb_test "record function-call-history /ci" " +13\t fun3\tinst 35,36\r +14\t fun4\tinst 37,38\r +15\tmain\tinst 39,39" "record_goto - function-call-history from end forwards" + +# check that we're filling up the context correctly +gdb_test "record instruction-history" " +37.*\r +38.*\r +39.*\r" "record_goto - instruciton-history from end forwards" + +# we should get the exact same history from the second to last instruction +gdb_test "record goto 38" " +.*fun4 \\(\\) at record_goto.c:44.*" "record_goto - goto 38" + +# check that we're filling up the context correctly +gdb_test "record function-call-history /ci" " +13\t fun3\tinst 35,36\r +14\t fun4\tinst 37,38\r +15\tmain\tinst 39,39" "record_goto - function-call-history from 38 forwards" + +# check that we're filling up the context correctly +gdb_test "record instruction-history" " +37.*\r +38.*\r +39.*\r" "record_goto - instruciton-history from 38 forwards" diff --git a/gdb/testsuite/gdb.btrace/x86-record_goto.S b/gdb/testsuite/gdb.btrace/x86-record_goto.S new file mode 100644 index 0000000..d2e6621 --- /dev/null +++ b/gdb/testsuite/gdb.btrace/x86-record_goto.S @@ -0,0 +1,332 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013 Free Software Foundation, Inc. + + Contributed by Intel Corp. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + + This file has been generated using: + gcc -S -g record_goto.c -o x86-record_goto.S */ + + .file "record_goto.c" + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .section .debug_line,"",@progbits +.Ldebug_line0: + .text +.Ltext0: +.globl fun1 + .type fun1, @function +fun1: +.LFB0: + .file 1 "record_goto.c" + .loc 1 22 0 + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + movq %rsp, %rbp + .cfi_offset 6, -16 + .cfi_def_cfa_register 6 + .loc 1 23 0 + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE0: + .size fun1, .-fun1 +.globl fun2 + .type fun2, @function +fun2: +.LFB1: + .loc 1 27 0 + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + movq %rsp, %rbp + .cfi_offset 6, -16 + .cfi_def_cfa_register 6 + .loc 1 28 0 + call fun1 + .loc 1 29 0 + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE1: + .size fun2, .-fun2 +.globl fun3 + .type fun3, @function +fun3: +.LFB2: + .loc 1 33 0 + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + movq %rsp, %rbp + .cfi_offset 6, -16 + .cfi_def_cfa_register 6 + .loc 1 34 0 + call fun1 + .loc 1 35 0 + call fun2 + .loc 1 36 0 + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE2: + .size fun3, .-fun3 +.globl fun4 + .type fun4, @function +fun4: +.LFB3: + .loc 1 40 0 + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + movq %rsp, %rbp + .cfi_offset 6, -16 + .cfi_def_cfa_register 6 + .loc 1 41 0 + call fun1 + .loc 1 42 0 + call fun2 + .loc 1 43 0 + call fun3 + .loc 1 44 0 + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE3: + .size fun4, .-fun4 +.globl main + .type main, @function +main: +.LFB4: + .loc 1 48 0 + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + movq %rsp, %rbp + .cfi_offset 6, -16 + .cfi_def_cfa_register 6 + .loc 1 49 0 + call fun4 + .loc 1 50 0 + movl $0, %eax + .loc 1 51 0 + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE4: + .size main, .-main +.Letext0: + .section .debug_info + .long 0xbc + .value 0x3 + .long .Ldebug_abbrev0 + .byte 0x8 + .uleb128 0x1 + .long .LASF4 + .byte 0x1 + .long .LASF5 + .long .LASF6 + .quad .Ltext0 + .quad .Letext0 + .long .Ldebug_line0 + .uleb128 0x2 + .byte 0x1 + .long .LASF0 + .byte 0x1 + .byte 0x15 + .byte 0x1 + .quad .LFB0 + .quad .LFE0 + .byte 0x1 + .byte 0x9c + .uleb128 0x2 + .byte 0x1 + .long .LASF1 + .byte 0x1 + .byte 0x1a + .byte 0x1 + .quad .LFB1 + .quad .LFE1 + .byte 0x1 + .byte 0x9c + .uleb128 0x2 + .byte 0x1 + .long .LASF2 + .byte 0x1 + .byte 0x20 + .byte 0x1 + .quad .LFB2 + .quad .LFE2 + .byte 0x1 + .byte 0x9c + .uleb128 0x2 + .byte 0x1 + .long .LASF3 + .byte 0x1 + .byte 0x27 + .byte 0x1 + .quad .LFB3 + .quad .LFE3 + .byte 0x1 + .byte 0x9c + .uleb128 0x3 + .byte 0x1 + .long .LASF7 + .byte 0x1 + .byte 0x2f + .byte 0x1 + .long 0xb8 + .quad .LFB4 + .quad .LFE4 + .byte 0x1 + .byte 0x9c + .uleb128 0x4 + .byte 0x4 + .byte 0x5 + .string "int" + .byte 0x0 + .section .debug_abbrev + .uleb128 0x1 + .uleb128 0x11 + .byte 0x1 + .uleb128 0x25 + .uleb128 0xe + .uleb128 0x13 + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1b + .uleb128 0xe + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x10 + .uleb128 0x6 + .byte 0x0 + .byte 0x0 + .uleb128 0x2 + .uleb128 0x2e + .byte 0x0 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0xc + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x40 + .uleb128 0xa + .byte 0x0 + .byte 0x0 + .uleb128 0x3 + .uleb128 0x2e + .byte 0x0 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0xc + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x40 + .uleb128 0xa + .byte 0x0 + .byte 0x0 + .uleb128 0x4 + .uleb128 0x24 + .byte 0x0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0x0 + .byte 0x0 + .byte 0x0 + .section .debug_pubnames,"",@progbits + .long 0x3b + .value 0x2 + .long .Ldebug_info0 + .long 0xc0 + .long 0x2d + .string "fun1" + .long 0x48 + .string "fun2" + .long 0x63 + .string "fun3" + .long 0x7e + .string "fun4" + .long 0x99 + .string "main" + .long 0x0 + .section .debug_aranges,"",@progbits + .long 0x2c + .value 0x2 + .long .Ldebug_info0 + .byte 0x8 + .byte 0x0 + .value 0x0 + .value 0x0 + .quad .Ltext0 + .quad .Letext0-.Ltext0 + .quad 0x0 + .quad 0x0 + .section .debug_str,"MS",@progbits,1 +.LASF3: + .string "fun4" +.LASF5: + .string "record_goto.c" +.LASF4: + .string "GNU C 4.4.4 20100726 (Red Hat 4.4.4-13)" +.LASF7: + .string "main" +.LASF1: + .string "fun2" +.LASF0: + .string "fun1" +.LASF6: + .string "/users/mmetzger/gdb/gerrit/git/gdb/testsuite/gdb.btrace" +.LASF2: + .string "fun3" + .ident "GCC: (GNU) 4.4.4 20100726 (Red Hat 4.4.4-13)" + .section .note.GNU-stack,"",@progbits -- 1.7.1