aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2021-05-19[PATCH]rs6000,testsuite Add a powerpc64-prologue testcase.Will Schmidt3-0/+180
Add a powerpc64-prologue testcase, this is based on the existing powerpc-prologue test, but updated for the powerpc64 (le) target. YYYY-MM-DD Will Schmidt <will_schmidt@vnet.ibm.com> gcc/testsuite/ChangeLog * gdb.arch/powerpc64-prologue.c: New test to exercise prologues for the powerpc64 LE target. * gdb.arch/powerpc-prologue.exp: Test Harness.
2021-05-19Mark tu_abbrev_offset::operator<() const.John Baldwin2-1/+5
clang 11 with libc++'s <algorithm> fails to match the existing operator<() for std::less<> since the method is not marked const. gdb/ChangeLog: * dwarf2/read.c (tu_abbrev_offset::operator<): Mark const.
2021-05-19gdb: Move definitions of std::string overloads in ui_out to the headerMarco Barisione2-15/+5
These methods are just trivial wrappers around the versions accepting a char pointer. By moving them to the header the compiler can inline them. gdb/ChangeLog: * ui-out.c (ui_out::field_string): Move to ui-out.h. (ui_out::text): Ditto. * ui-out.h (class ui_out): Add definitions of ui_out::field_string and ui_out::text which were previously defined in ui-out.c.
2021-05-19gdb: Pass std::strings to ui_out::field_string () where convenientMarco Barisione16-38/+37
While adding a ui_out::text () overload accepting a std::string, I noticed that several callers of ui_out::field_string () were converting std::string instances to char pointers even if not necessary. gdb/ChangeLog: * ui-out.c (ui_out::field_string): Add missing style_argument to the overload accepting a std::string, to make it equivalent to the char pointer version. * ui-out.h (class ui_out): Ditto. * break-catch-sig.c (signal_catchpoint_print_one): Do not convert std::strings to char pointers before passing them to ui_out::field_string (). * break-catch-throw.c (print_one_detail_exception_catchpoint): Ditto. * cli/cli-setshow.c (do_show_command): Ditto. * disasm.c (gdb_pretty_print_disassembler::pretty_print_insn): Ditto. * infcmd.c (print_return_value_1): Ditto. * inferior.c (print_inferior): Ditto. * linux-thread-db.c (info_auto_load_libthread_db): Ditto. * mi/mi-cmd-var.c (print_varobj): Ditto. (mi_cmd_var_set_format): Ditto. (mi_cmd_var_info_type): Ditto. (mi_cmd_var_info_expression): Ditto. (mi_cmd_var_evaluate_expression): Ditto. (mi_cmd_var_assign): Ditto. (varobj_update_one): Ditto. * mi/mi-main.c (list_available_thread_groups): Ditto. (mi_cmd_data_read_memory_bytes): Ditto. (mi_cmd_trace_frame_collected): Ditto. * osdata.c (info_osdata): Ditto. * probe.c (info_probes_for_spops): Ditto. * target-connection.c (print_connection): Ditto. * thread.c (print_thread_info_1): Ditto. * tracepoint.c (print_one_static_tracepoint_marker): Ditto.
2021-05-19gdb: Add an overloaded ui_out::text accepting a const std::string &Marco Barisione6-5/+12
gdb/ChangeLog: * ui-out.h (class ui_out): Add ui_out::text accepting a constant reference to a std::string. Fix all callers using std::string::c_str. * ui-out.c (ui_out::text): Ditto.
2021-05-19gdb/testsuite: resolve duplicate test names in gdb.guile/*.expAndrew Burgess2-3/+9
This commit: commit ecf25064e87a3d2d59871b3ea7126fa0dee0001d Date: Thu May 13 15:42:20 2021 +0100 gdb: fix pretty printing max depth behaviour Introduced a couple of duplicate tests, this commit resolves them by providing unique test names. gdb/testsuite/ChangeLog: * gdb.guile/scm-pretty-print.exp: Add test names to resolve duplicate test names.
2021-05-19[gdb/testsuite] Fix read1 timeout in gdb.base/info-types-c++.expTom de Vries2-17/+84
When running test-case gdb.base/info-types-c++.exp with check-read1 I run into: ... 425: typedef const void * std::allocator_traits<std::allocator<std::\ _Sp_counted_ptr_inplace<std::filesystem::__cxx11::\ recursive_directory_iterator::_Dir_stack, std::allocator<std::filesystem::\ __cxx11::recursive_directory_iterator::_Dir_stack>, \ FAIL: gdb.base/info-types-c++.exp: info types (timeout) ... The corresponding gdb_test_multiple does contain an exp_continue which resets the timeout counter every time info for another file is printed, but this doesn't help for this timeout because it times out during printing info for a single file. Fix this by processing line-by-line. Tested on x86_64-linux, both with gcc-7.5.0 and gcc-4.8.5 (the latter is different because the "unsigned int" type is missing). gdb/testsuite/ChangeLog: 2021-05-19 Tom de Vries <tdevries@suse.de> * gdb.base/info-types.exp.tcl: Scan info types output line-by-line.
2021-05-19inflow.c: Do not leak tty.Alexandra Hájková2-1/+6
In a case open() returns 0 tty might be leaked. While 0 should be stdin (and therefore is an unlikely return value from open()), it's still the case that the test should be for non-negative return values from open(). gdb/ChangeLog: 2021-05-11 Alexandra Hájková <ahajkova@redhat.com> * inflow.c (new_tty): Do not leak tty.
2021-05-17Rename dwarf2/comp-unit.hTom Tromey8-8/+18
Simon pointed out that dwarf2/cu.h and dwarf2/comp-unit.h seemingly mean the same thing. He suggested renaming the latter to comp-unit-head.h, which is what this patch does. gdb/ChangeLog 2021-05-17 Tom Tromey <tom@tromey.com> * dwarf2/read.h: Update include. * dwarf2/read.c: Update include. * dwarf2/line-header.c: Update include. * dwarf2/cu.h: Update include. * dwarf2/comp-unit-head.h: Rename from comp-unit.h. * dwarf2/comp-unit-head.c: Rename from comp-unit.c. * Makefile.in (COMMON_SFILES): Update.
2021-05-17Change dwarf2_cu marking to use methodsTom Tromey4-81/+93
This changes the dwarf2_cu marking functions to be methods on dwarf2_cu. gdb/ChangeLog 2021-05-17 Tom Tromey <tom@tromey.com> * dwarf2/read.c (maybe_queue_comp_unit) (dwarf2_per_objfile::age_comp_units): Update. (dwarf2_add_dependence, dwarf2_mark_helper, dwarf2_mark): Move to dwarf2_cu methods. * dwarf2/cu.h (struct dwarf2_cu) <mark, clear_mark, is_marked, add_dependence>: New methods. <m_dependencies>: Add "m_" prefix. Now private. <m_mark>: Add "m_" prefix. * dwarf2/cu.c (dwarf2_cu::dwarf2_cu): Update. (dwarf2_mark_helper): New function. (dwarf2_cu::mark, dwarf2_cu::add_dependence): New methods.
2021-05-17Move some dwarf2_cu methods to new fileTom Tromey4-67/+98
This moves some of the dwarf2_cu methods to a new file, dwarf2/cu.c. gdb/ChangeLog 2021-05-17 Tom Tromey <tom@tromey.com> * dwarf2/read.c (dwarf2_cu::addr_sized_int_type) (dwarf2_cu::start_symtab, dwarf2_cu::addr_type) (dwarf2_cu::dwarf2_cu): Move to cu.c. * dwarf2/cu.c: New file. * Makefile.in (COMMON_SFILES): Add dwarf2/cu.c.
2021-05-17Move dwarf2_cu to new header fileTom Tromey4-244/+279
This moves dwarf2_cu and one supporting data structure to a new header file. The main goal, as always with this kind of change, is to make the DWARF reader a bit more understandable. gdb/ChangeLog 2021-05-17 Tom Tromey <tom@tromey.com> * Makefile.in (HFILES_NO_SRCDIR): Add dwarf2/cu.h. * dwarf2/read.c (struct delayed_method_info, struct dwarf2_cu): Move to cu.h. * dwarf2/cu.h: New file.
2021-05-17gdb: additional settings for emacs in .dir-locals.elAndrew Burgess2-1/+9
Two additional settings for developers who use emacs: 1. Set brace-list-open to 0 for C and C++ modes, this ensures we format things like: enum blah { .... }; Instead of the default for the emacs GNU style: enum blah { ... }; The former seems to be the GDB style. 2. Set sentence-end-double-space to t. This is actually the default value for this setting, but if anyone has customised this to nil in general, then forcing this back to t for GDB files will give a better behaviour for the paragraph filling. gdb/ChangeLog: * .dir-locals.el: Set sentence-end-double-space for all modes, and set brace-list-open to 0 for C and C++ modes. gdbserver/ChangeLog: * .dir-locals.el: Set sentence-end-double-space for all modes, and set brace-list-open to 0 for C and C++ modes. gdbsupport/ChangeLog: * .dir-locals.el: Set sentence-end-double-space for all modes, and set brace-list-open to 0 for C and C++ modes.
2021-05-17Avoid crash with GCC trunkTom Tromey2-0/+8
With GCC trunk, gdb.ada/access_to_packed_array.exp causes a GDB crash. The problem is that ptype tries to resolve a dynamic type. However, the inferior is not running, so there are no frames. This patch updates dwarf2_evaluate_loc_desc::get_frame_base to handle this situation. gdb/ChangeLog 2021-05-17 Tom Tromey <tromey@adacore.com> * dwarf2/loc.c (dwarf2_evaluate_loc_desc::get_frame_base): Throw if frame is null.
2021-05-17Fix ubsan buildTom Tromey2-3/+8
I tried a build using the undefined behavior sanitizer, and gcc gave this error: In file included from /usr/include/string.h:495, from ../gnulib/import/string.h:41, from ../../binutils-gdb/gdb/../gdbsupport/common-defs.h:95, from ../../binutils-gdb/gdb/nat/linux-osdata.c:20: In function 'char* strncpy(char*, const char*, size_t)', inlined from 'void time_from_time_t(char*, int, TIME_T)' at ../../binutils-gdb/gdb/nat/linux-osdata.c:923:15, inlined from 'void time_from_time_t(char*, int, TIME_T)' at ../../binutils-gdb/gdb/nat/linux-osdata.c:911:1, inlined from 'void linux_xfer_osdata_sem(buffer*)' at ../../binutils-gdb/gdb/nat/linux-osdata.c:1082:22: /usr/include/bits/string_fortified.h:106:34: error: 'char* __builtin_strncpy(char*, const char*, long unsigned int)' specified bound 32 equals destination size [-Werror=stringop-truncation] This patch fixes the problem by subtracting one from the length parameter to strncpy. I changed a couple of other similar functions -- gcc does not warn about these, but I didn't see any substantial difference between the different cases, and I think these are just latent warnings, to be triggered in the future by a change to inlining heuristics. gdb/ChangeLog 2021-05-17 Tom Tromey <tromey@adacore.com> * nat/linux-osdata.c (user_from_uid, time_from_time_t) (group_from_gid): Subtract one from strncpy length.
2021-05-17Fix buffer underflow in add_pathTom Tromey2-0/+5
Address sanitizer pointed out a buglet in source.c:add_path. In this test, from gdb.base/source-dir.exp: (gdb) set directories :/foo:/bar ... 'p[-1]' will result in a buffer underflow. This patch fixes the bug by introducing a new check. 2021-05-17 Tom Tromey <tromey@adacore.com> * source.c (add_path): Check 'p' before using 'p[-1]'.
2021-05-17Change how dwarf2_per_cu_data is deletedTom Tromey3-20/+61
Address sanitizer pointed out that the patch to use 'delete' for dwarf2_per_cu_data introduced a bug -- now it is possible to delete a signatured_type using a pointer to its base class. This patch fixes the problem by introducing a deleter and a unique_ptr specialization. A virtual destructor would be more ordinary here, but it seemed wasteful to add a vtable just for this purpose. If virtual methods are ever needed here, we can revisit this. 2021-05-17 Tom Tromey <tromey@adacore.com> * dwarf2/read.h (struct dwarf2_per_cu_data_deleter: New. (dwarf2_per_cu_data_up): New typedef. (struct dwarf2_per_bfd) <allocate_per_cu>: Change return type. <all_comp_units>: Use dwarf2_per_cu_data_up. * dwarf2/read.c (dwarf2_per_cu_data::operator()): New function. (dwarf2_per_bfd::allocate_per_cu): Return dwarf2_per_cu_data_up. (create_cu_from_index_list): Likewise. (create_signatured_type_table_from_index) (create_cus_from_debug_names_list, add_type_unit) (read_comp_units_from_section): Update. (dwarf2_find_containing_comp_unit): Change type of all_comp_units. (run_test): Update.
2021-05-17Replace sort_tu_by_abbrev_offset with operator<Tom Tromey2-11/+13
I noticed that sort_tu_by_abbrev_offset only has a single caller. It seemed simpler to replace it with an implementation of operator< instead. 2021-05-17 Tom Tromey <tom@tromey.com> * dwarf2/read.c (tu_abbrev_offset::operator<): New method. (sort_tu_by_abbrev_offset): Remove. (build_type_psymtabs): Update.
2021-05-17gdb/testsuite: rename .py.in files to .pySimon Marchi5-3/+10
I noticed these files because they weren't considered by black for reformatting, prior to adding pyproject.toml, because their extension is not .py. I don't think they specifically need to be named .py.in, so I suggest renaming them to .py. This will make it nicer to edit them, as editors will recognize them more easily as Python files. Perhaps this was needed before, when the testsuite didn't always put output files in the output directory. Then, a different name for the source and destination file might have been desirable to avoid overwriting a file with itself (perhaps that wasn't well handled). But in any case, it doesn't see to cause any problem now. gdb/testsuite/ChangeLog: * gdb.python/py-framefilter-gdb.py.in: Rename to: * gdb.python/py-framefilter-gdb.py: ... this. * gdb.python/py-framefilter-invalidarg-gdb.py.in: Rename to: * gdb.python/py-framefilter-invalidarg-gdb.py: ... this. Change-Id: I63bb94010bbbc33434ee1c91a386c91fc1ff80bc
2021-05-17gdb: add pyproject.tomlSimon Marchi6-99/+117
When running black to format Python files, files with extension .py.in are ignored, because they don't end in .py. Add a pyproject.toml file to instruct black to pick up these files too. gdb/ChangeLog: * py-project.toml: New. * gdb-gdb.py.in: Re-format. gdb/testsuite/ChangeLog: * gdb.python/py-framefilter-gdb.py.in: Re-format. * gdb.python/py-framefilter-invalidarg-gdb.py.in: Re-format. Change-Id: I9b88faec3360ea24788f44c8b89fe0b2a5f4eb97
2021-05-17gdb: add cmd_list_element::is_command_class_helpSimon Marchi5-21/+22
Same idea as the previous patches, but for whether a command is a "command class help" command. I think this one is particularly useful, because it's not obvious when reading code what "c->func == NULL" means. Remove the cmd_func_p function, which does kind of the same thing as cmd_list_element::is_command_class_help (except it doesn't give a clue about the semantic of a NULL func value). gdb/ChangeLog: * cli/cli-decode.h (cmd_list_element) <is_command_class_help>: New, use it. * command.h (cmd_func_p): Remove. * cli/cli-decode.c (cmd_func_p): Remove. Change-Id: I521a3e1896dc93a5babe1493d18f5eb071e1b3b7
2021-05-17gdb: add cmd_list_element::is_prefixSimon Marchi11-31/+37
Same idea as the previous patch, but for prefix instead of alias. gdb/ChangeLog: * cli/cli-decode.h (cmd_list_element) <is_prefix>: New, use it. Change-Id: I76a9d2e82fc8d7429904424674d99ce6f9880e2b
2021-05-17gdb: add cmd_list_element::is_aliasSimon Marchi5-12/+20
Add the cmd_list_element::is_alias helper to check whether a command is an alias. I find it easier to understand the intention in: if (c->is_alias ()) than if (c->alias_target != nullptr) Change all the spots that are reading alias_target just to compare it to NULL/nullptr to use is_alias instead. gdb/ChangeLog: * cli/cli-decode.h (cmd_list_element) <is_alias>: New, use it. Change-Id: I26ed56f99ee47fe884fdfedf87016501631693ce
2021-05-17gdb: rename cmd_list_element::cmd_pointer to targetSimon Marchi5-44/+50
cmd_pointer is another field whose name I found really not clear. Yes, it's a pointer to a command, the type tells me that. But what's the relationship of that command to the current command? This field contains, for an alias, the command that it aliases. So I think that the name "alias_target" would be more appropriate. Also, rename "old" parameters to "target" in the functions that add aliases. gdb/ChangeLog: * cli/cli-decode.h (cmd_list_element) <cmd_pointer>: Rename to... <alias_target>: ... this. (add_alias_cmd): Rename old to target. (add_info_alias): Rename old_name to target_name. (add_com_alias): Likewise. Change-Id: I8db36c6dd799fae155f7acd3805f6d62d98befa9
2021-05-17gdb: rename cmd_list_element::prefixlist to subcommandsSimon Marchi13-87/+94
While browsing this code, I found the name "prefixlist" really confusing. I kept reading it as "list of prefixes". Which it isn't: it's a list of sub-commands, for a prefix command. I think that renaming it to "subcommands" would make things clearer. gdb/ChangeLog: * Rename "prefixlist" parameters to "subcommands" throughout. * cli/cli-decode.h (cmd_list_element) <prefixlist>: Rename to... <subcommands>: ... this. * cli/cli-decode.c (lookup_cmd_for_prefixlist): Rename to... (lookup_cmd_with_subcommands): ... this. Change-Id: I150da10d03052c2420aa5b0dee41f422e2a97928
2021-05-17gdb: don't handle old == nullptr in add_alias_cmdSimon Marchi2-12/+5
I don't think this can ever happen, that we add an alias command and pass a nullptr old (target) command. Remove the "if" handling this, replace with an assert. gdb/ChangeLog: * cli/cli-decode.c (add_alias_cmd): Don't handle old == 0. Change-Id: Ibb39e8dc4e0c465fa42e6826215f30a0a0aef932
2021-05-17gdb: move cmd_list_element::prefixname to cli/cli-decode.cSimon Marchi3-14/+25
I don't think this method really benefits from being implemented in the header file, especially because it's recursive, it can't be inlined. Move it to the source file, so it's no re-compiled by every CU including cli/cli-decode.h. I also noticed this method could be const, make it so. gdb/ChangeLog: * cli/cli-decode.h (prefixname): Make const, move implementation to cli/cli-decode.c. * cli/cli-decode.c (cmd_list_element::prefixname): New. Change-Id: I1597cace98d9a4ba71f51f1f495e73cc07b5dcf3
2021-05-17gdb/fortran: test case modified to suit the clang behavior.Bhuvanendra Kumar N2-3/+14
As mentioned in the test case itself, depending on the fortran compiler used, class member names used in the print commands and also output of these print commands varies. Existing print commands and its output are suited for gfortran, hence they were failing with clang compiler and test case was modified accordingly for clang compiler. gdb/testsuite/ChangeLog: * gdb.base/class-allocatable-array.exp: Modified test for clang.
2021-05-16CTF: handle forward reference typeWeimin Pan5-27/+562
The problems can be illustrated, with any program, below: (gdb) print main $1 = {main} 0x0 The return type was incorrectly set in read_func_kind_type, with the name of the function, which leads c_type_print_base_1 to print it. In addition, the address of a new function needs to be set with that info in its minimal symtab entry, when the new function is added. After the fix: (gdb) print main $1 = {int ()} 0x4004b7 <main> A new test, gdb.ctf/funcreturn.exp, is added to the testsuite. gdb/ChangeLog: * ctfread.c (new_symbol): Set function address. (read_func_kind_type): Remove incorrect type name setting. Don't copy name returned from ctf_type_ame_raw throughout file. gdb/testsuite/ChangeLog: * gdb.ctf/funcreturn.exp: New file. * gdb.ctf/whatis.c: Copy from gdb.base.
2021-05-14Fix Python pretty-printing bug in RustTom Tromey6-2/+133
An upstream Rust bug notes notes that the Python pretty-printing feature is broken for values that appear as members of certain types in Rust. The bug here is that some of the Rust value-printing code calls value_print_inner, a method on rust_language. This bypasses the common code that calls into Python. I'm checking this in. gdb/ChangeLog 2021-05-14 Tom Tromey <tom@tromey.com> * rust-lang.c (rust_language::val_print_struct) (rust_language::print_enum): Use common_val_print, not value_print_inner. gdb/testsuite/ChangeLog 2021-05-14 Tom Tromey <tom@tromey.com> * gdb.rust/pp.exp: New file. * gdb.rust/pp.py: New file. * gdb.rust/pp.rs: New file.
2021-05-14testsuite: Cleanup some temp dirs with gdb-index filesBernd Edlinger3-0/+29
After the gdb test-suite runs there are some files left in /tmp/tmp*/*.gdb-index, remove those files and the directory at the end of the test case. gdb/testsuite: 2021-05-14 Bernd Edlinger <bernd.edlinger@hotmail.de> * gdb.base/index-cache.exp: Cleanup $cache_dir/*.gdb-index and remove the directory. * gdb.dwarf2/per-bfd-sharing.exp: Likewise.
2021-05-14gdb/python: add a 'connection_num' attribute to Inferior objectsTankut Baris Aktemur7-1/+70
Define a 'connection_num' attribute for Inferior objects. The read-only attribute is the ID of the connection of an inferior, as printed by "info inferiors". In GDB's internal terminology, that's the process stratum target of the inferior. If the inferior has no target connection, the attribute is None. gdb/ChangeLog: 2021-05-14 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * python/py-inferior.c (infpy_get_connection_num): New function. (inferior_object_getset): Add a new element for 'connection_num'. * NEWS: Mention the 'connection_num' attribute of Inferior objects. gdb/doc/ChangeLog: 2021-05-14 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * python.texi (Inferiors In Python): Mention the 'connection_num' attribute. gdb/testsuite/ChangeLog: 2021-05-14 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * gdb.python/py-inferior.exp: Add test cases for 'connection_num'.
2021-05-14gdb: some int to bool conversion in remote.cAndrew Burgess2-17/+21
Convert a couple of local variables from int to bool. There should be no user visible changes after this commit. gdb/ChangeLog: * remote.c (check_pending_events_prevent_wildcard_vcont): Change argument type, update and re-wrap, header comment. (remote_target::commit_resumed): Convert any_process_wildcard and may_global_wildcard_vcont from int to bool.
2021-05-14gdb: fix pretty printing max depth behaviourKent Cheung9-37/+77
The 'print max-depth' feature incorrectly causes GDB to skip printing the string representation of pretty printed variables if the variable is stored at a nested depth corresponding to the set max-depth value. This change ensures that it is always printed before checking whether the maximum print depth has been reached. Regression tested with GCC 7.3.0 on x86_64, ppc64le, aarch64. gdb/ChangeLog: * cp-valprint.c (cp_print_value): Replaced duplicate code. * guile/scm-pretty-print.c (ppscm_print_children): Check max_depth just before printing child values. (gdbscm_apply_val_pretty_printer): Don't check max_depth before printing string representation. * python/py-prettyprint.c (print_children): Check max_depth just before printing child values. (gdbpy_apply_val_pretty_printer): Don't check max_depth before printing string representation. gdb/testsuite/ChangeLog: * gdb.python/py-format-string.c: Added a variable to test. * gdb.python/py-format-string.exp: Check string representation is printed at appropriate max_depth settings. * gdb.python/py-nested-maps.exp: Likewise. * gdb.guile/scm-pretty-print.exp: Add additional tests.
2021-05-14sim: create header namespaceMike Frysinger2-2/+7
The gdb/callback.h & gdb/remote-sim.h headers have nothing to do with gdb and are really definitions for the libsim API under the sim/ tree. While gdb uses those headers as a client, it's not specific to it. So create a new sim/ namespace and move the headers there.
2021-05-14gdb: lm32: drop unused sim headersMike Frysinger2-3/+5
Looks like these were copied & pasted as nothing from them are used.
2021-05-13gdb: maybe unpush target from old inferior in inf_child_target::follow_execSimon Marchi4-1/+39
I realized that with "follow-exec-mode == new", the process target stayed pushed in the original inferior. This can cause a small incoherence: $ ./gdb -q -nx --data-directory=data-directory -ex "set follow-exec-mode new" --args execer args-for-execer Reading symbols from execer... (gdb) r Starting program: /home/smarchi/build/binutils-gdb/gdb/execer args-for-execer I am execer and my argv[1] is: args-for-execer process 3562426 is executing new program: /home/smarchi/build/binutils-gdb/gdb/execee [New inferior 2] [New process 3562426] I am execee and my argv[1] is: arg-for-execee [Inferior 2 (process 3562426) exited normally] (gdb) info inferiors Num Description Connection Executable 1 <null> 1 (native) /home/smarchi/build/binutils-gdb/gdb/execer * 2 <null> /home/smarchi/build/binutils-gdb/gdb/execee (gdb) maintenance print target-stack The current target stack is: - exec (Local exec file) - None (None) (gdb) inferior 1 [Switching to inferior 1 [<null>] (/home/smarchi/build/binutils-gdb/gdb/execer)] (gdb) maintenance print target-stack The current target stack is: - native (Native process) - exec (Local exec file) - None (None) On exec, when execution continues into inferior 2, the native target isn't unpushed from inferior 1. When inferior 2's execution finishes normally, inf_child_target::mourn_inferior unpushes the native target, because the native target has been implicitly opened. I think that if the native target was implicitly opened, it should be unpushed from inferior 1, just like it is unpushed from an inferior whose execution terminate. This patch implements that. gdb/ChangeLog: * inf-child.h (inf_child_target) <follow_exec>: New. * inf-child.c (inf_child_target::follow_exec): New. Change-Id: I782cc08d73d93a990f4e53611107f68b2cb58af1
2021-05-13gdb: on exec, delegate pushing / unpushing target and adding thread to ↵Simon Marchi9-47/+107
target_ops::follow_exec On "exec", some targets need to unpush themselves from the inferior, and do some bookkeeping, like forgetting the data associated to the exec'ing inferior. One such example is the thread-db target. It does so in a special case in thread_db_target::wait, just before returning the TARGET_WAITKIND_EXECD event to its caller. We have another such case in the context of rocm-gdb [1], where the "rocm" target is pushed on top of the linux-nat target. When an exec happens, we want to unpush the rocm target from the exec'ing inferior to close some file descriptors that refer to the pre-exec address space and forget about that inferior. We then want to push the target on the inferior in which execution continues, to open the file descriptors for the post-exec address space. I think that a good way to address this cleanly is to do all this in the target_ops::follow_exec implementations. Make the process_stratum_target::follow_exec implementation have the default behavior of pushing itself to the new inferior's target stack (if execution continues in a new inferior) and add the initial thread. remote_target::follow_exec is an example of process target that wants to do a bit more than the default behavior. So it calls process_stratum_target::follow_exec first and does the extra work second. linux-thread-db (a non-process target) implements follow_exec to do some bookeeping (forget about that process' data), before handing down the event down to the process target (which hits process_stratum_target::follow_exec). gdb/ChangeLog: * target.h (struct target_ops) <follow_exec>: Add ptid_t parameter. (target_follow_exec): Likewise. * target.c (target_follow_exec): Add ptid_t parameter. * infrun.c (follow_exec): Adjust call to target_follow_exec, don't push target nor create thread. * linux-thread-db.c (class thread_db_target) <follow_exec>: New. (thread_db_target::wait): Just return on TARGET_WAITKIND_EXECD. (thread_db_target::follow_exec): New. * remote.c (class remote_target) <follow_exec>: Add ptid_t parameter. (remote_target::follow_exec): Call process_stratum_target::follow_exec. * target-delegates.c: Re-generate. Change-Id: I3f96d0ba3ea0dde6540b7e1b4d5cdb01635088c8
2021-05-13gdb: call target_follow_exec when "set follow-exec-mode" is "same"Simon Marchi3-2/+12
target_follow_exec is currently only called in the "follow-exec-mode == new" branch of follow_exec, not the "follow-exec-mode == same" branch. I think it would make sense to call it regardless of the mode to let targets do some necessary handling. This is needed in the context of rocm-gdb [1], where a target is pushed on top of the linux-nat target. On exec, it needs to do some bookkeeping, close some file descriptors / handles that were related to the process pre-exec and open some new ones for the process post-exec. However, by looking at the only in-tree implementation of target_ops::follow_exec, remote_target::follow_exec, I found that it would be useful for the extended-remote target too, to align its behavior with native debugging (although I think that behavior is not very user-friendly, see PR 27745 [2]). Using two programs, one (let's call it "execer") that execs the other (let's call it "execee"), with native: $ ./gdb -q -nx --data-directory=data-directory ./execer Reading symbols from ./execer... (gdb) r Starting program: /home/simark/build/binutils-gdb/gdb/execer I am execer process 1495622 is executing new program: /home/simark/build/binutils-gdb/gdb/execee I am execee [Inferior 1 (process 1495622) exited normally] (gdb) r Starting program: /home/simark/build/binutils-gdb/gdb/execee I am execee [Inferior 1 (process 1495626) exited normally] And now with gdbserver (some irrelevant output lines removed for brevity): $ ./gdbserver --once --multi :1234 ... $ ./gdb -q -nx --data-directory=data-directory ./execer -ex "set remote exec-file /home/simark/build/binutils-gdb/gdb/execer" -ex "tar ext :1234" Reading symbols from ./execer... Remote debugging using :1234 (gdb) r Starting program: /home/simark/build/binutils-gdb/gdb/execer process 1495724 is executing new program: /home/simark/build/binutils-gdb/gdb/execee [Inferior 1 (process 1495724) exited normally] (gdb) r `target:/home/simark/build/binutils-gdb/gdb/execee' has disappeared; keeping its symbols. Starting program: target:/home/simark/build/binutils-gdb/gdb/execee warning: Build ID mismatch between current exec-file target:/home/simark/build/binutils-gdb/gdb/execee and automatically determined exec-file target:/home/simark/build/binutils-gdb/gdb/execer exec-file-mismatch handling is currently "ask" Reading /home/simark/build/binutils-gdb/gdb/execer from remote target... Load new symbol table from "target:/home/simark/build/binutils-gdb/gdb/execer"? (y or n) When handling the exec, GDB updates the exec-file of the inferior to be the execee. This means that a subsequent "run" will run the execee, not the original executable (execer). remote_target::follow_exec is meant to update the "remote exec-file", which is the file on the remote system that will be executed if you "run" the inferior, to the execee as well. However, this is not called when follow-exec-mode is same, because target_follow_exec is not called in this branch. As a result, GDB thinks the inferior is executing execee but the remote side is really executing execer, hence the mismatch message. By calling target_follow_exec in the "same" branch of the follow_exec function, we ensure that everybody agrees, and we get the same behavior with the extended-remote target as we get with the native target, the execee is executed on the second run: $ ./gdbserver --once --multi :1234 ... $ ./gdb -q -nx --data-directory=data-directory ./execer -ex "set remote exec-file /home/simark/build/binutils-gdb/gdb/execer" -ex "tar ext :1234" Reading symbols from ./execer... Remote debugging using :1234 (gdb) r Starting program: /home/simark/build/binutils-gdb/gdb/execer process 1501445 is executing new program: /home/simark/build/binutils-gdb/gdb/execee [Inferior 1 (process 1501445) exited normally] (gdb) r `target:/home/simark/build/binutils-gdb/gdb/execee' has disappeared; keeping its symbols. Starting program: target:/home/simark/build/binutils-gdb/gdb/execee [Inferior 1 (process 1501447) exited normally] (gdb) This scenario is tested in gdb.base/foll-exec-mode.exp, and in fact this patch fixes the test for me when using --target_board=native-extended-gdbserver. gdb/ChangeLog: * infrun.c (follow_exec): Call target_follow_fork when follow-exec-mode is same. * target.h (target_follow_fork): Improve doc. [1] https://github.com/ROCm-Developer-Tools/ROCgdb [2] https://sourceware.org/bugzilla/show_bug.cgi?id=27745 Change-Id: I4ee84a875e39bf3f8eaf3e6789a4bfe23a2a430e
2021-05-13gdb/testsuite: fix dates in last 3 ChangeLog entriesAndrew Burgess1-3/+3
Incorrect dates in last 3 ChangeLog entries for gdb/testsuite/ChangeLog.
2021-05-13gdb/testsuite: resolve remaining duplicate tests in gdb.guile/Andrew Burgess2-76/+86
The remaining duplicates are resolved by adding a with_test_prefix and reindenting a proc. I also added a couple of additional test names to some of the tests. gdb/testsuite/ChangeLog: * gdb.guile/scm-pretty-print.exp (run_lang_tests): Give some tests unique names, also wrap proc body in with_test_prefix.
2021-05-13gdb/testsuite: resolve duplicate test names in gdb.guile/*.expAndrew Burgess6-45/+69
This commit resolves almost all of the remaining duplicate test names in gdb.guile/*.exp. This is done by either: - Making use of with_test_prefix, - Giving tests a unique name, - Extending the existing name to make it unique, - Not printing PASS lines for simple setup commands (e.g. loading support modules, or adjusting GDB internal settings not relating to guile). gdb/testsuite/ChangeLog: * gdb.guile/scm-frame-args.exp: Add with_test_prefix to resolve duplicate test names. * gdb.guile/scm-parameter.exp: Provide test names to avoid duplicate names based on the command being run. * gdb.guile/scm-symbol.exp: Extend test name to make it unique. * gdb.guile/scm-type.exp (restart_gdb): Don't print PASS line when loading a support module. (test_equality): Update test name to match the actual test, making the name unique in the process. * gdb.guile/scm-value.exp (test_value_in_inferior): Add test names to resolve duplicate tests. (test_inferior_function_call): Likewise. (test_subscript_regression): Likewise.
2021-05-13gdb/testsuite: remove some duplicate test names from guile testsAndrew Burgess2-3/+18
The guile support library has some "tests" that are actually being used to setup GDB ready for the real guile tests, e.g. we load some support modules, and define some helper functions. As this setup is done every time we call gdb_guile_runto_main, which could be called multiple times in a single test script, this can lead to duplicate PASS lines. As this setup is all pretty basic, and isn't the actual focus of the real tests, then in this commit I pass an empty test name through to the gdb_test_no_output calls, the result of this is that the PASS lines are no longer printed. This removes some duplicate tests from the gdb.guile/*.exp set of tests. gdb/testsuite/ChangeLog: * lib/guile.exp (gdb_scm_load_file): Use empty test name to silence PASS lines. (gdb_install_guile_module): Likewise.
2021-05-13gdb: remove cmd_list_element::pre_show_hookSimon Marchi3-8/+6
This is unused, remove it. gdb/ChangeLog: * cli/cli-decode.h (struct cmd_list_element) <pre_show_hook>: Remove. * cli/cli-setshow.c (do_show_command): Adjust. Change-Id: Ib9cd79d842550392b062309e1e5c079ad5d7571a
2021-05-13[AArch64] Fix off-by-one when calculating tag granules.Luis Machado2-2/+8
When we want to fetch tags from a memory range, the last address in that range is not included. There is a off-by-one error in aarch64_mte_get_tag_granules, which this patch fixes. gdb/ChangeLog: 2021-05-13 Luis Machado <luis.machado@linaro.org> * arch/aarch64-mte-linux.c (aarch64_mte_get_tag_granules): Don't include the last address in the range.
2021-05-12gdb: make gdbpy_parse_command_name return a unique_xmalloc_ptrSimon Marchi4-54/+61
This avoids some manual memory management. cmdpy_init correctly transfers ownership of the name to the cmd_list_element, as it sets the name_allocated flag. However, cmdpy_init (and add_setshow_generic) doesn't, it looks like the name is just leaked. This is a bit tricky, because it actually creates two commands (one set and one show), it would take a bit of refactoring of the command code to give each their own allocated copy. For now, just keep doing what the current code does but in a more explicit fashion, with an explicit release. gdb/ChangeLog: * python/python-internal.h (gdbpy_parse_command_name): Return gdb::unique_xmalloc_ptr. * python/py-cmd.c (gdbpy_parse_command_name): Likewise. (cmdpy_init): Adjust. * python/py-param.c (parmpy_init): Adjust. (add_setshow_generic): Take gdb::unique_xmalloc_ptr, release it when done. Change-Id: Iae5bc21fe2b22f12d5f954057b0aca7ca4cd3f0d
2021-05-12Revert "[gdb/symtab] Fix infinite recursion in dwarf2_cu::get_builder()"Tom de Vries4-18/+25
This reverts commit 4cf88725da1cb503be04d3237354105ec170bc86. It causes the following regression: ... $ cat shadow.cc namespace A {} int main() { using namespace A; return 0; } $ g++-10 -g shadow.cc -flto -o shadow $ ./gdb -q -batch ./shadow -ex "b main" Aborted (core dumped) ...
2021-05-12Guile: add value-const-valueGeorge Barrett7-2/+51
The Guile API doesn't currently have an equivalent to the Python API's gdb.Value.const_value(). This commit adds a procedure with equivalent semantics to the Guile API. gdb/ChangeLog: * NEWS (Guile API): Note the addition of the new procedure. * guile/scm-value.c (gdbscm_value_const_value): Add implementation of value-const-value procedure. (value_functions): Add value-const-value procedure. gdb/doc/ChangeLog: * guile.texi (Values From Inferior In Guile): Add documentation for value-const-value. gdb/testsuite/ChangeLog: * gdb.guile/scm-value.exp (test_value_in_inferior): Add test for value-const-value.
2021-05-12Guile: add value-{rvalue-,}reference-valueGeorge Barrett7-0/+88
The Guile API doesn't currently have an equivalent to the Python API's Value.reference_value() or Value.rvalue_reference_value(). This commit adds a procedure with equivalent semantics to the Guile API. gdb/ChangeLog: * NEWS (Guile API): Note the addition of new procedures. * guile/scm-value.c (gdbscm_reference_value): Add helper function for reference value creation. (gdbscm_value_reference_value): Add implementation of value-reference-value procedure. (gdbscm_value_rvalue_reference_value): Add implementation of value-rvalue-reference-value procedure. (value_functions): Add value-reference-value procedure. Add value-rvalue-reference-value procedure. gdb/doc/ChangeLog: * guile.texi (Values From Inferior In Guile): Add documentation for value-reference-value. Add documentation for value-rvalue-reference-value. gdb/testsuite/ChangeLog: * gdb.guile/scm-value.exp (test_value_in_inferior): Add test for value-reference-value. Add test for value-rvalue-reference-value.
2021-05-12Guile: improved rvalue reference supportGeorge Barrett6-0/+25
Adds a couple of missing bits to the Guile API to make C++11 rvalue reference values and types usable from Guile scripts. gdb/ChangeLog: * guile/scm-type.c (type_integer_constants): Add binding for TYPE_CODE_RVALUE_REF. * guile/scm-value.c (gdbscm_value_referenced_value): Handle dereferencing of rvalue references. * NEWS (Guile API): Note improvements in rvalue reference support. gdb/doc/ChangeLog: * guile.texi (Types In Guile): Add documentation for TYPE_CODE_RVALUE_REF.