]> git.ipfire.org Git - thirdparty/binutils-gdb.git/log
thirdparty/binutils-gdb.git
8 weeks ago[gdb/testsuite] Don't use string_to_regexp twice in gdb.base/options.exp
Tom de Vries [Tue, 29 Apr 2025 15:14:46 +0000 (17:14 +0200)] 
[gdb/testsuite] Don't use string_to_regexp twice in gdb.base/options.exp

In test-case gdb.base/options.exp, in proc test_completer_recognizes we have:
...
    set expected_re [string_to_regexp $input_line]
    test_gdb_complete_unique $input_line $expected_re
...

However, the first thing we do in proc test_gdb_complete_unique is to apply
string_to_regexp to the second argument:
...
proc test_gdb_complete_unique {
  input_line
  complete_line
  {append_char " "}
  {max_completions false}
  {testname ""}
} {
    set complete_line_re [string_to_regexp $complete_line]
    test_gdb_complete_unique_re \
         $input_line \
 $complete_line_re \
 $append_char \
 $max_completions\
 $testname
}
...

This happens to not cause any FAILs at the moment, but this should be done
only once.

Fix this not using string_to_regexp in proc test_completer_recognizes.

Tested on x86_64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
8 weeks ago[gdb] Handle nullptr gdb_std{err,out} in {gdbpy,ioscm}_flush
Tom de Vries [Tue, 29 Apr 2025 15:01:55 +0000 (17:01 +0200)] 
[gdb] Handle nullptr gdb_std{err,out} in {gdbpy,ioscm}_flush

Using the trigger patch described in the previous commit, I get:
...
$ gdb
(gdb) <q>error detected on stdin

Fatal signal: Segmentation fault
----- Backtrace -----
0x64c7b3 gdb_internal_backtrace_1
/data/vries/gdb/src/gdb/bt-utils.c:127
0x64c937 _Z22gdb_internal_backtracev
/data/vries/gdb/src/gdb/bt-utils.c:196
0x94db83 handle_fatal_signal
/data/vries/gdb/src/gdb/event-top.c:1021
0x94dd48 handle_sigsegv
/data/vries/gdb/src/gdb/event-top.c:1098
0x7f372be578ff ???
0x10b7c0a _Z9gdb_flushP7ui_file
/data/vries/gdb/src/gdb/utils.c:1527
0xd4b938 gdbpy_flush
/data/vries/gdb/src/gdb/python/python.c:1624
0x7f372d73b276 _PyCFunction_FastCallDict
Objects/methodobject.c:231
0x7f372d73b276 _PyCFunction_FastCallKeywords
Objects/methodobject.c:294
0x7f372d794a09 call_function
Python/ceval.c:4851
0x7f372d78e838 _PyEval_EvalFrameDefault
Python/ceval.c:3351
0x7f372d796e6e PyEval_EvalFrameEx
Python/ceval.c:754
0x7f372d796e6e _PyFunction_FastCall
Python/ceval.c:4933
0x7f372d796e6e _PyFunction_FastCallDict
Python/ceval.c:5035
0x7f372d6fefc8 _PyObject_FastCallDict
Objects/abstract.c:2310
0x7f372d6fefc8 _PyObject_Call_Prepend
Objects/abstract.c:2373
0x7f372d6fe162 _PyObject_FastCallDict
Objects/abstract.c:2331
0x7f372d700705 callmethod
Objects/abstract.c:2583
0x7f372d700705 _PyObject_CallMethodId
Objects/abstract.c:2640
0x7f372d812a41 flush_std_files
Python/pylifecycle.c:699
0x7f372d81281d Py_FinalizeEx
Python/pylifecycle.c:768
0xd4d49b finalize_python
/data/vries/gdb/src/gdb/python/python.c:2308
0x9587eb _Z17ext_lang_shutdownv
/data/vries/gdb/src/gdb/extension.c:330
0xfd98df _Z10quit_forcePii
/data/vries/gdb/src/gdb/top.c:1817
0x6b3080 _Z12quit_commandPKci
/data/vries/gdb/src/gdb/cli/cli-cmds.c:483
0x1056577 stdin_event_handler
/data/vries/gdb/src/gdb/ui.c:131
0x1986970 handle_file_event
/data/vries/gdb/src/gdbsupport/event-loop.cc:551
0x1986f4b gdb_wait_for_event
/data/vries/gdb/src/gdbsupport/event-loop.cc:672
0x1985e0c _Z16gdb_do_one_eventi
/data/vries/gdb/src/gdbsupport/event-loop.cc:263
0xb66f2e start_event_loop
/data/vries/gdb/src/gdb/main.c:402
0xb670ba captured_command_loop
/data/vries/gdb/src/gdb/main.c:466
0xb68b9b captured_main
/data/vries/gdb/src/gdb/main.c:1344
0xb68c44 _Z8gdb_mainP18captured_main_args
/data/vries/gdb/src/gdb/main.c:1363
0x41a3b1 main
/data/vries/gdb/src/gdb/gdb.c:38
---------------------
A fatal error internal to GDB has been detected, further
debugging is not possible.  GDB will now terminate.

This is a bug, please report it.  For instructions, see:
<https://www.gnu.org/software/gdb/bugs/>.

Segmentation fault (core dumped)
$ q
...

Fix this in gdbpy_flush by checking for nullptr gdb_stdout/gdb_stderr (and
likewise in ioscm_flush) such that we get instead:
...
$ gdb
(gdb) <q>error detected on stdin
$ q
...

Tested on x86_64-linux.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
8 weeks ago[gdb] Fix sig_write for null gdb_stderr
Tom de Vries [Tue, 29 Apr 2025 15:01:55 +0000 (17:01 +0200)] 
[gdb] Fix sig_write for null gdb_stderr

When running test-case gdb.tui/tui-layout-asm.exp with target board
dwarf5-fission-debug-types, the test-case fails and I get a core dump:
...
 # of unexpected core files      1
...

Looking at the backtrace of the core file, what seems to be happening is that:
- gdbpy_flush attempts to flush gdb_stdout, which is nullptr
- that causes a segfault
- gdb intercepts this and starts to handle it using handle_fatal_signal
- handle_fatal_signal calls sig_write, which attempts to write to gdb_stderr,
  which is nullptr,
- that causes another segfault
- gdb exits

I managed to reproduce the problem by the following trigger patch in
stdin_event_handler:
...
-  if (error)
+  if (1 || error)
     {
       current_ui = main_ui;
       ui->unregister_file_handler ();
-      if (main_ui == ui)
+      if (1 || main_ui == ui)
  {
    gdb_printf (gdb_stderr, _("error detected on stdin\n"));
+   gdb_stderr = nullptr;
+   gdb_stdout = nullptr;
+   gdb_stdlog = nullptr;
    quit_command ((char *) 0, 0);
  }
...
which gives us:
...
$ gdb
(gdb) <q>error detected on stdin
Segmentation fault (core dumped)
$ q
...

Fix sig_write to handle the case that gdb_stderr == nullptr, such that we get
instead:
...
$ gdb
(gdb) <q>error detected on stdin

Fatal signal: Segmentation fault
----- Backtrace -----
  ...
---------------------
A fatal error internal to GDB has been detected, further
debugging is not possible.  GDB will now terminate.

This is a bug, please report it.  For instructions, see:
<https://www.gnu.org/software/gdb/bugs/>.

Segmentation fault (core dumped)
$ q
...

Tested on x86_64-linux.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
8 weeks ago[gdb] Factor out sig_write
Tom de Vries [Tue, 29 Apr 2025 15:01:55 +0000 (17:01 +0200)] 
[gdb] Factor out sig_write

Lambda function sig_write:
...
  const auto sig_write = [] (const char *msg) -> void
  {
    gdb_stderr->write_async_safe (msg, strlen (msg));
  }
...
is defined a few times.

Factor this out into a regular function.

Tested on x86_64-linux.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
8 weeks agoelf: Properly set sh_offset for .tbss sections
H.J. Lu [Sun, 27 Apr 2025 23:12:48 +0000 (07:12 +0800)] 
elf: Properly set sh_offset for .tbss sections

Set sh_offset for .tbss sections to their nominal offset after aligning.
They are not loaded from disk so the value doesn't really matter, except
when the .tbss section is the first one in a PT_TLS segment.  In that
case, it sets the p_offset for the PT_TLS segment, which according to
the ELF gABI ought to satisfy p_offset % p_align == p_vaddr % p_align.

bfd/

PR ld/32896
* elf.c (assign_file_positions_for_load_sections): Properly set
sh_offset for .tbss sections.

ld/

PR ld/32896
* testsuite/ld-elf/tbss4.d: New file.
* testsuite/ld-elf/tbss4.s: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
8 weeks agogprofng not reading references correctly in Dwarf
Vladimir Mezentsev [Mon, 28 Apr 2025 03:28:30 +0000 (20:28 -0700)] 
gprofng not reading references correctly in Dwarf

Fixed as specified in the DWARF standard:
 The first type of reference can identify any debugging information entry
 within the containing unit. This type of reference is an offset from the first
 byte of the compilation header for the compilation unit containing
 the reference. There are five forms for this type of reference.
 There are fixed length forms for one, two, four and eight byte offsets
 (respectively, DW_FORM_ref1, DW_FORM_ref2, DW_FORM_ref4, and DW_FORM_ref8).
 There is also an unsigned variable length offset encoded form that uses
 unsigned LEB128 numbers (DW_FORM_ref_udata).

gprofng/ChangeLog
2025-04-27  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

* src/DwarfLib.cc (set_die): Handling DWARF references (DW_FORM_ref1,
DW_FORM_ref2, DW_FORM_ref4, DW_FORM_ref8, DW_FORM_ref_udata).
* src/Dwarf.cc: Likewise.

8 weeks agodwarf: Dump .debug_loclists only for DWARF-5
H.J. Lu [Thu, 20 Mar 2025 20:16:34 +0000 (13:16 -0700)] 
dwarf: Dump .debug_loclists only for DWARF-5

.debug_loclists section is loaded into debug_information as DWARF-5 debug
info and .debug_loc section is loaded into debug_information as pre-DWARF-5
debug info.  When dumping .debug_loc section, we should only process
pre-DWARF-5 debug info in debug_information.  When dumping .debug_loclists
section, we should only process DWARF-5 info in debug_information.

binutils/

PR binutils/32809
* dwarf.c (display_debug_loc): Dump .debug_loclists only for
DWARF-5.

ld/

PR binutils/32809
* testsuite/ld-x86-64/dwarf4.s: New file.
* testsuite/ld-x86-64/dwarf5a.s: Likewise.
* testsuite/ld-x86-64/dwarf5b.s: Likewise.
* testsuite/ld-x86-64/pr32809.d: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Run pr32809.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
8 weeks agoAutomatic date update in version.in
GDB Administrator [Tue, 29 Apr 2025 00:00:53 +0000 (00:00 +0000)] 
Automatic date update in version.in

8 weeks agoFix "set debug parser"
Tom Tromey [Fri, 25 Apr 2025 23:32:33 +0000 (17:32 -0600)] 
Fix "set debug parser"

While debugging my longer series, I discovered that I broken "set
debug parser" a couple years ago.  This patch fixes it and adds a
minimal test case so that it, hopefully, will not break again.

This patch also adds parser debugging to the C++ name canonicalizer.

Thanks to Tom de Vries for fixing the test case.

8 weeks agoRegenerate more configury files for 64-bit BFD detection fix
Maciej W. Rozycki [Mon, 28 Apr 2025 18:27:22 +0000 (19:27 +0100)] 
Regenerate more configury files for 64-bit BFD detection fix

The fix for 64-bit BFD detection omitted the regeneration of a bunch
of configury files; fix that.

8 weeks agoFix 64-bit BFD detection causing build failures
Maciej W. Rozycki [Mon, 28 Apr 2025 17:53:30 +0000 (18:53 +0100)] 
Fix 64-bit BFD detection causing build failures

We have a discrepancy with 64-bit BFD handling across our component
subdirectories leading to link failures such as:

ld: ../opcodes/.libs/libopcodes.a(disassemble.o): in function `disassembler': disassemble.c:(.text+0x65): undefined reference to `print_insn_alpha'
ld: disassemble.c:(.text+0x105): undefined reference to `print_insn_ia64'
ld: disassemble.c:(.text+0x11d): undefined reference to `print_insn_loongarch'
ld: disassemble.c:(.text+0x1a1): undefined reference to `print_insn_big_mips'
[...]

with some configurations having a 32-bit host and 64-bit BFD, such as:
`--host=i386-linux-gnu --target=riscv64-linux-gnu --enable-targets=all'.
This is ultimately due to how 64-bit BFD is enabled for bfd/ itself and
other subdirectorses and has been a regression from commit 1d5269c994bf
("unify 64-bit bfd checks").

For bfd/ the BFD_64_BIT autoconf macro from config/bfd64.m4 is used
combined with this logic in bfd/configure.ac:

case ${host64}-${target64}-${want64} in
  *true*)
    wordsize=64
    bfd64_libs='$(BFD64_LIBS)'
    all_backends='$(BFD64_BACKENDS) $(BFD32_BACKENDS)'
    [...]
    ;;
  false-false-false)
    wordsize=32
    all_backends='$(BFD32_BACKENDS)'
    ;;
