From a04ba9855e937fe9ffb6b928f889bbae4587dbf7 Mon Sep 17 00:00:00 2001 From: Jerome Guitton Date: Mon, 26 Jul 2010 09:38:50 +0000 Subject: [PATCH] gdb/testsuite/ * gdb.base/code_elim.exp: New file. * gdb.base/code_elim1.c: New file. * gdb.base/code_elim2.c: New file. --- gdb/testsuite/ChangeLog | 6 + gdb/testsuite/gdb.base/code_elim.exp | 173 +++++++++++++++++++++++++++ gdb/testsuite/gdb.base/code_elim1.c | 37 ++++++ gdb/testsuite/gdb.base/code_elim2.c | 35 ++++++ 4 files changed, 251 insertions(+) create mode 100644 gdb/testsuite/gdb.base/code_elim.exp create mode 100644 gdb/testsuite/gdb.base/code_elim1.c create mode 100644 gdb/testsuite/gdb.base/code_elim2.c diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0543f803284..090c6c2e47e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-07-26 Jerome Guitton + + * gdb.base/code_elim.exp: New file. + * gdb.base/code_elim1.c: New file. + * gdb.base/code_elim2.c: New file. + 2010-07-21 Pedro Alves PR symtab/11827 diff --git a/gdb/testsuite/gdb.base/code_elim.exp b/gdb/testsuite/gdb.base/code_elim.exp new file mode 100644 index 00000000000..cc625e01eda --- /dev/null +++ b/gdb/testsuite/gdb.base/code_elim.exp @@ -0,0 +1,173 @@ +# Copyright 2002, 2003, 2005, 2007, 2008, 2009, 2010 +# 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 . */ + +# code_elim.exp -- tests that GDB can handle executables where some data/code +# has been eliminated by the linker. + +if $tracelevel then { + strace $tracelevel +} + +set testfile1 code_elim1 +set testfile2 code_elim2 +set srcfile1 ${testfile1}.c +set srcfile2 ${testfile2}.c +set binfile1 ${objdir}/${subdir}/${testfile1} +set binfile2 ${objdir}/${subdir}/${testfile2} +set opts [list debug] +lappend opts "additional_flags=-ffunction-sections" +lappend opts "additional_flags=-fdata-sections" +lappend opts "additional_flags=-Wl,-gc-sections" +lappend opts "additional_flags=-Wl,-e,main" + +remote_exec build "rm -f ${binfile1}" +remote_exec build "rm -f ${binfile2}" + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" executable $opts] != "" } { + untested code_elim.exp + return -1 +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable $opts] != "" } { + untested code_elim.exp + return -1 +} + +proc get_var_address { var } { + global gdb_prompt hex + + # Match output like: + # $1 = (int *) 0x0 + # $5 = (int (*)()) 0 + # $6 = (int (*)()) 0x24 + + gdb_test_multiple "print &${var}" "get address of ${var}" { + -re "\\\$\[0-9\]+ = \\(.*\\) (0|$hex)( <${var}>)?\[\r\n\]+${gdb_prompt} $" { + pass "get address of ${var}" + if { $expect_out(1,string) == "0" } { + return "0x0" + } else { + return $expect_out(1,string) + } + } + } + return "" +} + +proc not_null_var_address { var } { + + # Same as get_var_address, expect that it reports a failure if a null + # address is returned by gdb. + + set address [get_var_address $var] + regexp "0x\[0-9a-fA-F\]+" $address address + if { "$address" == "0x0" } { + fail "$var has null address" + } +} + +proc test_eliminated_var { var } { + global gdb_prompt hex + + # Match output 'No symbol "${var}" in current context' + + gdb_test_multiple "print &${var}" "test eliminated var ${var}" { + -re "No symbol \"${var}\" in current context\\.\[\r\n\]+${gdb_prompt} $" { + pass "test eliminated var ${var}" + } + -re "\\\$\[0-9\]+ = \\(.*\\) (0|$hex)( <${var}>)?\[\r\n\]+${gdb_prompt} $" { + fail "test eliminated var ${var}" + } + } +} + +# Check that the code and data eliminated in binfile1 are not included +# into partial symtab... and that non-eliminated symbols are still there. + +gdb_exit +gdb_start + +gdb_test "add-symbol-file ${binfile1} 0x100000" \ + "Reading symbols from .*${testfile1}\\.\\.\\.done\\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)" \ + "add-symbol-file ${testfile1} 0x100000" \ + "add symbol table from file \".*${testfile1}\" at\[ \t\r\n\]+\.text_addr = 0x100000\[\r\n\]+\\(y or n\\) " \ + "y" + +test_eliminated_var my_global_symbol +test_eliminated_var my_static_symbol +test_eliminated_var my_global_func +not_null_var_address main + +# Same thing for symtabs + +gdb_exit +global GDBFLAGS +set saved_gdbflags $GDBFLAGS +set GDBFLAGS "$GDBFLAGS --readnow $binfile1" +gdb_start +set GDBFLAGS $saved_gdbflags + +test_eliminated_var my_global_symbol +test_eliminated_var my_static_symbol +test_eliminated_var my_global_func +not_null_var_address main + +# binfile2 contains the symbols that have been eliminated in binfile1. Check +# the eliminated symbols does not hide these valid ones. + +gdb_exit +gdb_start + +gdb_test "add-symbol-file ${binfile1} 0x100000" \ + "Reading symbols from .*${testfile1}\\.\\.\\.done\\." \ + "add-symbol-file ${testfile1} 0x100000" \ + "add symbol table from file \".*${testfile1}\" at\[ \t\r\n\]+\.text_addr = 0x100000\[\r\n\]+\\(y or n\\) " \ + "y" + +gdb_test "add-symbol-file ${binfile2} 0x200000" \ + "Reading symbols from .*${testfile2}\\.\\.\\.done\\." \ + "add-symbol-file ${testfile2} 0x200000" \ + "add symbol table from file \".*${testfile2}\" at\[ \t\r\n\]+\.text_addr = 0x200000\[\r\n\]+\\(y or n\\) " \ + "y" + +not_null_var_address my_global_symbol +not_null_var_address my_static_symbol +not_null_var_address my_global_func +not_null_var_address main + +# Same thing, but loading binfile2 before binfile1. + +gdb_exit +gdb_start + +gdb_test "add-symbol-file ${binfile2} 0x200000" \ + "Reading symbols from .*${testfile2}\\.\\.\\.done\\." \ + "add-symbol-file ${testfile2} 0x200000" \ + "add symbol table from file \".*${testfile2}\" at\[ \t\r\n\]+\.text_addr = 0x200000\[\r\n\]+\\(y or n\\) " \ + "y" + +gdb_test "add-symbol-file ${binfile1} 0x100000" \ + "Reading symbols from .*${testfile1}\\.\\.\\.done\\." \ + "add-symbol-file ${testfile1} 0x100000" \ + "add symbol table from file \".*${testfile1}\" at\[ \t\r\n\]+\.text_addr = 0x100000\[\r\n\]+\\(y or n\\) " \ + "y" + +not_null_var_address my_global_symbol +not_null_var_address my_static_symbol +not_null_var_address my_global_func +not_null_var_address main + + diff --git a/gdb/testsuite/gdb.base/code_elim1.c b/gdb/testsuite/gdb.base/code_elim1.c new file mode 100644 index 00000000000..6aef483b0e2 --- /dev/null +++ b/gdb/testsuite/gdb.base/code_elim1.c @@ -0,0 +1,37 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 + 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 . */ + +int my_global_symbol = 42; + +static int my_static_symbol; + +int +main () +{ + int v_in_main; + + return v_in_main; +} + +int +my_global_func () +{ + int v_in_global_func; + + return v_in_global_func; +} diff --git a/gdb/testsuite/gdb.base/code_elim2.c b/gdb/testsuite/gdb.base/code_elim2.c new file mode 100644 index 00000000000..61a4556e62b --- /dev/null +++ b/gdb/testsuite/gdb.base/code_elim2.c @@ -0,0 +1,35 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 + 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 . */ + +int my_global_symbol = 42; + +static int my_static_symbol; + +int +main () +{ + return my_global_func (); +} + +int +my_global_func () +{ + my_static_symbol = my_global_symbol; + my_global_symbol = my_static_symbol + my_global_symbol; + return my_global_symbol; +} -- 2.30.2