From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20733 invoked by alias); 22 Jul 2010 09:01:20 -0000 Received: (qmail 19508 invoked by uid 22791); 22 Jul 2010 09:01:17 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mel.act-europe.fr (HELO mel.act-europe.fr) (212.99.106.210) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 22 Jul 2010 09:01:07 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 54BD0CB0268; Thu, 22 Jul 2010 11:01:02 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YUJAHy2uQIJt; Thu, 22 Jul 2010 11:01:02 +0200 (CEST) Received: from province.act-europe.fr (province.act-europe.fr [10.10.0.214]) by mel.act-europe.fr (Postfix) with ESMTP id 42892CB023E; Thu, 22 Jul 2010 11:01:02 +0200 (CEST) Received: by province.act-europe.fr (Postfix, from userid 560) id 30AF01648A2; Thu, 22 Jul 2010 11:01:02 +0200 (CEST) Date: Thu, 22 Jul 2010 09:01:00 -0000 From: Jerome Guitton To: Jan Kratochvil Cc: gdb-patches@sourceware.org Subject: Re: [RFA] testcase for code/data elimination Message-ID: <20100722090102.GL14704@adacore.com> References: <1279719831-14906-1-git-send-email-guitton@adacore.com> <20100721192848.GA20539@host1.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100721192848.GA20539@host1.dyn.jankratochvil.net> User-Agent: Mutt/1.5.17 (2007-11-01) Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-07/txt/msg00346.txt.bz2 Jan Kratochvil (jan.kratochvil@redhat.com): > > +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}" { > ^^^^ > > Missing \\.\[\r\n\]+${gdb_prompt} $ > > > + -re "No symbol \"${var}\" in current context" { > > + pass "test eliminated var ${var}" > > + } > > + -re "\\\$\[0-9\]+ = \\(.*\\) (0|$hex)( <${var}>)?\[\r\n\]+${gdb_prompt} $" { > > + fail "test eliminated var ${var}" > > + } > > + } > > + return "" > > Unused return. Thank you. This is fixed in this new patch. gdb/testsuite/ChangeLog: * gdb.base/code_elim.exp: New file. * gdb.base/code_elim1.c: New file. * gdb.base/code_elim2.c: New file. diff --git a/gdb/testsuite/gdb.base/code_elim.exp b/gdb/testsuite/gdb.base/code_elim.exp new file mode 100644 index 0000000..cc625e0 --- /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 0000000..6aef483 --- /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 0000000..61a4556 --- /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; +}