From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 45047 invoked by alias); 27 Jun 2015 16:22:00 -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 44937 invoked by uid 89); 27 Jun 2015 16:21:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-pa0-f41.google.com Received: from mail-pa0-f41.google.com (HELO mail-pa0-f41.google.com) (209.85.220.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sat, 27 Jun 2015 16:21:58 +0000 Received: by pabvl15 with SMTP id vl15so83748633pab.1 for ; Sat, 27 Jun 2015 09:21:56 -0700 (PDT) X-Received: by 10.70.103.70 with SMTP id fu6mr15190485pdb.22.1435422116265; Sat, 27 Jun 2015 09:21:56 -0700 (PDT) Received: from localhost.localdomain (114-32-204-230.HINET-IP.hinet.net. [114.32.204.230]) by mx.google.com with ESMTPSA id ju3sm27788766pbc.33.2015.06.27.09.21.54 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 27 Jun 2015 09:21:55 -0700 (PDT) From: Wei-cheng Wang To: uweigand@de.ibm.com, gdb-patches@sourceware.org Cc: Wei-cheng Wang Subject: [PATCH 3/5 v4] Fix argument to compiled_cond, and add cases for compiled-condition. Date: Sat, 27 Jun 2015 16:22:00 -0000 Message-Id: <1435422102-39438-3-git-send-email-cole945@gmail.com> In-Reply-To: <1435422102-39438-1-git-send-email-cole945@gmail.com> References: <1435422102-39438-1-git-send-email-cole945@gmail.com> X-SW-Source: 2015-06/txt/msg00587.txt.bz2 Hi, Ulrich Weigand wrote: > Ah, when I said to add new test cases in a separate patch, what I meant was: > - use a separate patch (applied *first*) that adds the *new tests* (to be > run on existing platforms), i.e. test_ftrace_condition > - as part of the patch that actually adds powerpc support, add all the small > test case snippets that specifically enable the test cases for powerpc > This is again so that each set in a series is meaningful in itself (and > does not introduce testsuite regressions when applied alone). ... > Wei-cheng Wang wrote: > >if (tpoint->compiled_cond) > > err = ((condfn) (uintptr_t) (tpoint->compiled_cond)) (ctx, &value); > > > >I think probably either we could pass ctx->regs to compiled_cond instead, > >or move the declarations of fast_tracepoint_ctx (and others) to tracepoint.h, > >so we can use "offsetof (fast_tracepoint_ctx, regs)" instead. > >Any suggestion? > FWIW, passing the regs buffer directly to the compiled routine seems > more straightforward to me ... Some of the new cases are used to testing emit-reg, and emit-reg for x86 doesn't work due to the incorrect argument to compiled_cond - "regs" buffer is expected, but tracepoint context is passed This case also includes the fix for complied_cond in order for x86 to pass testing for emit-reg op. Testing result on my x86_64 Ubuntu 14.04.2 TLS before w/ new cases only w/ the fix PASS 2625 2759 2765 FAIL 33 39 33 XFAIL 16 16 16 KFAIL 2 2 2 UNTESTED 1 1 1 UNSUPPORTED 3 3 3 Thanks, Wei-cheng --- * Fix generating emit-reg op by passing register buffer to compiled_cond. * Add a new function for testing compiled-cond by checking whether based on a given CONDEXP, a list of expected values should be collected. --- gdb/gdbserver/ChangeLog 2015-06-27 Wei-cheng Wang * tracepoint.c (eval_result_type): Change prototype. (condition_true_at_tracepoint): Fix argument to compiled_cond. gdb/testsuite/ChangeLog 2015-06-27 Wei-cheng Wang * gdb.trace/ftrace.exp: (test_ftrace_condition) New function for testing bytecode compilation. --- gdb/gdbserver/tracepoint.c | 7 +++-- gdb/testsuite/gdb.trace/ftrace.exp | 64 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index 57b329d9..fdec7db 100644 --- a/gdb/gdbserver/tracepoint.c +++ b/gdb/gdbserver/tracepoint.c @@ -697,7 +697,7 @@ enum tracepoint_type struct tracepoint_hit_ctx; -typedef enum eval_result_type (*condfn) (struct tracepoint_hit_ctx *, +typedef enum eval_result_type (*condfn) (unsigned char *, ULONGEST *); /* The definition of a tracepoint. */ @@ -4903,7 +4903,10 @@ condition_true_at_tracepoint (struct tracepoint_hit_ctx *ctx, used. */ #ifdef IN_PROCESS_AGENT if (tpoint->compiled_cond) - err = ((condfn) (uintptr_t) (tpoint->compiled_cond)) (ctx, &value); + { + struct fast_tracepoint_ctx *fctx = (struct fast_tracepoint_ctx *) ctx; + err = ((condfn) (uintptr_t) (tpoint->compiled_cond)) (fctx->regs, &value); + } else #endif { diff --git a/gdb/testsuite/gdb.trace/ftrace.exp b/gdb/testsuite/gdb.trace/ftrace.exp index f2d8002..a8eb515 100644 --- a/gdb/testsuite/gdb.trace/ftrace.exp +++ b/gdb/testsuite/gdb.trace/ftrace.exp @@ -178,6 +178,42 @@ proc test_fast_tracepoints {} { } } +# Test compiled-condition +# CONDEXP is the condition expression to be compiled. +# VAR is the variable to be collected for testing. +# LIST is a list of expected values of VAR should be collected +# based on the CONDEXP. +proc test_ftrace_condition { condexp var list } \ +{ with_test_prefix "ond $condexp" \ +{ + global executable + global hex + + clean_restart ${executable} + if ![runto_main] { + fail "Can't run to main to check for trace support" + return -1 + } + + gdb_test "break end" ".*" "" + gdb_test "tvariable \$tsv = 0" + gdb_test "ftrace set_point if $condexp" "Fast tracepoint .*" + gdb_trace_setactions "set action for tracepoint .*" "" \ + "collect $var" "^$" + + gdb_test_no_output "tstart" "" + gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "" + gdb_test_no_output "tstop" "" + + set i 0 + foreach expval $list { + gdb_test "tfind" "Found trace frame $i, tracepoint .*" "tfind frame $i" + gdb_test "print $var" "\\$\[0-9\]+ = $expval\[\r\n\]" "expect $expval" + set i [expr $i + 1] + } + gdb_test "tfind" "Target failed to find requested trace frame\." +}} + gdb_reinitialize_dir $srcdir/$subdir if { [gdb_test "info sharedlibrary" ".*${libipa}.*" "IPA loaded"] != 0 } { @@ -186,3 +222,31 @@ if { [gdb_test "info sharedlibrary" ".*${libipa}.*" "IPA loaded"] != 0 } { } test_fast_tracepoints + +# Test conditional goto and simple expression. +test_ftrace_condition "globvar > 7" "globvar" { 8 9 10 } +test_ftrace_condition "globvar < 4" "globvar" { 1 2 3 } +test_ftrace_condition "globvar >= 7" "globvar" { 7 8 9 10 } +test_ftrace_condition "globvar <= 4" "globvar" { 1 2 3 4 } +test_ftrace_condition "globvar == 5" "globvar" { 5 } +test_ftrace_condition "globvar != 5" "globvar" { 1 2 3 4 6 7 8 9 10 } +test_ftrace_condition "globvar > 3 && globvar < 7" "globvar" { 4 5 6 } +test_ftrace_condition "globvar < 3 || globvar > 7" "globvar" { 1 2 8 9 10 } +test_ftrace_condition "(globvar << 2) + 1 == 29" "globvar" { 7 } +test_ftrace_condition "(globvar >> 2) == 2" "globvar" { 8 9 10 } + +# Test emit_call by accessing trace state variables. +test_ftrace_condition "(\$tsv = \$tsv + 2) > 10" "globvar" { 6 7 8 9 10 } + +# This expression is used for testing emit_reg. +if [is_amd64_regs_target] { + set arg0exp "\$rdi" +} elseif [is_x86_like_target] { + set arg0exp "*(int *) (\$ebp + 8)" +} else { + set arg0exp "" +} + +if { "$arg0exp" != "" } { + test_ftrace_condition "($arg0exp > 500)" "globvar" { 6 7 8 9 10 } +} -- 1.9.1