esac

where the value of ${wordsize} switches between 32-bit and 64-bit BFD
via these pieces:

#define BFD_ARCH_SIZE @wordsize@

and:

#if BFD_ARCH_SIZE >= 64
#define BFD64
#endif

in bfd/bfd-in.h, which ultimately becomes a part of "bfd.h".

Then ${host64} is determined in bfd/configure.ac from the host's word
size, via the host's pointer size:

if test "x${ac_cv_sizeof_void_p}" = "x8"; then
  host64=true
fi

And ${target64} is determined in bfd/configure.ac from the target's word
size:

    if test ${target_size} = 64; then
target64=true
    fi

Where multiple targets have been requested with `--enable-targets=all'
the presence of any 64-bit target will set "true" here.

Finally ${want64} is set according to `--enable-64-bit-bfd' user option
with an arrangement involving BFD_64_BIT:

BFD_64_BIT
if test $enable_64_bit_bfd = yes ; then
  want64=true
else
  want64=false
fi

which also, redundantly, checks and sets its result upon the host's word
size.  Lastly ${want64} is also selectively set by target fragments in
bfd/config.bfd, which mostly if not completely overlaps with ${target64}
setting as described above.

Conversely other subdirectories only rely on BFD_64_BIT, so they fail to
notice that BFD is 64-bit and do not enable their 64-bit handling where
the host requested is 32-bit and 64-bit BFD has been enabled other than
with `--enable-64-bit-bfd'.  One consequence is opcodes/disassemble.c
enables calls to its numerous own 64-bit backends by checking the BFD64
macro from "bfd.h", however does not actually enable said backends in
its Makefile.  Hence the link errors quoted above.

Address the problem then by moving the `--enable-64-bit-bfd' option back
to bfd/configure.ac and remove the call to BFD_64_BIT from there and
then rewrite the macro in terms of checking for the presence of BFD64
macro in "bfd.h", which is the canonical way of determining whether BFD
is 64-bit or not.

Rather than running `grep' directly on ../bfd/bfd-in3.h as the opcodes/
fragment used to before the problematic commit:

    if grep '#define BFD_ARCH_SIZE 64' ../bfd/bfd-in3.h > /dev/null; then

run the preprocessor on "bfd.h", which allows to invoke the macro from
configure.ac files placed in subdirectories located at deeper levels, by
relying on the preprocessor's search path.

This requires however that the invokers rely on `all-bfd' rather than
`configure-bfd' for their `configure' invocation stage, because "bfd.h"
is made by `make all' rather than `configure' in bfd/.

