aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/lib
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2022-10-05 15:26:11 +0100
committerAndrew Burgess <aburgess@redhat.com>2022-10-10 13:05:27 +0100
commit66984afd29ea9bad2155ed21098437a71208a106 (patch)
tree72934b9578be7fde232671533272c3e05d2ef93c /gdb/testsuite/lib
parent322dd71cbffdd681f3c94ad28b625f71ea9369f8 (diff)
downloadgdb-66984afd29ea9bad2155ed21098437a71208a106.zip
gdb-66984afd29ea9bad2155ed21098437a71208a106.tar.gz
gdb-66984afd29ea9bad2155ed21098437a71208a106.tar.bz2
gdb: include the base address in in-memory bfd filenames
The struct target_buffer (in gdb_bfd.c) is used to hold information about an in-memory BFD object created by GDB. For now this mechanism is used by GDB when loading information about JIT symfiles. This commit updates target_buffer (in gdb_bfd.c) to be more C++ like, and, at the same time, adds the base address of the symfile into the BFD filename. Right now, every in-memory BFD is given the filename "<in-memory>". This filename is visible in things like 'maint info symtabs' and 'maint info line-table'. If there are multiple in-memory BFD objects then it can be hard to match keep track if which BFD is which. This commit changes the name to be "<in-memory@ADDRESS>" where ADDRESS is replaced with the base address for where the in-memory symbol file was read from. As an example of how this is useful, here's the output of 'maint info jit' showing a single loaded JIT symfile: (gdb) maintenance info jit jit_code_entry address symfile address symfile size 0x00000000004056b0 0x0000000007000000 17320 And here's part of the output from 'maint info symtabs': (gdb) maintenance info symtabs ...snip... { objfile <in-memory@0x7000000> ((struct objfile *) 0x5258250) { ((struct compunit_symtab *) 0x4f0afb0) debugformat DWARF 4 producer GNU C17 9.3.1 20200408 (Red Hat 9.3.1-2) -mtune=generic -march=x86-64 -g -fno-stack-protector -fpic name jit-elf-solib.c dirname /tmp/binutils-gdb/build/gdb/testsuite blockvector ((struct blockvector *) 0x5477850) user ((struct compunit_symtab *) (null)) { symtab /tmp/binutils-gdb/build/gdb/testsuite/../../../src/gdb/testsuite/gdb.base/jit-elf-solib.c ((struct symtab *) 0x4f0b030) fullname (null) linetable ((struct linetable *) 0x5477880) } } } I've added a new test that checks the new in-memory file names are generated correctly, and also checks that the in-memory JIT files can be dumped back out using 'dump binary memory'.
Diffstat (limited to 'gdb/testsuite/lib')
-rw-r--r--gdb/testsuite/lib/gdb.exp22
-rw-r--r--gdb/testsuite/lib/jit-elf-helpers.exp12
2 files changed, 31 insertions, 3 deletions
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 44cc28b..ae3a46c 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -8164,6 +8164,28 @@ proc cmp_file_string { file str msg } {
}
}
+# Compare FILE1 and FILE2 as binary files. Return 0 if the files are
+# equal, otherwise, return non-zero.
+
+proc cmp_binary_files { file1 file2 } {
+ set fd1 [open $file1]
+ fconfigure $fd1 -translation binary
+ set fd2 [open $file2]
+ fconfigure $fd2 -translation binary
+
+ set blk_size 1024
+ while {true} {
+ set blk1 [read $fd1 $blk_size]
+ set blk2 [read $fd2 $blk_size]
+ set diff [string compare $blk1 $blk2]
+ if {$diff != 0 || [eof $fd1] || [eof $fd2]} {
+ close $fd1
+ close $fd2
+ return $diff
+ }
+ }
+}
+
# Does the compiler support CTF debug output using '-gctf' compiler
# flag? If not then we should skip these tests. We should also
# skip them if libctf was explicitly disabled.
diff --git a/gdb/testsuite/lib/jit-elf-helpers.exp b/gdb/testsuite/lib/jit-elf-helpers.exp
index b699917..80ba769 100644
--- a/gdb/testsuite/lib/jit-elf-helpers.exp
+++ b/gdb/testsuite/lib/jit-elf-helpers.exp
@@ -74,9 +74,13 @@ proc compile_jit_elf_main_as_so {main_solib_srcfile main_solib_binfile options}
# Compile jit-elf-solib.c as a shared library in multiple copies and
# upload them to the target.
#
+# OPTIONS_LIST is a list of additional options to pass through to
+# gdb_compile_shlib.
+#
# On success, return a list of target path to the shared libraries.
# On failure, return -1.
-proc compile_and_download_n_jit_so {jit_solib_basename jit_solib_srcfile count} {
+proc compile_and_download_n_jit_so {jit_solib_basename jit_solib_srcfile \
+ count {options_list {}}} {
global jit_load_address jit_load_increment
set binfiles_target {}
@@ -93,9 +97,11 @@ proc compile_and_download_n_jit_so {jit_solib_basename jit_solib_srcfile count}
# compiled shared library against a fixed base address. Combined
# with mapping the resulting binary to the same fixed base it allows
# to dynamically execute functions from it without any further adjustments.
+ set fname [format "jit_function_%04d" $i]
set options [list \
- additional_flags=-DFUNCTION_NAME=[format "jit_function_%04d" $i] \
- text_segment=$addr]
+ ${options_list} \
+ additional_flags=-DFUNCTION_NAME=$fname \
+ text_segment=$addr]
if { [gdb_compile_shlib ${jit_solib_srcfile} ${binfile} \
$options] != "" } {
set f [file tail $binfile]