aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp
diff options
context:
space:
mode:
authorSergio Durigan Junior <sergiodj@redhat.com>2014-10-14 14:31:09 -0400
committerSergio Durigan Junior <sergiodj@redhat.com>2014-10-14 14:33:31 -0400
commitf7088df3b1c0370101edada54e26d24efb53125c (patch)
tree094d03453eb39c92b087642a458ca8c6011cf4ba /gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp
parent5697705ac6eafb3e3f9dd3ba253231a4d51a1fa4 (diff)
downloadgdb-f7088df3b1c0370101edada54e26d24efb53125c.zip
gdb-f7088df3b1c0370101edada54e26d24efb53125c.tar.gz
gdb-f7088df3b1c0370101edada54e26d24efb53125c.tar.bz2
Explicitly use language_c when evaluating a SDT probe argument
Joel contacted me offlist with a question about a warning that one of his customers was seeing. The message came from the new linker-debugger interface, which uses SDT probes internally. The warning said: (gdb) run [...] warning: Probes-based dynamic linker interface failed. Reverting to original interface. Argument to arithmetic operation not a number or boolean. This should not have happened in the environment the customer was using (RHEL-6.x), so I found it strange. Another thing caught my attention: the last message, saying "Argument to arithmetic operation not a number or boolean.". Joel kindly investigated the issue further, and found the answer for this. To quote him: (gdb) set lang c (gdb) p 48+$ebp $4 = (void *) 0xffffd0f8 So far so good. But... (gdb) set lang ada (gdb) p 48+$ebp Argument to arithmetic operation not a number or boolean. Ooops! Interestingly, if you revert the order of the operands... (gdb) p $ebp+48 $5 = (access void) 0xffffd0f8 So the problem is doing pointer arithmetics when the language is set to Ada. I remembered that, during the parsing and the evaluation of SDT probe arguments, the code sets the language as current_language, because, at that time, I thought it was not necessary to worry about the language given that the code implements its own parser. I was wrong. So here is a patch to fix that, by setting the language as C, which should guarantee that the maths are done in the right way (TM). It was somewhat hard to find a reproducer for this issue. In the end, what I had to do was to create a testcase that used the %ebp register on some displacement (e.g., "-4(%ebp)"), which finally triggered the bug. I am not sure why I could not trigger it when using other registers, but I did not want to spend too much time investigating this issue, which seemed like an Ada issue. Also, because of this peculiar way to trigger the problem, the testcase only covers x86-like targets (i.e., i*86 and x86_64 with -m32). Joel kindly tested this for me, and it worked. I also ran a full regression test here on my Fedora 20 x86_64, and everything is fine. I will push this patch in a few days if there are no comments. gdb/ChangeLog: 2014-10-14 Sergio Durigan Junior <sergiodj@redhat.com> * stap-probe.c (stap_parse_argument): Initialize expout explicitly using language_c, instead of current_language. gdb/testsuite/ChangeLog: 2014-10-14 Sergio Durigan Junior <sergiodj@redhat.com> * gdb.arch/stap-eval-lang-ada.S: Likewise. * gdb.arch/stap-eval-lang-ada.c: Likewise. * gdb.arch/stap-eval-lang-ada.exp: New file.
Diffstat (limited to 'gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp')
-rw-r--r--gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp35
1 files changed, 35 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp b/gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp
new file mode 100644
index 0000000..6afe758
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp
@@ -0,0 +1,35 @@
+# 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/>.
+
+standard_testfile ".S"
+
+# We can only test this if the target is i686 or x86_64 with -m32
+if { ![is_x86_like_target] } {
+ verbose "Skipping $testfile.exp"
+ return
+}
+
+if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } {
+ return -1
+}
+
+gdb_test_no_output "set language ada"
+
+if { ![runto "-pstap bar"] } {
+ return -1
+}
+
+gdb_test "print \$_probe_arg0" " = 40" \
+ "printing \$_probe_arg0"