Do not cache the result of this check however, as reconfiguring a tree
such as to flip `--enable-64-bit-bfd' on or to change a secondary target
may affect BFD64 and we have no access to information about secondary
targets in BFD_64_BIT.

Also remove the ENABLE_BFD_64_BIT automake conditional, as it's not used
anywhere.

Last but not least remove the hack from gdb/configure.ac to fail builds
for `mips*-*-*' hosts where `--enable-targets=all' has been requested,
but `--enable-64-bit-bfd' has not as it's no longer needed.  Such builds
complete successfully now, having enabled 64-bit BFD implicitly.

Tested-By: Guinevere Larsen <guinevere@redhat.com>
Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Alan Modra <amodra@gmail.com>
Approved-By: Luis Machado <luis.machado@arm.com>
8 weeks ago[gdb/testsuite] Avoid generating gdb_leak_detector.cpython-<n>.pyc
Tom de Vries [Mon, 28 Apr 2025 16:03:09 +0000 (18:03 +0200)] 
[gdb/testsuite] Avoid generating gdb_leak_detector.cpython-<n>.pyc

After running test-case gdb.python/py-color-leak.exp in a container where I
don't have PYTHONDONTWRITEBYTECODE set, I get:
...
$ ls src/gdb/testsuite/gdb.python/__pycache__/
gdb_leak_detector.cpython-313.pyc
...

Fix this by setting sys.dont_write_bytecode to True in the python scripts
importing the module.

Tested on x86_64-linux.

8 weeks agoUpdate binutils/MAINTAINERS for PPC
Surya Kumari Jangala [Mon, 28 Apr 2025 08:25:15 +0000 (03:25 -0500)] 
Update binutils/MAINTAINERS for PPC

binutils/
* MAINTAINERS: Add myself as PPC maintainer.

8 weeks agoPowerPC: Support for Prefixed Add Immediate Shifted Instruction (RFC02686)
Surya Kumari Jangala [Thu, 27 Feb 2025 17:48:29 +0000 (12:48 -0500)] 
PowerPC: Support for Prefixed Add Immediate Shifted Instruction (RFC02686)

opcodes/
* ppc-opc.c (insert_si32, extract_si32, insert_nsi32,
extract_nsi32): New functions.
(SI32, NSI32, P_D_SI32_MASK, P_DRAPCREL_SI32_MASK): New macros.
(IMM32): Update for new macros.
(powerpc_opcodes): Add plis, paddis, psubis.

gas/
* testsuite/gas/ppc/future.s: New test.
* testsuite/gas/ppc/future.d: Likewise.

2 months agoAutomatic date update in version.in
GDB Administrator [Mon, 28 Apr 2025 00:00:12 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 months agoAutomatic date update in version.in
GDB Administrator [Sun, 27 Apr 2025 00:00:06 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 months agoAdd "maint canonicalize" command
Tom Tromey [Tue, 1 Nov 2022 18:48:27 +0000 (12:48 -0600)] 
Add "maint canonicalize" command

This adds a new "maint canonicalize" command that can be used to see
the canonical form of a C++ name.  I've needed this a few times when
debugging gdb.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Reviewed-By: Tom de Vries <tdevries@suse.de>
2 months ago[gdb/contrib] Add codespell:ignore-begin/ignore-end (disabled)
Tom de Vries [Sat, 26 Apr 2025 07:49:49 +0000 (09:49 +0200)] 
[gdb/contrib] Add codespell:ignore-begin/ignore-end (disabled)

It would be useful to tell codespell to ignore blocks of code.

A feature ignore-multiline-regex exists, which can be used to implement this:
...
$ codespell --ignore-multiline-regex \
    'codespell:ignore-begin.*codespell:ignore-end'
...

Unfortunately there's a bug in codespell where using -w in
combination with --ignore-multiline-regex drops all newlines in the updated
file.

In absence of a fix, commit this solution disabled, to locally document the
current state of this feature.

2 months agoAutomatic date update in version.in
GDB Administrator [Sat, 26 Apr 2025 00:00:07 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 months agoFix d10v sim build with GCC 15
Tom Tromey [Fri, 25 Apr 2025 17:38:34 +0000 (11:38 -0600)] 
Fix d10v sim build with GCC 15

The d10v sim fails when built with GCC 15.  From the bug:

d10v/table.c:171:17: error: initialization of ‘void (*)(struct sim_state *, SIM_CPU *)’ {aka ‘void (*)(struct sim_state *, struct _sim_cpu *)’} from incompatible pointer type ‘void (*)(void)’ [-Wincompatible-pointer-types]
  171 | { 0,0,0,0,0,0,0,(void (*)())0,0,{0,0,0}},
      |                 ^
d10v/table.c:171:17: note: (near initialization for ‘Simops[165].func’)

The bug here is that this is the wrong function pointer type.  Since
'0' is perfectly fine here, this patch simply removes the cast.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32900
Approved-By: Tom de Vries <tdevries@suse.de>
2 months ago[pre-commit] Add codespell-log commit-msg hook
Tom de Vries [Fri, 25 Apr 2025 17:22:36 +0000 (19:22 +0200)] 
[pre-commit] Add codespell-log commit-msg hook

Now that we're using codespell to check spelling in gdb files, can we use
codespell to bring this spelling warning:
...
$ echo usuable | codespell -
1: usuable
usuable ==> usable
...
to:
...
$ git commit -a -m "Usuable stuff"
...
?

First, let's look at a straightforward commit-msg hook implementation:
...
    - id: codespell
      name: codespell-commit-msg
      verbose: true
      always_run: true
      stages: [commit-msg]
...
installed using:
...
$ pre-commit install -t commit-msg
...

When trying the commit, we get:
...
$ echo "/* bla */" >> gdb/gdb.c
$ git commit -a -m "Usuable stuff"
black................................................(no files to check)Skipped
flake8...............................................(no files to check)Skipped
isort................................................(no files to check)Skipped
codespell............................................(no files to check)Skipped
check-include-guards.................................(no files to check)Skipped
black................................................(no files to check)Skipped
flake8...............................................(no files to check)Skipped
codespell............................................(no files to check)Skipped
codespell-commit-msg.....................................................Failed
- hook id: codespell
- duration: 0.06s
- exit code: 65

.git/COMMIT_EDITMSG:1: Usuable ==> Usable

check-include-guards.................................(no files to check)Skipped
$
...

The commit was aborted, but the commit message is still there:
...
$ cat .git/COMMIT_EDITMSG
Usuable stuff
...

We can retry and edit the commit message to clean up the typo:
...
$ git commit -e -F .git/COMMIT_EDITMSG -a
...
but it's a bit cumbersome.

Furthermore, say we fix a typo and want to document this in the commit log, and
do:
...
$ git commit -m "Fixed typo: useable -> usable" -a
...

This commit cannot succeed, unless we add a codespell ignore tag, which feels
like taking it too far.

Both these problems can be addressed by setting things up in such a way that
the commit always succeeds, and codespell output is shown as a hint.

Ideally, we'd tell to pre-commit to implement this using some setting, but
there doesn't seem to be one.

So we use some indirection.  Instead of using native codespell, use a local
hook that calls a script gdb/contrib/codespell-log.sh, which calls pre-commit,
which calls codespell.

Using this approach, we get:
...
$ echo "/* bla */" >> gdb/gdb.c
$ git commit -a -m "Usuable stuff"
black................................................(no files to check)Skipped
flake8...............................................(no files to check)Skipped
isort................................................(no files to check)Skipped
codespell............................................(no files to check)Skipped
check-include-guards.................................(no files to check)Skipped
black................................................(no files to check)Skipped
flake8...............................................(no files to check)Skipped
codespell............................................(no files to check)Skipped
check-include-guards.................................(no files to check)Skipped
codespell-log............................................................Passed
- hook id: codespell-log
- duration: 0.18s

codespell-log-internal...................................................Failed
- hook id: codespell
- exit code: 65

.git/COMMIT_EDITMSG:1: Usuable ==> Usable

[codespell/codespell-log-2 d081bd25a40] Usuable stuff
 1 file changed, 1 insertion(+)
$
...

This is obviously convoluted, but it works.  Perhaps we can propose a
pre-commit improvement (always_pass) and simplify this eventually.

Checked new script codespell-log.sh with shell-check.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2 months agogdb: fix 32 bit build
Guinevere Larsen [Thu, 24 Apr 2025 11:42:12 +0000 (08:42 -0300)] 
gdb: fix 32 bit build

The recent commit dbbb9cfd3708a5b09b449c6cbc4d74dfec13904d added a
message using %ld to print an std::vector::size, which is of size_t
type. on 64 bit machines, size_t will be an unsigned long int, making
%ld work just fine, but on 32 bit ones, size_t will be unsigned int,
which causes the build to fail.

This commit fixes that by using %zu instead.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32901
Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoRevert "gdb: update corner case when canonicalizing riscv syscall names"
Guinevere Larsen [Fri, 25 Apr 2025 11:41:52 +0000 (08:41 -0300)] 
Revert "gdb: update corner case when canonicalizing riscv syscall names"

This reverts commit b2aba1ce1326df73c03641e1cb01d2c5aa577015.
That commit was pushed in error, as I confused which patch was approved
in the list

2 months agoBFD linker: Allow target backends to provide alternate entry names.
Pali Roh?r [Fri, 25 Apr 2025 11:31:48 +0000 (12:31 +0100)] 
BFD linker: Allow target backends to provide alternate entry names.

PR 30144

2 months agogdb/dwarf: add dwarf2_cu::find_die method
Simon Marchi [Thu, 24 Apr 2025 20:36:02 +0000 (16:36 -0400)] 
gdb/dwarf: add dwarf2_cu::find_die method

I added this small helper method in the series I'm writing, to make
finding a DIE by section offset a bit nicer than using the unordered_set
methods.  It doesn't have any dependencies, so I thought I would submit
it on its own.

Change-Id: If7313194ab09d9bd6d6a52c24eb6fd9a9c1b76e0
Approved-by: Kevin Buettner <kevinb@redhat.com>
2 months agoAutomatic date update in version.in
GDB Administrator [Fri, 25 Apr 2025 00:00:30 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 months agogdbsupport: add missing include guard to remote-args.h
Simon Marchi [Thu, 24 Apr 2025 19:36:23 +0000 (15:36 -0400)] 
gdbsupport: add missing include guard to remote-args.h

Also, fix a type in "namespace".

Change-Id: I3e5d1d49c765a035217437c0635b12dc28e41bf6

2 months agopre-commit autoupdate
Simon Marchi [Thu, 24 Apr 2025 18:48:33 +0000 (14:48 -0400)] 
pre-commit autoupdate

Run `pre-commit autoupdate`.  This brings in new versions of isort and
flake8.

Change-Id: I55f8b51b100e090e9a210338f46e10cf131a4aa7
Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb: fix some flake8 F824 warnings
Simon Marchi [Thu, 24 Apr 2025 18:48:32 +0000 (14:48 -0400)] 
gdb: fix some flake8 F824 warnings

flake8 7.2.0 appears to have this new warning:

    F824: global name / nonlocal name is unused: name is never assigned in scope

It points out a few places in our code base where "global" is not
necessary, fix them.

Change-Id: Ia6fb08686977559726fefe2a5bb95d8dcb298bb0
Approved-By: Tom Tromey <tom@tromey.com>
2 months agoUse correct sign extension for enumeration types
Tom Tromey [Thu, 20 Mar 2025 15:52:08 +0000 (09:52 -0600)] 
Use correct sign extension for enumeration types

This changes update_enumeration_type_from_children to use the correct
sign-extension method on the attribute.  The logic here is a bit
complicated: if the enum has an underlying type, then we use that
type's signed-ness to interpret attributes; otherwise we must assume
attributes are encoded as signed values.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse bool in update_enumeration_type_from_children
Tom Tromey [Thu, 20 Mar 2025 14:52:35 +0000 (08:52 -0600)] 
Use bool in update_enumeration_type_from_children

This is just a small preliminary cleanup to use 'bool' in
update_enumeration_type_from_children.

2 months agoRemove dead code from dwarf2_const_value_data
Tom Tromey [Thu, 20 Mar 2025 14:13:57 +0000 (08:13 -0600)] 
Remove dead code from dwarf2_const_value_data

dwarf2_const_value_data checks the size of the data like so:

   if (bits < sizeof (*value) * 8)
...
  else if (bits == sizeof (*value) * 8)
...
   else
...

However, 'bits' can only be 8, 16, 32, or 64.  And, because 'value' is
a LONGEST, which is alwasy 64-bit, the final 'else' can never be
taken.

This patch removes the dead code.  And, because this was the only
reason for a non-void return value, the return type is changed as
well.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse attribute::signed_constant in attribute::as_boolean
Tom Tromey [Thu, 20 Mar 2025 13:52:24 +0000 (07:52 -0600)] 
Use attribute::signed_constant in attribute::as_boolean

This changes attribute::as_boolean to use attribute::signed_constant.
This is maybe overkill but lets any reasonable constant form through.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse correct sign for variant part discriminants
Tom Tromey [Thu, 20 Mar 2025 13:47:51 +0000 (07:47 -0600)] 
Use correct sign for variant part discriminants

The discriminant value for a variant part may be signed or unsigned,
depending on the type of the variant.  This patch changes the DWARF
reader to delay interpretation of the relevant attribute until the
signed-ness is known.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse correct sign in get_mpz
Tom Tromey [Wed, 19 Mar 2025 20:04:43 +0000 (14:04 -0600)] 
Use correct sign in get_mpz

This changes dwarf2/read.c:get_mpz to use the correct sign-extension
function.  Normally a rational constant uses signed values, but a
purely unsigned form also seems fine here.  This adds a new
attribute::form_is_strictly_unsigned, which is more precise than
form_is_unsigned (which accepts a lot of forms that aren't really for
ordinary constants).

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse attribute::unsigned_constant for DW_AT_data_member_location
Tom Tromey [Wed, 19 Mar 2025 20:02:12 +0000 (14:02 -0600)] 
Use attribute::unsigned_constant for DW_AT_data_member_location

This changes the DWARF reader to use attribute::unsigned_constant for
DW_AT_data_member_location.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse attribute::unsigned_constant for DW_AT_data_bit_offset
Tom Tromey [Wed, 19 Mar 2025 16:32:24 +0000 (10:32 -0600)] 
Use attribute::unsigned_constant for DW_AT_data_bit_offset

This changes the DWARF reader to use attribute::unsigned_constant when
examining DW_AT_data_bit_offset.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse correct sign for DW_AT_GNU_bias
Tom Tromey [Wed, 19 Mar 2025 13:25:55 +0000 (07:25 -0600)] 
Use correct sign for DW_AT_GNU_bias

DW_AT_GNU_bias may be signed or unsigned, depending on the underlying
type.  This patch changes the DWARF reader to examine the type before
decoding the attribute.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse attribute::unsigned_constant for DW_AT_bit_stride
Tom Tromey [Wed, 19 Mar 2025 13:22:27 +0000 (07:22 -0600)] 
Use attribute::unsigned_constant for DW_AT_bit_stride

DW_AT_bit_stride uses an unsigned constant, so make this explicit in
the reader.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse attribute::signed_constant for fixed-point scale
Tom Tromey [Mon, 10 Mar 2025 16:03:17 +0000 (10:03 -0600)] 
Use attribute::signed_constant for fixed-point scale

This changes the DWARF reader to use attribute::signed_constant for
DW_AT_binary_scale and DW_AT_decimal_scale.  (FWIW these were the
attributes that first lead me to find this problem.)

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoIntroduce attribute::signed_constant
Tom Tromey [Mon, 24 Feb 2025 19:26:36 +0000 (12:26 -0700)] 
Introduce attribute::signed_constant

This introduces a new method, attribute::signed_constant.  This should
be used wherever DWARF specifies a signed integer constant, or where
this is implied by the context.  It properly handles sign-extension
for DW_FORM_data*.

To my surprise, there doesn't seem to be a pre-existing sign-extension
function.  I've added one to common-utils.h alongside the align
functions.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agoUse attribute::unsigned_constant for sizes
Tom Tromey [Thu, 6 Feb 2025 18:45:05 +0000 (11:45 -0700)] 
Use attribute::unsigned_constant for sizes

This changes the DWARF reader to use attribute::unsigned_constant for
DW_AT_bit_size, DW_AT_byte_size, DW_AT_data_byte_size, and
DW_AT_string_length.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680

2 months agogdb: update corner case when canonicalizing riscv syscall names
Guinevere Larsen [Wed, 23 Apr 2025 14:26:51 +0000 (11:26 -0300)] 
gdb: update corner case when canonicalizing riscv syscall names

The script syscalls/riscv-canonicalize-syscall-gen.py has been recently
introduced to help support record-full in riscv systems.  However, it
was developed before commit 432eca4113d5748ad284a068873455f9962b44fe,
which made the GDB enum more consistent, which forced the python script
to have a corner case for the "gdb_old_mmap" case.

Since the aforementioned commit has already been merged, we need to
update the special case for the mmap syscall. A special case is still
needed because the script would expect that the glibc sources call the
syscall "old_mmap", or that gdb call it "gdb_sys_mmap", neither of which
happens unfortunately.

This commit doesn't change the .c file because it was already fixed by a
different commit, 65ab41b7d5c612b6000b28f4c50bb256b2a9e22b, which was
pushed as obvious to fix the build issues.

Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoFix documentation for gdb.blocked_signals
Tom Tromey [Thu, 24 Apr 2025 13:36:19 +0000 (07:36 -0600)] 
Fix documentation for gdb.blocked_signals

gdb exports a context manager named gdb.blocked_signals, but the
documentation erroneously refers to it as gdb.block_signals.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32891
Approved-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom de Vries <tdevries@suse.de>
2 months agoAdd TLS NEWS entry and document 'set force-internal-tls-address-lookup' command
Kevin Buettner [Thu, 24 Apr 2025 04:39:29 +0000 (21:39 -0700)] 
Add TLS NEWS entry and document 'set force-internal-tls-address-lookup' command

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoNew test - gdb.base/tls-dlobj.exp
Kevin Buettner [Thu, 24 Apr 2025 04:39:29 +0000 (21:39 -0700)] 
New test - gdb.base/tls-dlobj.exp

This test exercises musl_link_map_to_tls_module_id() and
glibc_link_map_to_tls_module_id(), both of which are in solib-svr4.c.

Prior to writing this test, I had only written what is now named
'musl_link_map_to_tls_module_id' and it worked for both GLIBC and
MUSL.  Once I wrote this new test, tls-dlobj.exp, there were a number
of tests which didn't work with GLIBC.  This led me to write a
GLIBC-specific link map to module id function, i.e,
'glibc_link_map_to_tls_module_id'.

It only has one compilation scenario, in which the pthread(s) library
is used - as noted in a comment, it became too much of a hassle to try
to KFAIL things, though it certainly could have been done in much the
same was as was done in gdb.base/multiobj.exp.  It didn't seem that
important to do so, however, since I believe that the other tests
have adequate coverage for different compilation scenarios.

Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoNew test - gdb.base/tls-multiobj.exp
Kevin Buettner [Thu, 24 Apr 2025 04:39:29 +0000 (21:39 -0700)] 
New test - gdb.base/tls-multiobj.exp

This test exercises GDB's internal TLS support when both the main
program and several shared libraries have TLS variables.  It also
tests existing (non-internal) TLS support too.

It tests using two compilation scenarios, "default", in which
libpthread is not linked with the program and libraries as well
as one which does use libpthread.

It tests link map address to module id mapping code in GDB
in addition to the ability of GDB to traverse TLS data structures
with several libraries in play.

Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoNew test - gdb.base/tls-nothreads.exp
Kevin Buettner [Thu, 24 Apr 2025 04:39:29 +0000 (21:39 -0700)] 
New test - gdb.base/tls-nothreads.exp

This commit introduces a new test, gdb.base/tls-nothreads.exp.

It has a test case, a C file, which has several TLS variables in the
main program, which, once compiled and linked, should end up (in ELF
files) in .tdata and .tbss.  The test compiles the program in a number
of different ways, making sure that each variable is accessible
regardless of how it was compiled.

Note that some of the compilation scenarios end up with a statically
linked executable.  Prior to this series of commits, accessing TLS
variables from a statically linked program on Linux did not work.
For certain targets (x86_64, aarch64, s390x, riscv, and ppc64),
all on Linux, support has been added to GDB for accessing thread
local storage in statically linked executables.  This test is
important for testing those build scenarios.

But it's also important to make sure that GDB's internal TLS support
works for other scenarios too.  In order to accomplish that, the
tests are also run in a mode which forces the internal support to
be used.

It also adds a new file, gdb.base/tls-common.exp.tcl, which includes
some common definitions used by the three new TLS tests, including
the one added by this commit.  In particular, it sets a TCL variable,
'internal_tls_linux_targets' which list the targets mentioned earlier.
This means that as internal TLS support is added for other targets,
the target should be listed in just one file as opposed to three
(or more if other tests using tls-common.exp.tcl are added).

Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoDelete disabled i386 internal TLS support
Kevin Buettner [Thu, 24 Apr 2025 04:39:29 +0000 (21:39 -0700)] 
Delete disabled i386 internal TLS support

As mentioned in the previous commit, this commit deletes the disabled
code which could be used to implement internal TLS support for the
i386 target.

Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoInternal, but disabled, TLS support for i386
Kevin Buettner [Thu, 24 Apr 2025 04:39:29 +0000 (21:39 -0700)] 
Internal, but disabled, TLS support for i386

This commit shows how internal TLS address lookup support could
be implemented for the i386 target.

Unfortunately, it doesn't work due to I386_GSBASE_REGNUM being
unavailable for Linux targets.  I looked at trying to access the
gsbase register via PTRACE_GET_THREAD_AREA, but did not understand
it well enough to finish it.  Since the i386 target is much less
important than it used to be, I gave up working on it.

I don't want to leave this disabled code in our sources, so I
will delete it in the next commit, however, this commit will be
in our git repo, so it'll be available for someone with sufficient
interest in the i386 target to look at.

Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoInternal TLS support for aarch64, x86_64, riscv, ppc64, and s390x
Kevin Buettner [Thu, 24 Apr 2025 04:39:29 +0000 (21:39 -0700)] 
Internal TLS support for aarch64, x86_64, riscv, ppc64, and s390x

For each architecture, aarch64, x86_64, riscv, ppc64, and s390x,
this commit defines a suitable 'get_tls_dtv_addr' method and,
when necessary, a 'get_tls_dtp_offset' method.

It also registers svr4_tls_get_thread_local_address, defined in
svr4-tls-tdep.c (in an earlier commit), as the
get_thread_local_address gdbarch method.  It also registers its
architecture specific code using svr4_tls_register_tls_methods().

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24548
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31563

Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoImplement internal TLS address lookup for select Linux targets
Kevin Buettner [Thu, 24 Apr 2025 04:39:28 +0000 (21:39 -0700)] 
Implement internal TLS address lookup for select Linux targets

This commit adds non-architecture-specific support for internal TLS
address lookup for targets which register their support with the new
file svr4-tls-tdep.c.  By "internal", I mean support which does not
rely on libthread_db.  Knowledge of how to traverse TLS data
structures is contained in this commit along with the next commit
containing architecture specific knowledge regarding TLS offsets,
registers, and such.

The new function 'svr4_tls_get_thread_local_address' is a gdbarch method.
It should be passed as an argument to
set_gdbarch_get_thread_local_address in architecture specific
<arch>-linux-tdep.c files which wish to offer internal TLS support.

The architecture specific tdep files need to define a get_tls_dtv_addr
method - as the name suggests, it needs to return the address of the
DTV (dynamic thread vector) via architecture specific means.  This
usually entails fetching the thread pointer via a register or registers
assigned to this purpose, and then using that value to locate the
address of the DTV from within the TCB (thread control block).

Additionally, some architectures also need to provide a DTP offset,
which is used by the MUSL C library to adjust the value obtained
from a DTV entry to that of the start of the TLS block for a particular
thread.  This is provided, when necessary, by a get_tls_dtp_offset
method.

Both methods, get_tls_dtv_addr and get_tls_dtp_offset, are registered
with data structures maintained by linux-tdep.c via the new function
svr4_tls_register_tls_methods().  Thus, for example, on RISC-V,
riscv_linux_init_abi() will make the following two calls, the first
for registering the internal get_thread_local_address gdbarch method
and the second for registering riscv-specific methods for obtaining
the DTV address and DTP offset:

  set_gdbarch_get_thread_local_address (gdbarch,
svr4_tls_get_thread_local_address);
  svr4_tls_register_tls_methods (info, gdbarch, riscv_linux_get_tls_dtv_addr,
 riscv_linux_get_tls_dtp_offset);

Internal TLS support is provided for two C libraries, GLIBC, and MUSL.
Details for accessing the various TLS data structures differ between
these libraries.  As a consequence, linux-tdep.h defines a new enum,
svr4_tls_libc, with values svr4_tls_libc_unknown, svr4_tls_libc_musl,
and svr4_tls_libc_glibc.  A new static function libc_tls_sniffer uses
heuristics to (try to) decide whether a program was linked against
GLIBC or MUSL.  Working out what the heuristics should be, especially
for statically linked binaries, turned out to be harder than I thought
it would be.

A new maintenance setting, force-internal-tls-address-lookup, has been
added, which, when set to 'on', will (as the name suggests) force the
internal TLS lookup mechanisms to be used.  Otherwise, if thread_db
support is available (via the thread stratum), that will be preferred
since it should be more accurate.  I expect that this setting will be
mostly used by test cases in the GDB test suite.  The new test cases
that are part of this series all use it, with iterations using both
'on' and 'off' for all of the tests therein.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24548
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31563
Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoTrack and fetch TLS module ids for MUSL and GLIBC
Kevin Buettner [Thu, 24 Apr 2025 04:39:28 +0000 (21:39 -0700)] 
Track and fetch TLS module ids for MUSL and GLIBC

This commit adds, to solib-svr4.h and solib-svr4.c, functions
glibc_link_map_to_tls_module_id and musl_link_map_to_tls_module_id for
use with callers in a new file svr4-tls-tdep.c (which is not in this
commit).  It adds a number of helper functions for implementing link
map to module id support.

It also renames existing function 'find_program_interpreter' to
'svr4_find_program_interpreter' and makes it visible to other source
files within GDB.  It will be used in the libc sniffing code in
svr4-tls-tdep.c in a later commit in this series.  The libc sniffer is
needed in order to know which link map to module id function to call
as the method for determining module ids differs between libc /
dynamic linker implementations.  These details are discussed in
comments in the patch.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24548
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31563
Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoAllow TLS access to work in gdb.server/no-thread-db.exp
Kevin Buettner [Thu, 24 Apr 2025 04:39:28 +0000 (21:39 -0700)] 
Allow TLS access to work in gdb.server/no-thread-db.exp

The patches later in the series add GDB-internal TLS support for
certain targets.  This commit updates the "print foo" test in
gdb.server/no-thread-db.exp to accept either a TLS failure (when
libthread_db isn't available) or printing the correct answer, which
will occur when GDB's internal TLS address resolution can be used.

I'm making this change prior to the commits which actually add
the GDB-internal TLS support in order to avoid tripping regression
testers.

Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agoDon't attempt to find TLS address when target has no registers
Kevin Buettner [Thu, 24 Apr 2025 04:39:28 +0000 (21:39 -0700)] 
Don't attempt to find TLS address when target has no registers

This commit fixes two bugs, one of which is Bug 25807, which occurs
when target_translate_tls_address() is called from
language_defn::read_var_value in findvar.c.  I found it while testing on
aarch64; it turned a KFAIL for gdb.threads/tls.exp: print a_thread_local
into a FAIL due to a GDB internal error.  Now, with this commit in place,
the KFAIL/FAIL turns into a PASS.

In addition to the existing test just noted, I've also added a test to
the new test case gdb.base/tls-nothreads.exp.  It'll be tested, using
different scenarios, up to 8 times:

PASS: gdb.base/tls-nothreads.exp: default: force_internal_tls=false: after exit: print tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: default: force_internal_tls=true: after exit: print tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: static: force_internal_tls=false: after exit: print tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: static: force_internal_tls=true: after exit: print tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: pthreads: force_internal_tls=false: after exit: print tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: pthreads: force_internal_tls=true: after exit: print tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: pthreads-static: force_internal_tls=false: after exit: print tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: pthreads-static: force_internal_tls=true: after exit: print tls_tbss_1

There is a related problem that occurs when target_translate_tls_address
is called from find_minsym_type_and_address() in minsyms.c.  It can be
observed when debugging a program without debugging symbols when the
program is not executing.  I've written a new test for this, but it's
(also) included in the new test case gdb.base/tls-nothreads.exp, found
later in this series.  Depending on the target, it can run up to 8
times using different scenarios.  E.g., on aarch64, I'm seeing these
PASSes, all of which test this change:

PASS: gdb.base/tls-nothreads.exp: default: force_internal_tls=false: stripped: after exit: print (int) tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: default: force_internal_tls=true: stripped: after exit: print (int) tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: static: force_internal_tls=false: stripped: after exit: print (int) tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: static: force_internal_tls=true: stripped: after exit: print (int) tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: pthreads: force_internal_tls=false: stripped: after exit: print (int) tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: pthreads: force_internal_tls=true: stripped: after exit: print (int) tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: pthreads-static: force_internal_tls=false: stripped: after exit: print (int) tls_tbss_1
PASS: gdb.base/tls-nothreads.exp: pthreads-static: force_internal_tls=true: stripped: after exit: print (int) tls_tbss_1

In an earlier version of this commit (v4), I was checking whether the
target has registers in language_defn::read_var_value in findvar.c and
in find_minsym_type_and_address in minsyms.c, printing suitable error
messages in each case.  In his review of this commit for the v4
series, Tom Tromey asked whether it would be better to do this check
in target_translate_tls_address.  I had considered doing that for the
v4 (and earlier) series, but I wanted to print slightly different
messages at each check.  Also, read_var_value in findvar.c was already
printing a message in some cases and I had arranged for the later
check in that function to match the original message.

However, while I had added a target-has-registers check at two of the
call sites for target_translate_tls_address, I hadn't added it at the
third call site which is in dwarf_expr_context::execute_stack_op() in
dwarf2/expr.c.  I believe that in most cases, this is handled by the
early check in language_defn::read_var_value...

  else if (sym_need == SYMBOL_NEEDS_REGISTERS && !target_has_registers ())
    error (_("Cannot read `%s' without registers"), var->print_name ());

