[gdb/testsuite] Add test-case for gdb-add-index.sh

Message ID 20190507160800.GA29009@delia
State New
Headers show
Series
  • [gdb/testsuite] Add test-case for gdb-add-index.sh
Related show

Commit Message

Tom de Vries May 7, 2019, 4:08 p.m.
Hi,

Add a test-case gdb.dwarf2/gdb-add-index.exp to test
gdb/contrib/gdb-add-index.sh.

Tested with x86_64-linux.

OK for trunk?

Thanks,
- Tom

[gdb/testsuite] Add test-case for gdb-add-index.sh

gdb/testsuite/ChangeLog:

2019-05-07  Tom de Vries  <tdevries@suse.de>

	* gdb.dwarf2/gdb-add-index.exp: New file.

---
 gdb/testsuite/gdb.dwarf2/gdb-add-index.exp | 69 ++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

Comments

Tom de Vries May 23, 2019, 10:15 a.m. | #1
On 07-05-19 18:08, Tom de Vries wrote:
> Hi,

> 

> Add a test-case gdb.dwarf2/gdb-add-index.exp to test

> gdb/contrib/gdb-add-index.sh.

> 

> Tested with x86_64-linux.

> 

> OK for trunk?

> 


Ping.

Thanks,
- Tom

> [gdb/testsuite] Add test-case for gdb-add-index.sh

> 

> gdb/testsuite/ChangeLog:

> 

> 2019-05-07  Tom de Vries  <tdevries@suse.de>

> 

> 	* gdb.dwarf2/gdb-add-index.exp: New file.

> 

> ---

>  gdb/testsuite/gdb.dwarf2/gdb-add-index.exp | 69 ++++++++++++++++++++++++++++++

>  1 file changed, 69 insertions(+)

> 

> diff --git a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

> new file mode 100644

> index 0000000000..39286ec2e3

> --- /dev/null

> +++ b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

> @@ -0,0 +1,69 @@

> +# Copyright 2019 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/>.

> +

> +load_lib dwarf.exp

> +

> +# This test can only be run on targets which support DWARF-2.

> +if {![dwarf2_support]} {

> +    return 0

> +}

> +

> +standard_testfile main.c

> +

> +if { [prepare_for_testing "failed to prepare" "${testfile}" \

> +	  [list ${srcfile}]] } {

> +    return -1

> +}

> +

> +# Add a .gdb_index section to PROGRAM.

> +# PROGRAM is assumed to be the output of standard_output_file.

> +# Returns the path of the program or "" if there is a failure.

> +# If there is a failure it will have already been logged.

> +

> +proc add_gdb_index { program } {

> +    global srcdir GDB env

> +    set contrib_dir "$srcdir/../contrib"

> +    set env(GDB) $GDB

> +    exec $contrib_dir/gdb-add-index.sh $program

> +    return ${program}

> +}

> +

> +# Build a copy of the program with an index (.gdb_index/.debug_names).

> +# But only if the toolchain didn't already create one: gdb doesn't support

> +# building an index from a program already using one.

> +

> +set test "check if index present"

> +gdb_test_multiple "mt print objfiles ${testfile}" $test {

> +    -re "gdb_index.*${gdb_prompt} $" {

> +	set binfile_with_index $binfile

> +    }

> +    -re "debug_names.*${gdb_prompt} $" {

> +	set binfile_with_index $binfile

> +    }

> +    -re "Psymtabs.*${gdb_prompt} $" {

> +	set binfile_with_index [add_gdb_index $binfile]

> +	if { ${binfile_with_index} == "" } {

> +	    return -1

> +	}

> +    }

> +}

> +

> +# Ok, we have a copy of $binfile with an index.

> +# Restart gdb and verify the index was used.

> +

> +clean_restart ${binfile_with_index}

> +gdb_test "mt print objfiles ${testfile}" \

> +    "(gdb_index|debug_names).*" \

> +    "index used"

>
Simon Marchi May 24, 2019, 2:37 a.m. | #2
Hi Tom,

On 2019-05-07 12:08 p.m., Tom de Vries wrote:
> Hi,

> 

> Add a test-case gdb.dwarf2/gdb-add-index.exp to test

> gdb/contrib/gdb-add-index.sh.

> 

> Tested with x86_64-linux.

> 

> OK for trunk?

> 

> Thanks,

> - Tom

> 

> [gdb/testsuite] Add test-case for gdb-add-index.sh

> 

> gdb/testsuite/ChangeLog:

> 

> 2019-05-07  Tom de Vries  <tdevries@suse.de>

> 

> 	* gdb.dwarf2/gdb-add-index.exp: New file.

> 

> ---

>  gdb/testsuite/gdb.dwarf2/gdb-add-index.exp | 69 ++++++++++++++++++++++++++++++

