diff --git a/gdb/printcmd.c b/gdb/printcmd.c --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1214,6 +1214,10 @@ print_command_1 (const char *args, int voidprint) if (exp != nullptr && *exp) { + /* '*((int *(*) (void)) __errno_location) ()' is incompatible with + function descriptors. */ + if (target_has_execution && strcmp (exp, "errno") == 0) + exp = "*(*(int *(*)(void)) __errno_location) ()"; expression_up expr = parse_expression (exp); val = evaluate_expression (expr.get ()); } diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno.c b/gdb/testsuite/gdb.dwarf2/dw2-errno.c new file mode 100644 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-errno.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2005, 2007 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 . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +#include + +int main() +{ + errno = 42; + + return 0; /* breakpoint */ +} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno.exp b/gdb/testsuite/gdb.dwarf2/dw2-errno.exp new file mode 100644 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-errno.exp @@ -0,0 +1,60 @@ +# Copyright 2007 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 . + +set testfile dw2-errno +set srcfile ${testfile}.c +set binfile [standard_output_file ${testfile}] + +proc prep {} { + global srcdir subdir binfile + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} + + runto_main + + gdb_breakpoint [gdb_get_line_number "breakpoint"] + gdb_continue_to_breakpoint "breakpoint" +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } { + untested "Couldn't compile test program" + return -1 +} +prep +gdb_test "print errno" ".* = 42" "errno with macros=N threads=N" + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } { + untested "Couldn't compile test program" + return -1 +} +prep +gdb_test "print errno" ".* = 42" "errno with macros=Y threads=N" + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } { + return -1 +} +prep +gdb_test "print errno" ".* = 42" "errno with macros=N threads=Y" + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } { + return -1 +} +prep +gdb_test "print errno" ".* = 42" "errno with macros=Y threads=Y" + +# TODO: Test the error on resolving ERRNO with only libc loaded. +# Just how to find the current libc filename? diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno2.c b/gdb/testsuite/gdb.dwarf2/dw2-errno2.c new file mode 100644 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-errno2.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2005, 2007 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 . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +#include + +int main() +{ + errno = 42; + + return 0; /* breakpoint */ +} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp b/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp new file mode 100644 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp @@ -0,0 +1,71 @@ +# Copyright 2007 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 . + +set testfile dw2-errno2 +set srcfile ${testfile}.c +set binfile [standard_output_file ${testfile}] + +proc prep { message {do_xfail 0} } { with_test_prefix $message { + global srcdir subdir binfile variant + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile}${variant} + + runto_main + + gdb_breakpoint [gdb_get_line_number "breakpoint"] + gdb_continue_to_breakpoint "breakpoint" + + gdb_test "gcore ${binfile}${variant}.core" "\r\nSaved corefile .*" "gcore $variant" + + gdb_test "print errno" ".* = 42" + + gdb_test "kill" ".*" "kill" {Kill the program being debugged\? \(y or n\) } "y" + gdb_test "core-file ${binfile}${variant}.core" "\r\nCore was generated by .*" "core-file" + if $do_xfail { + setup_xfail "*-*-*" + } + gdb_test "print (int) errno" ".* = 42" "print errno for core" +}} + +set variant g2thrN +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } { + untested "Couldn't compile test program" + return -1 +} +prep "macros=N threads=N" 1 + +set variant g3thrN +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } { + untested "Couldn't compile test program" + return -1 +} +prep "macros=Y threads=N" 1 + +set variant g2thrY +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } { + return -1 +} +prep "macros=N threads=Y" + +set variant g3thrY +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } { + return -1 +} +prep "macros=Y threads=Y" 1 + +# TODO: Test the error on resolving ERRNO with only libc loaded. +# Just how to find the current libc filename?