aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2025-06-04libctf: dedup: improve hiding of conflicting types in the same dictNick Alcock1-5/+40
If types are conflicting, they are usually moved into separate child dicts -- but not always. If they are added to the same dict by the cu-mapping mechanism (as used e.g. for multi-TU kernel modules), we can easily end up adding multiple conflicting types with the same name to the same dict. The mechanism used for turning on the non-root-visible flag in order to do this had a kludge attached which always hid types with the same name, whether or not they were conflicting. This is unnecessary and can hide types that should not be hidden, as well as hiding bugs. Remove it, and replace it with two different approaches: - for everything but cu-mapped links (the in-memory first phase of a link with ctf_link_add_cu_mapping in force), check for duplicate names if types are conflicting, and mark them as hidden if the names are found. This will never happen in normal links (in an upcoming commit we will suppress doing even this much in such cases). - for cu-mapped links, the only case that merges multiple distinct target dicts into one, we apply a big hammer and simply hide everything! The non-root flag will be ignored in the next link phase anyway (which dedups the cu-mapped pieces against each other), and this way we can be sure that merging multiple types cannot incur name clashes at this stage. The result seems to work: the only annoyance is that when enums with conflicting enumerators are found in a single cu-mapped child (so, really multiple merged children), you may end up with every instance of that enum being hidden for reasons of conflictingness. I don't see a real way to avoid that. libctf/ PR libctf/33047 * ctf-dedup.c (ctf_dedup_emit_type): Only consider non conflicting types. Improve type hiding in the presence of clashing enumerators. Hide everything when doing a cu-mapped link: they will be unhidden by the next link pass if nonconflicting.
2025-06-04Revert "libctf: fix linking of non-root-visible types"Nick Alcock3-132/+2
This reverts commit 87b2f673102884d7c69144c85a26ed5dbaa4f86a. It is based on a misconception, that hidden types in the deduplicator input should always be hidden in the output. For cu-mapped links, and final links following cu-mapped links, this is not true: we want to hide inputs if they were conflicting on the output and no more. We will reintroduce the testcase once a better fix is found. libctf/ PR libctf/33047 * ctf-dedup.c (ctf_dedup_emit_type): Don't respect the nonroot flag. * testsuite/libctf-writable/ctf-nonroot-linking.c: Removed. * testsuite/libctf-writable/ctf-nonroot-linking.lk: Removed.
2025-06-04aarch64: Support id_aa64fpfr0_el1, id_aa64pfr2_el1Dmitry Chestnykh3-0/+6
2025-06-04gdb/python/guile: fix segfault from nested prefix command creationAndrew Burgess6-23/+105
A commit I recently pushed: commit 0b5023cc71d3af8b18e10e6599a3f9381bc15265 Date: Sat Apr 12 09:15:53 2025 +0100 gdb/python/guile: user created prefix commands get help list can trigger a segfault if a user tries to create nested prefix commands. For example, this will trigger a crash: (gdb) python gdb.ParameterPrefix("prefix-1", gdb.COMMAND_NONE) (gdb) python gdb.ParameterPrefix("prefix-1 prefix-2", gdb.COMMAND_NONE) Fatal signal: Segmentation fault ... etc ... If the user adds an actual parameter under 'prefix-1' before creating 'prefix-2', then everything is fine: (gdb) python gdb.ParameterPrefix("prefix-1", gdb.COMMAND_NONE) (gdb) python gdb.Parameter('prefix-1 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN) (gdb) python gdb.ParameterPrefix("prefix-1 prefix-2", gdb.COMMAND_NONE) The mistake in the above patch is in how gdbpy_parse_command_name is used. The BASE_LIST output argument from this function points to the list of commands for the prefix, not to the prefix command itself. So when gdbpy_parse_command_name is called for 'prefix-1 prefix-2', BASE_LIST points to the list of commands associated with 'prefix-1', not to the actual 'prefix-1' cmd_list_element. Back in cmdpy_init, from where gdbpy_parse_command_name was called, I was walking back from the first entry in BASE_LIST to figure out if this was a "show" prefix command or not. However, if BASE_LIST is empty then there is no first item, and this would trigger the segfault. The solution it to extend gdbpy_parse_command_name to also return the prefix cmd_list_element in addition to the existing values. With this done, and cmdpy_init updated, the segfault is now avoided. There's a new test that would trigger the crash without the patch. And, of course, the above commit also broke guile in the exact same way. And the fix is exactly the same. And there's a guile test too. NOTE: We should investigate possibly sharing some of this boiler plate helper code between Python and Guile. But not in this commit. Approved-By: Tom Tromey <tom@tromey.com>
2025-06-04[gdb/testsuite] Fix gdb.base/exec-invalid-sysroot.expTom de Vries1-0/+4
Since commit d462550c91c ("gdb/testsuite: also compile foll-exec.exp as C++"), we run into: ... Running gdb.base/exec-invalid-sysroot.exp ... gdb compile failed, foll-exec.c: In function 'main': foll-exec.c:35:52: error: 'EXECD_PROG' undeclared (first use in this function) printf ("foll-exec is about to execlp(%s)...\n", EXECD_PROG); ^~~~~~~~~~ foll-exec.c:35:52: note: each undeclared identifier is reported only once \ for each function it appears in ... Fix this by default-defining EXECD_PROG to "execd-prog". Tested on x86_64-linux.
2025-06-04Reject compressed sections exceding 4 GiB on LLP64 machinesRui Ueyama1-4/+12
According to the zlib FAQ (*1), zlib does not support compressed data larger than 4 GiB when the compiler's long type is 32 bits. Therefore, we need to report an error if a zlib-compressed debug section exceeds 4 GiB on LLP64 machines. (*1) https://zlib.net/zlib_faq.html#faq32 Signed-off-by: Rui Ueyama <rui314@gmail.com>
2025-06-03sframe: fix PR libsframe/33051Indu Bhagat1-1/+1
Fix PR libsframe/Bug 33051 - ASAN: heap-buffer-overflow ../../src/libsframe/sframe.c:1054 in sframe_get_funcdesc_with_addr_internal The previous commit 9d2a24349e2 (libsframe: correct binary search for SFrame FDE) adapted the binary search logic in sframe_get_funcdesc_with_addr_internal. Adjusting the upper end of the search index was missed. The search must only be done for FDEs starting at index 0 and up until num_fdes - 1. Prior logic of searching (before commit 9d2a24349e2) was a bit different. libsframe/ * sframe.c: Use the correct high index.
2025-06-04Automatic date update in version.inGDB Administrator1-1/+1
2025-06-03gdb/testsuite: also compile foll-exec.exp as C++Andrew Burgess4-44/+122
For a long time, Fedora GDB has carried a test that performs some basic testing that GDB can handle 'catch exec' related commands for a C++ executable. The exact motivation for this test has been lost in the mists of time, but looking at the test script, the concern seems to be that GDB would have problems inserting C++ related internal breakpoints if a non C++ process is execd from a C++ one. There's no actual GDB fix associated with the Fedora test. This usually means that the issue was fixed upstream long ago. This patch does seem to date from around 2010ish (or maybe earlier). Having a look through the upstream tests, I cannot see anything that covers this sort of thing (C++ to C exec calls), and I figure it cannot hurt to have some additional testing in this area, and so I wrote this patch. I've taken the existing foll-exec.exp test, which compiles a C executable and then execs a different C executable, and split it into two copies. We now have foll-exec-c.exp and foll-exec-c++.exp. These tests compile a C and C++ executable respectively. Then within each of these scripts both a C and C++ helper application is built, which can then be execd from the main test executable. And so, we now cover 4 cases, the initial executable can be C or C++, and the execd process can be C or C++. As expected, everything passes. This is just increasing test coverage. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-06-03gdb: Make dwarf support optional at compile timeGuinevere Larsen11-70/+279
This commit allows a user to enable or disable dwarf support at compilation time. To do that, a new configure option is introduced, in the form of --enable-gdb-dwarf-support (and the accompanying --disable version). By default, dwarf support is enabled, so no behavior changes occur if a user doesn't use the new feature. If support is disabled, no .c files inside the dwarf2/ subfolder will be compiled into the final binary. To achieve this, this commit also introduces the new macro DWARF_FORMAT_AVAILABLE, which guards the definitions of functions exported from the dwarf reader. If the macro is not defined, there are a couple behaviors that exported functions may have: * no-ops: several functions are used to register things at initialization time, like unwinders. These are turned into no-ops because the user hasn't attempted to read DWARF yet, there's no point in warning that DWARF is unavailable. * warnings: similar to the previous commit, if dwarf would be read or used, the funciton will emit the warning "No dwarf support available." * throw exceptions: If the code that calls a function expects an exceptin in case of errors, and has a try-catch block, an error with the previous message is thrown. I believe that the changed functions should probalby be moved to the dwarf2/public.h header, but that require a much larger refactor, so it is left as a future improvement. Finally, the --enable-gdb-compile configure option has been slightly changed, since compile requires dwarf support. If compile was requested and dwarf was disabled, configure will throw an error. If the option was not used, support will follow what was requested for dwarf (warning the user of what is decided). Reviewed-By: Eli Zaretskii <eliz@gnu.org> Approved-By: Tom Tromey <tom@tromey.com> Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-06-03gdb: wrap mdebug debuginfo reading in ifdefsGuinevere Larsen8-8/+77
This commit aims to allow a user to enable or disable mdebug support at compilation time. To do that, a new configure option is added, called --enable-gdb-mdebug-support (and the accompanying --disable version). By default, support is enabled, and if a user decides to disable support, the file mdebugread.c won't be compiled in the final binary, and the macro MDEBUG_FORMAT_AVAILABLE won't be defined. That macro is used to control the definitions of mdebug reading, either the actual definition in mdebugread.c, or a static inline version that only emits the following warning: > No mdebug support available. Ideally, we'd like to guard the entirity of mdebugread in the macro, but the alpha-mdebug-tdep file uses those directly, and I don't think we should restrict alpha hosts to requiring that debug format compiled in, nor do I understand the tdep file enough to be comfortable disentangling the requirements. Reviewed-By: Eli Zaretskii <eliz@gnu.org> Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-06-03gdb: Use multiple minimal_symbol_readers in mipscoff_symfile_readGuinevere Larsen3-8/+33
Currently, mipscoff_symfile_read uses a single minimal_symbol_reader to get all minimal symbols from mdebug-formatted debuginfo, and from alphacoff. This pattern has been around since minimal_symbol_reader has been introduced, and from own research, there's no need to use the same reader. This made it so mipscoff_symfile_read could call mdebug_build_psymtabs directly, since the latter needs a reference to the minsym reader object. The issue is that future commits need a unified entrance point to read debuginfo, and this pattern is very different to how elf does mdebug reading. In fact, the elf mdebug reader does some preparatory steps and then calls mdebug_build_psymtabs, so what the mips version does is just spread these preparatory steps through the mipscoff function instead. To make it easier for future commits to query debuginfo support dynamically (as opposed to assuming things at compile time), this commit introduces a new mipsmdebug_build_psymtabs function, which does similar preparatory steps as elfmdebug_build_psymtabs. It is added to mdebugread.c to help with maintaining a separation between reading an objfile (in mipsread.c) and its debuginfo (mdebug), so that in the future we have an easier time selectively disabling debuginfo formats at compilation time. This should have no visible changes for the end user. The new function must receive the pointers to ecoff_debug_swap and ecoff_debug_info because finding those structures based on the bfd object necessitates including the headers libcoff.h and libecoff.h, and those headers can't be included at the same time as libaout.h - which mdebugread.c already uses. Approved-By: Tom Tromey <tom@tromey.com>
2025-06-03Add checks for illegal symbol binding and type values when reading ELF symbols.Nick Clifton1-11/+38
PR 33019
2025-06-03gdb/python/guile: user created prefix commands get help listAndrew Burgess9-42/+381
Consider GDB's builtin prefix set/show prefix sub-commands, if they are invoked with no sub-command name then they work like this: (gdb) show print print address: Printing of addresses is on. print array: Pretty formatting of arrays is off. print array-indexes: Printing of array indexes is off. print asm-demangle: Demangling of C++/ObjC names in disassembly listings is off. ... cut lots of lines ... (gdb) set print List of set print subcommands: set print address -- Set printing of addresses. set print array -- Set pretty formatting of arrays. set print array-indexes -- Set printing of array indexes. set print asm-demangle -- Set demangling of C++/ObjC names in disassembly listings. ... cut lots of lines ... Type "help set print" followed by set print subcommand name for full documentation. Type "apropos word" to search for commands related to "word". Type "apropos -v word" for full documentation of commands related to "word". Command name abbreviations are allowed if unambiguous. (gdb) That is 'show print' lists the values of all settings under the 'print' prefix, and 'set print' lists the help text for all settings under the 'set print' prefix. Now, if we try to create something similar using the Python API: (gdb) python gdb.ParameterPrefix("my-prefix", gdb.COMMAND_NONE) (gdb) python gdb.Parameter("my-prefix foo", gdb.COMMAND_OBSCURE, gdb.PARAM_BOOLEAN) (gdb) show my-prefix (gdb) set my-prefix Neither 'show my-prefix' or 'set my-prefix' gives us the same details relating to the sub-commands that we get with the builtin prefix commands. This commit aims to address this. Currently, in cmdpy_init, when a new command is created, we always set the commands callback function to cmdpy_function. It is within cmdpy_function that we spot that the command is a prefix command, and that there is no gdb.Command.invoke method, and so return early. This commit changes things so that the rules are now: 1. For NON prefix commands, we continue to use cmdpy_function. 2. For prefix commands that do have a gdb.Command.invoke method (i.e. can handle unknown sub-commands), continue to use cmdpy_function. 3. For all other prefix commands, don't use cmdpy_function, instead use GDB's normal callback function for set/show prefixes. This requires splitting the current call to add_prefix_cmd into either a call to add_prefix_cmd, add_show_prefix_cmd, or add_basic_prefix_cmd, as appropriate. After these changes, we now see this: (gdb) python gdb.ParameterPrefix("my-prefix", gdb.COMMAND_NONE) │ (gdb) python gdb.Parameter("my-prefix foo", gdb.COMMAND_OBSCURE, gdb.PARAM_BOOLEAN) (gdb) show my-prefix │ my-prefix foo: The current value of 'my-prefix foo' is "off". (gdb) set my-prefix List of "set my-prefix" subcommands: set my-prefix foo -- Set the current value of 'my-prefix foo'. Type "help set my-prefix" followed by subcommand name for full documentation. Type "apropos word" to search for commands related to "word". Type "apropos -v word" for full documentation of commands related to "word". Command name abbreviations are allowed if unambiguous. (gdb) Which matches how a prefix defined within GDB would act. I have made the same changes to the Guile API.
2025-06-03Clean up comment in dw2-ranges-psym-warning.expTom Tromey1-1/+1
This removes a trailing backslash from a comment in dw2-ranges-psym-warning.exp. This backslash causes Emacs to try to reindent the next line. This happens because comments are weird in Tcl -- they are not exactly syntactic and the backslash still acts as a line-continuation marker here.
2025-06-03sframe: doc: add date to the pdf outputIndu Bhagat1-0/+2
libsframe/doc/ * sframe-spec.texi: Include date with each publication.
2025-06-03Handle dynamic DW_AT_data_bit_offsetTom Tromey7-18/+162
In Ada, a field can have a dynamic bit offset in its enclosing record. In DWARF 3, this was handled using a dynamic DW_AT_data_member_location, combined with a DW_AT_bit_offset -- this combination worked out ok because in practice GNAT only needs a dynamic byte offset with a fixed offset within the byte. However, this approach was deprecated in DWARF 4 and then removed in DWARF 5. No replacement approach was given, meaning that in strict mode there is no way to express this. This is a DWARF bug, see https://dwarfstd.org/issues/250501.1.html In a discussion on the DWARF mailing list, a couple people mentioned that compilers could use the obvious extension of a dynamic DW_AT_data_bit_offset. I've implemented this for LLVM: https://github.com/llvm/llvm-project/pull/141106 In preparation for that landing, this patch implements support for this construct in gdb. New in v2: renamed some constants and added a helper method, per Simon's review. New in v3: more renamings. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-06-03gdb: support zero inode in generate-core-file commandAndrew Burgess4-7/+819
It is possible, when creating a shared memory segment (i.e. with shmget), that the id of the segment will be zero. When looking at the segment in /proc/PID/smaps, the inode field of the entry holds the shared memory segment id. And so, it can be the case that an entry (in the smaps file) will have an inode of zero. When GDB generates a core file, with the generate-core-file (or its gcore alias) command, the shared memory segment should be written into the core file. Fedora GDB has, since 2008, carried a patch that tests this case. There is no fix for GDB associated with the test, and unfortunately, the motivation for the test has been lost to the mists of time. This likely means that a fix was merged upstream without a suitable test, but I've not been able to find and relevant commit. The test seems to be checking that the shared memory segment with id zero, is being written to the core file. While looking at this test and trying to work out if it should be posted upstream, I saw that GDB does appear to write the shared memory segment into the core file (as expected), which is good. However, GDB still isn't getting this case exactly right, there appears to be no NT_FILE entry for the shared memory mapping if the mapping had an id of zero. In gcore_memory_sections (gcore.c) we call back into linux-tdep.c (via the gdbarch_find_memory_regions call) to correctly write the shared memory segment into the core file, however, in linux_make_mappings_corefile_notes, when we use linux_find_memory_regions_full to create the NT_FILE note, we call back in to dump_note_entry_p for each mapping, and in here we reject any mapping with a zero inode. The result of this, is that, for a shared memory segment with a non-zero id, after loading the core file, the shared memory segment will appear in the 'proc info mappings' output. But, for a shared memory segment with a zero id, the segment will not appear in the 'proc info mappings' output. I initially tried just dropping the inode check in this function (see previous commit 1e21c846c27, which I then reverted in commit 998165ba99a. The problem with dropping the inode check is that the special kernel mappings, e.g. '[vvar]' would now get a NT_FILE entry. In fact, any special entry except '[vdso]' and '[vsyscall]' which are specifically checked for in dump_note_entry_p would get a NT_FILE entry, which is not correct. So, instead, I propose that if the inode is zero, and the filename starts with '[' and finished with ']' then we should not create a NT_FILE entry. But otherwise a zero inode should not prevent a NT_FILE entry being created. The test for this change is a bit tricky. The original Fedora test (mentioned above) has a loop that tries to grab the shared memory mapping with id zero. This was, unfortunately, not very reliable. I tried to make this more reliable by going multi-threaded, and waiting for longer, see my proposal here: https://inbox.sourceware.org/gdb-patches/0d389b435cbb0924335adbc9eba6cf30b4a2c4ee.1741776651.git.aburgess@redhat.com But this was still not great. On further testing this was only passing (i.e. managing to find the shared memory mapping with id zero) about 60% of the time. However, I realised that GDB finds the shared memory id by reading the /proc/PID/smaps file. But we don't really _need_ the shared memory id for anything, we just use the value (as an inode) to decide if the segment should be included in the core file or not. The id isn't even written to the core file. So, if we could intercept the read of the smaps file, then maybe, we could lie to GDB, and tell it that the id was zero, and then see how GDB handles this. And luckily, we can do that using a preload library! We already have a test that uses a preload library to modify GDB, see gdb.threads/attach-slow-waitpid.exp. So, I have created a new preload library. This one intercepts open, open64, close, read, and pread. When GDB attempts to open /proc/PID/smaps, the library spots this and loads the file contents into a memory buffer. The buffer is then modified to change the id of any shared memory mapping to zero. Any reads from this file are served from the modified memory buffer. I tested on x86-64, AArch64, PPC, s390, and ARM, all running various versions of GNU/Linux. The requirement for open64() came from my ARM testing. The other targets used plain open(). And so, the test is now simple. Start GDB with the preload library in place, start the inferior and generate a core file. Then restart GDB, load the core file, and check the shared memory mapping was included. This test will fail with an unpatched GDB, and succeed with the patch applied. Tested-By: Guinevere Larsen <guinevere@redhat.com>
2025-06-03gdb: handle struct and union types in evaluate_subexp_for_address_basePiotr Rudnicki3-1/+23
Suppose a function returns a struct and a method of that struct is called. E.g.: struct S { int a; int get () { return a; } }; S f () { S s; s.a = 42; return s; } ... int z = f().get(); ... GDB is able to evaluate the expression: (gdb) print f().get() $1 = 42 However, type-checking the expression fails: (gdb) ptype f().get() Attempt to take address of value not located in memory. This happens because the `get` function takes an implicit `this` pointer, which in this case is the value returned by `f()`, and GDB wants to get an address for that value, as if passing the implicit this pointer. However, during type-checking, the struct value returned by `f()` is a `not_lval`. A similar issue exists for union types, where methods called on temporary union objects would fail type-checking in the same way. Address the problems by handling `TYPE_CODE_STRUCT` and `TYPE_CODE_UNION` in `evaluate_subexp_for_address_base`. With this change, for struct's method call, we get (gdb) ptype f().get() type = int Add new test cases to file gdb.cp/chained-calls.exp to test this change. Regression-tested in X86-64 Linux.
2025-06-03gdb: remove unused argument in evaluate_subexp_for_address_basePiotr Rudnicki1-10/+7
Remove the unused 'struct expression *exp' parameter from evaluate_subexp_for_address_base and also do some format cleanup.
2025-06-03[gdb/cli] Use captured per_command_time in worker threadsTom de Vries6-11/+25
With test-case gdb.base/maint.exp, I ran into: ... (gdb) file maint^M Reading symbols from maint...^M (gdb) mt set per-command on^M (gdb) Time for "DWARF indexing worker": ...^M Time for "DWARF indexing worker": ...^M Time for "DWARF indexing worker": ...^M Time for "DWARF indexing worker": ...^M Time for "DWARF skeletonless type units": ...^M Time for "DWARF add parent map": ...^M Time for "DWARF finalize worker": ...^M Time for "DWARF finalize worker": ...^M Time for "DWARF finalize worker": ...^M Time for "DWARF finalize worker": ...^M Time for "DWARF finalize worker": ...^M FAIL: $exp: warnings: per-command: mt set per-command on (timeout) mt set per-command off^M 2025-05-31 09:33:44.711 - command started^M (gdb) PASS: $exp: warnings: per-command: mt set per-command off ... I didn't manage to reproduce this by rerunning the test-case, but it's fairly easy to reproduce using a file with more debug info, for instance gdb: ... $ gdb -q -batch -ex "file build/gdb/gdb" -ex "mt set per-command on" ... Due to the default "mt dwarf synchronous" == off, the file command starts building the cooked index in the background, and returns immediately without waiting for the result. The subsequent "mt set per-command on" implies "mt set per-command time on", which switches on displaying of per-command execution time. The "Time for" lines are the result of those two commands, but these lines shouldn't be there because "mt per-command time" == off at the point of issuing the file command. Fix this by capturing the per_command_time variable, and using the captured value instead. Tested on x86_64-linux. Approved-By: Simon Marchi <simon.marchi@efficios.com> PR cli/33039 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33039
2025-06-03Automatic date update in version.inGDB Administrator1-1/+1
2025-06-02gdb/dwarf2: update call_site::target commentSimon Marchi1-1/+1
This comment refers to the field location kind enum, even though call sites were moved to their own enum in 7eb21cc70224 ("Change call_site_target to use custom type and enum"). Update it. Change-Id: I089923170c919853efb2946529221a4b55e720c1
2025-06-02gdb: use quoted filename completion for the shell commandAndrew Burgess2-2/+42
With the quoted filename completion work that I did last year the deprecated_filename_completer function will now only complete a single word as a filename, for example: (gdb) save breakpoints /tm<TAB> The 'save breakpoints' command uses the deprecated_filename_completer completion function. In the above '/tm' will complete to '/tmp/' as expected. However, if you try this: (gdb) save breakpoints /tmp/ /tm<TAB> The second '/tm' will not complete for GDB 16.x, but will complete with GDB 15.x as GDB 15.x is before my changes were merged. What's actually happening here is that, before my changes, the filename completion was breaking words on white space, so in the above the first '/tmp/' and the second '/tm' are seen as separate words for completion, the second word is therefore seen as the start of a new filename. After my changes, deprecated_filename_completer allows spaces to be part of the filename, so in the above, GDB is actually trying to complete a filename '/tmp/ /tm' which likely doesn't exist, and so completion stops. This change for how deprecated_filename_completer works makes sense, commands like 'save breakpoints' take their complete command arguments and treat it as a single filename, so given this: (gdb) save breakpoints /tmp/ /tm<ENTER> GDB really will try to save breakpoints to a file called '/tmp/ /tm', weird as that may seem. How GDB interprets the command arguments didn't change with my completion patches, I simply brought completion into line with how GDB interprets the arguments. The patches I'm talking about here are this set: * 4076f962e8c gdb: split apart two different types of filename completion * dc22ab49e9b gdb: deprecated filename_completer and associated functions * 35036875913 gdb: improve escaping when completing filenames * 1d1df753977 gdb: move display of completion results into completion_result class * bbbfe4af4fb gdb: simplify completion_result::print_matches * 2bebc9ee270 gdb: add match formatter mechanism for 'complete' command output * f2f866c6ca8 gdb: apply escaping to filenames in 'complete' results * 8f87fcb1daf gdb: improve gdb_rl_find_completion_word for quoted words * 67b8e30af90 gdb: implement readline rl_directory_rewrite_hook callback * 1be3b2e82f7 gdb: extend completion of quoted filenames to work in brkchars phase * 9dedc2ac713 gdb: fix for completing a second filename for a command * 4339a3ffc39 gdb: fix filename completion in the middle of a line Bug PR gdb/32982 identifies a problem with the shell command; completion broke between 15.x and 16.x. The shell command also uses deprecated_filename_completer for completion. But consider a shell command line: (gdb) shell ls /tm<TAB> The arguments to the shell command are 'ls /tm' at the point <TAB> is pressed. Under the old 15.x completion GDB would split the words on white space and then try to complete '/tm' as a filename. Under the 16.x model, GDB completes all the arguments as a single filename, that is 'ls /tm', which is unlikely to match any filenames, and so completion fails. The fix is to write a custom completion function for the shell_command function (cli/cli-cmds.c), this custom completion function will skip forward to find the last word in the arguments, and then try to complete that, so in the above example, GDB will skip over 'ls ', and then tries to complete '/tm', which is exactly what we want. Given that the filenames passed to the shell command are forwarded to an actual shell, I have switched over the new quoted filename completion function for the shell command, this means that white space within a filename will be escaped with a backslash by the completion function, which is likely what the user wants, this means the filename will arrive in the (actual) shell as a single word, rather than splitting on white space and arriving as two words. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32982 Reviewed-By: Tom Tromey <tom@tromey.com>
2025-06-02Fix DAP defer_stop_events implementationTom Tromey5-55/+64
DAP requests have a "defer_stop_events" option that is intended to defer the emission of any "stopped" event until after the current request completes. This was needed to handle async continues like "finish &". However, I noticed that sometimes DAP tests can fail, because a stop event does arrive before the response to the "stepOut" request. I've only noticed this when the machine is fairly loaded -- for instance when I'm regression-testing a series, it may occur in some of the tests mid-series. I believe the problem is that the implementation in the "request" function is incorrect -- the flag is set when "request" is invoked, but instead it must be deferred until the request itself is run. That is, the setting must be captured in one of the wrapper functions. Following up on this, Simon pointed out that introducing a delay before sending a request's response will cause test case failures. That is, there's a race here that is normally hidden. Investigation showed that that deferred requests can't force event deferral. This patch implements this; but more testing showed many more race failures. Some of these are due to how the test suite is written. Anyway, in the end I took the radical approach of deferring all events by default. Most DAP requests are asynchronous by nature, so this seemed ok. The only case I found that really required this is pause.exp, where the test (rightly) expects to see a 'continued' event while performing an inferior function call. I went through all events and all requests and tried to convince myself that this patch will cause acceptable behavior in every case. However, it's hard to be completely sure about this approach. Maybe there are cases that do still need an event before the response, but we just don't have tests for them. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32685 Acked-By: Simon Marchi <simon.marchi@efficios.com>
2025-06-02gdb: introduce a per-interpreter event servicing methodPatrick Monnerat3-3/+11
This allows an interpreter to override internal calls to gdb_do_one_event in case the former needs to handle alternate event sources. The default action is to call gdb_do_one_event and this is not overriden in current internal interpreters. However this feature allows to easily embed Tcl/Tk in insight that needs to concurrently handle Tcl events for GUI handling. In all cases, an interpreter event servicing method must call gdb_do_one_event at some point. All internal event servicing calls from gdb now direct to the interpreter-specific method rather than gdb_do_one_event itself.
2025-06-02[gdb/python] Reimplement F405 fixTom de Vries1-10/+20
At commit 34b0776fd73^, flake8 reports the following F405 warnings: ... $ pre-commit run flake8 --file gdb/python/lib/gdb/__init__.py flake8...................................................................Failed - hook id: flake8 - exit code: 1 F405 'flush' may be undefined, or defined from star imports: _gdb F405 'write' may be undefined, or defined from star imports: _gdb F405 'STDOUT' may be undefined, or defined from star imports: _gdb F405 'STDERR' may be undefined, or defined from star imports: _gdb ... F405 'selected_inferior' may be undefined, or defined from star imports: _gdb F405 'execute' may be undefined, or defined from star imports: _gdb F405 'parameter' may be undefined, or defined from star imports: _gdb ... The F405s are addressed by commit 34b0776fd73 ('Suppress some "undefined" warnings from flake8'). The problem indicated by the first F405 is that the use of flush here: ... class _GdbFile(object): ... def flush(self): flush(stream=self.stream) ... cannot be verified by flake8. It concludes that either, flush is undefined, or it is defined by this "star import": ... from _gdb import * # noqa: F401,F403 ... In this particular case, indeed flush is defined by the star import. This can be addressed by simply adding: ... flush(stream=self.stream) # noqa: F405 ... but that has only effect for flake8, so other analyzers may report the same problem. The commit 34b0776fd73 addresses it instead by adding an "import _gdb" and adding a "_gdb." prefix: ... _gdb.flush(stream=self.stream) ... This introduces a second way to specify _gdb names, but the first one still remains, and occasionally someone will use the first one, which then requires fixing once flake8 is run [1]. While this works to silence the warnings, there is a problem: if a developer makes a typo: ... _gdb.flash(stream=self.stream) ... this is not detected by flake8. This matters because although the python import already complains: ... $ gdb -q -batch -ex "python import gdb" Exception ignored in: <gdb._GdbFile object at 0x7f6186d4d7f0> Traceback (most recent call last): File "__init__.py", line 63, in flush _gdb.flash(stream=self.stream) AttributeError: module '_gdb' has no attribute 'flash' ... that doesn't trigger if the code is hidden behind some control flow: ... if _var_mostly_false: flash(stream=self.stream) ... Instead, fix the F405s by reverting commit 34b0776fd73 and adding a second import of _gdb alongside the star import which lists the names used locally: ... from _gdb import * # noqa: F401,F403 +from _gdb import ( + STDERR, + STDOUT, + Command, + execute, + flush, + parameter, + selected_inferior, + write, +) ... This gives the following warnings for the flash typo: ... 31:1: F401 '_gdb.flush' imported but unused 70:5: F811 redefinition of unused 'flush' from line 31 71:9: F405 'flash' may be undefined, or defined from star imports: _gdb ... The benefits of this approach compared to the previous one are that: - the typo is noticed, and - when using a new name, the F405 fix needs to be done once (by adding it to the explicit import list), while previously the fix had to be applied to each use (by adding the "_gdb." prefix). Tested on x86_64-linux. Approved-By: Tom Tromey <tom@tromey.com> [1] Commit 475799b692e ("Fix some pre-commit nits in gdb/__init__.py")
2025-06-02Automatic date update in version.inGDB Administrator1-1/+1
2025-06-01Have bfd_thread_init fail when thread-local storage is unavailableTom Tromey1-13/+21
If thread-local storage is unavailable, bfd_thread_init should fail, because in this case BFD can't be used from multiple threads -- it relies on TLS working.
2025-06-01[gdb/tdep] Fix gdb.ada/finish-var-size.exp on ppc64le-linuxTom de Vries2-1/+8
On openSUSE Tumbleweed ppc64le-linux using gcc 14.3.0, with a gdb 16.3 based package and test-case gdb.ada/finish-var-size.exp, I run into: ... (gdb) finish^M Run till exit from #0 pck.get (value=true) at pck.adb:19^M 0x0000000100004a20 in p () at finish-var-size/p.adb:18^M 18 V : Result_T := Get (True);^M Value returned is $1 = <error reading variable: \ Cannot access memory at address 0x0>^M (gdb) FAIL: gdb.ada/finish-var-size.exp: finish ... Function pck.get returns type Result_T: ... type Array_Type is array (1 .. 64) of Integer; type Maybe_Array (Defined : Boolean := False) is record Arr : Array_Type; Arr2 : Array_Type; end record; type Result_T (Defined : Boolean := False) is record case Defined is when False => Arr : Maybe_Array; when True => Payload : Boolean; end case; end record; ... and uses r3 as address of the return value, which means RETURN_VALUE_STRUCT_CONVENTION, but while executing finish_command we do: ... return_value = gdbarch_return_value_as_value (gdbarch, read_var_value (sm->function, nullptr, callee_frame), val_type, nullptr, nullptr, nullptr); ... and get: ... (gdb) p return_value $1 = RETURN_VALUE_REGISTER_CONVENTION ... This is caused by this check in ppc64_sysv_abi_return_value: ... /* In the ELFv2 ABI, aggregate types of up to 16 bytes are returned in registers r3:r4. */ if (tdep->elf_abi == POWERPC_ELF_V2 && valtype->length () <= 16 ... which succeeds because valtype->length () == 0. Fix this by also checking for !TYPE_HAS_DYNAMIC_LENGTH (valtype). [ I also tested a version of this patch using "!is_dynamic_type (valtype)" instead, but ran into a regression in test-case gdb.ada/variant-record.exp, because type T: ... Length : constant Positive := 8; subtype Name_T is String (1 .. Length); type A_Record_T is record X1 : Natural; X2 : Natural; end record; type Yes_No_T is (Yes, No); type T (Well : Yes_No_T := Yes) is record case Well is when Yes => Name : Name_T; when No => Unique_Name : A_Record_T; end case; end record; ... while being dynamic, also has a non-zero size, and is small enough to be returned in registers r3:r4. ] Fixing this causes the test-case to fail with the familiar: ... warning: Cannot determine the function return value. Try compiling with -fvar-tracking. ... and indeed using -fvar-tracking makes the test-case pass. Tested on ppc64le-linux. PR tdep/33000 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33000
2025-06-01weakref gas internal errorAlan Modra1-0/+1
This horrible testcase (cleaned up from oss-fuzz) r=x*2 x=r-r .weakref r,x r=r-5 triggers resolve_symbol_value "gas_assert (final_val == 0)" in weakref handling. * read.c (assign_symbol): Clear weakrefr.
2025-06-01decompress_contents: fuss over 32-bit longAlan Modra1-2/+4
Some 64-bit compilers have a 32-bit long, which could result in an endless loop if uncompressed_size is larger than 4G.
2025-06-01PR 33033, Support compressed debug sections larger than 4 GiBRui Ueyama1-39/+12
z_stream's avail_in and avail_out are defined as "unsigned int", so it cannot decode an entire compressed stream in one pass if the stream is larger than 4 GiB. The simplest solution to this problem is to use zlib's convenient uncompress2() function, which handles the details for us. Signed-off-by: Rui Ueyama <rui314@gmail.com>
2025-06-01Automatic date update in version.inGDB Administrator1-1/+1
2025-05-31Do not allocate macro_scope on the heapTom Tromey6-59/+56
I noticed that there's no particular reason to allocate the macro_scope objects on the heap. They can be passed around by value just as easily. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-05-31Define TLS in bfd.c if not already definedTom Tromey1-0/+6
If configure decides that thread-local storage isn't available, it does not define "TLS". However, this is used unconditionally in a definition. So, define it if it isn't already defined.
2025-05-31Automatic date update in version.inGDB Administrator1-1/+1
2025-05-31PR 33020 segv in _bfd_elf_strtab_offsetAlan Modra1-8/+9
The PR fuzzer testcase creates a SHT_NOBITS .debug_info section, then triggers a bug in --compress-debug-sections=zlib whereby sh_name is set to -1 in elf_fake_sections as a flag to indicate the name is not set yet (may change to zdebug_*), but the section never hits the debug compression code in assign_file_positions_for_non_load_sections that is responsible for setting sh_name. PR 33020 * elf.c (_bfd_elf_init_reloc_shdr): Rename delay_st_name_p param to delay_sh_name_p. (elf_fake_sections): Rename delay_st_name_p to delay_sh_name_p. Don't set delay_sh_name_p for no contents debug sections.
2025-05-31Revert "Replace assertions with error return values, thus ensuring an ↵Alan Modra2-9/+7
illegal memory access does not occur." This reverts commit 429fb15134cfbdafe2b203086ee05d827726b63b.
2025-05-30gprofng: Use __x86_64__ instead of __x86_64Andrew Pinski7-17/+17
With some compilers, only __x86_64__ is defined so use that instead of __x86_64. gprofng/ChangeLog 2025-05-30 Andrew Pinski <quic_apinski@quicinc.com> * common/core_pcbe.c: s/__x86_64/__x86_64__/. * common/cpu_frequency.h: Likewise. * common/cpuid.c: Likewise. * common/gp-defs.h: Likewise. * common/hwctable.c: Likewise. * libcollector/libcol-i386-dis.c: Likewise. * libcollector/libcol_util.h: Likewise. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2025-05-30Remove some Rust expression helpersTom Tromey2-36/+33
When I did the big expression conversion, I left some helper functions lying around, primarily because the conversion was already quite large and I didn't want to add on. This patch removes a couple such helpers, turning them into methods on the appropriate operation objects. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-05-30gdb: fix DW_AT_compile_unit -> DW_TAG_compile_unit in commentSimon Marchi1-1/+1
While (mistakenly) grepping for DW_AT_compile_unit, I found this typo. Change-Id: I04d97d7b1b27eacfca9da3853711b6092d330575
2025-05-30Prevent illegal memory access when generating map file entries for ifuncs ↵Nick Clifton1-0/+6
removed by garbage collection
2025-05-30Require Python 3.4Tom Tromey8-27/+11
I believe we previously agreed that the minimum supported Python version should be 3.4. This patch makes this change, harmonizing the documentation (which was inconsistent about the minimum version) and the code. New in v2: rebased, and removed a pre-3.4 workaround from __init__.py. Reviewed-By: Eli Zaretskii <eliz@gnu.org> Approved-by: Kevin Buettner <kevinb@redhat.com> Acked-By: Tom de Vries <tdevries@suse.de> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31870
2025-05-30Replace assertions with error return values, thus ensuring an illegal memory ↵Nick Clifton2-7/+9
access does not occur. PR 33020
2025-05-30Updated Malay translation for the bfd/ sub-directoryNick Clifton1-1246/+1424
2025-05-30elf symbol sizeAlan Modra10-111/+43
This changes elf_obj_sy.size from being malloc'd to being on the notes obstack. That means no code needs to free these expressions, which in turn means that the size expression can be shared when cloning symbols. Nothing modifies the size expressions except when resolving. In all cases I could see, if the size changes the entire expression is replaced. The patch also extracts code from elf_copy_symbol_attributes into a separate function for use by riscv and aarch64. * config/obj-elf.c (elf_obj_symbol_clone_hook): Delete. (elf_copy_symbol_size): New function, extracted and modified from.. (elf_copy_symbol_attributes): ..here. (obj_elf_size): Don't free size and use notes_alloc. (elf_frob_symbol): Don't free size. (elf_format_ops): Zero symbol_clone_hook. * config/obj-elf.h (elf_obj_symbol_clone_hook): Delete. (obj_symbol_clone_hook): Don't define. (elf_copy_symbol_size): Declare. * config/tc-aarch64.c (aarch64_elf_copy_symbol_attributes): Delete. * config/tc-aarch64.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Define as elf_copy_symbol_size. * config/tc-alpha.c (s_alpha_end): notes_alloc symbol size exp. * config/tc-ia64.c (dot_endp): Likewise. * config/tc-kvx.c (kvx_endp): Likewise. * config/tc-mips.c (s_mips_end): Likewise. * config/tc-riscv.c (riscv_elf_copy_symbol_attributes): Delete. * config/tc-riscv.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Define as elf_copy_symbol_size.
2025-05-30gas symbol_removeAlan Modra1-41/+18
If a symbol is at the start of the symbol chain then symbol_rootP points at the symbol and symbol->x->previous is NULL. Testing either condition is sufficient, there is no need to test both. Similarly for the symbol at the end of the symbol chain. I'm testing the previous/next pointer because it's most likely that the symbol is not at the start/finish of the chain and thus we need to use that pointer. * symbols.c (symbol_remove): Tidy list handling. (symbol_append, symbol_clone, symbol_insert): Likewise.
2025-05-30Reduce rs_align_code memory for small alignmentsAlan Modra28-36/+61
On x86, MAX_MEM_FOR_RS_ALIGN_CODE is 35, when the most common alignment is 2**3 or 2**4, where the max memory required for the alignment nops is 7 and 15 bytes respectively. So there is some memory wasted since commit 83d94ae428b1. It's not a large amount, especially considering that frag overhead on x86_46 is 144 bytes, but even so I'd rather not be blamed for increasing gas memory usage. So to reduce the memory we'd like to take the alignment into consideration when initialising an rs_align_code frag. The only difficulty here is start_bundle making an rs_align_code frag with an alignment of zero initially, then later increasing the alignment. We change that to use the bundle alignment when setting up the frag. I think that is sufficient as bundle_align_p2 can't change in the middle of a start_bundle/finish_bundle sequence. I haven't modified any targets other than x86 in this patch. Most won't benefit much due to using fairly small MAX_MEM_FOR_RS_ALIGN_CODE. * read.c (start_bundle): Create rs_align_code frag with bundle_align_p2 alignment, then set to zero alignment. (finish_bundle): Adjust comment. * frags.c (MAX_MEM_FOR_RS_ALIGN_CODE): Pass p2align and max to macro. * config/tc-i386.h (HANDLE_ALIGN): Assert that max_bytes is sufficient for nop padding. (max_mem_for_rs_align_code): New inline function. (MAX_MEM_FOR_RS_ALIGN_CODE): Use it. * config/tc-aarch64.h: Adjust MAX_MEM_FOR_RS_ALIGN_CODE. * config/tc-alpha.h: Likewise. * config/tc-arc.h: Likewise. * config/tc-arm.h: Likewise. * config/tc-epiphany.h: Likewise. * config/tc-frv.h: Likewise. * config/tc-ia64.h: Likewise. * config/tc-kvx.h: Likewise. * config/tc-loongarch.h: Likewise. * config/tc-m32r.h: Likewise. * config/tc-metag.h: Likewise. * config/tc-mips.h: Likewise. * config/tc-nds32.h: Likewise. * config/tc-ppc.h: Likewise. * config/tc-riscv.h: Likewise. * config/tc-rl78.h: Likewise. * config/tc-rx.h: Likewise. * config/tc-score.h: Likewise. * config/tc-sh.h: Likewise. * config/tc-sparc.h: Likewise. * config/tc-spu.h: Likewise. * config/tc-tilegx.h: Likewise. * config/tc-tilepro.h: Likewise. * config/tc-visium.h: Likewise. * config/tc-xtensa.h: Likewise.
2025-05-30Automatic date update in version.inGDB Administrator1-1/+1