This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: RFA: handle "MiniDebuginfo" section
Pedro> Seems like this won't work with remote hosts as is. Can we make
Pedro> it use "remote_file host delete", "remote_spawn host", etc.? If
Pedro> not, perhaps just bail early if [is_remote host].
FWIW, I took a stab at this, using the appended patch.
However, I could not get it to work. I always get an error:
ERROR: bad spawn_id (process died earlier?)
while executing
"expect {
-i $spawn_id -timeout $timeout -re ".+" {
append output $expect_out(buffer)
if { [string length $output] < 512000 } {
exp_contin..."
(procedure "local_exec" line 94)
invoked from within
[...]
I don't know if this is my bug, or dejagnu's, or expect's -- but I
couldn't find a way to work around it.
According to comments in remote.exp it is not ok to use redirections in
a remote_exec. So I am going to just skip the remote host case.
Tom
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-gnu-debugdata.exp b/gdb/testsuite/gdb.dwarf2/dw2-gnu-debugdata.exp
index e384412..85391e6 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-gnu-debugdata.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-gnu-debugdata.exp
@@ -24,12 +24,20 @@ if [build_executable ${testfile}.exp $testfile] {
return -1
}
-proc run { test cmdline } {
- verbose "cmdline is $cmdline"
- set result [catch "exec $cmdline" output]
+source /tmp/remote.exp
+
+set pipeline_counter 0
+
+# A wrapper for 'remote_exec host' that passes or fails a test.
+# Returns 0 if all went well, nonzero on failure.
+# TEST is the name of the test, other arguments are as for
+# remote_exec.
+proc run {test program args} {
+ verbose -log "cmdline is remote_exec host $program $args"
+ set result [eval remote_exec host [list $program] $args]
verbose "result is $result"
- verbose "output is $output"
- if {$result == 0} {
+ lassign $result output status
+ if {$status == 0} {
pass $test
return 0
} else {
@@ -38,50 +46,89 @@ proc run { test cmdline } {
}
}
-set strip_program [transform strip]
-set nm_program [transform nm]
+# Run a pipeline of processes through 'run'.
+# TEST is the base name of the test, it is modified and passed to 'run'.
+# Each subsequent argument is a list of the form {PROGRAM [ARG]...}.
+# It is passed to 'run'. However, before being passed, if input and output
+# files are not specified in the list, then this proc provides them.
+# Each program in the pipeline takes its input from the previous
+# program's output.
+proc pipeline {test args} {
+ global pipeline_counter
+
+ set input_file {}
+ foreach arglist $args {
+ verbose -log "raw args are $arglist"
+ lassign $arglist program arguments input output
+
+ if {$input == ""} {
+ set input $input_file
+ }
+ if {$output == ""} {
+ set output pipe.[pid].$pipeline_counter
+ incr pipeline_counter
+ }
+ verbose -log "cooked args are [list $program $arguments $input $output]"
+
+ if {[run "$test - invoke $program" $program $arguments \
+ $input $output]} {
+ return -1
+ }
+
+ set input_file $output
+ }
+ return 0
+}
# Extract the dynamic symbols from the main binary, there is no need
# to also have these in the normal symbol table.
-file delete -- ${binfile}.dynsyms
-if [run "nm -D" "[transform nm] -D ${binfile} --format=posix --defined-only | awk \\{print\\ \\\$1\\} | sort > ${binfile}.dynsyms"] {
+remote_file host delete ${binfile}.dynsyms
+if {[pipeline "nm -D" \
+ [list [transform nm] "-D ${binfile} --format=posix --defined-only"] \
+ [list awk "\\{print\\ \\\$1\\}"] \
+ [list sort "" "" "${binfile}.dynsyms"]]} {
return -1
}
# Extract all the text (i.e. function) symbols from the debuginfo.
-file delete -- ${binfile}.funcsyms
-if [run "nm" "[transform nm] ${binfile} --format=posix --defined-only | awk \\{if(\\\$2==\"T\"||\\\$2==\"t\")print\\ \\\$1\\} | sort > ${binfile}.funcsyms"] {
+remote_file host delete ${binfile}.funcsyms
+if {[pipeline "nm" \
+ [list [transform nm] "${binfile} --format=posix --defined-only"] \
+ [list awk "\\{if(\\\$2==\"T\"||\\\$2==\"t\")print\\ \\\$1\\}"] \
+ [list sort "" "" "${binfile}.funcsyms"]]} {
return -1
}
# Keep all the function symbols not already in the dynamic symbol
# table.
-file delete -- ${binfile}.keep_symbols
-if [run "comm" "comm -13 ${binfile}.dynsyms ${binfile}.funcsyms > ${binfile}.keep_symbols"] {
+remote_file host delete ${binfile}.keep_symbols
+if {[run "comm" "comm" "-13 ${binfile}.dynsyms ${binfile}.funcsyms" "" \
+ "${binfile}.keep_symbols"]} {
return -1
}
# Copy the full debuginfo, keeping only a minimal set of symbols and
# removing some unnecessary sections.
-file delete -- ${binfile}.mini_debuginfo
-if [run "objcopy 1" "[transform objcopy] -S --remove-section .gdb_index --remove-section .comment --keep-symbols=${binfile}.keep_symbols ${binfile} ${binfile}.mini_debuginfo"] {
+remote_file host delete ${binfile}.mini_debuginfo
+if {[run "objcopy 1" [transform objcopy] "-S --remove-section .gdb_index --remove-section .comment --keep-symbols=${binfile}.keep_symbols ${binfile} ${binfile}.mini_debuginfo"]} {
return -1
}
# GDB specific - we do not have split executable in advance.
-file delete -- ${binfile}.strip
-if [run "strip" "[transform strip] --strip-all -o ${binfile}.strip ${binfile}"] {
+remote_file host delete ${binfile}.strip
+if {[run "strip" [transform strip] \
+ "--strip-all -o ${binfile}.strip ${binfile}"]} {
return -1
}
# Inject the compressed data into the .gnu_debugdata section of the
# original binary.
-file delete -- ${binfile}.mini_debuginfo.xz
-if [run "xz" "xz ${binfile}.mini_debuginfo"] {
+remote_file host delete ${binfile}.mini_debuginfo.xz
+if {[run "xz" "xz" "${binfile}.mini_debuginfo"]} {
return -1
}
-file delete -- ${binfile}.test
-if [run "objcopy 2" "[transform objcopy] --add-section .gnu_debugdata=${binfile}.mini_debuginfo.xz ${binfile}.strip ${binfile}.test"] {
+remote_file host delete ${binfile}.test
+if {[run "objcopy 2" [transform objcopy] "--add-section .gnu_debugdata=${binfile}.mini_debuginfo.xz ${binfile}.strip ${binfile}.test"]} {
return -1
}