...but it's entirely possible that dwarf_expr_context::execute_stack_op()
might get called in some other context.  So it makes sense to do the
target-has-registers check for that case too.  And rather than add yet
another check at that call site, I decided that moving the check and
error message to target_translate_tls_address makes sense.

I had to make the error messages that it prints somewhat more generic.
In particular, when called from language_defn::read_var_value, the
message printed by target_translate_tls_address no longer matches the
earlier message that could be printed (as shown above).  That meant
that the test cases which check for this message, gdb.threads/tls.exp,
and gdb.base/tls-nothreads.exp had to be adjusted to account for the
new message.  Also, I think it's valuable to the user to know (if
possible) the name of the variable that caused the error, so I've
added an optional parameter to target_translate_tls_address, providing
the name of the variable, if it's known.  Therefore, the message
that's printed when the target-has-registers test fails is one of the
following:

When the TLS variable isn't known (due to being called from
dwarf_expr_context::execute_stack_op):

    "Cannot translate TLS address without registers"

When the TLS variable is known (from either of the other two call sites
for target_translate_tls_address):

    "Cannot find address of TLS symbol `%s' without registers"

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25807
Tested-By: Luis Machado <luis.machado@arm.com>
Approved-By: Luis Machado <luis.machado@arm.com>
2 months agogdb: fix completion of anonymous struct members
Simon Marchi [Thu, 24 Apr 2025 15:13:37 +0000 (11:13 -0400)] 
gdb: fix completion of anonymous struct members