>  1 file changed, 69 insertions(+)

> 

> diff --git a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

> new file mode 100644

> index 0000000000..39286ec2e3

> --- /dev/null

> +++ b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

> @@ -0,0 +1,69 @@

> +# Copyright 2019 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/>.

> +

> +load_lib dwarf.exp

> +

> +# This test can only be run on targets which support DWARF-2.

> +if {![dwarf2_support]} {

> +    return 0

> +}

> +

> +standard_testfile main.c

> +

> +if { [prepare_for_testing "failed to prepare" "${testfile}" \

> +	  [list ${srcfile}]] } {

> +    return -1

> +}

> +

> +# Add a .gdb_index section to PROGRAM.

> +# PROGRAM is assumed to be the output of standard_output_file.

> +# Returns the path of the program or "" if there is a failure.

> +# If there is a failure it will have already been logged.

> +

> +proc add_gdb_index { program } {

> +    global srcdir GDB env

> +    set contrib_dir "$srcdir/../contrib"

> +    set env(GDB) $GDB

> +    exec $contrib_dir/gdb-add-index.sh $program

> +    return ${program}

> +}


Maybe make this proc return true/false or 1/0, since it only needs to report success/failure?

> +

> +# Build a copy of the program with an index (.gdb_index/.debug_names).

> +# But only if the toolchain didn't already create one: gdb doesn't support

> +# building an index from a program already using one.

> +

> +set test "check if index present"

> +gdb_test_multiple "mt print objfiles ${testfile}" $test {

> +    -re "gdb_index.*${gdb_prompt} $" {

> +	set binfile_with_index $binfile

> +    }

> +    -re "debug_names.*${gdb_prompt} $" {

> +	set binfile_with_index $binfile

> +    }

> +    -re "Psymtabs.*${gdb_prompt} $" {

> +	set binfile_with_index [add_gdb_index $binfile]

> +	if { ${binfile_with_index} == "" } {

> +	    return -1

> +	}

> +    }

> +}

> +

> +# Ok, we have a copy of $binfile with an index.

> +# Restart gdb and verify the index was used.

> +

> +clean_restart ${binfile_with_index}

> +gdb_test "mt print objfiles ${testfile}" \

> +    "(gdb_index|debug_names).*" \

> +    "index used"

> 


I am getting an error like this when trying to run the test:

---
ERROR: Exception caught while booting Guile.

/home/simark/build/binutils-gdb/gdb/testsuite/../../gdb/gdb: warning: Could not complete Guile gdb module initialization from:
/usr/local/share/gdb/guile/gdb/boot.scm.
Limited Guile support is available.
Suggest passing --data-directory=/path/to/gdb/data-directory.

