From patchwork Fri Sep 11 17:25:01 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre Langlois X-Patchwork-Id: 8642 Received: (qmail 125366 invoked by alias); 11 Sep 2015 17:25:14 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 125314 invoked by uid 89); 11 Sep 2015 17:25:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.8 required=5.0 tests=AWL, BAYES_00, KAM_STOCKGEN, SPF_PASS autolearn=no version=3.3.2 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (146.101.78.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 11 Sep 2015 17:25:09 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.140]) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-31-v-GUVKiFS_21X-BYX9st6g-5; Fri, 11 Sep 2015 18:25:05 +0100 Received: from e105615-lin.cambridge.arm.com ([10.1.2.79]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 11 Sep 2015 18:25:03 +0100 From: Pierre Langlois To: gdb-patches@sourceware.org Cc: Pierre Langlois Subject: [PATCH 2/2] [testsuite] Add test case for tracepoints with conditions Date: Fri, 11 Sep 2015 18:25:01 +0100 Message-Id: <1441992301-26779-3-git-send-email-pierre.langlois@arm.com> In-Reply-To: <1441992301-26779-1-git-send-email-pierre.langlois@arm.com> References: <1441992301-26779-1-git-send-email-pierre.langlois@arm.com> X-MC-Unique: v-GUVKiFS_21X-BYX9st6g-5 X-IsSubscribed: yes This patch adds a test case for tracepoints with a condition expression. Each case will test a condition against the number of frames that should have been traced. Some of these tests fail on x86_64 and others on i386, which have been marked as known failures for now, see PR/18955. gdb/testsuite/ChangeLog: * gdb.trace/trace-condition.c: New file. * gdb.trace/trace-condition.exp: New file. --- gdb/testsuite/gdb.trace/trace-condition.c | 66 +++++++++++ gdb/testsuite/gdb.trace/trace-condition.exp | 167 ++++++++++++++++++++++++++++ 2 files changed, 233 insertions(+) create mode 100644 gdb/testsuite/gdb.trace/trace-condition.c create mode 100644 gdb/testsuite/gdb.trace/trace-condition.exp diff --git a/gdb/testsuite/gdb.trace/trace-condition.c b/gdb/testsuite/gdb.trace/trace-condition.c new file mode 100644 index 0000000..2e965c9 --- /dev/null +++ b/gdb/testsuite/gdb.trace/trace-condition.c @@ -0,0 +1,66 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011-2015 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 . */ + +#ifdef SYMBOL_PREFIX +#define SYMBOL(str) SYMBOL_PREFIX #str +#else +#define SYMBOL(str) #str +#endif + +int globvar; + +static void +begin (void) +{ +} + +/* Called from asm. */ +static void __attribute__((used)) +func (void) +{ +} + +static void +marker (int anarg) +{ + /* `set_point' is the label at which to set a fast tracepoint. The + insn at the label must be large enough to fit a fast tracepoint + jump. */ + asm (" .global " SYMBOL (set_point) "\n" + SYMBOL (set_point) ":\n" +#if (defined __x86_64__ || defined __i386__) + " call " SYMBOL (func) "\n" +#endif + ); +} + +static void +end (void) +{ +} + +int +main () +{ + begin (); + + for (globvar = 1; globvar < 11; ++globvar) + marker (globvar * 100); + + end (); + return 0; +} diff --git a/gdb/testsuite/gdb.trace/trace-condition.exp b/gdb/testsuite/gdb.trace/trace-condition.exp new file mode 100644 index 0000000..8bfd34a --- /dev/null +++ b/gdb/testsuite/gdb.trace/trace-condition.exp @@ -0,0 +1,167 @@ +# Copyright 2011-2015 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 . + +load_lib "trace-support.exp" + +standard_testfile +set executable $testfile +set expfile $testfile.exp + +# Some targets have leading underscores on assembly symbols. +set additional_flags [gdb_target_symbol_prefix_flags] + +if [is_amd64_regs_target] { + set pcreg "\$rip" +} elseif [is_x86_like_target] { + set pcreg "\$eip" +} else { + set pcreg "\$pc" +} + +if [prepare_for_testing $expfile $executable $srcfile \ + [list debug $additional_flags]] { + untested "failed to prepare for trace tests" + return -1 +} + +if ![runto_main] { + fail "Can't run to main to check for trace support" + return -1 +} + +if ![gdb_target_supports_trace] { + unsupported "target does not support trace" + return -1 +} + +set libipa [get_in_proc_agent] +gdb_load_shlibs $libipa + +# Can't use prepare_for_testing, because that splits compiling into +# building objects and then linking, and we'd fail with "linker input +# file unused because linking not done" when building the object. + +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable [list debug $additional_flags shlib=$libipa] ] != "" } { + untested "failed to compile ftrace tests" + return -1 +} + +clean_restart ${executable} + +if ![runto_main] { + fail "Can't run to main for ftrace tests" + return 0 +} + +gdb_reinitialize_dir $srcdir/$subdir + +if { [gdb_test "info sharedlibrary" ".*${libipa}.*" "IPA loaded"] != 0 } { + untested "Could not find IPA lib loaded" + return 1 +} + +proc test_tracepoints { trace_command condition num_frames { kfail_proc 0 } } { + global executable + + clean_restart ${executable} + + if ![runto_main] { + fail "Can't run to main for ftrace tests" + return 0 + } + + gdb_test "break begin" ".*" "" + + gdb_test "break end" ".*" "" + + gdb_test "${trace_command} set_point if ${condition}" "\(Fast t|T\)racepoint .*" \ + "${trace_command} with condition $condition" + + gdb_test "continue" \ + ".*Breakpoint \[0-9\]+, begin .*" \ + "advance to trace begin" + + gdb_test_no_output "tstart" "start trace experiment" + + gdb_test_multiple "continue" "advance through tracing" { + -re ".*Breakpoint \[0-9\]+, end .*" { + pass "advance through tracing" + } + -re "Program received signal SIGSEGV, Segmentation fault\\..*" { + if { $kfail_proc != 0 } { + $kfail_proc $trace_command + } + fail "advance through tracing" + } + } + + if { $kfail_proc != 0 } { + $kfail_proc $trace_command + } + gdb_test "tstatus" \ + ".*Trace .*Collected $num_frames .*" \ + "check $num_frames frames were collected." + + gdb_test "tstop" "" "" +} + +# These callbacks identify known failures for certain architectures. They +# are called either if GDBserver crashes or has not traced the correct +# number of frames. + +proc 18955_x86_64_failure { trace_command } { + if { $trace_command == "ftrace" } { + setup_kfail "gdb/18955" "x86_64-*-linux*" + } +} + +proc 18955_i386_failure { trace_command } { + if { $trace_command == "ftrace" } { + setup_kfail "gdb/18955" "i\[34567\]86-*-*" + } +} + +foreach trace_command { "trace" "ftrace" } { + # This condition is always true as the PC should be set to the tracepoint + # address when hit. + test_tracepoints $trace_command "$pcreg == *set_point" 10 + + # Can we read local variables? + test_tracepoints $trace_command "anarg == 100 || anarg == 200" 2 18955_x86_64_failure + # Can we read global variables? + test_tracepoints $trace_command "anarg == 100 && globvar == 1" 1 18955_x86_64_failure + + # Test various operations to cover as many opcodes as possible. + test_tracepoints $trace_command "21 + 21 == 42" 10 + test_tracepoints $trace_command "21 - 21 == 0" 10 + test_tracepoints $trace_command "21 * 2 == 42" 10 + test_tracepoints $trace_command "21 << 1 == 42" 10 + test_tracepoints $trace_command "42 >> 1 == 21" 10 + test_tracepoints $trace_command "-21 << 1 == -42" 10 + test_tracepoints $trace_command "-42 >> 1 == -21" 10 + test_tracepoints $trace_command "(0xabababab & 0x0000ffff) == 0xabab" 10 + test_tracepoints $trace_command "(0xabababab | 0x0000ffff) == 0xababffff" 10 + test_tracepoints $trace_command "(0xaaaaaaaa ^ 0x55555555) == 0xffffffff" 10 + test_tracepoints $trace_command "~0xaaaaaaaa == 0x55555555" 10 + test_tracepoints $trace_command "21 < 42" 10 + test_tracepoints $trace_command "42 <= 42" 10 + test_tracepoints $trace_command "42 >= 42" 10 + test_tracepoints $trace_command "42 > 21" 10 + test_tracepoints $trace_command "(21 < 42 ? 0 : 1) == 0" 10 18955_i386_failure + test_tracepoints $trace_command "(42 <= 42 ? 0 : 1) == 0" 10 + test_tracepoints $trace_command "(42 >= 42 ? 0 : 1) == 0" 10 + test_tracepoints $trace_command "(42 > 21 ? 0 : 1) == 0" 10 18955_i386_failure + test_tracepoints $trace_command "\$trace_timestamp >= 0" 10 +}