mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
474ca4f687
This patch is a fix to PR gdb/17235. The bug is about an unused variable that got declared and set during one of the parsing phases of an SDT probe's argument. I took the opportunity to rewrite some of the code to improve the parsing. The bug was actually a thinko, because what I wanted to do in the code was to discard the number on the string being parsed. During this portion, the code identifies that it is dealing with an expression that begins with a sign ('+', '-' or '~'). This means that the expression could be: - a numeric literal (e.g., '+5') - a register displacement (e.g., '-4(%rsp)') - a subexpression (e.g., '-(2*3)') So, after saving the sign and moving forward 1 char, now the code needs to know if there is a digit followed by a register displacement prefix operand (e.g., '(' on x86_64). If yes, then it is a register operation. If not, then it will be handled recursively, and the code will later apply the requested operation on the result (either a '+', a '-' or a '~'). With the bug, the code was correctly discarding the digit (though using strtol unnecessarily), but it wasn't properly dealing with subexpressions when the register indirection prefix was '(', like on x86_64. This patch also fixes this bug, and includes a testcase. It passes on x86_64 Fedora 20.
42 lines
1.3 KiB
Plaintext
42 lines
1.3 KiB
Plaintext
# Copyright 2014 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 <http://www.gnu.org/licenses/>.
|
|
|
|
if { ![istarget "x86_64-*-*"] || ![is_lp64_target] } {
|
|
verbose "Skipping amd64-stap-wrong-subexp.exp"
|
|
return
|
|
}
|
|
|
|
standard_testfile amd64-stap-wrong-subexp.S
|
|
|
|
if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
|
|
untested amd64-stap-wrong-subexp.exp
|
|
return -1
|
|
}
|
|
|
|
proc goto_probe { probe_name } {
|
|
if { ![runto "-pstap $probe_name"] } {
|
|
fail "run to probe $probe_name"
|
|
return
|
|
}
|
|
}
|
|
|
|
goto_probe foo
|
|
gdb_test "print \$_probe_arg0" "Invalid operator `\\\(' on expression .*" \
|
|
"print probe foo arg0"
|
|
|
|
goto_probe bar
|
|
gdb_test "print \$_probe_arg0" " = -4" "print probe bar arg0"
|
|
gdb_test "print \$_probe_arg1" " = -8" "print probe bar arg1"
|