aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2019-12-13Fix indentation in jit.cSimon Marchi2-56/+61
Many places in this file use spaces only for indentation. Fix them to conform to GNU style. gdb/ChangeLog: * jit.c: Fix indentation, replace spaces with tabs where applicable.
2019-12-13MSP430: Relax target glob for configuring GDBJozef Lawrynowicz2-1/+5
This enables support for the msp430-elfbare target being added to GCC. gdb/ChangeLog: 2019-12-13 Jozef Lawrynowicz <jozef.l@mittosystems.com> * configure.tgt: Match msp430-*-elf* targets when configuring GDB.
2019-12-12Change objfile::partial_symtabs to be a unique_ptrTom Tromey2-1/+6
A plan I had a while ago was to write the DWARF index in a worker thread. This is why objfile::partial_symtabs is a shared_ptr. However, it turned out that doing this required keeping the objfile alive as well. Now that objfiles are managed using shared_ptr, there's no need for partial_symtabs to be one as well, so this patch reverts that change. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * objfiles.h (struct objfile) <partial_symtabs>: Now a unique_ptr. Change-Id: I3d7831006c40d4c8f3173ba51c0c1b0a32021ae5
2019-12-12Manage objfiles with shared_ptrTom Tromey5-17/+123
This changes objfiles to be managed using a shared_ptr. shared_ptr is chosen because it enables the use of objfiles in background threads. The simplest way to do this was to introduce a new iterator that will return the underlying objfile, rather than a shared_ptr. (I also tried changing the rest of gdb to use shared_ptr, but this was quite large; and to using intrusive reference counting, but this also was tricky.) gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * progspace.h (objfile_list): New typedef. (class unwrapping_objfile_iterator) (struct unwrapping_objfile_range): Newl (struct program_space) <objfiles_range>: Change type. <objfiles>: Change return type. <add_objfile>: Change type of "objfile" parameter. <objfiles_list>: Now a list of shared_ptr. * progspace.c (program_space::add_objfile): Change type of "objfile". Update. (program_space::remove_objfile): Update. * objfiles.h (struct objfile) <~objfile>: Make public. * objfiles.c (objfile::make): Update. (objfile::unlink): Don't call delete. Change-Id: I6fb7fbf06efb7cb7474c525908365863eae27eb3
2019-12-12Move free_all_objfiles to program_spaceTom Tromey6-18/+31
This changes free_all_objfiles to be a method on program_space, in line with the other changes to treat program_space as a container for objfiles. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * symfile.c (symbol_file_clear): Update. * progspace.h (struct program_space) <free_all_objfiles>: Declare method. * progspace.c (program_space::free_all_objfiles): New method. * objfiles.h (free_all_objfiles): Don't declare. * objfiles.c (free_all_objfiles): Move to program_space. Change-Id: I908b549d2981b6005f7ca181fc0e6d24fc8b7b6f
2019-12-12Store objfiles on a std::listTom Tromey5-59/+45
This removes objfile::next and changes objfiles to be stored in a std::list. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * progspace.c (program_space::add_objfile) (program_space::remove_objfile): Update. (program_space::multi_objfile_p): Remove. * objfiles.h (struct objfile) <next>: Remove. * objfiles.c (objfile::objfile): Update. (put_objfile_before): Update. (unlink_objfile): Update. * progspace.h (object_files): Remove. (struct program_space) <objfiles_head>: Remove. <objfiles_list>: New member. <objfiles_range, objfiles_safe_range>: Change type. (objfiles): Change return type. (objfiles_safe): Update. (multi_objfile_p): Rewrite and inline. (object_files): Remove macro. Change-Id: Ib4430e3db6f9a390399924379a5c10426c514853
2019-12-12Introduce basic_safe_rangeTom Tromey2-5/+53
This introduces the basic_safe_range class, which can be used to create a basic_safe_iterator. This also changes basic_safe_iterator in two ways. First, it simplifies the constructor. This seemed unnecessarily complicated to me, and keeping it this way would prevent the second change... ... which is to add a second constructor for initializing the one-past-the-end iterator that is stored in basic_safe_iterator. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * gdbsupport/safe-iterator.h (basic_safe_iterator): Simplify. Add second constructor. (basic_safe_range): New class. Change-Id: Ib351ef6fd435129a5053c64e5561877e1459ab37
2019-12-12Remove MULTI_OBJFILE_PTom Tromey6-6/+24
This removes the MULTI_OBJFILE_P macro in favor of a method on the program space. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * progspace.c (program_space::multi_objfile_p): New method. * printcmd.c (info_symbol_command): Update. * maint.c (maintenance_translate_address): Update. * objfiles.h (MULTI_OBJFILE_P): Remove. * progspace.h (struct program_space) <multi_objfile_p>: New method. Change-Id: I2779e26ea8909078d63fea8f13bce94cab73948c
2019-12-12Introduce program_space::remove_objfileTom Tromey4-28/+36
This introduces a new method, program_space::remove_objfile, and changes the objfile destructor not to unlink an objfile from the program space's list. This is cleaner because, like the previous patch, it treats the program space more like a container for objfiles. Also, this makes it possible to keep an objfile alive even though it has been unlinked from the program space's list, which is important for processing in a worker thread. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * progspace.h (struct program_space) <remove_objfile>: Declare. * progspace.c (program_space::remove_objfile): New method. * objfiles.c (unlink_objfile): Remove. (objfile::unlink): Call remove_objfile. (objfile): Don't call unlink_objfile. Change-Id: I22f768827723dce21886fae9b3664532c8349e68
2019-12-12Introduce program_space::add_objfileTom Tromey4-45/+45
This introduces a new method, program_space::add_objfile, that adds an objfile to the program space's list of objfiles. It also changes the obfile's constructor so that linking an objfile into this list is not done here. The former is an improvement because it makes more sense to treat the program space as a container holding objfiles -- so manipulation of the list belongs there. The latter is not strictly needed, but seemed better both because it is removing a global side effect from a constructor, and for symmetry reasons, as a subsequent patch will remove unlinking from the destructor. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * progspace.h (struct program_space) <add_objfile>: Declare method. * progspace.c (program_space::add_objfile): New method. * objfiles.c (~objfile): Don't unlink objfile. (put_objfile_before): Remove. (add_separate_debug_objfile): Don't call put_objfile_before. (objfile::make): Call add_objfile. Set new_objfiles_available on the per-program-space data. Change-Id: I93e8525dda631cb89dcc2046a5c51c7c9f34ccfd
2019-12-12Make the objfile destructor privateTom Tromey8-28/+66
The idea behind this is that, in the long run, some code will need to be able to hold onto an objfile after it is unlinked from the program space. In particular, this is needed for some functionality to be moved to worker threads -- otherwise the objfile can be deleted while still in use. So, this makes ~objfile private, replacing it with an "unlink" method, making it more obvious which operation is intended at the calling points. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * symfile.c (syms_from_objfile_1): Use objfile_up. (syms_from_objfile_1, remove_symbol_file_command): Call unlink method. (reread_symbols): Use objfile_up. * solib.c (update_solib_list, reload_shared_libraries_1): Call unlink method. * objfiles.h (struct objfile) <~objfile>: Now private. <unlink>: New method. (struct objfile_deleter): New. (objfile_up): New typedef. * objfiles.c (objfile::unlink): New method. (free_objfile_separate_debug, free_all_objfiles) (objfile_purge_solibs): Use it. * jit.c (jit_unregister_code): Remove. (jit_inferior_exit_hook, jit_event_handler): Call unlink on objfile. * compile/compile-object-run.c (do_module_cleanup): Call unlink on objfile. * compile/compile-object-load.c (compile_object_load): Use objfile_up. Change-Id: I934bee70b26b8b24e1735828fb1e60fe8a05714f
2019-12-12Make add_separate_debug_objfile staticTom Tromey4-11/+26
This changes objfile::make to take a "parent" parameter, and makes add_separate_debug_objfile static. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * symfile.c (symbol_file_add_with_addrs): Pass "parent" to objfile::make. * objfiles.h (struct objjfile) <make>: No longer inline. (add_separate_debug_objfile): Don't declare. * objfiles.c (add_separate_debug_objfile): Now static. (objfile::make): Move from objfiles.h. Call add_separate_debug_objfile. Add "parent" parameter. Change-Id: I631f43bb71738dea6ae0697317bf8ef4a0db4617
2019-12-12Make the objfile constructor privateTom Tromey4-3/+22
This changes the objfile constructor to be private, changing the callers to use a factory method. This isn't perhaps strictly needed for the goal of this series -- changing the container model of objfiles -- but is a nice symmetry. gdb/ChangeLog 2019-12-12 Tom Tromey <tom@tromey.com> * symfile.c (symbol_file_add_with_addrs): Use objfile::make. * objfiles.h (struct objfile): Make constructor private. <make>: New static method. * jit.c (jit_object_close_impl): Update. Change-Id: I42e07bc80a88cf3322ace94ffe869ae5788bcb29
2019-12-12Replace xmalloc/xfree with vector in jit.cSimon Marchi2-5/+9
I'm currently studying that code and noticed this manual memory management, which could easily be replaced with a vector, so here it is. gdb/ChangeLog: * jit.c (jit_reader_try_read_symtab): Replace xmalloc/xfree with gdb::byte_vector.
2019-12-12Remove some calls to malloc_failureTom Tromey4-9/+8
I noticed a couple of spots that call malloc_failure, but that don't need to. * In xml-support.c, "concat" uses xmalloc, so cannot return NULL. * In utils.c, "buildargv" also uses xmalloc, so can only return NULL if the argument is empty. Tested by the buildbot. gdb/ChangeLog 2019-12-12 Tom Tromey <tromey@adacore.com> * xml-support.c (xml_fetch_content_from_file): Don't call malloc_failure. * utils.h (class gdb_argv): Remove malloc_failure comment. * utils.c (gdb_argv::reset): Don't call malloc_failure. Change-Id: I59483620deb6609ccf2f024d94a29113bb62d1a9
2019-12-12Ravenscar port for RISC-VTom Tromey6-1/+186
This adds Ravenscar support to gdb for RISC-V targets. This was tested internally using AdaCore's test suite and qemu. gdb/ChangeLog 2019-12-12 Tom Tromey <tromey@adacore.com> * Makefile.in (ALL_TARGET_OBS): Add riscv-ravenscar-thread.o. (HFILES_NO_SRCDIR): Add riscv-ravenscar-thread.h. (ALLDEPFILES): Add riscv-ravenscar-thread.c. * configure.tgt (riscv-*-*): Add riscv-ravenscar-thread.o. * riscv-ravenscar-thread.c: New file. * riscv-ravenscar-thread.h: New file. * riscv-tdep.c (riscv_gdbarch_init): Call register_riscv_ravenscar_ops. Change-Id: Ic47a3b3cfbbe80c2c82a5f48d2e0481845cac8b0
2019-12-12Fix the thread-pool.c compilationTom Tromey2-8/+7
A recent commit removed DIAGNOSTIC_IGNORE_UNUSED_FUNCTION, which was used in thread-pool.c. This patch changes this code to use ATTRIBUTE_UNUSED instead. Tested by rebuilding. gdb/ChangeLog 2019-12-12 Tom Tromey <tromey@adacore.com> * gdbsupport/thread-pool.c (set_thread_name): Use ATTRIBUTE_UNUSED. Change-Id: I56d46eaac73690565d0e52db1791411567a918dd
2019-12-12Fix unused function errorLuis Machado2-10/+8
Attempting to build GDB in Ubuntu 16.04.6 LTS on x86_64, I ran into warnings that caused the build to fail: binutils-gdb/gdb/gdbsupport/safe-strerror.c:44:1: error: ‘char* select_strerror_r(char*, char*)’ defined but not used [-Werror=unused-function] select_strerror_r (char *res, char *) The diagnostic macro DIAGNOSTIC_IGNORE_UNUSED_FUNCTION seems to expand correctly to its respective pragma, but this doesn't seem to have an effect on the warning. I tried to use the pragma explicitly and got the same result. ATTRIBUTE_UNUSED works fine in this case if you put it in both functions, which should fix warnings for both gdb and gdbserver builds. The compiler version is gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609. This is likely the result of PR64079 in GCC, which was fixed by commit 9e96f1e1b9731c4e1ef4fbbbf0997319973f0537. To prevent other developers from attempting to use this macro, only to get confused by it not working as expected, it seems better to not define this particular macro. gdb/ChangeLog: 2019-12-12 Luis Machado <luis.machado@linaro.org> * gdbsupport/safe-strerror.c: Don't include diagnostics.h. (select_strerror_r): Use ATTRIBUTE_UNUSED instead of the diagnostics macros. include/ChangeLog: 2019-12-12 Luis Machado <luis.machado@linaro.org> * diagnostics.h (DIAGNOSTIC_IGNORE_UNUSED_FUNCTION). Remove definitions. Change-Id: Iad6123d61d76d111e3ef8d24aa8c60112304c749
2019-12-11Fix TUI test suite regexpsTom Tromey4-4/+10
Testing on another TUI series showed that some of the regexps in the TUI test suite have been incorrect for a while. In particular, "|" was meant literally in these tests, but was interpreted as pattern alternation due to lack of quoting. This patch fixes the bad tests. I am checking this in. gdb/testsuite/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * gdb.tui/resize.exp: Fix regexp. * gdb.tui/regs.exp: Fix regexps. * gdb.tui/main.exp: Fix regexp. Change-Id: Ib6661361171ac120bb92f4a8aec7efa4bcaa36b9
2019-12-11Change "winheight" resizing to use new layout codeTom Tromey4-279/+22
The "winheight" command resizes a specified window, resizing the other windows in the layout to adapt. In the current code, this is done by examining each possible layout separately. The new layout code has a more general approach to handling this, and this patch simply removes the old code in favor of a call into the new layout engine. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-win.c (tui_set_win_height_command): Call tui_adjust_window_height. (tui_adjust_win_heights, new_height_ok): Remove. * tui/tui-layout.h (tui_adjust_window_height): Declare. * tui/tui-layout.c (tui_adjust_window_height): New function. Change-Id: I6bb681375a46adc8d29fd06f581deed4e078e78a
2019-12-11Re-apply the current layout when resizingTom Tromey5-111/+19
The TUI has separate code for each possible layout to handle the case where the terminal window is resized. With the new layout code, this can all be replaced with a call to tui_apply_current_layout, which simply re-applies the current layout. This results in some small differences in behavior when resizing, so some tests are updated. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-win.c (tui_resize_all): Remove code, call tui_apply_current_layout. gdb/testsuite/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * gdb.tui/resize.exp: Update. * gdb.tui/empty.exp (layouts): Update. Change-Id: I3dc6c02a753d495d9ab5e8213d550a147198ce6f
2019-12-11First use of tui_layoutTom Tromey8-182/+84
This patch introduces the first use of tui_layout, by changing show_layout to clone and use the appropriate tui_layout. This resulted in one minor layout change, and also in the unintended -- but good -- side effect that the title of each boxed window is now visible. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-layout.h (tui_apply_current_layout): Declare. * tui/tui-layout.c (standard_layouts, applied_layout): New globals. (tui_apply_current_layout): New function. (show_layout): Set applied_layout. Call tui_apply_current_layout. (show_source_command, show_disasm_command) (show_source_disasm_command, show_data) (show_source_or_disasm_and_command): Remove. (initialize_layouts): New function. (_initialize_tui_layout): Call initialize_layouts. gdb/testsuite/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * gdb.tui/regs.exp: Update. * gdb.tui/empty.exp (layouts): Update. * gdb.tui/basic.exp: Update. * lib/tuiterm.exp (_check_box): Don't check bottom border. Change-Id: If1ee06ee58f4803e8c213f4ab0f5bb59f4650ec2
2019-12-11Introduce new layout codeTom Tromey3-0/+522
This introduces a new approach to window layout for the TUI. The idea behind this code is that a layout should be specified in a declarative way, and then be applied by generic code that does not need to know the specifics of every possible layout. This patch itself does not change any behavior, because the new layout engine isn't yet connected to anything. That is, this merely introduces the implementation. This generic approach makes the code more maintainable. It also enables some future changes: * New window types are simpler to add; * User-specified layouts are possible; and * Horizontal layouts are more attainable gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-layout.h (class tui_layout_base) (class tui_layout_window, class tui_layout_split): New. * tui/tui-layout.c (tui_get_window_by_name) (tui_layout_window::clone, tui_layout_window::apply) (tui_layout_window::get_sizes, tui_layout_window::add_split) (tui_layout_split::add_window, tui_layout_split::clone) (tui_layout_split::get_sizes) (tui_layout_split::set_weights_from_heights) (tui_layout_split::adjust_size, tui_layout_split::apply): New functions. (tui_layout_split::add_split, tui_layout_split::add_split) (tui_layout_split::set_weights_from_heights) (tui_layout_split::set_weights_from_heights): New functions. Change-Id: I3a4cae666327b617d862aaa356f8179f945c6a4e
2019-12-11Remove struct tui_pointTom Tromey6-30/+35
struct tui_point does not help very much. It is only used for storage, and never passed between functions. I think it makes the code more verbose without any corresponding benefit, so this patch removes it. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-wingeneral.c (tui_gen_win_info::make_window): Update. * tui/tui-win.c (tui_adjust_win_heights, tui_resize_all): Update. * tui/tui-layout.c (tui_gen_win_info::resize): Update. * tui/tui-data.h (struct tui_point): Remove. (struct tui_gen_win_info) <origin>: Remove. <x, y>: New fields. * tui/tui-command.c (tui_cmd_window::resize): Update. Change-Id: I3f77920585b9ea9e2b4b189f3f3ae32d4da0c252
2019-12-11Introduce the tui_gen_win_info::min_height methodTom Tromey4-0/+28
This introduces a new method, tui_gen_win_info::min_height, to fetch the minimum height of a window. This is used in the subsequent unified layout patch. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-stack.h (struct tui_locator_window) <min_height>: Implement. * tui/tui-regs.h (struct tui_data_item_window) <min_height>: Implement. * tui/tui-data.h (struct tui_gen_win_info) <min_height>: New method. (struct tui_win_info) <min_height>: Implement. Change-Id: Id33baffdf041fde072e15c1ff89b75f8b8118adb
2019-12-11Move can_box to tui_gen_win_infoTom Tromey2-1/+12
This moves the can_box method to tui_gen_win_info, so that it will be available on the tui_locator_window class. This will be used in a subsequent patch. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-data.h (struct tui_gen_win_info) <can_box>: New method. (struct tui_win_info) <can_box>: Update. Change-Id: Idfa58af41341607932d3c39415f6a35ee9b5d3dc
2019-12-11Move max_height method to tui_gen_win_infoTom Tromey4-2/+24
This moves the max_height method to tui_gen_win_info and implements it in the subclasses. This is used by a subsequent patch, which will normalize window layout across all window types. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-stack.h (struct tui_locator_window) <max_height>: New method. * tui/tui-regs.h (struct tui_data_item_window) <max_height>: New method. * tui/tui-data.h (struct tui_gen_win_info) <max_height>: New method. (struct tui_win_info) <max_height>: Now override. Change-Id: I4ba3e8899bc4668328d3d78e3c1674c61882450d
2019-12-11Update NEWS post GDB 9 branch creation.Joel Brobecker2-1/+9
gdb/ChangeLog: * NEWS: Create a new section for the next release branch. Rename the section of the current branch, now that it has been cut.
2019-12-11Bump version to 10.0.50.DATE-git.Joel Brobecker2-1/+6
Now that the GDB 9 branch has been created, we can bump the version number. gdb/ChangeLog: GDB 9 branch created (27f7b2f64062ac9e52afc60509263c2702a9ebd0): * version.in: Bump version to 10.0.50.DATE-git.
2019-12-11Fix typo, get_Frame_id -> get_frame_idgdb-9-branchpointSimon Marchi2-1/+5
gdb/doc/ChangeLog: * gdb.texinfo (Writing JIT Debug Info Readers): Fix typo.
2019-12-11Fix build on macOSTom Tromey2-4/+38
PR build/25268 points out that the build fails on macOS, because on macOS the "pthread_setname_np" function takes a single argument. This patch fixes the problem, by introducing a new adapter function that handles both styles of pthread_setname_np. This change also meant moving the pthread_setname_np call to the thread function, because macOS only permits setting the name of the current thread. This means that there can be a brief window when gdb will see the wrong name; but I think this is a minor concern. Tested by rebuilding on x86-64 Fedora 30, and on macOS High Sierra. On Linux I also debugged gdb to ensure that the thread names are still set correctly. gdb/ChangeLog 2019-12-11 Tom Tromey <tromey@adacore.com> PR build/25268: * gdbsupport/thread-pool.c (set_thread_name): New function. (thread_pool::set_thread_count): Don't call pthread_setname_np. (thread_pool::thread_function): Call set_thread_name. Change-Id: Id7bf28d99ca27a893a9fc87ebb90b15a9c2a9cb4
2019-12-11Fix the build after bfd_get_signed_8 changeTom Tromey2-1/+6
A recent commit changed bfd_get_signed_8 to extend the result to a bfd_signed_vma. This caused a compiler error in one spot in my --enable-targets=all gdb build, where the result of bfd_get_signed_8 was passed to printf. This patch fixes the build. Tested by rebuilding. gdb/ChangeLog 2019-12-11 Tom Tromey <tromey@adacore.com> * fbsd-tdep.c (fbsd_core_info_proc_status): Cast result of bfd_get_signed_8. Change-Id: Ic015f5fd3d88da6b5da8f7b4e1d11d5c981333db
2019-12-11Implement 'print -raw-values' and 'set print raw-values on|off'Philippe Waroquiers9-14/+110
The option framework documentation was speaking about a 'print -raw' option, but this option does not exist. This patch implements -raw-values option that tells to ignore the active pretty printers when printing a value. As we already have -raw-frame-arguments, I thought -raw-values was more clear, in particular to differentiate set print raw-values and set print raw-frame-arguments. gdb/doc/ChangeLog 2019-12-11 Philippe Waroquiers <philippe.waroquiers@skynet.be> * gdb.texinfo (Command Options): Use -p and -pretty in the example, as -r is ambiguous. Update the print - TAB TAB completion result. (Data): Document new option -raw-values. Use -p and -pretty in the example, as -r is ambiguous. (Print Settings): Document set print raw values. (Pretty-Printer Commands): Document interaction between enabled pretty printers and -raw-values/-raw-frame-arguments. gdb/ChangeLog 2019-12-11 Philippe Waroquiers <philippe.waroquiers@skynet.be> * NEWS: Document -raw-values option and the related setting commands. * printcmd.c (print_command_parse_format): Do not set opts->raw off, only set it on when /r is given. * valprint.c (value_print_option_defs): New element raw-values. * Makefile.in: Add the new file. gdb/testsuite/ChangeLog 2019-12-11 Philippe Waroquiers <philippe.waroquiers@skynet.be> * gdb.base/options.exp: Add -raw-values in the print completion list. * gdb.python/py-prettyprint.exp: Add tests for -raw-values.
2019-12-10Minor fix to gdb.prompt documentationTom Tromey2-3/+7
I noticed that an example in the gdb.prompt documentation used the wrong kind of quotes -- because it is code, it should use a plain ASCII quotation mark. I also slightly shortened the sample text here, so it would more clearly fit on a single line. gdb/doc/ChangeLog 2019-12-10 Tom Tromey <tom@tromey.com> * python.texi (gdb.prompt): Use correct quotes in example. Shorten sample text. Change-Id: I4153928c0d88001244ad410f3943c952a6ebfeb1
2019-12-10OpenMP parallel region scope testsKevin Buettner3-0/+461
Add tests which check for accessibility of variables from within various OpenMP parallel regions. Tested on Fedora 27, 28, 29, 30, and 31. I also tested with my OpenMP work on Fedora 30. The test has been annotated with setup_xfail and setup_kfail statements so that there are no unexpected failures on any of these platforms when using gcc. Better still, for my own testing anyway, is that there are also no XPASSes or KPASSes either. So, regardless of platform, when using gcc, and regardless of whether my (not yet public) OpenMP work is used, seeing a FAIL indicates a real problem. Fedora 27 results: # of expected passes 85 # of expected failures 65 (Note: I have not retested F27 since v1 of the patch; it's possible that the numbers will be slightly different for v2.) Fedora 28, 29, 30 results: # of expected passes 131 # of expected failures 4 # of known failures 16 Fedora 30, 31 results w/ my OpenMP work: # of expected passes 151 The above results all use gcc, either the system gcc or a development gcc (when testing against my OpenMP work in GDB). I've also tested with clang 9.0.0 and icc 19.0.5.281 20190815 on Fedora 31. Fedora 31, clang: FAIL: gdb.threads/omp-par-scope.exp: single_scope: first thread: print s1 FAIL: gdb.threads/omp-par-scope.exp: single_scope: first thread: print s3 FAIL: gdb.threads/omp-par-scope.exp: single_scope: first thread: print i1 FAIL: gdb.threads/omp-par-scope.exp: single_scope: first thread: print i3 FAIL: gdb.threads/omp-par-scope.exp: single_scope: second thread: print s1 FAIL: gdb.threads/omp-par-scope.exp: single_scope: second thread: print s3 FAIL: gdb.threads/omp-par-scope.exp: single_scope: second thread: print i1 FAIL: gdb.threads/omp-par-scope.exp: multi_scope: first thread: print i02 FAIL: gdb.threads/omp-par-scope.exp: multi_scope: first thread: print i11 FAIL: gdb.threads/omp-par-scope.exp: multi_scope: first thread: print i12 FAIL: gdb.threads/omp-par-scope.exp: multi_scope: first thread: print i22 FAIL: gdb.threads/omp-par-scope.exp: multi_scope: first thread: print file_scope_var FAIL: gdb.threads/omp-par-scope.exp: multi_scope: second thread: print i11 FAIL: gdb.threads/omp-par-scope.exp: multi_scope: second thread: print file_scope_var FAIL: gdb.threads/omp-par-scope.exp: multi_scope: after parallel: print file_scope_var FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 1st stop: print file_scope_var FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 1st stop: print num FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 1st stop: print l FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 1st stop: print k FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 2nd stop: print file_scope_var FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 2nd stop: print num FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 3rd stop: print file_scope_var FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 3rd stop: print num FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 3rd stop: print l FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 3rd stop: print k FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 4th stop: print file_scope_var FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 4th stop: print num FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: outer_threads: outer stop: print file_scope_var FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: outer_threads: outer stop: print i FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: outer_threads: outer stop: print j Fedora 31, icc: FAIL: gdb.threads/omp-par-scope.exp: multi_scope: first thread: print i12 FAIL: gdb.threads/omp-par-scope.exp: multi_scope: first thread: print i22 FAIL: gdb.threads/omp-par-scope.exp: nested_func: 1st call: 1st thread: print s1 FAIL: gdb.threads/omp-par-scope.exp: nested_func: 1st call: 1st thread: print i FAIL: gdb.threads/omp-par-scope.exp: nested_func: 1st call: 1st thread: print j FAIL: gdb.threads/omp-par-scope.exp: nested_func: 1st call: 2nd thread: print s1 FAIL: gdb.threads/omp-par-scope.exp: nested_func: 1st call: 2nd thread: print i FAIL: gdb.threads/omp-par-scope.exp: nested_func: 1st call: 2nd thread: print j FAIL: gdb.threads/omp-par-scope.exp: nested_func: 1st call: 2nd thread: print k FAIL: gdb.threads/omp-par-scope.exp: nested_func: 1st call: 2nd thread: print z FAIL: gdb.threads/omp-par-scope.exp: nested_func: 2nd call: 1st thread: print s1 FAIL: gdb.threads/omp-par-scope.exp: nested_func: 2nd call: 1st thread: print i FAIL: gdb.threads/omp-par-scope.exp: nested_func: 2nd call: 1st thread: print j FAIL: gdb.threads/omp-par-scope.exp: nested_func: 2nd call: 2nd thread: print s1 FAIL: gdb.threads/omp-par-scope.exp: nested_func: 2nd call: 2nd thread: print i FAIL: gdb.threads/omp-par-scope.exp: nested_func: 2nd call: 2nd thread: print j FAIL: gdb.threads/omp-par-scope.exp: nested_func: 2nd call: 2nd thread: print k FAIL: gdb.threads/omp-par-scope.exp: nested_func: 2nd call: 2nd thread: print z FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 1st stop: print l FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 1st stop: print k FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 3rd stop: print l FAIL: gdb.threads/omp-par-scope.exp: nested_parallel: inner_threads: 3rd stop: print k For both clang and icc, it turns out that there are some problems with the DWARF that these compilers generate. Of the two, icc does at least nest the subprogram of the outlined function representing the parallel region within the function that it's defined, but does not handle inner scopes if they exist. clang places the subprogram for the outlined function at the same level as the containing function, so variables declared within the function aren't visible at all. I could call setup_xfail to avoid FAILs for clang and icc also, but I don't want to further complicate the test. gdb/testsuite/ChangeLog: * gdb.threads/omp-par-scope.c: New file. * gdb/threads/omp-par-scope.exp: New file. Change-Id: Icb9c991730d84ca7509380af817dfcc778e764ea
2019-12-10Add gdb_caching_proc support_nested_function_tests to lib/gdb.expKevin Buettner2-3/+22
This commit adds the gdb_caching_proc, support_nested_function_tests, to lib/gdb.exp. It tests to see whether or not the C compiler has support for nested function calls. gdb/testsuite/ChangeLog: * lib/gdb.exp (support_nested_function_tests): New proc. Change-Id: Ic2c93bc4cc200e07e104a2398f89a9c0514bdc75
2019-12-10Add gdb_compile_openmp to lib/gdb.expKevin Buettner2-2/+19
gdb/testsuite/ChangeLog: * lib/gdb.exp (gdb_compile_openmp): New proc. (build_executable_from_specs): Add an "openmp" option. (gdb_compile_pthreads): Add non-executable case. Change-Id: I94048b8b0940c707ce0529a6bcfa6e4eace49101
2019-12-10Suppress the "unused function" warning for select_strerror_rChristian Biesinger2-0/+13
We only ever use one of the two overloads, so to avoid breaking -Werror builds, supress the warning. gdb/ChangeLog: 2019-12-10 Christian Biesinger <cbiesinger@google.com> * gdbsupport/safe-strerror.c: Supress the unused function warning for select_strerror_r. Change-Id: I344869a382bb36fe181b5b2a31838d1d20f58169
2019-12-10Replace the remaining uses of strerror with safe_strerrorChristian Biesinger15-65/+66
To do that, this patch makes IPA compile safe-strerror as well. Because it doesn't use Gnulib, it calls the Glibc version of strerror_r directly. Consequently this patch also removes the configure checks for strerror. gdb/ChangeLog: 2019-12-10 Christian Biesinger <cbiesinger@google.com> * config.in: Regenerate. * configure: Regenerate. * gdbsupport/agent.c (gdb_connect_sync_socket): Call safe_strerror instead of strerror. * gdbsupport/common.m4: Don't check for strerror. * gdbsupport/safe-strerror.c: Support both the glibc version of strerror_r and the XSI version. gdb/gdbserver/ChangeLog: 2019-12-10 Christian Biesinger <cbiesinger@google.com> * Makefile.in: Add safe-strerror.c to gdbreplay and IPA, and change UNDO_GNULIB_CFLAGS to undo strerror_r instead of strerror. * config.in: Regenerate. * configure: Regenerate. * configure.ac: Don't check for strerror. * linux-i386-ipa.c (initialize_fast_tracepoint_trampoline_buffer): Call safe_strerror instead of strerror. * server.h (strerror): Remove this now-unnecessary declaration. * tracepoint.c (init_named_socket): Call safe_strerror instead of strerror. (gdb_agent_helper_thread): Likewise. * utils.c (perror_with_name): Likewise. Change-Id: I74848f072dcde75cb55c435ef9398dc8f958cd73
2019-12-10Normalize Ada ptype to use a single "?"Tom Tromey8-5/+171
Sometimes -- notably with unchecked unions -- the Ada "ptype" code will print a "?" or "??" to indicate something unknown. The choice of what was printed was somewhat arbitrary, and in one case, Ada would print an empty string rather than "?". This patch normalizes the Ada code to use "?" rather than an empty string or "??". My reasoning here is that a single question mark is enough to convey unknown-ness. gdb/ChangeLog 2019-12-10 Tom Tromey <tromey@adacore.com> * ada-typeprint.c (print_choices): Use a single "?". (print_variant_part): Print "?" if the discriminant name is not known. gdb/testsuite/ChangeLog 2019-12-10 Tom Tromey <tromey@adacore.com> * gdb.ada/unchecked_union.exp: New file. * gdb.ada/unchecked_union/pck.adb: New file. * gdb.ada/unchecked_union/pck.ads: New file. * gdb.ada/unchecked_union/unchecked_union.adb: New file. * gdb-utils.exp (string_to_regexp): Also quote "?". Change-Id: I3403040780a155ffa2c44c8e6a04ba86bc810e29
2019-12-09Fix scripted probe breakpointsGeorge Barrett10-21/+141
The documentation for make-breakpoint from the Guile API and the `spec' variant of the gdb.Breakpoint constructor from the Python API state that the format acceptable for location strings is the same as that accepted by the break command. However, using the -probe qualifier at the beginning of the location string causes a GDB internal error as it attempts to decode a probe location in the wrong code path. Without this functionality, there doesn't appear to be another way to set breakpoints on probe points from Python or Guile scripts. This patch introduces a new helper function that returns a breakpoint_ops instance appropriate for a parsed location and updates the Guile and Python bindings to use said function, rather than the current hard-coded use of bkpt_breakpoint_ops. Since this logic is duplicated in the handling of the `break' and `trace' commands, those are also updated to call into the new helper function. gdb/ChangeLog: 2019-12-10 George Barrett <bob@bob131.so> Fix scripted probe breakpoints. * breakpoint.c (tracepoint_probe_breakpoint_ops): Move declaration forward. (breakpoint_ops_for_event_location_type) (breakpoint_ops_for_event_location): Add function definitions. (break_command_1, trace_command): Use breakpoint_ops_for_event_location. * breakpoint.h (breakpoint_ops_for_event_location): Add function declarations. * guile/scm-breakpoint.c (gdbscm_register_breakpoint_x): Use breakpoint_ops_for_event_location. * python/py-breakpoint.c (bppy_init): Use breakpoint_ops_for_event_location. gdb/testsuite/ChangeLog: 2019-12-10 George Barrett <bob@bob131.so> Test scripted probe breakpoints. * gdb.guile/scm-breakpoint.c (main): Add probe point. * gdb.python/py-breakpoint.c (main): Likewise. * gdb.guile/scm-breakpoint.exp (test_bkpt_probe): Add probe specifier test. * gdb.python/py-breakpoint.exp (test_bkpt_probe): Likewise.
2019-12-09gdb: rank an lvalue argument incompatible for an rvalue parameterTankut Baris Aktemur5-5/+30
Passing an lvalue argument to a function that takes an rvalue parameter is not allowed per C++ rules. Consider this function: int g (int &&x) { return x; } Calling g as in int i = 5; int j = g (i); is illegal. For instance, GCC 9.2.1 yields ~~~ test.cpp: In function ‘int main()’: test.cpp:6:14: error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’ 6 | int j = g (i); | ^ ~~~ GDB currently allows this function call: ~~~ (gdb) print g(i) $1 = 5 ~~~ Fix this by ranking an lvalue argument incompatible with an rvalue parameter. The behavior after this patch is: ~~~ (gdb) print g(i) Cannot resolve function g to any overloaded instance ~~~ Tested with GCC 9.2.1. gdb/ChangeLog: 2019-12-09 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * gdbtypes.c (rank_one_type): Return INCOMPATIBLE_TYPE_BADNESS when ranking an lvalue argument for an rvalue parameter. gdb/testsuite/ChangeLog: 2019-12-09 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * gdb.cp/rvalue-ref-overload.cc (g): New function that takes an rvalue parameter. * gdb.cp/rvalue-ref-overload.exp: Test calling it with an lvalue parameter. Change-Id: I4a6dfc7dac63efa1e3b9f8f391e4b736fbdccdc1
2019-12-09gdb/fortran: Improve output pattern in gdb.mi/mi-fortran-modules.expAndrew Burgess2-4/+16
Extend the output pattern in mi-fortran-modules.exp to skip some system modules that appear with versions of GFortran after 7.x.x. gdb/testsuite/ChangeLog: * gdb.mi/mi-fortran-modules.exp: Add patterns to skip system modules. Change-Id: I64aaa395e554a32e8267ffa096faee53c19c0b9e
2019-12-09gdb/testsuite: kfail some tests if using broken gccAndrew Burgess2-0/+11
In some cases the Fortran stride information generated by GCC is wrong with versions of GCC after 7.x.x. This commit adds kfails for the tests in question with known bad versions of gcc. The bug has been reported to GCC here: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92775 gdb/testsuite/ChangeLog: * gdb.fortran/derived-type-striding.exp: KFAIL if we are using a broken version of GCC. Change-Id: Iaef08e5e2c87ab3d6983b88f749d40e01aea2bc6
2019-12-09gdb/testsuite/fortran: Fix info-modules/info-types for gfortran 8+Andrew Burgess4-140/+648
The gdb.fortran/info-modules.exp and gdb.fortran/info-types.exp tests are failing on versions of gfortran after 7.3 due to the inclusion of extra "system" modules and type that were not being matched by the current test patterns. Rather than building increasingly complex patterns that would always be at risk of breaking with future versions of GCC I have instead added a new library that parses the output of the following commands: info types info variables info functions info modules info module functions info module variables into a data structure, the test can than run checks against the contents of this data structure. The benefit is that we can simply ignore extra results that we don't care about. There is a small risk that a bug in GDB might allow us to start reporting incorrect results in such a way that the new library will not spot the error. However, I have tried to mitigate this risk by adding extra procedures into the test library (see check_no_entry) and we can add more in future if we wanted to be even more defensive. I tested this test file with gFortran 7.3.1, 8.3.0, and 9.2.0, I now see 100% pass in all cases. gdb/testsuite/ChangeLog: * gdb.fortran/info-modules.exp: Rewrite to make use of new sym-info-cmds library. * gdb.fortran/info-types.exp: Likewise. * lib/sym-info-cmds.exp: New file. Change-Id: Iff81624f51b5afb6c95393932f3d94472d7c2970
2019-12-09gdb/darwin-nat.c: Fix template argument for scoped_restore_tmplWataru Ashihara2-1/+6
This should be the type of startup_with_shell, whose type was changed from int to bool at commit 80fd28264. This fixes the build on macOS: CXX darwin-nat.o In file included from ../../gdb/darwin-nat.c:22: In file included from ../../gdb/top.h:25: In file included from ../../gdb/value.h:23: In file included from ../../gdb/frame.h:72: In file included from ../../gdb/language.h:26: In file included from ../../gdb/symtab.h:33: ../../gdb/gdbsupport/gdb_optional.h:155:19: error: no matching constructor for initialization of 'scoped_restore_tmpl<int>' new (&m_item) T (std::forward<Args>(args)...); ^ ~~~~~~~~~~~~~~~~~~~~~~~~ ../../gdb/darwin-nat.c:1995:31: note: in instantiation of function template specialization 'gdb::optional<scoped_restore_tmpl<int> >::emplace<bool *, int>' requested here restore_startup_with_shell.emplace (&startup_with_shell, 0); ^ ../../gdb/gdbsupport/scoped_restore.h:69:3: note: candidate constructor template not viable: no known conversion from 'bool *' to 'int *' for 1st argument scoped_restore_tmpl (T *var, T2 value) ^ ../../gdb/gdbsupport/scoped_restore.h:57:3: note: candidate constructor not viable: requires single argument 'var', but 2 arguments were provided scoped_restore_tmpl (T *var) ^ ../../gdb/gdbsupport/scoped_restore.h:76:3: note: candidate constructor not viable: requires single argument 'other', but 2 arguments were provided scoped_restore_tmpl (const scoped_restore_tmpl<T> &other) ^ 1 error generated. gdb/ChangeLog 2019-12-08 Wataru Ashihara <wataash@wataash.com> * darwin-nat.c (darwin_nat_target::create_inferior): Fix template argument for scoped_restore_tmpl from bool to int. Change-Id: Ia0202efd34dbce69b6af5d035fa55ed89215138a
2019-12-08Fix inter-CU references using intra-CU form in imported-unitTom de Vries2-5/+9
When running the gdb testsuite with the cc-with-dwz board, I run into: ... Running gdb/testsuite/gdb.dwarf2/imported-unit.exp ... gdb compile failed, dwz: gdb.dwarf2/imported-unit/imported-unit: \ Couldn't find DIE referenced by DW_AT_abstract_origin cc-with-tweaks.sh: dwz did not modify gdb.dwarf2/imported-unit/imported-unit. ... The problem is that the DW_AT_abstract_origin reference here: ... <0><d2>: Abbrev Number: 2 (DW_TAG_compile_unit) <1><e6>: Abbrev Number: 4 (DW_TAG_subprogram) <e7> DW_AT_abstract_origin: <0x142> <eb> DW_AT_low_pc : 0x4004b2 <f3> DW_AT_high_pc : 0x4004c8 ... referring to a DIE in another compilation unit here: ... <0><129>: Abbrev Number: 2 (DW_TAG_compile_unit) <1><142>: Abbrev Number: 4 (DW_TAG_subprogram) <143> DW_AT_name : main <148> DW_AT_type : <0x13b> <14c> DW_AT_external : 1 ... is encoded using intra-CU reference form DW_FORM_ref4 instead of intra-CU reference DW_FORM_ref_addr: ... 4 DW_TAG_subprogram [has children] DW_AT_abstract_origin DW_FORM_ref4 DW_AT_low_pc DW_FORM_addr DW_AT_high_pc DW_FORM_addr DW_AT value: 0 DW_FORM value: 0 ... Fix this in the DWARF assembler by making all inter-CU references use the '%' label prefix. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2019-12-08 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/imported-unit.exp: Fix inter-CU references. Change-Id: I690ff18c3943705ed478453531b176ff74700f3c
2019-12-07Core file build-id supportKeith Seitz9-8/+485
This patch uses new BFD support for detecting build-ids in core files. After this patch, it is possible to run gdb with only the core file, and gdb will automatically load the executable and debug info [example from tests]: $ gdb -nx -q (gdb) core-file corefile-buildid.core [New LWP 29471] Reading symbols from gdb.base/corefile-buildid/debugdir-exec/.build-id/36/fe5722c5a7ca3ac746a84e223c6a2a69193a24... Core was generated by `outputs/gdb.base/coref'. Program terminated with signal SIGABRT, Aborted. (gdb) This work is based on functionality available in Fedora originally written by Jan Kratochvil. Regression tested on buildbot. gdb/ChangeLog: 2019-12-07 Keith Seitz <keiths@redhat.com> * build-id.c (build_id_bfd_get): Permit bfd_core, too. (build_id_to_debug_bfd): Make static, rewriting to use build_id_to_bfd_suffix. (build_id_to_bfd_suffix): Copy of build_id_to_debug_bfd, adding `suffix' parameter. Append SUFFIX to file names when searching for matching files. (build_id_to_debug_bfd): Use build_id_to_bfd_suffix. (build_id_to_exec_bfd): Likewise. * build-id.h (build_id_to_debug_bfd): Clarify that function searches for BFD of debug info file. (build_id_to_exec_bfd): Declare. * corelow.c: Include build-id.h. (locate_exec_from_corefile_build_id): New function. (core_target_open): If no executable BFD is found, search for a core file BFD using build-id. gdb/testsuite/ChangeLog: 2019-12-07 Keith Seitz <keiths@redhat.com> * gdb.base/corefile-buildid-shlib-shr.c: New file. * gdb.base/corefile-buildid-shlib.c: New file. * gdb.base/corefile-buildid.c: New file. * gdb.base/corefile-buildid.exp: New file. Change-Id: I15e9e8e58f10c68b5cae55e2eba58df1e8aef529
2019-12-06Put bcache inside "namespace gdb"Christian Biesinger8-9/+36
This avoids a conflict with a system "struct bcache" on Solaris (see e.g. https://www.isi.edu/nsnam/archive/ns-users/webarch/2001/msg05393.html) Note that the Solaris conflict for now only surfaces with --enable-targets=all (which the build bot doesn't use). gdb/ChangeLog: 2019-12-06 Christian Biesinger <cbiesinger@google.com> * bcache.c: Put in namespace gdb. * bcache.h: Likewise. * gdbtypes.c (check_types_worklist): Update. (types_deeply_equal): Update. * macrotab.c (struct macro_table) <bcache>: Update. (new_macro_table): Update. * macrotab.h (struct bcache): Put this forward declaration inside namespace gdb. (new_macro_table): Update. * objfiles.h (struct objfile_per_bfd_storage) <filename_cache>: Update. <macro_cache>: Update. * psymtab.h: (psymtab_storage) <psymbol_cache>: Update. Change-Id: I843d5e91f7ccb3db6d1099a8214c15a74510256f
2019-12-06[gdb/symtab] Prefer var def over declTom de Vries4-10/+123
Consider the DWARF as generated by gcc with the tentative patch to fix gcc PR91507 - "wrong debug for completed array with previous incomplete declaration": ... <1><f4>: Abbrev Number: 2 (DW_TAG_array_type) <f5> DW_AT_type : <0xff> <f9> DW_AT_sibling : <0xff> <2><fd>: Abbrev Number: 3 (DW_TAG_subrange_type) <2><fe>: Abbrev Number: 0 <1><ff>: Abbrev Number: 4 (DW_TAG_pointer_type) <100> DW_AT_byte_size : 8 <101> DW_AT_type : <0x105> <1><105>: Abbrev Number: 5 (DW_TAG_base_type) <106> DW_AT_byte_size : 1 <107> DW_AT_encoding : 6 (signed char) <108> DW_AT_name : (indirect string, offset: 0x19f): char <1><10c>: Abbrev Number: 6 (DW_TAG_variable) <10d> DW_AT_name : zzz <111> DW_AT_decl_file : 1 <112> DW_AT_decl_line : 1 <113> DW_AT_decl_column : 14 <114> DW_AT_type : <0xf4> <118> DW_AT_external : 1 <118> DW_AT_declaration : 1 <1><118>: Abbrev Number: 2 (DW_TAG_array_type) <119> DW_AT_type : <0xff> <11d> DW_AT_sibling : <0x128> <1><12f>: Abbrev Number: 8 (DW_TAG_variable) <130> DW_AT_specification: <0x10c> <134> DW_AT_decl_line : 2 <135> DW_AT_decl_column : 7 <136> DW_AT_type : <0x118> <13a> DW_AT_location : 9 byte block: 3 30 10 60 0 0 0 0 0 (DW_OP_addr: 601030) ... The DWARF will result in two entries in the symbol table, a decl with type char *[] and a def with type char*[2]. When trying to print the value of zzz: ... $ gdb a.spec.out -batch -ex "p zzz" ... the decl (rather than the def) will be found in the symbol table, which is missing the location information, and consequently we get: ... $1 = 0x601030 <zzz> ... [ There is a fallback mechanism that finds the address of the variable in the minimal symbol table, but that's not used here, because the type of the decl does not specify a size. We could use the symbol size here to get the size of the type, but that's currently not done: PR exp/24989. Still, fixing that PR would not fix the generic case, where minimal symbol info is not available. ] Fix this by preferring defs over decls when searching in the symbol table. Build and reg-tested on x86_64-linux. gdb/ChangeLog: 2019-12-06 Tom de Vries <tdevries@suse.de> PR symtab/24971 * block.c (best_symbol, better_symbol): New function. (block_lookup_symbol_primary, block_lookup_symbol): Prefer def over decl. gdb/testsuite/ChangeLog: 2019-12-06 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/varval.exp: Add decl before def test. Change-Id: Id92326cb8ef9903b121ef9e320658eb565d0f5a9