Python Exception <class 'ModuleNotFoundError'> No module named 'gdb':
/home/simark/build/binutils-gdb/gdb/testsuite/../../gdb/gdb: warning:
Could not load the Python gdb module from `/usr/local/share/gdb/python'.
Limited Python support is available from the _gdb module.
Suggest passing --data-directory=/path/to/gdb/data-directory.
---

Since we want to run GDB from its build directory, we need to start it with
--data-directory.  The following change makes it work for me:


diff --git a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp
index 39286ec2e37f..035413d61c5b 100644
--- a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp
+++ b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp
@@ -33,9 +33,9 @@ if { [prepare_for_testing "failed to prepare" "${testfile}" \
 # If there is a failure it will have already been logged.

 proc add_gdb_index { program } {
-    global srcdir GDB env
+    global srcdir GDB env BUILD_DATA_DIRECTORY
     set contrib_dir "$srcdir/../contrib"
-    set env(GDB) $GDB
+    set env(GDB) "$GDB --data-directory=$BUILD_DATA_DIRECTORY"
     exec $contrib_dir/gdb-add-index.sh $program
     return ${program}
 }


Ideally, we would test both without the -dwarf-5 switch, and check for the presence of the
.gdb_index section, then test with the -dwarf-5 switch, and check for the presence of the
.debug_names section.  But already having this test is better than no test at all, so the
patch LGTM with the changes highlighted above.

Simon
Tom de Vries May 24, 2019, 12:36 p.m. | #3
On 24-05-19 04:37, Simon Marchi wrote:
> Hi Tom,

> 

> On 2019-05-07 12:08 p.m., Tom de Vries wrote:

>> Hi,

>>

>> Add a test-case gdb.dwarf2/gdb-add-index.exp to test

>> gdb/contrib/gdb-add-index.sh.

>>

>> Tested with x86_64-linux.

>>

>> OK for trunk?

>>

>> Thanks,

>> - Tom

>>

>> [gdb/testsuite] Add test-case for gdb-add-index.sh

>>

>> gdb/testsuite/ChangeLog:

>>

>> 2019-05-07  Tom de Vries  <tdevries@suse.de>

>>

>> 	* gdb.dwarf2/gdb-add-index.exp: New file.

>>

>> ---

>>  gdb/testsuite/gdb.dwarf2/gdb-add-index.exp | 69 ++++++++++++++++++++++++++++++

>>  1 file changed, 69 insertions(+)

>>

>> diff --git a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

>> new file mode 100644

>> index 0000000000..39286ec2e3

>> --- /dev/null

>> +++ b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

>> @@ -0,0 +1,69 @@

>> +# Copyright 2019 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/>.

>> +

>> +load_lib dwarf.exp

>> +

>> +# This test can only be run on targets which support DWARF-2.

>> +if {![dwarf2_support]} {

>> +    return 0

>> +}

>> +

>> +standard_testfile main.c

>> +

>> +if { [prepare_for_testing "failed to prepare" "${testfile}" \

>> +	  [list ${srcfile}]] } {

>> +    return -1

>> +}

>> +

>> +# Add a .gdb_index section to PROGRAM.

>> +# PROGRAM is assumed to be the output of standard_output_file.

>> +# Returns the path of the program or "" if there is a failure.

>> +# If there is a failure it will have already been logged.

>> +

>> +proc add_gdb_index { program } {

>> +    global srcdir GDB env

>> +    set contrib_dir "$srcdir/../contrib"

>> +    set env(GDB) $GDB

>> +    exec $contrib_dir/gdb-add-index.sh $program

>> +    return ${program}

>> +}

> 

> Maybe make this proc return true/false or 1/0, since it only needs to report success/failure?

> 


Done.

>> +

>> +# Build a copy of the program with an index (.gdb_index/.debug_names).

>> +# But only if the toolchain didn't already create one: gdb doesn't support

>> +# building an index from a program already using one.

>> +

>> +set test "check if index present"

>> +gdb_test_multiple "mt print objfiles ${testfile}" $test {

>> +    -re "gdb_index.*${gdb_prompt} $" {

>> +	set binfile_with_index $binfile

>> +    }

>> +    -re "debug_names.*${gdb_prompt} $" {

>> +	set binfile_with_index $binfile

>> +    }

>> +    -re "Psymtabs.*${gdb_prompt} $" {

>> +	set binfile_with_index [add_gdb_index $binfile]

>> +	if { ${binfile_with_index} == "" } {

>> +	    return -1

>> +	}

>> +    }

>> +}

>> +

>> +# Ok, we have a copy of $binfile with an index.

>> +# Restart gdb and verify the index was used.

>> +

>> +clean_restart ${binfile_with_index}

>> +gdb_test "mt print objfiles ${testfile}" \

>> +    "(gdb_index|debug_names).*" \

>> +    "index used"

>>

> 

> I am getting an error like this when trying to run the test:

> 

> ---

> ERROR: Exception caught while booting Guile.

> 

> /home/simark/build/binutils-gdb/gdb/testsuite/../../gdb/gdb: warning: Could not complete Guile gdb module initialization from:

> /usr/local/share/gdb/guile/gdb/boot.scm.

> Limited Guile support is available.

> Suggest passing --data-directory=/path/to/gdb/data-directory.

> 

> Python Exception <class 'ModuleNotFoundError'> No module named 'gdb':

> /home/simark/build/binutils-gdb/gdb/testsuite/../../gdb/gdb: warning:

> Could not load the Python gdb module from `/usr/local/share/gdb/python'.

> Limited Python support is available from the _gdb module.

> Suggest passing --data-directory=/path/to/gdb/data-directory.

> ---

> 

> Since we want to run GDB from its build directory, we need to start it with

> --data-directory.  The following change makes it work for me:

> 

> 

> diff --git a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

> index 39286ec2e37f..035413d61c5b 100644

> --- a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

> +++ b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp

