f4abbc1682
Add a struct to describe the branch trace configuration and use it for enabling branch tracing. The user will be able to set configuration fields for each tracing format to be used for new threads. The actual configuration that is active for a given thread will be shown in the "info record" command. At the moment, the configuration struct only contains a format field that is set to the only available format. The format is the only configuration option that can not be set via set commands. It is given as argument to the "record btrace" command when starting recording. 2015-02-09 Markus Metzger <markus.t.metzger@intel.com> * Makefile.in (XMLFILES): Add btrace-conf.dtd. * x86-linux-nat.c (x86_linux_enable_btrace): Update parameters. (x86_linux_btrace_conf): New. (x86_linux_create_target): Initialize to_btrace_conf. * nat/linux-btrace.c (linux_enable_btrace): Update parameters. Check format. Split into this and ... (linux_enable_bts): ... this. (linux_btrace_conf): New. (perf_event_skip_record): Renamed into ... (perf_event_skip_bts_record): ... this. Updated users. (linux_disable_btrace): Split into this and ... (linux_disable_bts): ... this. (linux_read_btrace): Check format. * nat/linux-btrace.h (linux_enable_btrace): Update parameters. (linux_btrace_conf): New. (btrace_target_info)<ptid>: Moved. (btrace_target_info)<conf>: New. (btrace_target_info): Split into this and ... (btrace_tinfo_bts): ... this. Updated users. * btrace.c (btrace_enable): Update parameters. (btrace_conf, parse_xml_btrace_conf_bts, parse_xml_btrace_conf) (btrace_conf_children, btrace_conf_attributes) (btrace_conf_elements): New. * btrace.h (btrace_enable): Update parameters. (btrace_conf, parse_xml_btrace_conf): New. * common/btrace-common.h (btrace_config): New. * feature/btrace-conf.dtd: New. * record-btrace.c (record_btrace_conf): New. (record_btrace_cmdlist): New. (record_btrace_enable_warn, record_btrace_open): Pass &record_btrace_conf. (record_btrace_info): Print recording format. (cmd_record_btrace_bts_start): New. (cmd_record_btrace_start): Call cmd_record_btrace_bts_start. (_initialize_record_btrace): Add "record btrace bts" subcommand. Add "record bts" alias command. * remote.c (remote_state)<btrace_config>: New. (remote_btrace_reset, PACKET_qXfer_btrace_conf): New. (remote_protocol_features): Add qXfer:btrace-conf:read. (remote_open_1): Call remote_btrace_reset. (remote_xfer_partial): Handle TARGET_OBJECT_BTRACE_CONF. (btrace_target_info)<conf>: New. (btrace_sync_conf, btrace_read_config): New. (remote_enable_btrace): Update parameters. Call btrace_sync_conf and btrace_read_conf. (remote_btrace_conf): New. (init_remote_ops): Initialize to_btrace_conf. (_initialize_remote): Add qXfer:btrace-conf packet. * target.c (target_enable_btrace): Update parameters. (target_btrace_conf): New. * target.h (target_enable_btrace): Update parameters. (target_btrace_conf): New. (target_object)<TARGET_OBJECT_BTRACE_CONF>: New. (target_ops)<to_enable_btrace>: Update parameters and comment. (target_ops)<to_btrace_conf>: New. * target-delegates: Regenerate. * target-debug.h (target_debug_print_const_struct_btrace_config_p) (target_debug_print_const_struct_btrace_target_info_p): New. NEWS: Announce new command and new packet. doc/ * gdb.texinfo (Process Record and Replay): Describe the "record btrace bts" command. (General Query Packets): Describe qXfer:btrace-conf:read packet. (Branch Trace Configuration Format): New. gdbserver/ * linux-low.c (linux_low_enable_btrace): Update parameters. (linux_low_btrace_conf): New. (linux_target_ops)<to_btrace_conf>: Initialize. * server.c (current_btrace_conf): New. (handle_btrace_enable): Rename to ... (handle_btrace_enable_bts): ... this. Pass ¤t_btrace_conf to target_enable_btrace. Update comment. Update users. (handle_qxfer_btrace_conf): New. (qxfer_packets): Add btrace-conf entry. (handle_query): Report qXfer:btrace-conf:read as supported packet. * target.h (target_ops)<enable_btrace>: Update parameters and comment. (target_ops)<read_btrace_conf>: New. (target_enable_btrace): Update parameters. (target_read_btrace_conf): New. testsuite/ * gdb.btrace/delta.exp: Update "info record" output. * gdb.btrace/enable.exp: Update "info record" output. * gdb.btrace/finish.exp: Update "info record" output. * gdb.btrace/instruction_history.exp: Update "info record" output. * gdb.btrace/next.exp: Update "info record" output. * gdb.btrace/nexti.exp: Update "info record" output. * gdb.btrace/step.exp: Update "info record" output. * gdb.btrace/stepi.exp: Update "info record" output. * gdb.btrace/nohist.exp: Update "info record" output.
95 lines
3.2 KiB
Text
95 lines
3.2 KiB
Text
# This testcase is part of GDB, the GNU debugger.
|
|
#
|
|
# Copyright 2013-2015 Free Software Foundation, Inc.
|
|
#
|
|
# Contributed by Intel Corp. <markus.t.metzger@intel.com>
|
|
#
|
|
# 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/>.
|
|
|
|
# check for btrace support
|
|
if { [skip_btrace_tests] } { return -1 }
|
|
|
|
# start inferior
|
|
standard_testfile x86-record_goto.S
|
|
if [prepare_for_testing stepi.exp $testfile $srcfile] {
|
|
return -1
|
|
}
|
|
|
|
global gdb_prompt
|
|
|
|
if ![runto_main] {
|
|
return -1
|
|
}
|
|
|
|
proc check_replay_at { insn } {
|
|
gdb_test "info record" [join [list \
|
|
"Active record target: record-btrace" \
|
|
"Recording format: .*" \
|
|
"Recorded 40 instructions in 16 functions for .*" \
|
|
"Replay in progress\. At instruction $insn\." \
|
|
] "\r\n"]
|
|
}
|
|
|
|
# trace the call to the test function
|
|
gdb_test_no_output "record btrace"
|
|
gdb_test "next"
|
|
|
|
# we start with stepping to make sure that the trace is fetched automatically
|
|
gdb_test "reverse-stepi" ".*fun4\.5.*"
|
|
gdb_test "reverse-stepi" ".*fun4\.5.*"
|
|
|
|
# let's check where we are in the trace
|
|
with_test_prefix "reverse-stepi to 39" { check_replay_at 39 }
|
|
|
|
# let's step forward and check again
|
|
gdb_test "stepi" ".*fun4\.5.*"
|
|
with_test_prefix "stepi to 40" { check_replay_at 40 }
|
|
|
|
# with the next step, we stop replaying
|
|
gdb_test "stepi" ".*main\.3.*"
|
|
gdb_test "info record" [join [list \
|
|
"Active record target: record-btrace" \
|
|
"Recording format: .*" \
|
|
"Recorded 40 instructions in 16 functions for \[^\\\r\\\n\]*" \
|
|
] "\r\n"] "stepi to live"
|
|
|
|
# let's step from a goto position somewhere in the middle
|
|
gdb_test "record goto 22" ".*fun3\.2.*"
|
|
with_test_prefix "goto 22" { check_replay_at 22 }
|
|
|
|
gdb_test "stepi" ".*fun1\.1.*"
|
|
with_test_prefix "stepi to 23" { check_replay_at 23 }
|
|
|
|
# and back again
|
|
gdb_test "reverse-stepi" ".*fun3\.2.*"
|
|
gdb_test "reverse-stepi" ".*fun3\.1.*"
|
|
with_test_prefix "reverse-stepi to 21" { check_replay_at 21 }
|
|
|
|
# let's try to step off the left end
|
|
gdb_test "record goto begin" ".*main\.2.*"
|
|
with_test_prefix "goto begin" { check_replay_at 1 }
|
|
|
|
gdb_test "reverse-stepi" "No more reverse-execution history\.\r\n.*main\.2.*"
|
|
gdb_test "reverse-stepi" "No more reverse-execution history\.\r\n.*main\.2.*"
|
|
with_test_prefix "reverse-stepi at begin" { check_replay_at 1 }
|
|
|
|
# we can step forward, though
|
|
gdb_test "stepi" ".*fun4\.1.*"
|
|
with_test_prefix "stepi to 2" { check_replay_at 2 }
|
|
|
|
# let's try to step off the left end again
|
|
gdb_test "reverse-stepi" ".*main\.2.*"
|
|
gdb_test "reverse-stepi" "No more reverse-execution history\.\r\n.*main\.2.*"
|
|
gdb_test "reverse-stepi" "No more reverse-execution history\.\r\n.*main\.2.*"
|
|
with_test_prefix "reverse-stepi at begin" { check_replay_at 1 }
|