Completing fields inside an anonymous struct does not work.  With:

    struct commit_counters_hot {
     union {
     struct {
     long owner;
     };
     char padding[16];
     };
    };

I get:

    (gdb) complete print cc_hot.
    print cc_hot.padding

After this patch, I get:

    (gdb) complete print cc_hot.
    print cc_hot.owner
    print cc_hot.padding

Update break1.c to include an anonymous struct.  The tests that complete
"z_field" inside gdb.base/completion.exp would start to fail without the
fix.

Change-Id: I46b65a95ad16b0825de58dfa241777fe57acc361
Reviewed-By: Keith Seitz <keiths@redhat.com>
2 months agogdb: fix some Python files formatting
Simon Marchi [Wed, 23 Apr 2025 01:15:11 +0000 (21:15 -0400)] 
gdb: fix some Python files formatting

Running `pre-commit run --all-files` introduces these fixes.

Change-Id: I2e363fdf988b66d83008265b3ca8d1120f84b95d

2 months agogdb: add remote argument passing unit tests
Andrew Burgess [Thu, 9 Nov 2023 15:28:49 +0000 (15:28 +0000)] 
gdb: add remote argument passing unit tests

This commit adds some remote argument passing unit tests.  There are
not many tests right now -- there are known bugs in the remote
argument passing mechanism (see PR gdb/28392) -- but some simple cases
are covered here, and I plan to add additional tests once I've fixed
more of the problems with the existing argument handling code.

The tests take an inferior argument string, this is the string that
GDB would carry around as inferior::m_args.  This string is then split
using gdb::remote_args::split, this gives a vector of strings, these
are the strings that are passed over the remote protocol.  These split
strings are validated as part of the test.

The split strings are then combined using gdb::remote_args::join which
gives the inferior argument string that gdbserver will use, this is
held in server.cc as program_args, this joined string is then checked
as part of the test.

There are no changes to GDB's behaviour as part of this commit, other
than adding the new tests which can be run with:

  (gdb) maintenance selftest remote-args
  Running selftest remote-args.
  Ran 1 unit tests, 0 failed

Tested-By: Guinevere Larsen <guinevere@redhat.com>
2 months agogdb: move remote arg splitting and joining into gdbsupport/
Andrew Burgess [Thu, 9 Nov 2023 14:47:34 +0000 (14:47 +0000)] 
gdb: move remote arg splitting and joining into gdbsupport/

This is a refactoring commit.  When passing inferior arguments to
gdbserver we have two actions that need to be performed, splitting and
joining.

On the GDB side, we take the inferior arguments, a single string, and
split the string into a list of individual arguments.  These are then
sent to gdbserver over the remote protocol.

On the gdbserver side we receive the list of individual arguments and
join these back together into a single inferior argument string.

In the next commit I plan to add some unit testing for this remote
argument passing process.  Ideally, for unit testing, we need the code
being tested to be located in some easily callable function, rather
than being inline at the site of use.

So in this commit I propose to move the splitting and joining logic
out into a separate file, we can then use this within GDB and
gdbserver when passing arguments between GDB and gdbserver, but we can
also call the same functions for some unit testing.

In this commit I'm not adding the unit tests, they will be added next,
so for now there should be no user visible changes after this commit.

Tested-By: Guinevere Larsen <guinevere@redhat.com>
2 months agogas: sframe: fix handling of .cfi_def_cfa_register
Claudiu Zissulescu [Tue, 15 Apr 2025 09:20:40 +0000 (12:20 +0300)] 
gas: sframe: fix handling of .cfi_def_cfa_register

Fix PR gas/32879 sframe: Assembler internal error when translating
cfi_def_cfa_register

As per the documentation, .cfi_def_cfa_register modifies a rule for
computing CFA; the register is updated, but the offset remains the same.

While translating .cfi_def_cfa_register into SFrame context, we use the
information from last translated FRE to set the CFA offset. However,
there may be cases when the last translated FRE is empty.  Use last FRE
only if available.

