aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
AgeCommit message (Collapse)AuthorFilesLines
2022-11-18gdb/testsuite: rewrite gdb.cp/call-method-register.exp with dwarf assemblerAndrew Burgess2-76/+80
Convert the gdb.cp/call-method-register.exp test to make use of the DWARF assembler. The existing gdb.cp/call-method-register.exp test relies on a GCC extension - forcing a local variable into a particular named register. This means that the test will only work with Clang, and, as we have to name the register into which the variable will be placed, will only work for those targets where we've selected a suitable register, currently this is x86-64, i386, and ppc64. By switching to the DWARF assembler, the test will work with gcc and clang, and should work on most, if not all, architectures. The test creates a small structure, something that can fit within a register, and then tries to call a method on the structure from within GDB. This should fail because GDB can't take the address of the in register structure (for the `this` pointer). As the test is for a failure case, then we don't really care _which_ register the structure is in, and I take advantage of this for the DWARF assembler test, I just declare that the variable is in DW_OP_reg0, whatever that might be. I've tested the new test on x86-64, ppc, aarch64, and risc-v, and the test runs, and passes on all these architectures, which is already more than we used to cover. Additionally, on x86-64, I've tested with Clang and gcc, and the test runs and passed with both compilers. Reviewed-By: Lancelot SIX <lancelot.six@amd.com>
2022-11-18gdb/testsuite: fix gdb.debuginfod/fetch_src_and_symbols.exp with ClangAndrew Burgess2-2/+10
The gdb.debuginfod/fetch_src_and_symbols.exp test is showing a single failure when run with some older versions of Clang, e.g. 9.0.1. The problem appears to be with Clang's generated line table. The test source looks like this: int main() { asm ("main_label: .globl main_label"); return 0; } In GDB, when we 'start', we expect to stop at the 'return 0;' line. This is the behaviour when the compiler is gcc, or later versions of Clang. However, with Clang 9.0.2, I see GDB stop on the 'asm' line. In this commit I'll fix this issue by placing a breakpoint on the return line, and then using gdb_continue_to_breakpoint to ensure we have stopped in the correct place. Of course, using gdb_continue_to_breakpoint will only work if we are not already stopped at the breakpoint location, so I've added some filler work before the 'return 0;' line. With this done we can use gdb_continue_to_breakpoint in all cases. As a result of adding the new filler work, one of the later tests, that used the 'list' command, no longer see the correct expected output (the top line of the source file is no longer included in the output). I've fixed this by listing a known specific line, the test is checking that GDB managed to find the source file, it doesn't matter which source line we list, as long as we can list something.
2022-11-18gdb/testsuite: rename source file gdb.debuginfod/main.cAndrew Burgess2-1/+1
The test gdb.debuginfod/fetch_src_and_symbols.exp uses a source file named main.c. I can't see any particular reason why the file is named as such. Usually test source files are named after the test script. This commit just renames the source file inline with the test script, and updates the call to standard_testfile (removing the reference to main.c). There's no particular reason for this change other than seeing the file named main.c made me thing that the source file must be shared with some other test (it isn't). There should be no change in what is tested after this commit.
2022-11-18gdb/testsuite: add (and use) a new build-id compile optionAndrew Burgess2-2/+11
I noticed that the gdb.debuginfod/fetch_src_and_symbols.exp test was failing when run with Clang as the compiler. This test relies on the compiled binaries having a build-id within them. For GCC, really GNU ld, the default is to always include a build-id. When compiling with Clang though, the default is for no build-id. I did consider *always* turning on the build-id feature when the compiler is Clang, but that felt a little weird. Instead, I propose that we add a new 'build-id' compiler option to gdb_compile, this flag indicates that the test _requires_ a build-id. In gcc_compile we can then add the required flags if the compiler is Clang so that we do get a build-id. With this change the gdb.debuginfod/fetch_src_and_symbols.exp test now (mostly) passes with Clang 9.0.1 and 15.0.2, and still passes with gcc. The 'mostly' part is an unrelated issue, and will be addressed in a later commit in this series. Reviewed-By: Lancelot SIX <lancelot.six@amd.com>
2022-11-18gdb/testsuite: fix gdb.compile/compile-ops.exp with clangAndrew Burgess2-11/+15
I noticed that the gdb.compile/compile-ops.exp test was failing when run with Clang as the compiler. This test makes use of the DWARF assembler, and, it turns out, uses a technique which is not portable to Clang. This problem is described in the comment on the function_range proc in lib/dwarf.exp, the explanation is: # If the compiler is gcc, we can do the following to get function start # and end address too: # # asm ("func_start: .globl func_start"); # static void func (void) {} # asm ("func_end: .globl func_end"); # # however, this isn't portable, because other compilers, such as clang, # may not guarantee the order of global asms and function. The code # becomes: # # asm ("func_start: .globl func_start"); # asm ("func_end: .globl func_end"); # static void func (void) {} These start/end labels are used for computing the function start, end, and length. The portable solution is to place a label within the function, like this: # int main (void) # { # asm ("main_label: .globl main_label"); # return 0; # } And make use of 'proc function_range' (from lib/dwarf.exp). So, that's what I do in this commit. One consequence of this change is that we need to compile the source file, and have it loaded into a GDB session, before calling function_range, so I've added an early call to prepare_for_testing. Additionally, this test script was generating the DWARF assembler into a file called gdbjit-ops.S, I suspect a copy and paste issue there, so I've switched this to use compile-ops-dbg.S instead, which is more inline with what other DWARF assembler tests do. The only other change, which might be a problem, is that I also deleted these two lines from the source file: asm (".section \".text\""); asm (".balign 8"); These lines were setting the alignment of the .text section. What I don't know is whether this was significant or not. If it is significant, then I can't see why. On x86-64, the test still passes fine without these lines, but that doesn't mean the test wont start failing on some other architecture. Still, I figure, lets remove them, then, if/when we find a test that starts failing, we can add the lines back, along with an explanation for why the extra alignment is required. But, if people would prefer to be more conservative, then I'm happy to just add the lines back. Reviewed-By: Lancelot SIX <lancelot.six@amd.com>
2022-11-18gdb/testsuite: fix gdb.trace/unavailable-dwarf-piece.exp with ClangAndrew Burgess1-2/+2
I noticed that the test gdb.trace/unavailable-dwarf-piece.exp was failing when run with Clang. Or rather, the test was not running as the test executable failed to compile. The problem is that Clang was emitting this warning: warning: argument unused during compilation: '-fdiagnostics-color=never' [-Wunused-command-line-argument] This warning is emitted when compiling the assembler file generated by the DWARF assembler. Most DWARF assembler tests generate the assembler file into a file with the '.S' extension. However, this particular test uses a '.s' extension. Now a .S file will be passed through the preprocessor, while a .s will be sent straight to the assembler. My guess is that Clang doesn't support the -fdiagnostics-color=never option for the assembler, but does for the preprocessor. That's a little annoying, but easily worked around. We don't care if our assembler file is passed through the preprocessor, so, in this commit, I just change the file extension from .s to .S, and the problem is fixed. Currently, the unavailable-dwarf-piece.exp script names the assembler file using standard_output_file, in this commit I've switched to make use of standard_testfile, as that seems to be the more common way of doing this sort of thing. With these changes the test now passes with Clang 9.0.1 and 15.0.2, and also still passes with gcc. Reviewed-By: Lancelot SIX <lancelot.six@amd.com>
2022-11-18gdb/testsuite: don't avoid DWARF assembler tests with ClangAndrew Burgess2-11/+0
Two tests make the claim that the DWARF assembler requires gcc, however, this isn't true. I think at one point, when the DWARF assembler was first added, we did use some techniques that were not portable (see the comments in lib/dwarf.exp on function_range for details), however, I think most DWARF assembler tests will now work fine with Clang. The two tests that I modify in this commit both work fine with Clang, at least, I've tested with Clang 9.0.1 and 15.0.2, and don't see any problems, so I'm removing the early return logic that stops these tests from running with Clang. Reviewed-By: Lancelot SIX <lancelot.six@amd.com>
2022-11-17PowerPC, fix gdb.base/retval-large-struct.expCarl Love1-1/+7
Support for printining non-trivial return values was recently added in commit: commit a0eda3df5b750ae32576a9be092b361281a41787 Author: Carl Love <cel@us.ibm.com> Date: Mon Nov 14 16:22:37 2022 -0500 PowerPC, fix support for printing the function return value for non-trivial values. The functionality can now be used to fix gdb.base/retval-large-struct.exp. The test just needs to be compiled with -fvar-tracking to enable GDB to determine the address off the return buffer when the function is called. The current output from the test: 34 return big_struct; (gdb) PASS: gdb.base/retval-large-struct.exp: continue to breakpoint: Break in print_large_struct finish warning: Cannot determine the function return value. Try compiling with -fvar-tracking. Run till exit from #0 return_large_struct () at binutils-gdb-current/gdb/testsuite/gdb.base/retval-large-struct.c:34 main (argc=1, argv=0x7fffffffcd58) at binutils-gdb-current/gdb/testsuite/gdb.base/retval-large-struct.c:44 44 return 0; Value returned has type: struct big_struct_t. Cannot determine contents (gdb) FAIL: gdb.base/retval-large-struct.exp: finish from return_large_struct testcase binutils-gdb-current/gdb/testsuite/gdb.base/retval-large-struct.exp completed in 1 seconds This patch adds the command line argument -fvar-tracking to enable gdb to determine the return vaule and thus fixing the test. Patch tested on Power 10 with no regressions.
2022-11-17gdb: new $_inferior_thread_count convenience variableAndrew Burgess2-0/+21
Add a new convenience variable $_inferior_thread_count that contains the number of live (non-exited) threads in the current inferior. This can be used in command scripts, or breakpoint conditions, etc to adjust the behaviour for multi-threaded inferiors. This value is only stable in all-stop mode. In non-stop mode, where new threads can be started, and existing threads exit, at any time, this convenience variable can give a different value each time it is evaluated.
2022-11-17gdb/testsuite: fix failure in gdb.python/py-send-packet.expAndrew Burgess1-3/+3
While working on another patch I noticed that, when run on an AArch64 target, the test gdb.python/py-send-packet.exp was failing: Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/build/gdb/testsuite/outputs/gdb.python/py-send-packet/py-send-packet.py", line 106, in run_auxv_send_packet_test assert string == expected_result AssertionError Error while executing Python code. (gdb) FAIL: gdb.python/py-send-packet.exp: call python run_auxv_send_packet_test function The test uses 'maint packet ...' to send a packet to gdbserver, and then captures the output in TCL. This output is then passed through to a Python function, which performs some actions using the Python API, and compares the results from the Python API to the results captured in TCL from 'maint packet ...'. The problem is that the output captured in TCL contains lots of things like '\x000', when this is passed through to Python the '\x' causes this to be treated as an escape code, which isn't what we want - we want the actual string "\x000". So, in the TCL part of the test we were expanding '\x' to '\\x', this seemed to work fine for my testing on x86-64. However, on AArch64 what I see is that the results from 'maint packet ...' contain a literal '\' character followed by a literal 'x' character. When GDB prints this in the 'maint packet' output, GDB escapes the '\' for us, thus we get '\\x' printed by 'maint packet'. However, now our TCL test script kicks in and tries to "fix" the '\x', this means we now have '\\\x', which isn't correct. The problem is that in the TCL script we are too restrictive, we expand '\x' to '\\x', but really, we should be expanding all '\' characters, regardless of what follows them. This is what this patch does. After this the gdb.python/py-send-packet.exp test passes on AArch64 for me.
2022-11-17gdb/fortran/testsuite: print values and types of string variablesAndrew Burgess2-0/+107
While looking through the Fortran tests, I couldn't find a test of GDB printing the value and type of a Fortran string defined using the 'character*SIZE' notation. This works fine in GDB right now, but I thought it wouldn't hurt to have a test for this, so this commit adds such a test. The test also includes printing a string that includes some embedded special characters: \n \r \t \000 - that's right, as Fortran strings are stored as an address and length, it is fine to include an embedded null, so this test includes an example of that. Standard Fortran doesn't support backslash escape sequences within strings, the special characters must be generated using the `achar` function. However, when GDB prints the strings we currently print using the standard C like backslash sequences. I'm not currently proposing to change that behaviour, the backslash sequences are more compact than the standard Fortran way of doing things, and are so widely used that I suspect most Fortran programmers will understand them.
2022-11-17[gdb/testsuite] Fix DUPLICATE in gdb.arch/ppc-fp.expTom de Vries1-2/+2
I noticed: ... DUPLICATE: gdb.arch/ppc-fp.exp: next ... Fix this by adding unique test names. Tested on powerpc64le-linux.
2022-11-16[gdb/testsuite] Use gdb_gcore_cmd in gdb.threads/gcore-thread.expTom de Vries1-1/+1
I noticed a plain gcore command in test-case gdb.threads/gcore-thread.exp: ... gdb_test "gcore $core0file" "Saved corefile .*" \ "save a zeroed-threads corefile" ... Use gdb_gcore_cmd instead. Tested on x86_64-linux.
2022-11-16[gdb/testsuite] Modernize gdb.arch/i386-biarch-core.expTom de Vries2-26/+21
I noticed in test-case gdb.arch/i386-biarch-core.exp that we run into the completion limit for "complete set gnutarget": ... set gnutarget vms-libtxt^M set gnutarget *** List may be truncated, max-completions reached. ***^M (gdb) PASS: gdb.arch/i386-biarch-core.exp: complete set gnutarget ... Fix this by using get_set_option_choices. Also use get_set_option_choices for "complete set architecture i386", which required extending get_set_option_choices to accept a second argument, such that we can do: ... set archs [get_set_option_choices "set architecture" "i386"] ... because this returns an empty list: ... set archs [get_set_option_choices "set architecture i386"] ... because it does "complete set architecture i386 ". Also clean up the explicit gdb_exit/gdb_start and use clean_restart instead. Tested on x86_64-linux.
2022-11-16[gdb/testsuite] Fix gdb.arch/ppc64-symtab-cordic.exp without bzip2Tom de Vries3-8/+32
After de-installing bzip2, I run into: ... Running ppc64-symtab-cordic.exp ... sh: bzip2: command not found PATH: gdb.arch/ppc64-symtab-cordic.exp: failed bzip2 for \ src/gdb/testsuite/gdb.arch/cordic.ko.bz2 ... Fix these by: - using remote_exec instead of catch system, and - using file tail in the untested message. I've tried making output redirection work with remote_exec, but that seems to be broken, so we now: - copy the file $f.bz2 into the desired location $dir/$f.bz2, and - decompress the bz2 file using "bzip2 -df $dir/$f.bz2", resulting in a file $dir/$f. Factor out new function decompress_bz2 to make the test-case less verbose, and also use it in gdb.arch/i386-biarch-core.exp. Tested on x86_64-linux, without and with bzip2 installed.
2022-11-15Fix crash in ada_print_typeTom Tromey4-0/+110
The "varstring" paramter to ada_print_type can be null, but one spot failed to check this. This could cause a crash in some situations. As this is Ada-specific, and we've been using it internally at AdaCore for a while, I am going to push it.
2022-11-15gdb/testsuite: get_set_option_choices: expect \r\n after each itemSimon Marchi1-2/+7
I get some random failures since commit 8d45c3a82a0e ("[gdb/testsuite] Set completions to unlimited in get_set_option_choices"), which can be reproduced with: $ make check-read1 TESTS="gdb.base/parse_number.exp" For instance: set architecture A^M Ambiguous item "A".^M (gdb) FAIL: gdb.base/parse_number.exp: arch=A: set architecture A The problem is the regexp in get_set_option_choices, it is possible that is only matches part of a completion result. With check-read1, that is always one letter. Fix this by expecting the \r\n at the end of the line, so we only match entire results. Use ^ in match patterns to ensure we don't miss any output. Approved-By: Tom de Vries <tdevries@suse.de> Change-Id: Ib1733737feab7dde0f7095866e089081a891054e
2022-11-15[gdb/testsuite] Normalize gdbserver path nameTom de Vries2-5/+4
Currently for the target board remote-gdbserver-on-localhost we use the gdbserver file on build, using a file name which includes "/../". Fix this by using a normalized file name instead. This allows us to be more restrictive about which files REMOTE_TARGET_USERNAME can access: ... - remote_exec build "chmod go-rx $objdir/outputs" + remote_exec build "chmod go-rx $objdir" ... Tested on x86_64-linux.
2022-11-15[gdb/testsuite] Fix gdb.base/jit-elf-so.exp for remote targetTom de Vries1-4/+7
With test-case gdb.base/jit-elf-so.exp and target board remote-gdbserver-on-localhost (using REMOTE_TARGET_USERNAME) we run into some failures. Fix these by: - setting jit_libname with the name as returned by gdb_load_shlib - allowing the libraries to be prefixed with the remote target directory. Tested on x86_64-linux. Co-Authored-by: Ivan Tetyushkin <ivan.tetyushkin@syntacore.com>
2022-11-15[gdb/testsuite] Fix gdb.base/jit-reader-exec.exp for remote targetTom de Vries1-5/+9
With test-case gdb.base/jit-reader-exec.exp and target board remote-gdbserver-on-localhost (using REMOTE_TARGET_USERNAME) we run into some failures. Fix this by adding the missing gdb_remote_download. Tested on x86_64-linux. Co-Authored-by: Ivan Tetyushkin <ivan.tetyushkin@syntacore.com>
2022-11-15[gdb/testsuite] Fix gdb.base/info-shared.exp for remote targetTom de Vries1-2/+9
With test-case gdb.base/info-shared.exp and target board remote-gdbserver-on-localhost (using REMOTE_TARGET_USERNAME) we run into some failures. Fix these by adding the missing gdb_load_shlib. Tested on x86_64-linux. Co-Authored-by: Ivan Tetyushkin <ivan.tetyushkin@syntacore.com>
2022-11-15[gdb/testsuite] Fix gdb.base/solib-vanish.exp for remote targetTom de Vries1-4/+17
When running test-case gdb.base/solib-vanish.exp with target board remote-gdbserver-on-localhost (using REMOTE_TARGET_USERNAME) we run into some failures. Fix these by adding the missing gdb_load_shlib. Tested on x86_64-linux. Co-Authored-by: Ivan Tetyushkin <ivan.tetyushkin@syntacore.com>
2022-11-15[gdb/testsuite] Fix gdb.base/infcall-exec.exp for remote targetTom de Vries2-3/+55
When running test-case gdb.base/infcall-exec.exp with target board remote-gdbserver-on-localhost (using REMOTE_TARGET_USERNAME) we run into: ... (gdb) call (int) execlp ("$outputs/gdb.base/infcall-exec/infcall-exec2", \ "$outputs/gdb.base/infcall-exec/infcall-exec2", (char *)0)^M $1 = -1^M (gdb) FAIL: gdb.base/infcall-exec.exp: call execlp ... Fix this by using just: ... (gdb) call (int) execlp ("infcall-exec2", "infcall-exec2", (char *)0)^M ... and using putenv ("PATH=...") to allow infcall-exec to exec infcall-exec2 if it's available alongside. Also fix the exec name in the test-case, such that we can successfully run the test-case: ... $ ./outputs/gdb.base/infcall-exec/infcall-exec PATH SETTING: 'PATH=./outputs/gdb.base/infcall-exec' $ ... Tested on x86_64-linux. Co-Authored-by: Ivan Tetyushkin <ivan.tetyushkin@syntacore.com>
2022-11-15[gdb/testsuite] Fix gdb.base/print-file-var.exp for remote targetTom de Vries2-17/+29
When running test-case gdb.base/print-file-var.exp with target board remote-gdbserver-on-localhost (using REMOTE_TARGET_USERNAME) we run into some failures. Fix these by using the name of a shared lib as returned by gdb_load_shlib. This required splitting up the gdb_load_shlib functionality, which is now defined as: ... proc gdb_load_shlib { file } { set dest [gdb_download_shlib $file] gdb_locate_shlib $file return $dest } ... such that we can do gdb_download_shlib before gdb is started. Tested on x86_64-linux. Co-Authored-by: Ivan Tetyushkin <ivan.tetyushkin@syntacore.com>
2022-11-15[gdb/testsuite] Add REMOTE_TARGET_USERNAME in remote-gdbserver-on-localhost.expTom de Vries1-2/+27
As reported here ( https://sourceware.org/pipermail/gdb-patches/2022-October/193147.html ) a number of test-cases fails with a remote target setup, for instance test-case gdb.base/print-file-var.exp. So, why don't we see these fails with our remote target boards in gdb/testsuite/boards, say remote-gdbserver-on-localhost.exp? The problem is that the target board uses the same machine and user for both (by-definition-local) build and remote target, and when using absolute pathnames to refer to files on build, we can access those files on target, which in a real remote target setup wouldn't be the case: we'd have to download them to target first, and then the filename would also be different. For aforementioned test-case, this happens when the name of a shared library is passed as absolute file name to gcc: ... gcc ... -DSHLIB_NAME="$outputs/gdb.base/print-file-var/\ print-file-var-lib2-hidden0-dlopen1-version_id_main0_c.so" ... Make these problems visible with remote-gdbserver-on-localhost.exp by adding an option to specify a test account (still on the same machine) using REMOTE_TARGET_USERNAME. We make sure by restricting file permissions, that the test account cannot see the build files on the $USER account, and that the $USER account cannot see the target files on the test account. And so we can reproduce the reported fails: ... $ cd build/gdb $ tc="gdb.base/print-file-var.exp" $ tb="--target_board remote-gdbserver-on-localhost" $ tbu="REMOTE_TARGET_USERNAME=remote-target" $ make check RUNTESTFLAGS="$tb $tbu $tc" ... FAIL: gdb.base/print-file-var.exp: lang=c: hidden=0: dlopen=1: \ version_id_main=0: continue to STOP marker ... Tested on x86_64-linux. Reported-by: Ivan Tetyushkin <ivan.tetyushkin@syntacore.com>
2022-11-15[gdb/testsuite] Fix gdb.base/info_sources_2.exp for remote targetTom de Vries1-0/+12
With test-case gdb.base/info_sources_2.exp and target board remote-gdbserver-on-localhost (using REMOTE_TARGET_USERNAME) we run into some failures. Fix these by adding the missing gdb_load_shlib. Tested on x86_64-linux.
2022-11-15[gdb/testsuite] Fix gdb.base/foll-exec.exp for remote targetTom de Vries3-0/+12
When running test-case gdb.base/foll-exec.exp with target board remote-gdbserver-on-localhost.exp, I run into: ... (gdb) PASS: gdb.base/foll-exec.exp: insert first exec catchpoint continue^M Continuing.^M [Inferior 1 (process 4476) exited normally]^M (gdb) FAIL: gdb.base/foll-exec.exp: continue to first exec catchpoint (the program e\ xited) ... The problem is that the foll-exec executable expects the exec-ed executable execd-prog alongside it, but it's missing. Fix this by adding the missing gdb_remote_download. Likewise in a few other test-cases. Tested on x86_64-linux.
2022-11-15[gdb/testssuite] Skip aarch64 in skip_gdbserver_test if no xml supportTom de Vries1-0/+1
On aarch64-linux, with a gdb build without libexpat, so without xml support, I run into: ... (gdb) builtin_spawn attach-no-multi-process^M attach 26808^M Attaching to Remote target^M warning: Can not parse XML target description; XML support was disabled at \ compile time^M Reading symbols from attach-no-multi-process...^M Remote 'g' packet reply is too long (expected 788 bytes, got 796 bytes): ... ^M ... The test-case checks for skip_gdbserver_tests and that one contains a check for xml support: ... # If GDB is lack of XML support, and targets, like arm, have # multiple target descriptions, GDB doesn't know which target # description GDBserver uses, and may fail to parse 'g' packet # after connection. if { [gdb_skip_xml_test] && ([istarget "arm*-*-linux*"] || [istarget "mips*-*-linux*"] || [istarget "powerpc*-*-linux*"] || [istarget "s390*-*-linux*"] || [istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"]) } { return 1 } ... but it doesn't trigger because aarch64 is missing. Fix this by adding istarget "aarch64*-*-linux*". Tested on aarch64-linux. Approved-By: Luis Machado <luis.machado@arm.com>
2022-11-14PowerPC, fix support for printing the function return value for non-trivial ↵Carl Love2-1/+16
values. Currently, a non-trivial return value from a function cannot currently be reliably determined on PowerPC. This is due to the fact that the PowerPC ABI uses register r3 to store the address of the buffer containing the non-trivial return value when the function is called. The PowerPC ABI does not guarantee the value in register r3 is not modified in the function. Thus the value in r3 cannot be reliably used to obtain the return addreses on exit from the function. This patch adds a new gdbarch method to allow PowerPC to access the value of r3 on entry to a function. On PowerPC, the new gdbarch method attempts to use the DW_OP_entry_value for the DWARF entries, when exiting the function, to determine the value of r3 on entry to the function. This requires the use of the -fvar-tracking compiler option to compile the user application thus generating the DW_OP_entry_value in the binary. The DW_OP_entry_value entries in the binary file allows GDB to resolve the DW_TAG_call_site entries. This new gdbarch method is used to get the return buffer address, in the case of a function returning a nontrivial data type, on exit from the function. The GDB function should_stop checks to see if RETURN_BUF is non-zero. By default, RETURN_BUF will be set to zero by the new gdbarch method call for all architectures except PowerPC. The get_return_value function will be used to obtain the return value on all other architectures as is currently being done if RETURN_BUF is zero. On PowerPC, the new gdbarch method will return a nonzero address in RETURN_BUF if the value can be determined. The value_at function uses the return buffer address to get the return value. This patch fixes five testcase failures in gdb.cp/non-trivial-retval.exp. The correct function return values are now reported. Note this patch is dependent on patch: "PowerPC, function ppc64_sysv_abi_return_value add missing return value convention". This patch has been tested on Power 10 and x86-64 with no regressions.
2022-11-14[gdb/testsuite] Run gdb.arch/ppc64-symtab-cordic.exp for --enable-targets=allTom de Vries1-8/+4
While looking at test-case gdb.arch/ppc64-symtab-cordic.exp I realized that the test-case is too restrictive here: ... if {![istarget "powerpc*"] || ![is_lp64_target]} { verbose "Skipping powerpc64 separate debug file symtab test." return } ... and can also be run on x86_64-linux, if "set arch powerpc:common64" is supported, which is the case if we've build gdb with --enable-targets=all. Fix this by instead checking if powerpc:common64 is in the completion list for "set arch". This allows us to remove the 'untested "powerpc:common64 is not supported"'. While we're at it, clean up the test-case by using clean_restart. Tested on x86_64-linux.
2022-11-14[gdb/testsuite] Handle with_set archTom de Vries1-2/+20
I realized that the more irregular output of show arch: ... (gdb) show arch^M The target architecture is set to "auto" (currently "i386").^M ... would be a problem for something like: ... with_set arch powerpc:common64 {} ... and indeed: ... (gdb) set arch powerpc:common64^M The target architecture is set to "powerpc:common64".^M (gdb) FAIL: gdb.base/foo.exp: set arch powerpc:common64 ... and: ... (gdb) set arch set to "auto" (currently "i386")^M Undefined item: "set".^M ... Fix this in with_set by handling this type of output. Tested on x86_64-linux.
2022-11-14[gdb/testsuite] Set completions to unlimited in get_set_option_choicesTom de Vries2-29/+35
In some test-case I tried to use get_set_option_choices "set architecture" and ran into max-completions: ... set architecture simple^M set architecture tomcat^M set architecture xscale^M set architecture *** List may be truncated, max-completions reached. ***^M (gdb) PASS: gdb.base/foo.exp: complete set architecture ... There's only one test-case using this currently: gdb.base/parse_number.exp, and it locally sets max-completions to unlimited. Fix this by: - factoring out a new proc with_set out of proc with_complaints, and - using it to temporarily set max-completions to unlimited in get_set_option_choice. Tested on x86_64-linux, by running test-cases that excercise get_set_option_choice and with_complaints.
2022-11-11[gdb/testsuite] Don't timeout on prompt in gdb_start_cmdTom de Vries1-0/+1
We're currently running into a timeout at: ... (gdb) start ^M Error in expression, near `1'.^M (gdb) UNTESTED: gdb.ada/start.exp: start failed to land inside the right \ procedure ... due to the fact that gdb_start_cmd doesn't handle a prompt as reaction to the start command. Fix this by handling the prompt. Reduces execution time of the test-case from 1m1s to 1s. Tested on x86_64-linux.
2022-11-11[gdb/testsuite] Better error checking in has_hw_wp_supportTom de Vries1-2/+10
With gdb 12.1, on powerpc64le I ran into ERRORs related to has_hw_wp_support usage, which was already fixed on trunk by commits: - 13f72372413 ("gdb/testsuite: fix gdb.base/break-idempotent.exp on ppc"), and - 01a32ee0b8c ("PowerPC, fix gdb.base/watchpoint.exp on Power 9") While looking into these ERRORs and the commits that fix them, it occurred to me that while the commits fix the root cause, the failure mode is not great. The test-cases expect a running instance of gdb upon return, which is not there, so there's an long stream of ERRORs generated as a result. Fix this at the start of has_hw_wp_support, by (instead of accomodating a running gdb instance by calling gdb_exit), checking whether it's called without a running gdb instance, and erroring out otherwise. This way, there's just one error. I also noticed that in case we do an early exit due to !runto_main, we don't clean up, so copy the missing cleanups (gdb_exit and $obj file deletion) from the regular exit. Tested on x86_64-linux, using has_hw_wp_support for x86_64 in skip_hw_watchpoint_tests.
2022-11-11gdb, btrace: Fix rn-dl-bind.exp for new icx remark.Felix Willgerodt1-1/+1
When running the test with the latest Intel compiler: Running gdb/gdb/testsuite/gdb.btrace/rn-dl-bind.exp ... gdb compile failed, icpx: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated] The test doesn't seem to test something specifically for C++, so I removed the C++ compilation option. Alternatively we could rename rn-dl-bind.exp.c to rn-dl-bind.exp.cc. Signed-off-by: Felix Willgerodt <felix.willgerodt@intel.com>
2022-11-11gdb/testsuite: disable gdb.cp/call-method-register.exp when not using gccBruno Larsen1-0/+5
The test gdb.cp/call-method-register.exp assumes that the class will be placed on a register. However, this keyword has been deprecated since C++11, and Clang, for instance, does not feel the need to follow it. Since this test is not usable without this working, this commit marks this test as untested. Approved-by: Tom Tromey <tom@tromey.com>
2022-11-11gdb/testsuite: remove XFAIL on gdb.cp/temargs.expBruno Larsen1-2/+4
gdb.cp/temargs.exp last 2 tests always setup an XFAILs, despite checking for old gcc versions. However, Clang does not fail in this test, turning into XPASSes and slighty annoying when comparing between compilers. To change this, make the xfails only happen if we using gcc. Approved-by: Tom Tromey <tom@tromey.com>
2022-11-11gdb/testsuite: disable some tests of gdb.cp/typeid.exp when using ClangBruno Larsen1-1/+9
Since Clang chooses to not add any debug information for base types, expecting it to be included with libraries' informations, gdb.cp/typeid.exp will always fail if the program hasn't started. This commit fixes that by making it so when using Clang, the base type variables aren't tested. Approved-by: Tom Tromey <tom@tromey.com>
2022-11-11gdb/testsuite: skip gdb.cp/anon-struct.exp when using ClangBruno Larsen1-0/+10
When Clang compiles anonymous structures, it does not add linkage names in their dwarf representations. This is compounded by Clang not adding linkage names to subprograms of those anonymous structs (for instance, the constructor). With these 2 things together, GDB is unable to refer to any of them, so there is no way to pass any of the tests of gdb.cp/anon-struct.exp Since this isn't a bug on Clang or GDB according to the DWARF specifications as DW_AT_name is optional for all DIEs, the test was marked as untested. Since I was already touching the file, I also added a comment at the top of the file explaining what it is testing for. Approved-by: Tom Tromey <tom@tromey.com>
2022-11-11gdb/testsuite: allow for Clang style destructors on gdb.cp/m-static.expBruno Larsen1-5/+6
when running gdb.cp/m-static.exp using Clang, we get the following failures: print test1.~gnu_obj_1^M $6 = {void (gnu_obj_1 * const)} 0x555555555470 <gnu_obj_1::~gnu_obj_1()>^M (gdb) FAIL: gdb.cp/m-static.exp: simple object instance, print destructor ptype test1.~gnu_obj_1^M type = void (gnu_obj_1 * const)^M (gdb) FAIL: gdb.cp/m-static.exp: simple object instance, ptype destructor print test1.'~gnu_obj_1'^M $7 = {void (gnu_obj_1 * const)} 0x555555555470 <gnu_obj_1::~gnu_obj_1()>^M (gdb) FAIL: gdb.cp/m-static.exp: simple object instance, print quoted destructor This is because the test is expecting an extra integer parameter on the destructor. Looking at the debuginfo, it seems that there is nothing actually wrong with this output, so these tests were changed to test multiple possible regexps. Approved-by: Tom Tromey <tom@tromey.com>
2022-11-11gdb/testsuite: add XFAIL to gdb.cp/derivation.exp when using ClangBruno Larsen1-0/+4
When running gdb.cp/derivation.exp using Clang, we get an unexpected failure when printing the type of a class with an internal typedef. This happens because Clang doesn't add accessibility information for typedefs inside classes (see https://github.com/llvm/llvm-project/issues/57608 for more info). To help with Clang testing, an XFAIL was added to this test. Approved-by: Tom Tromey <tom@tromey.com>
2022-11-11gdb/testsuite: account for clang's nested destructor calls on gdb.cp/mb-ctor.expBruno Larsen1-0/+18
When compiling virtual classes's destructors, two versions are compiled, one with a single parameter (this) and the other with 2 parameters (this and vtt). GCC's compilation makes it so either the version with 1 parameter or the one with 2 parameters is called, depending on whether the destructor is being called by the class itself or by an inherited class. On the test gdb.cp/mb-ctor.exp, this means that the breakpoint set at the destructor will be hit 4 times. Clang, on the other hand, makes the single-parameter version call the 2 parameter version, probably in an attempt to reduce the size of the resulting executable. This means that the gdb.cp/mb-ctor.exp will hit 6 breakpoints before finishing, and is the reason why this test was failing. To make this test stop failing, a compiler check is added and another "continue" instruction is issued to account for this difference. Approved-by: Tom Tromey <tom@tromey.com>
2022-11-11gdb/testsuite: enable running gdb.cp/classes.exp with clangBruno Larsen1-1/+35
When attempting to run the gdb.cp/classes.exp test using Clang++, the test fails to prepare with -Wnon-c-typedef-for-linkage like the previously fixed gdb.cp/class2.exp. Upon fixing this, the test shows 5 unexpected failures. One such failures is: ptype/r class class_with_public_typedef type = class class_with_public_typedef { private: int a; public: class_with_public_typedef::INT b; private: typedef int INT; } (gdb) FAIL: gdb.cp/classes.exp: ptype class class_with_public_typedef // wrong access specifier for typedef: private While g++ provided the following output: ptype/r class class_with_public_typedef type = class class_with_public_typedef { private: int a; public: class_with_public_typedef::INT b; typedef int INT; } (gdb) PASS: gdb.cp/classes.exp: ptype class class_with_public_typedef This error happens because Clang does not add DW_AT_accessibility to typedefs inside classes, and without this information GDB defaults to assuming the typedef is private. Since there is nothing that GDB can do about this, these tests have been set as xfails, and Clang bug 57608 has been filed. Bug: https://github.com/llvm/llvm-project/issues/57608 Approved-by: Tom Tromey <tom@tromey.com>
2022-11-11gdb/testsuite: ignore Non-C-typedefs for gdb.cp/class2.expBruno Larsen1-1/+8
When attempting to test gdb.cp/class2.exp using Clang, it fails to prepare with the following error: Executing on host: clang++ -fdiagnostics-color=never -Wno-unknown-warning-option -c -g -o /home/blarsen/Documents/fsf_build/gdb/testsuite/outputs/gdb.cp/class2/class20.o /home/blarsen/Documents/fsf_build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.cp/class2.cc (timeout = 300) builtin_spawn -ignore SIGHUP clang++ -fdiagnostics-color=never -Wno-unknown-warning-option -c -g -o /home/blarsen/Documents/fsf_build/gdb/testsuite/outputs/gdb.cp/class2/class20.o /home/blarsen/Documents/fsf_build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.cp/class2.cc /home/blarsen/Documents/fsf_build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.cp/class2.cc:53:14: warning: anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here [-Wnon-c-typedef-for-linkage] typedef class { ^ Dbase /home/blarsen/Documents/fsf_build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.cp/class2.cc:54:2: note: type is not C-compatible due to this member declaration public: ^~~~~~~ /home/blarsen/Documents/fsf_build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.cp/class2.cc:58:3: note: type is given name 'Dbase' for linkage purposes by this typedef declaration } Dbase; ^ 1 warning generated. gdb compile failed, /home/blarsen/Documents/fsf_build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.cp/class2.cc:53:14: warning: anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here [-Wnon-c-typedef-for-linkage] typedef class { ^ Dbase /home/blarsen/Documents/fsf_build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.cp/class2.cc:54:2: note: type is not C-compatible due to this member declaration public: ^~~~~~~ /home/blarsen/Documents/fsf_build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.cp/class2.cc:58:3: note: type is given name 'Dbase' for linkage purposes by this typedef declaration } Dbase; ^ 1 warning generated. UNTESTED: gdb.cp/class2.exp: failed to prepare This can be silenced by adding -Wno-non-c-typedef-for-linkage for Clang 11 or later. The test shows no failures with this change. Approved-by: Tom Tromey <tom@tromey.com>
2022-11-10gdb: make "start" breakpoint inferior-specificSimon Marchi3-0/+126
I saw this failure on a CI: (gdb) add-inferior [New inferior 2] Added inferior 2 (gdb) PASS: gdb.threads/vfork-multi-inferior.exp: method=non-stop: add-inferior inferior 2 [Switching to inferior 2 [<null>] (<noexec>)] (gdb) PASS: gdb.threads/vfork-multi-inferior.exp: method=non-stop: inferior 2 kill The program is not being run. (gdb) file /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/jammy-amd64/target_board/unix/tmp/tmp.GYATAXR8Ku/gdb/testsuite/outputs/gdb.threads/vfork-multi-inferior/vfork-multi-inferior-sleep Reading symbols from /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/jammy-amd64/target_board/unix/tmp/tmp.GYATAXR8Ku/gdb/testsuite/outputs/gdb.threads/vfork-multi-inferior/vfork-multi-inferior-sleep... (gdb) run & Starting program: /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/jammy-amd64/target_board/unix/tmp/tmp.GYATAXR8Ku/gdb/testsuite/outputs/gdb.threads/vfork-multi-inferior/vfork-multi-inferior-sleep (gdb) PASS: gdb.threads/vfork-multi-inferior.exp: method=non-stop: run inferior 2 inferior 1 [Switching to inferior 1 [<null>] (<noexec>)] (gdb) PASS: gdb.threads/vfork-multi-inferior.exp: method=non-stop: inferior 1 kill The program is not being run. (gdb) file /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/jammy-amd64/target_board/unix/tmp/tmp.GYATAXR8Ku/gdb/testsuite/outputs/gdb.threads/vfork-multi-inferior/vfork-multi-inferior Reading symbols from /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/jammy-amd64/target_board/unix/tmp/tmp.GYATAXR8Ku/gdb/testsuite/outputs/gdb.threads/vfork-multi-inferior/vfork-multi-inferior... (gdb) break should_break_here Breakpoint 1 at 0x11b1: file /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/jammy-amd64/target_board/unix/src/binutils-gdb/gdb/testsuite/gdb.threads/vfork-multi-inferior.c, line 25. (gdb) PASS: gdb.threads/vfork-multi-inferior.exp: method=non-stop: break should_break_here [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". start Temporary breakpoint 2 at 0x11c0: -qualified main. (2 locations) Starting program: /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/jammy-amd64/target_board/unix/tmp/tmp.GYATAXR8Ku/gdb/testsuite/outputs/gdb.threads/vfork-multi-inferior/vfork-multi-inferior [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Thread 2.1 "vfork-multi-inf" hit Temporary breakpoint 2, main () at /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/jammy-amd64/target_board/unix/src/binutils-gdb/gdb/testsuite/gdb.threads/vfork-multi-inferior-sleep.c:23 23 sleep (30); (gdb) FAIL: gdb.threads/vfork-multi-inferior.exp: method=non-stop: start inferior 1 What happens is: 1. We start inferior 2 with "run&", it runs very slowly, takes time to get to main 2. We switch to inferior 1, and run "start" 3. The temporary breakpoint inserted by "start" applies to all inferiors 4. Inferior 2 hits that breakpoint and GDB reports that hit To avoid this, breakpoints inserted by "start" should be inferior-specific. However, we don't have a nice way to make inferior-specific breakpoints yet. It's possible to make pspace-specific breakpoints (for example how the internal_breakpoint constructor does) by creating a symtab_and_line manually. However, inferiors can share program spaces (usually on particular embedded targets), so we could have a situation where two inferiors run the same code in the same program space. In that case, it would just not be possible to insert a breakpoint in one inferior but not the other. A simple solution that should work all the time is to add a condition to the breakpoint inserted by "start", to check the inferior reporting the hit is the expected one. This is what this patch implements. Add a test that does: - start in background inferior 1 that sleeps before reaching its main function (using a sleep in a global C++ object's constructor) - start inferior 2 with the "start" command, which also sleeps before reaching its main function - validate that we hit the breakpoint in inferior 2 Without the fix, we hit the breakpoint in inferior 1 pretty much all the time. There could be some unfortunate scheduling causing the test not to catch the bug, for instance if the scheduler decides not to schedule inferior 1 for a long time, but it would be really rare. If the bug is re-introduced, the test will catch it much more often than not, so it will be noticed. Reviewed-By: Bruno Larsen <blarsen@redhat.com> Approved-By: Pedro Alves <pedro@palves.net> Change-Id: Ib0148498a476bfa634ed62353c95f163623c686a
2022-11-10gdb: add prepare_reinflate/reinflate around print_frame_args in ↵Simon Marchi1-0/+8
info_frame_command_core I noticed this crash: $ ./gdb --data-directory=data-directory -nx -q \ testsuite/outputs/gdb.python/pretty-print-call-by-hand/pretty-print-call-by-hand \ -x testsuite/outputs/gdb.python/pretty-print-call-by-hand/pretty-print-call-by-hand.py \ -ex "b g" -ex r (gdb) info frame Stack level 0, frame at 0x7fffffffdd80: rip = 0x555555555160 in g (/home/simark/src/binutils-gdb/gdb/testsuite/gdb.python/pretty-print-call-by-hand.c:41); saved rip = 0x5555555551a3 called by frame at 0x7fffffffdda0 source language c. Arglist at 0x7fffffffdd70, args: mt=mytype is 0x555555556004 "hello world", depth=10 Fatal signal: Segmentation fault This is another case of frame_info being invalidated under a function's feet. The stack trace when the frame_info get invalidated looks like: ... many frames to pretty print the arg, that eventually invalidate the frame_infos ... #35 0x00005568d0a8ab24 in print_frame_arg (fp_opts=..., arg=0x7ffc3216bcb0) at /home/simark/src/binutils-gdb/gdb/stack.c:489 #36 0x00005568d0a8cc75 in print_frame_args (fp_opts=..., func=0x621000233210, frame=..., num=-1, stream=0x60b000000300) at /home/simark/src/binutils-gdb/gdb/stack.c:898 #37 0x00005568d0a9536d in info_frame_command_core (fi=..., selected_frame_p=true) at /home/simark/src/binutils-gdb/gdb/stack.c:1682 print_frame_args knows that print_frame_arg can invalidate frame_info objects, and therefore calls prepare_reinflate/reinflate. However, info_frame_command_core has a separate frame_info_ptr instance (it is passed by value / copy). So info_frame_command_core needs to know that print_frame_args can invalidate frame_info objects, and therefore needs to prepare_reinflate/reinflate as well. Add those calls, and enhance the gdb.python/pretty-print-call-by-hand.exp test to test that command. Reviewed-By: Bruno Larsen <blarsen@redhat.com> Change-Id: I9edaae06d62e97ffdb30938d364437737238a960
2022-11-10gdb/c++: Improve error messages in overload resolutionBruno Larsen2-0/+228
When resolving overloaded functions, GDB relies on knowing relationships between types, i.e. if a type inherits from another. However, some compilers may not add complete information for given types as a way to reduce unnecessary debug information. In these cases, GDB would just say that it couldn't resolve the method or function, with no extra information. The problem is that sometimes the user may not know that the type information is incomplete, and may just assume that there is a bug in GDB. To improve the user experience, we attempt to detect if the overload match failed because of an incomplete type, and warn the user of this. This commit also adds a testcase confirming that the message is only triggered in the correct scenario. This test was not developed as an expansion of gdb.cp/overload.cc because it needed the dwarf assembler, and porting all of overload.cc seemed unnecessary. Approved-By: Tom Tromey <tom@tromey.com>
2022-11-10gdb/testsuite: allowed for function_range to deal with mangled functionsBruno Larsen1-1/+1
When calling get_func_info inside a test case, it would cause failures if the function was printed using a C++ style mangled name. The current patch fixes this by allowing for mangled names along with the current rules. Approved-By: Tom Tromey <tom@tromey.com>
2022-11-10gdb/testsuite: Fix rtld-step-nodebugsym.expLancelot SIX1-1/+3
The test case introduced in bafcc335266 (Fix stepping in rtld without debug symbol) fails on some systems as reported by PR/29768. This can be seen if the system does not have debug info for the libc: (gdb) step^M Single stepping until exit from function main,^M which has no line number information.^M hello world[Inferior 1 (process 48203) exited normally]^M (gdb) PASS: gdb.base/rtld-step-nodebugsym.exp: step continue^M The program is not being run.^M (gdb) FAIL: gdb.base/rtld-step-nodebugsym.exp: continue until exit (the program is no longer running) Without glibc debug info, GDB steps until the program finishes, and then "gdb_continue_to_end" fails. As this test was designed to check that GDB does not crash in the "step" command, the continue does not carry real meaning to the test. Replace it by "print 0" so we still check that after the step command GDB is still alive, which is what we care about. Tested on Ubuntu-22.04 x86_64, with and without libc6-dbg. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29768 Approved-By: Simon Marchi <simon.marchi@efficios.com>
2022-11-09Fix stepping in rtld without debug symbolLancelot SIX2-0/+57
Commit be6276e0aed "Allow debugging of runtime loader / dynamic linker" introduced a small regression when stepping into the runtime loader / dynamic linker from function we do not have debug information for. This is reported in PR/29747. This can be shown by the following example (given by Simon Marchi in buzilla bug report): $ cat test.c #include <stdio.h> int main() { printf("Hi\n"); return 0; } $ gcc test.c -O0 -o test $ ./gdb -q -nx --data-directory=data-directory test -ex start -ex s Reading symbols from test... (No debugging symbols found in test) Temporary breakpoint 1 at 0x1151 Starting program: .../binutils-gdb/gdb/test [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Temporary breakpoint 1, 0x0000555555555151 in main () Single stepping until exit from function main, which has no line number information. /home/smarchi/src/binutils-gdb/gdb/infrun.c:6960:64: runtime error: member call on null pointer of type 'struct symbol' The crash happens here: #0 __sanitizer::Die () at ../../../../src/libsanitizer/sanitizer_common/sanitizer_termination.cpp:50 #1 0x00007ffff5dd7128 in __ubsan::__ubsan_handle_type_mismatch_v1_abort (Data=<optimized out>, Pointer=<optimized out>) at ../../../../src/libsanitizer/ubsan/ubsan_handlers.cpp:148 #2 0x000055556183e1a7 in process_event_stop_test (ecs=0x7fffffffccd0) at .../binutils-gdb/gdb/infrun.c:6960 #3 0x0000555561838ea4 in handle_signal_stop (ecs=0x7fffffffccd0) at .../binutils-gdb/gdb/infrun.c:6615 #4 0x000055556182f77b in handle_inferior_event (ecs=0x7fffffffccd0) at .../binutils-gdb/gdb/infrun.c:5866 When evaluating: 6956 if (execution_direction != EXEC_REVERSE 6957 && ecs->event_thread->control.step_over_calls == STEP_OVER_UNDEBUGGABLE 6958 && in_solib_dynsym_resolve_code (ecs->event_thread->stop_pc ()) 6959 && !in_solib_dynsym_resolve_code ( 6961 ecs->event_thread->control.step_start_function->value_block () 6962 ->entry_pc ())) we dereference, ecs->event_thread->control.step_start_function which is nullptr. This patch changes this condition so it evaluates to true if ecs->event_thread->control.step_start_function is nullptr since this matches the behaviour before be6276e0aed. Tested on ubuntu-22.04 x86_64. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29747 Reviewed-By: Bruno Larsen <blarsen@redhat.com> Approved-By: Kevin Buettner <kevinb@redhat.com>