From d78908cff50f281dab6390646fb1b7c58236d83e Mon Sep 17 00:00:00 2001 From: Wei-cheng Wang Date: Wed, 16 Sep 2015 16:20:51 +0100 Subject: [PATCH] Fix argument to compiled_cond, and add cases for compiled-condition. This patch fixes the argument passed to compiled_cond. It should be regs buffer instead of tracepoint_hit_ctx. Test case is added as well for testing compiled-cond. gdb/gdbserver/ChangeLog 2015-09-16 Wei-cheng Wang * tracepoint.c (eval_result_type): Change prototype. (condition_true_at_tracepoint): Fix argument to compiled_cond. gdb/testsuite/ChangeLog 2015-09-16 Wei-cheng Wang * gdb.trace/ftrace.exp: (test_ftrace_condition) New function for testing bytecode compilation. --- gdb/gdbserver/ChangeLog | 5 +++ gdb/gdbserver/tracepoint.c | 7 +++-- gdb/testsuite/ChangeLog | 5 +++ gdb/testsuite/gdb.trace/ftrace.exp | 64 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 5c0cbce..c018f28 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2015-09-16 Wei-cheng Wang + + * tracepoint.c (eval_result_type): Change prototype. + (condition_true_at_tracepoint): Fix argument to compiled_cond. + 2015-09-15 Pedro Alves * remote-utils.c (prepare_resume_reply) : diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index fd010ae..5e34eba 100644 --- a/gdb/gdbserver/tracepoint.c +++ b/gdb/gdbserver/tracepoint.c @@ -695,7 +695,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. */ @@ -4907,7 +4907,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/ChangeLog b/gdb/testsuite/ChangeLog index 2e9a605..a0ac2ca 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-09-16 Wei-cheng Wang + + * gdb.trace/ftrace.exp: (test_ftrace_condition) New function + for testing bytecode compilation. + 2015-09-16 Pedro Alves Sandra Loosemore 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 } +} -- 2.7.4