> @@ -33,9 +33,9 @@ if { [prepare_for_testing "failed to prepare" "${testfile}" \

>  # If there is a failure it will have already been logged.

> 

>  proc add_gdb_index { program } {

> -    global srcdir GDB env

> +    global srcdir GDB env BUILD_DATA_DIRECTORY

>      set contrib_dir "$srcdir/../contrib"

> -    set env(GDB) $GDB

> +    set env(GDB) "$GDB --data-directory=$BUILD_DATA_DIRECTORY"

>      exec $contrib_dir/gdb-add-index.sh $program

>      return ${program}

>  }

> 

> 


Done.

[ Btw, for the cc-with-gdb-index board I first tried (in
cc-with-tweaks.exp):
...
set env(GDB) "$GDB $GDBFLAGS $INTERNAL_GDBFLAGS"
...
but found that that didn't work due to quoting issues, so I ended up
generating a script gdb.sh and passing that instead:
...
set env(GDB) $pwd/gdb.sh
                                         ...
]

> Ideally, we would test both without the -dwarf-5 switch, and check for the presence of the

> .gdb_index section, then test with the -dwarf-5 switch, and check for the presence of the

> .debug_names section.  But already having this test is better than no test at all, so the

> patch LGTM with the changes highlighted above.

> 


Agreed.

For now, committed as below.

Thanks,
- Tom
[gdb/testsuite] Add test-case for gdb-add-index.sh

Add a test-case gdb.dwarf2/gdb-add-index.exp to test
gdb/contrib/gdb-add-index.sh.

Tested with x86_64-linux.

gdb/testsuite/ChangeLog:

2019-05-07  Tom de Vries  <tdevries@suse.de>

	* gdb.dwarf2/gdb-add-index.exp: New file.

---
 gdb/testsuite/gdb.dwarf2/gdb-add-index.exp | 74 ++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp
new file mode 100644
index 0000000000..1c87d49203
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp
@@ -0,0 +1,74 @@
+# Copyright 2019 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/>.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2.
+if {![dwarf2_support]} {
+    return 0
+}
+
+standard_testfile main.c
+
+if { [prepare_for_testing "failed to prepare" "${testfile}" \
+	  [list ${srcfile}]] } {
+    return -1
+}
+
+# Add a .gdb_index section to PROGRAM.
+# PROGRAM is assumed to be the output of standard_output_file.
+# Returns the 0 if there is a failure, otherwise 1.
+
+proc add_gdb_index { program } {
+    global srcdir GDB env BUILD_DATA_DIRECTORY
+    set contrib_dir "$srcdir/../contrib"
+    set env(GDB) "$GDB --data-directory=$BUILD_DATA_DIRECTORY"
+    set result [catch "exec $contrib_dir/gdb-add-index.sh $program" output]
+    if { $result != 0 } {
+	verbose -log "result is $result"
+	verbose -log "output is $output"
+	return 0
+    }
+
+    return 1
+}
+
+# Build a copy of the program with an index (.gdb_index/.debug_names).
+# But only if the toolchain didn't already create one: gdb doesn't support
+# building an index from a program already using one.
+
+set test "check if index present"
+gdb_test_multiple "mt print objfiles ${testfile}" $test {
+    -re "gdb_index.*${gdb_prompt} $" {
+	set binfile_with_index $binfile
+    }
+    -re "debug_names.*${gdb_prompt} $" {
+	set binfile_with_index $binfile
+    }
+    -re "Psymtabs.*${gdb_prompt} $" {
+	if { [add_gdb_index $binfile] != "1" } {
+	    return -1
+	}
+	set binfile_with_index $binfile
+    }
+}
+
+# Ok, we have a copy of $binfile with an index.
+# Restart gdb and verify the index was used.
+
+clean_restart ${binfile_with_index}
+gdb_test "mt print objfiles ${testfile}" \
+    "(gdb_index|debug_names).*" \
+    "index used"

Patch

diff --git a/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp
new file mode 100644
index 0000000000..39286ec2e3
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/gdb-add-index.exp
@@ -0,0 +1,69 @@ 
+# Copyright 2019 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/>.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2.
+if {![dwarf2_support]} {
+    return 0
+}
+
+standard_testfile main.c
+
+if { [prepare_for_testing "failed to prepare" "${testfile}" \
+	  [list ${srcfile}]] } {
+    return -1
+}
+
+# Add a .gdb_index section to PROGRAM.
+# PROGRAM is assumed to be the output of standard_output_file.
+# Returns the path of the program or "" if there is a failure.
+# If there is a failure it will have already been logged.
+
+proc add_gdb_index { program } {
+    global srcdir GDB env
+    set contrib_dir "$srcdir/../contrib"
+    set env(GDB) $GDB
+    exec $contrib_dir/gdb-add-index.sh $program
+    return ${program}
+}
+
+# Build a copy of the program with an index (.gdb_index/.debug_names).
+# But only if the toolchain didn't already create one: gdb doesn't support
+# building an index from a program already using one.
+
+set test "check if index present"
+gdb_test_multiple "mt print objfiles ${testfile}" $test {
+    -re "gdb_index.*${gdb_prompt} $" {
+	set binfile_with_index $binfile
+    }
+    -re "debug_names.*${gdb_prompt} $" {
+	set binfile_with_index $binfile
+    }
+    -re "Psymtabs.*${gdb_prompt} $" {
+	set binfile_with_index [add_gdb_index $binfile]
+	if { ${binfile_with_index} == "" } {
+	    return -1
+	}
+    }
+}
+
+# Ok, we have a copy of $binfile with an index.
+# Restart gdb and verify the index was used.
+
+clean_restart ${binfile_with_index}
+gdb_test "mt print objfiles ${testfile}" \
+    "(gdb_index|debug_names).*" \
+    "index used"