Signed-off-by: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
Signed-off-by: Indu Bhagat <indu.bhagat@oracle.com>
2 months agoAutomatic date update in version.in
GDB Administrator [Thu, 24 Apr 2025 00:00:11 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 months agogdb/python: keyword arguments for gdb.Color.escape_sequence
Andrew Burgess [Wed, 23 Apr 2025 09:22:32 +0000 (10:22 +0100)] 
gdb/python: keyword arguments for gdb.Color.escape_sequence

GDB's Python documentation does make it clear that keywords arguments
are supported for functions that take 2 or more arguments.  The
documentation makes no promise for keyword argument support on
functions that only take a single argument.

That said, I'm a fan of keyword arguments, I think they help document
the code, and make intentions clearer, even for single argument
functions.

As I'm changing gdb.Color anyway (see previous commit), I'd like to
add keyword argument support to gdb.Color.escape_sequence, even though
this is a single argument method.  This should be harmless for anyone
who doesn't want to use keywords, but adds the option for those of us
that do.

I've also removed a redundant check that the 'self' argument was a
gdb.Color object; Python already ensures this is the case.

And I have folded the check that the single argument is a bool into
the gdb_PyArg_ParseTupleAndKeywords call, this means that the error
message will include the incorrect type name now, which should make
debugging issues easier.

Tests have been extended to cover both cases -- it appears the
incorrect argument type error was not previously tested, so it is
now.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb/python: keyword args for Color.__init__
Andrew Burgess [Wed, 23 Apr 2025 09:07:09 +0000 (10:07 +0100)] 
gdb/python: keyword args for Color.__init__

GDB's Python API documentation is clear:

     Functions and methods which have two or more optional arguments allow
  them to be specified using keyword syntax.

The gdb.Color.__init__ method matches this description, but doesn't
support keyword arguments.

This commit fixes this by adding keyword argument support.

There's a new test to cover this functionality.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb/doc: tweaks to documentation for gdb.Color
Andrew Burgess [Wed, 23 Apr 2025 08:48:11 +0000 (09:48 +0100)] 
gdb/doc: tweaks to documentation for gdb.Color

While reading through the documentation for the new gdb.Color class I
spotted a couple of things which I thought could be improved:

  * I replaced @code{Color} with @code{gdb.Color}.  Most of the other
    classes are referenced with the 'gdb.' prefix, so this makes
    gdb.Color consistent.  Including the 'gdb.' prefix makes it far
    easier to search the documentation to find relevant content.  And
    finally, my understanding is that usually in Python code, the
    class would be written as 'gdb.Color' unless the user specifically
    pulls 'Color' into the current scope using 'from gdb import
    Color'.

  * Replace 'colorspace' with 'color space'.  There was already a use
    of the two word form in the documentation (for gdb.Color), so this
    just makes things consistent.

  * Removed use of @var on two @defun lines.  No other @defun lines
    use @var, so the use of @var here was making the output
    inconsistent, e.g. in the 'info' output, @var causes the string to
    be capitalised.

  * Rename the 'color-space' argument to 'color_space' for
    Color.__init__.  In the next commit I plan to add Python keyword
    argument support to this function, which means the argument name
    needs to be a valid keyword (i.e. must not contain the '-'
    character).

  * Added a pointer to where the @samp{COLORSPACE_} constants can be
    found.  These constants are referenced before they are defined in
    the documentation, which is fine, but I think it is a good idea to
    let the user know where the constants can be found when we first
    reference them.

  * Remove use of 'self' for the Color.escape_sequence documentation.
    There are a few functions that do include 'self' as an argument (I
    think this is a mistake) but the vast majority don't.  I think not
    including 'self' is the better approach; a user wouldn't be
    expected to explicitly pass 'self', this is done automatically by
    Python as a result of calling the method on an object.  So I've
    removed the reference to 'self' from this method.

Approved-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb/python: don't use PyObject_IsInstance in py-unwind.c
Andrew Burgess [Tue, 22 Apr 2025 22:01:58 +0000 (23:01 +0100)] 
gdb/python: don't use PyObject_IsInstance in py-unwind.c

I've been reviewing all uses of PyObject_IsInstance, and I believe
that the use of PyObject_IsInstance in py-unwind.c is not entirely
correct.  The use of PyObject_IsInstance is in this code in
frame_unwind_python::sniff:

  if (PyObject_IsInstance (pyo_unwind_info,
   (PyObject *) &unwind_info_object_type) <= 0)
    error (_("A Unwinder should return gdb.UnwindInfo instance."));

The problem is that PyObject_IsInstance can return -1 to indicate an
error, in which case a Python error will have been set.  Now, the
above code appears to handle this case, it checks for '<= 0', however,
frame_unwind_python::sniff has this near the start:

  gdbpy_enter enter_py (gdbarch);

And looking in python.c at 'gdbpy_enter::~gdbpy_enter ()', you'll
notice that if an error is set then the error is printed, but also, we
get a warning about an unhandled Python exception.  Clearly, all
exceptions should have been handled by the time the gdbpy_enter
destructor is called.

I've added a test as part of this commit that exposes this problem,
the current output is:

  (gdb) backtrace
  Python Exception <class 'RuntimeError'>: error in Blah.__class__
  warning: internal error: Unhandled Python exception
  Python Exception <class 'gdb.error'>: A Unwinder should return gdb.UnwindInfo instance.
  #0  corrupt_frame_inner () at /home/andrew/projects/binutils-gdb/build.dev-g/gdb/testsuite/../../../src.dev-g/gdb/test>
  (gdb)

An additional observation is that we use PyObject_IsInstance to check
that the return value is a gdb.UnwindInfo, or a sub-class.  However,
gdb.UnwindInfo lacks the Py_TPFLAGS_BASETYPE flag, and so cannot be
sub-classed.  As such, PyObject_IsInstance is not really needed, we
could use PyObject_TypeCheck instead.  The PyObject_TypeCheck function
only returns 0 or 1, there is no -1 error case.  Switching to
PyObject_TypeCheck then, fixes the above problem.

There's a new test that exposes the problems that originally existed.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb/python: don't use PyObject_IsInstance in py-registers.c
Andrew Burgess [Tue, 22 Apr 2025 20:43:43 +0000 (21:43 +0100)] 
gdb/python: don't use PyObject_IsInstance in py-registers.c

In python/py-registers.c we make use of PyObject_IsInstance.  The
PyObject_IsInstance can return -1 for an error, 0 for false, or 1 for
true.

In py-registers.c we treat the return value from PyObject_IsInstance
as a boolean, which means both -1 and 1 will be treated as true.

If PyObject_IsInstance returns -1 for an error, this will be treated
as true, we will then invoke undefined behaviour as the pyo_reg_id
object will be treated as a gdb.RegisterDescriptor, even though it
might not be.

I noticed that the gdb.RegisterDescriptor class does not have the
Py_TPFLAGS_BASETYPE flag, and therefore cannot be inherited from.  As
such, using PyObject_IsInstance is not necessary, we can use
PyObject_TypeCheck instead.  The PyObject_TypeCheck function only
returns 0 or 1, so we don't need to worry about the error case.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb/testsuite: split gdb.dwarf2/macro-source-path.exp
Simon Marchi [Tue, 22 Apr 2025 19:48:27 +0000 (15:48 -0400)] 
gdb/testsuite: split gdb.dwarf2/macro-source-path.exp

Because it runs so many variations, the test
gdb.dwarf2/macro-source-path.exp takes about 2:40 minutes to run for me,
in a non-optimized build.  These days I often run all tests under
gdb.dwarf2, as a sanity test for my changes, and so I often have to wait
for this test to complete.

Split the test, to allow it to complete faster when running the
testsuite in parallel.  After this patch, running all the
gdb.dwarf2/macro-source-path-*.exp tests in parallel takes me about 1
minute.  It's more that I would expect, I would expect the time to be
divided by nearly 5, but it's already better than what we have now.

Change-Id: I07e4e1f234cf57d9b0c1c027f08061615714a4d5
Acked-By: Tom de Vries <tdevries@suse.de>
2 months agogdb: fix riscv record-full push
Timur [Thu, 10 Apr 2025 11:55:19 +0000 (14:55 +0300)] 
gdb: fix riscv record-full push

When I (Guinevere) pushed commit
b9c7eed0c2409fc640129a38d80a2bf1212b464a I accidentally used an outdated
version of the patch. This current patch fixes the importation of that
patch based on the actually approved version instead.

2 months ago[gdb/testsuite] Fix another timeout in gdb.base/bg-execution-repeat.exp
Tom de Vries [Wed, 23 Apr 2025 17:10:22 +0000 (19:10 +0200)] 
[gdb/testsuite] Fix another timeout in gdb.base/bg-execution-repeat.exp

With a gdb 16.2 based package, I ran into:
...
(gdb) PASS: gdb.base/bg-execution-repeat.exp: c 1&: input still accepted
interrupt
(gdb) PASS: gdb.base/bg-execution-repeat.exp: c 1&: interrupt
set var do_wait=0
(gdb) PASS: gdb.base/bg-execution-repeat.exp: c 1&: set var do_wait=0
continue&
Cannot execute this command while the selected thread is running.
(gdb)
Program received signal SIGINT, Interrupt.
PASS: gdb.base/bg-execution-repeat.exp: c 1&: continue&
0x00007ffff7cf1503 in clock_nanosleep@GLIBC_2.2.5 () from /lib64/libc.so.6
FAIL: gdb.base/bg-execution-repeat.exp: c 1&: breakpoint hit 2 (timeout)
...

Fix this by waiting for "Program received signal SIGINT, Interrupt" after
issuing the interrupt command.

Tested on x86_64-linux.

2 months agogdb/python: don't use PyObject_IsInstance in gdbpy_is_color
Andrew Burgess [Tue, 22 Apr 2025 18:56:13 +0000 (19:56 +0100)] 
gdb/python: don't use PyObject_IsInstance in gdbpy_is_color

The gdbpy_is_color function uses PyObject_IsInstance, and converts the
return from PyObject_IsInstance to a bool.

Unfortunately, PyObject_IsInstance can return -1, 0, or 1, for error,
failure, or success respectively.  When converting to a bool both -1
and 1 will convert to true.

Additionally, when PyObject_IsInstance returns -1 an error will be
set.

What this means is that, if gdbpy_is_color is called with a non
gdb.Color object, and the PyObject_IsInstance check raises an error,
then (a) GDB will continue as if the object is a gdb.Color object,
which is likely going to invoke undefined behaviour, see
gdbpy_get_color for example, and (b) when GDB eventually returns to
the Python interpreter, due to an error being set, we'll see:

  Python Exception <class 'SystemError'>: PyEval_EvalFrameEx returned a result with an error set
  Error occurred in Python: PyEval_EvalFrameEx returned a result with an error set

However, after the previous commit, gdb.Color can no longer be
sub-classed, this means that fixing the above problems is easy, we can
replace the PyObject_IsInstance check with a PyObject_TypeCheck, the
PyObject_TypeCheck function only returns 0 or 1, there's no -1 error
case.

It's also worth noting that PyObject_TypeCheck is the function that is
more commonly used within GDB's Python API implementation, include the
py-color.c use there were only 4 PyObject_IsInstance uses.  Of the
remaining 3, 2 are fine, and one other (in py-disasm.c) is also
wrong.  I'll address that in a separate patch.

There's also a new test included which exposes the above issue.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb/python: remove Py_TPFLAGS_BASETYPE from gdb.Color
Andrew Burgess [Tue, 22 Apr 2025 17:01:07 +0000 (18:01 +0100)] 
gdb/python: remove Py_TPFLAGS_BASETYPE from gdb.Color

Remove the Py_TPFLAGS_BASETYPE flag from the gdb.Color type.  This
effectively makes gdb.Color final; users can no longer create classes
that inherit from gdb.Color.

Right now I cannot think of any cases where inheritance would be
needed over composition for a simple type like gdb.Color.  If I'm
wrong, then it's easy to add Py_TPFLAGS_BASETYPE back in later, this
would be an extension of the API.  But it's much harder to remove the
flag later as that might break existing user code (note: there has
been no release of GDB yet that includes the gdb.Color type).

Introducing this restriction makes the next commit easier.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb/python: stop using PyObject_IsInstance in py-disasm.c
Andrew Burgess [Tue, 22 Apr 2025 20:31:02 +0000 (21:31 +0100)] 
gdb/python: stop using PyObject_IsInstance in py-disasm.c

The PyObject_IsInstance function can return -1 for errors, 0 to
indicate false, and 1 to indicate true.

I noticed in python/py-disasm.c that we treat the result of
PyObject_IsInstance as a bool.  This means that if PyObject_IsInstance
returns -1, then this will be treated as true.  The consequence of
this is that we will invoke undefined behaviour by treating the result
from the _print_insn call as if it was a DisassemblerResult object,
even though PyObject_IsInstance raised an error, and the result might
not be of the required type.

I could fix this by taking the -1 result into account, however,
gdb.DisassemblerResult cannot be sub-classed, the type doesn't have
the Py_TPFLAGS_BASETYPE flag.  As such, we can switch to using
PyObject_TypeCheck instead, which only return 0 or 1, with no error
case.

I have also taken the opportunity to improve the error message emitted
if the result has the wrong type.  Better error message make debugging
issues easier.

I've added a test which exposes the problem when using
PyObject_IsInstance, and I've updated the existing test for the
improved error message.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb: fix building with all targets
Guinevere Larsen [Wed, 23 Apr 2025 14:12:07 +0000 (11:12 -0300)] 
gdb: fix building with all targets

Commit b9c7eed0c2409fc640129a38d80a2bf1212b464a recently introduced
a build failure, because the file gdb/riscv-canonicalize-syscall-gen.c
hasn't been added to the ALL_64_TARGET_OBS variable in the makefile,
leading to a linker issue.  This commit fixes that.

Also, turns out, the new file was slightly outdated, as the gdb_old_mmap
syscall has been renamed to gdb_sys_old_mmap in commit
432eca4113d5748ad284a068873455f9962b44fe.  This commit also fixes that
on the generated file itself, to quickly fix the build. A followup
commit will fix the python file responsible for generating the .c file.

2 months agoGDB: Introduce "info linker-namespaces" command
Guinevere Larsen [Wed, 26 Mar 2025 14:14:52 +0000 (11:14 -0300)] 
GDB: Introduce "info linker-namespaces" command

Continuing to improve GDB's ability to debug linker namespaces, this
commit adds the command "info linker- namespaces". The command is
similar to "info sharedlibrary" but focused on improved readability
when the inferior has multiple linker namespaces active. This command
can be used in 2 different ways, with or without an argument.

When called without argument, the command will print the number of
namespaces, and for each active namespace, it's identifier, how many
libraries are loaded in it, and all the libraries (in a similar table to
what "info sharedlibrary" shows). As an example, this is what GDB's
output could look like:

  (gdb) info linker-namespaces
  There are 2 linker namespaces loaded
  There are 3 libraries loaded in linker namespace [[0]]
  Displaying libraries for linker namespace [[0]]:
  From                To                  Syms Read   Shared Object Library
  0x00007ffff7fc6000  0x00007ffff7fff000  Yes         /lib64/ld-linux-x86-64.so.2
  0x00007ffff7ebc000  0x00007ffff7fa2000  Yes (*)     /lib64/libm.so.6
  0x00007ffff7cc9000  0x00007ffff7ebc000  Yes (*)     /lib64/libc.so.6
  (*): Shared library is missing debugging information.

  There are 4 libraries loaded in linker namespace [[1]]
  Displaying libraries for linker namespace [[1]]:
  From                To                  Syms Read   Shared Object Library
  0x00007ffff7fc6000  0x00007ffff7fff000  Yes         /lib64/ld-linux-x86-64.so.2
  0x00007ffff7fb9000  0x00007ffff7fbe000  Yes         gdb.base/dlmopen-ns-ids/dlmopen-lib.so
  0x00007ffff7bc4000  0x00007ffff7caa000  Yes (*)     /lib64/libm.so.6
  0x00007ffff79d1000  0x00007ffff7bc4000  Yes (*)     /lib64/libc.so.6
  (*): Shared library is missing debugging information.

When called with an argument, the argument must be a namespace
identifier (either with or without the square brackets decorators). In
this situation, the command will truncate the output to only show the
relevant information for the requested namespace. For example:

  (gdb) info linker-namespaces 0
  There are 3 libraries loaded in linker namespace [[0]]
  Displaying libraries for linker namespace [[0]]:
  From                To                  Syms Read   Shared Object Library
  0x00007ffff7fc6000  0x00007ffff7fff000  Yes         /lib64/ld-linux-x86-64.so.2
  0x00007ffff7ebc000  0x00007ffff7fa2000  Yes (*)     /lib64/libm.so.6
  0x00007ffff7cc9000  0x00007ffff7ebc000  Yes (*)     /lib64/libc.so.6
  (*): Shared library is missing debugging information.

The test gdb.base/dlmopen-ns-id.exp has been extended to test this new
command.  Because some gcc and glibc defaults can change between
systems, we are not guaranteed to always have libc and libm loaded in a
namespace, so we can't guarantee the number of libraries, but the range
of the result is 2, so we can still check for glaring issues.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-by: Kevin Buettner <kevinb@redhat.com>
2 months agogdb: factor out printing a table of solibs for info sharedlibrary
Guinevere Larsen [Tue, 25 Mar 2025 20:27:49 +0000 (17:27 -0300)] 
gdb: factor out printing a table of solibs for info sharedlibrary

The next patch will add a new command that will print libraries in a
manner very similar to the existing "info sharedlibrary" command. To
make that patch simpler to review, this commit does the bulk of
refactoring work, since it ends up being a non-trivial diff to review.

No functional changes are expected after this commit.

Approved-by: Kevin Buettner <kevinb@redhat.com>
2 months agogdb: add convenience variables around linker namespace debugging
Guinevere Larsen [Fri, 21 Mar 2025 19:35:07 +0000 (16:35 -0300)] 
gdb: add convenience variables around linker namespace debugging

This commit adds 2 simple built-in convenience variables to help users
debug an inferior with multiple linker namespaces. The first is
$_active_linker_namespaces, which just counts how many namespaces have SOs
loaded onto them. The second is $_current_linker_namespace, and it tracks
which namespace the current location in the inferior belongs to.

This commit also introduces a test ensuring that we track namespaces
correctly, and that a user can use the $_current_linker_namespace
variable to set a conditional breakpoint, while linespec changes aren't
finalized to make it more convenient.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-by: Kevin Buettner <kevinb@redhat.com>
2 months agogdb: print target in print_target_wait_results
Tankut Baris Aktemur [Wed, 23 Apr 2025 12:40:14 +0000 (14:40 +0200)] 
gdb: print target in print_target_wait_results

Extend `print_target_wait_results` to print the target from which the
wait result came.

Approved-By: Pedro Alves <pedro@palves.net>
2 months agoThis commit adds record full support for rv64gc instruction set
Timur [Tue, 18 Mar 2025 18:49:44 +0000 (21:49 +0300)] 
This commit adds record full support for rv64gc instruction set

It includes changes to the following files:
- gdb/riscv-linux-tdep.c, gdb/riscv-linux-tdep.h: adds facilities to record
syscalls.
- gdb/riscv-tdep.c, gdb/riscv-tdep.h: adds facilities to record execution of
rv64gc instructions.
- gdb/configure.tgt: adds new files for compilation.
- gdb/testsuite/lib/gdb.exp: enables testing of full record mode for RISC-V
targets.
- gdb/syscalls/riscv-canonicalize-syscall-gen.py: a script to generate
function that canonicalizes RISC-V syscall. This script can simplify support
for syscalls on rv32 and rv64 system (currently support only for rv64).  To
use this script you need to pass a path to a file with syscalls description
from riscv-glibc (example is in the help message). The script produces a
mapping from syscall names to gdb_syscall enum.
- gdb/riscv-canonicalize-syscall.c: the file generated by the previous script.
- gdb/doc/gdb.texinfo: notification that record mode is enabled in RISC-V.
- gdb/NEWS: notification of new functionality.

Approved-By: Guinevere Larsen <guinevere@redhat.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>
2 months agogdb: fix bashism in configure.ac
Sam James [Wed, 23 Apr 2025 09:57:00 +0000 (10:57 +0100)] 
gdb: fix bashism in configure.ac

Use '=', not '==', as configure has a #!/bin/sh shebang and must work
with non-bash shells.

Fixes: c4375bc51c861dfa384a01bdb2e460e115710bf9
2 months ago[gdb/testsuite] Add selftest disassemble-s390x
Tom de Vries [Wed, 23 Apr 2025 09:02:53 +0000 (11:02 +0200)] 
[gdb/testsuite] Add selftest disassemble-s390x

In commit a98a6fa2d8e ("s390: Add arch15 instructions"), support for
new instructions was added to libopcodes, but the added tests only exercise
this for gas.

Add a unit test disassemble-s390x that checks gdb's ability to
disassemble one of these instructions:
...
$ gdb -q -batch -ex "maint selftest -v disassemble-s390x"
Running selftest disassemble-s390x.
0xb9 0x68 0x00 0x03 -> clzg %r0,%r3
Ran 1 unit tests, 0 failed
...

Tested on x86_64-linux and s390x-linux.

2 months ago[gdb/testsuite] Update regexp in gdb.debuginfod/fetch_src_and_symbols.exp
Tom de Vries [Wed, 23 Apr 2025 08:07:28 +0000 (10:07 +0200)] 
[gdb/testsuite] Update regexp in gdb.debuginfod/fetch_src_and_symbols.exp

Since commit 7b80401da00 ("Handle DWARF 5 separate debug sections"), test-case
gdb.debuginfod/fetch_src_and_symbols.exp fails here:
...
(gdb) file fetch_src_and_symbols_alt.o^M
Reading symbols from fetch_src_and_symbols_alt.o...^M
warning: could not find supplementary DWARF file \
  (fetch_src_and_symbols_dwz.o) for fetch_src_and_symbols_alt.o^M
(gdb) FAIL: $exp: no_url: file fetch_src_and_symbols_alt.o
...
because this is expected:
...
(gdb) file fetch_src_and_symbols_alt.o^M
Reading symbols from fetch_src_and_symbols_alt.o...^M
warning: could not find '.gnu_debugaltlink' file for \
  fetch_src_and_symbols_alt.o^M
(gdb) PASS: $exp: no_url: file fetch_src_and_symbols_alt.o
...

Fix this by updating the regexp.

Tested on x86_64-linux.

2 months agoLoongArch: Add test for divide by zero in instructions
Lulu Cai [Mon, 21 Apr 2025 02:47:43 +0000 (10:47 +0800)] 
LoongArch: Add test for divide by zero in instructions

Added tests for division/modulo by zero for instruction expressions.

2 months agostring merge section map output
Alan Modra [Wed, 23 Apr 2025 01:20:18 +0000 (10:50 +0930)] 
string merge section map output

This fixes an inconsistency in the linker map file, where string merge
sections (other than the first) kept their sizes.  String merge
sections of like entsize all are accounted in the fisrt string merge
section size.

* ldlang.c (print_input_section): Print SEC_EXCLUDE section size
as zero.

2 months agoAutomatic date update in version.in
GDB Administrator [Wed, 23 Apr 2025 00:00:12 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 months agoPR 32603 followup, remove %F from einfo
Alan Modra [Tue, 22 Apr 2025 03:06:47 +0000 (12:36 +0930)] 
PR 32603 followup, remove %F from einfo

No uses of %F remain.

* ldmisc.c (vfinfo): Remove %F handling.

2 months agoAdd "-5" flag to cc-with-tweaks
Tom Tromey [Sun, 23 Mar 2025 16:21:25 +0000 (10:21 -0600)] 
Add "-5" flag to cc-with-tweaks

This adds a "-5" flag to cc-with-tweaks, mirroring dwz's "-5" flag,
and also adds a new cc-with-dwz-5 target board.

The "-5" flag tells dwz to use the DWARF 5 .debug_sup section in
multi-file mode.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32808

2 months agoHandle DWARF 5 separate debug sections
Tom Tromey [Wed, 19 Mar 2025 20:47:29 +0000 (14:47 -0600)] 
Handle DWARF 5 separate debug sections

DWARF 5 standardized the .gnu_debugaltlink section that dwz emits in
multi-file mode.  This is handled via some new forms, and a new
.debug_sup section.

This patch adds support for this to gdb.  It is largely
straightforward, I think, though one oddity is that I chose not to
have this code search the system build-id directories for the
supplementary file.  My feeling was that, while it makes sense for a
distro to unify the build-id concept with the hash stored in the
.debug_sup section, there's no intrinsic need to do so.

This in turn means that a few tests -- for example those that test the
index cache -- will not work in this mode.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32808
Acked-By: Simon Marchi <simon.marchi@efficios.com>
2 months agoRemove 'read' call from dwz_file::read_string
Tom Tromey [Sat, 22 Mar 2025 16:39:43 +0000 (10:39 -0600)] 
Remove 'read' call from dwz_file::read_string

dwz_file::read_string calls 'read' on the section, but this isn't
needed as the sections have all been pre-read.

This patch makes this change, and refactors dwz_file a bit to make
this more obvious -- by making it clear that only the "static
constructor" can create a dwz_file.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
Tested-By: Alexandra Petlanova Hajkova <ahajkova@redhat.com>
2 months agogdb/testsuite: fix incorrect comment in py-color.exp
Andrew Burgess [Tue, 22 Apr 2025 18:45:57 +0000 (19:45 +0100)] 
gdb/testsuite: fix incorrect comment in py-color.exp

There was a comment in gdb.python/py-color.exp that was probably left
over from a copy & paste, it incorrectly described what the test
script was testing.

Fixed in this commit.

There's no change in what is tested with this commit.

2 months agogdb/python: address some coding style issues in py-color.c
Andrew Burgess [Sat, 19 Apr 2025 21:33:32 +0000 (22:33 +0100)] 
gdb/python: address some coding style issues in py-color.c

A few minor GNU/GDB coding style issues in py-color.c:

  - Space after '&' reference operator in one place.
  - Some excessive indentation on a couple of lines.
  - Spaces after '!' logical negation operator.
  - Using a pointer as a bool in a couple of places.

There should be no functional changes after this commit.

2 months agogdb/python: remove stray white space in error message
Andrew Burgess [Sat, 19 Apr 2025 21:03:15 +0000 (22:03 +0100)] 
gdb/python: remove stray white space in error message

Spotted a stray white space at the end of an error message.  Removed,
and updated the py-breakpoint.exp test to check this case.

2 months agogdb/doc: use @samp{} in Python docs
Andrew Burgess [Tue, 22 Apr 2025 16:32:53 +0000 (17:32 +0100)] 
gdb/doc: use @samp{} in Python docs

In this review:

  https://inbox.sourceware.org/gdb-patches/86sem6ase5.fsf@gnu.org

it was pointed out that I should use @samp{} around some text I was
adding to the documentation.  However, the offending snippet of
documentation was something I copied from elsewhere in python.texi.
This commit fixes the original to use @samp{}.

2 months agogdb/python: fix memory leak of gdb.Color objects
Andrew Burgess [Fri, 18 Apr 2025 21:42:17 +0000 (22:42 +0100)] 
gdb/python: fix memory leak of gdb.Color objects

I noticed that this commit:

  commit 6447969d0ac774b6dec0f95a0d3d27c27d158690
  Date:   Sat Oct 5 22:27:44 2024 +0300

      Add an option with a color type.

has an unnecessary `Py_INCREF (self);` in gdb.Color.__init__.  This
means that the reference count on all gdb.Color objects (that pass
through __init__) will be +1 from where they should normally be, and
this will stop the gdb.Color objects from being deallocated.

Fix by removing the Py_INCREF call.

Add a test which exposes the memory leak.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agogdb/python: restructure the existing memory leak tests
Andrew Burgess [Sat, 19 Apr 2025 13:41:17 +0000 (14:41 +0100)] 
gdb/python: restructure the existing memory leak tests

We currently have two memory leak tests in gdb.python/ and there's a
lot of duplication between these two.

In the next commit I'd like to add yet another memory leak test, which
would mean a third set of scripts which duplicate the existing two.
And three is where I draw the line.

This commit factors out the core of the memory leak tests into a new
module gdb_leak_detector.py, which can then be imported by each
tests's Python file in order to make writing the memory leak tests
easier.

I've also added a helper function to lib/gdb-python.exp which captures
some of the common steps needed in the TCL file in order to run a
memory leak test.

Finally, I use this new infrastructure to rewrite the two existing
memory leak tests.

What I considered, but ultimately didn't do, is merge the two memory
leak tests into a single TCL script.  I did consider this, and for the
existing tests this would be possible, but future tests might require
different enough setup that this might not be possible for all future
tests, and now that we have helper functions in a central location,
the each individual test is actually pretty small now, so leaving them
separate seemed OK.

There should be no change in what is actually being tested after this
commit.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agoRemove ui_file::reset_style
Tom Tromey [Wed, 9 Apr 2025 23:34:10 +0000 (17:34 -0600)] 
Remove ui_file::reset_style

ui_file::reset_style doesn't seem to be needed.  This patch removes
it.  Regression tested on x86-64 Fedora 40.

2 months agogdb: fix ui-style regex initializing order
ZENG Hao [Fri, 18 Apr 2025 22:41:28 +0000 (06:41 +0800)] 
gdb: fix ui-style regex initializing order

This fixes a crash on Windows NT 4.0, where windows-nat failed dynamic loading
some Win32 functions and print a warning message with styled string, which
depends on ui-style regex. By using `compiled_regex` constructor, the regex is
guaranteed to be initialized before `_initialize_xxx` functions.

Approved-By: Tom Tromey <tom@tromey.com>
2 months agogas: sframe: Fix typo in comment on SFrame identifier
Jens Remus [Tue, 22 Apr 2025 13:48:28 +0000 (15:48 +0200)] 
gas: sframe: Fix typo in comment on SFrame identifier

gas/config/
* tc-aarch64.c (aarch64_sframe_get_abi_arch): Fix typo in
comment on SFrame identifier.
* tc-aarch64.h (aarch64_sframe_get_abi_arch,
sframe_get_abi_arch): Likewise.
* tc-i386.c (x86_sframe_get_abi_arch): Likewise.
* tc-i386.h (x86_sframe_get_abi_arch, sframe_get_abi_arch):
Likewise.

Reported-by: Indu Bhagat <indu.bhagat@oracle.com>
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
2 months agogprofng: fix 32889 Typo in documentation
Vladimir Mezentsev [Fri, 18 Apr 2025 21:08:20 +0000 (14:08 -0700)] 
gprofng: fix 32889 Typo in documentation

gprofng/ChangeLog
2025-04-18  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

* doc/gprofng_ug.texi: Fix typo.

2 months agogprofng: fix 32886 wrong mapping from instruction to line number
Vladimir Mezentsev [Fri, 18 Apr 2025 21:00:59 +0000 (14:00 -0700)] 
gprofng: fix 32886 wrong mapping from instruction to line number

On Intel, gprofng should adjusts return addresses, including user leaf functions.

gprofng/ChangeLog
2025-04-18  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

* src/CallStack.cc (add_stack): Adjust return addresses on Intel.

2 months agoMicroBlaze: Make sure we see memory breakpoints before reading
Michael J. Eager [Tue, 22 Apr 2025 00:44:08 +0000 (17:44 -0700)] 
MicroBlaze: Make sure we see memory breakpoints before reading

For linux target, when trying to run a program from gdb, the
following defect is seen:

Program received signal SIGILL, Illegal instruction.
0x48004674 in _dl_debug_state () from target:/lib/ld.so.1

* microblaze-linux-tdep.c (microblaze_linux_memory_remove_breakpoint):
  Call make_scoped_restore_show_memory_breakpoints

Signed-off-by: Gopi Kumar Bulusu <gopi@sankhya.com>
Signed-off-by: Michael J. Eager <eager@eagercon.com>