binutils-gdb.git
23 months agosim: aarch64: invert sim_cpu storage
Mike Frysinger [Sat, 13 Aug 2016 03:10:55 +0000 (11:10 +0800)]
sim: aarch64: invert sim_cpu storage

23 months agosim: microblaze: invert sim_cpu storage
Mike Frysinger [Sat, 13 Aug 2016 02:10:49 +0000 (10:10 +0800)]
sim: microblaze: invert sim_cpu storage

23 months agosim: avr: invert sim_cpu storage
Mike Frysinger [Fri, 12 Aug 2016 16:43:58 +0000 (00:43 +0800)]
sim: avr: invert sim_cpu storage

23 months agosim: moxie: invert sim_cpu storage
Mike Frysinger [Fri, 12 Aug 2016 16:37:34 +0000 (00:37 +0800)]
sim: moxie: invert sim_cpu storage

23 months agosim: msp430: invert sim_cpu storage
Mike Frysinger [Fri, 12 Aug 2016 16:28:11 +0000 (00:28 +0800)]
sim: msp430: invert sim_cpu storage

23 months agosim: ft32: invert sim_cpu storage
Mike Frysinger [Fri, 12 Aug 2016 16:07:45 +0000 (00:07 +0800)]
sim: ft32: invert sim_cpu storage

23 months agosim: bfin: invert sim_cpu storage
Mike Frysinger [Fri, 12 Aug 2016 15:43:27 +0000 (23:43 +0800)]
sim: bfin: invert sim_cpu storage

23 months agosim: sim_cpu: invert sim_cpu storage
Mike Frysinger [Fri, 12 Aug 2016 15:43:27 +0000 (23:43 +0800)]
sim: sim_cpu: invert sim_cpu storage

Currently all ports have to declare sim_cpu themselves in their
sim-main.h and then embed the common sim_cpu_base in it.  This
dynamic makes it impossible to share common object code among
multiple ports because the core data structure is always different.

Let's invert this relationship: common code declares sim_cpu, and
the port uses the new arch_data field for its per-cpu state.

This is the first in a series of changes: it adds a define to select
between the old & new layouts, then converts all the ports that don't
need custom state over to the new layout.  This includes mn10300 that,
while it defines custom fields in its cpu struct, never uses them.

23 months agosim: move register headers into sim/ namespace [PR sim/29869]
Mike Frysinger [Sat, 10 Dec 2022 11:33:58 +0000 (06:33 -0500)]
sim: move register headers into sim/ namespace [PR sim/29869]

These headers define the register numbers for each port to implement
the sim_fetch_register & sim_store_register interfaces.  While gdb
uses these, the APIs are part of the sim, not gdb.  Move the headers
out of the gdb/ include namespace and into sim/ instead.

23 months agosim: ppc: drop old dgen.c generator
Mike Frysinger [Wed, 9 Nov 2022 19:52:45 +0000 (02:52 +0700)]
sim: ppc: drop old dgen.c generator

The spreg.[ch] files live in the source tree now and are created
with the dgen.py script, so we don't need this old tool anymore.

23 months agosim: ppc: move spreg.[ch] files to the source tree
Mike Frysinger [Wed, 9 Nov 2022 19:52:45 +0000 (02:52 +0700)]
sim: ppc: move spreg.[ch] files to the source tree

Simplify the build by moving the generation of these files from
build-time (via dgen.c that we have to compile & execute on the
build system) to maintainer/release mode (via spreg-gen.py that
we only ever execute when the spreg table actually changes).  It
speeds up the build process and makes it easier for us to reason
about & review changes to the code generator.

The tool is renamed from "dgen" because it's hardcoded to only
generated spreg files.  It isn't a generalized tool for creating
lookup tables.

23 months agoAutomatic date update in version.in
GDB Administrator [Wed, 21 Dec 2022 00:00:53 +0000 (00:00 +0000)]
Automatic date update in version.in

23 months agoFix install-strip target
Hannes Domani [Mon, 19 Dec 2022 16:29:27 +0000 (17:29 +0100)]
Fix install-strip target

The libtool patch broke install-strip of gdb:

/bin/sh ../../gdb/../mkinstalldirs /src/gdb/inst/share/gdb/python/gdb
transformed_name=`t='s,y,y,'; \
                  echo gdb | sed -e "$t"` ; \
        if test "x$transformed_name" = x; then \
          transformed_name=gdb ; \
        else \
          true ; \
        fi ; \
        /bin/sh ../../gdb/../mkinstalldirs /src/gdb/inst/bin ; \
        /bin/sh ./libtool --mode=install STRIPPROG='strip' /bin/sh /src/gdb/gdb.git/install-sh -c -s \
                gdb \
                /src/gdb/inst/bin/$transformed_name ; \
        /bin/sh ../../gdb/../mkinstalldirs /src/gdb/inst/include/gdb ; \
        /usr/bin/install -c -m 644 jit-reader.h /src/gdb/inst/include/gdb/jit-reader.h
libtool: install: `/src/gdb/inst/bin/gdb' is not a directory
libtool: install: Try `libtool --help --mode=install' for more information.

Since INSTALL_PROGRAM_ENV is no longer at the beginning of the command, the
gdb executable is not installed with install-strip.

23 months agobfd: Discard symbol regardless of warning flag
Torbjörn SVENSSON [Sat, 17 Dec 2022 10:16:19 +0000 (11:16 +0100)]
bfd: Discard symbol regardless of warning flag

The discard of symbols should be performed whether the warning for
the discard is enabled or not.
Without this patch, ld would segfault in bfd_section_removed_from_list,
called in the if-statement right after this block, as the argument
isec->output_section can be NULL.

Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
Co-Authored-By: Yvan ROUX <yvan.roux@foss.st.com>
23 months agoPR29915, bfdio.c does not compile with mingw.org's MinGW
Alan Modra [Tue, 20 Dec 2022 07:31:07 +0000 (18:01 +1030)]
PR29915, bfdio.c does not compile with mingw.org's MinGW

PR 29915
* configure.ac: Add AC_CHECK_DECLS test ___lc_codepage_func.
* configure: Regenerate.
* config.in: Regenerate.
* bfdio.c (___lc_codepage_func): Move declaration to..
(_bfd_real_fopen): ..here, and use !HAVE_DECL____LC_CODEPAGE_FUNC.

23 months agoRe: x86: remove i386-opc.c
Alan Modra [Tue, 20 Dec 2022 08:29:45 +0000 (18:59 +1030)]
Re: x86: remove i386-opc.c

Regen opcodes/po/POTFILES.in

23 months agosim: ppc: change spreg switch table generation to compile-time
Mike Frysinger [Wed, 9 Nov 2022 19:50:52 +0000 (02:50 +0700)]
sim: ppc: change spreg switch table generation to compile-time

Simplify the generator by always outputting the switch tables, and
leave the choice of whether to use them to the compiler via a -D
flag.

23 months agosim: dv-core: add hw_detach_address method [PR sim/25211]
Mike Frysinger [Thu, 10 Nov 2022 15:20:15 +0000 (22:20 +0700)]
sim: dv-core: add hw_detach_address method [PR sim/25211]

The core device has an attach address method as the root of the tree
which calls out to the sim API.  But it doesn't have a corresponding
detach method which means we just crash if anything tries to detach
itself from the core.  In practice, the m68hc11 is the only model
that actually tries to detach itself on the fly, so no one noticed
earlier.

With this in place, we can delete the existing detach code from the
m68hc11 model since it defaults to "passthru" callback which will in
turn call the dv-core detach, and they have the same behavior -- call
the sim core API to detach from the address space.

Bug: https://sourceware.org/PR25211

23 months agogprofng: PR29646 Various warnings
Vladimir Mezentsev [Mon, 19 Dec 2022 09:01:04 +0000 (01:01 -0800)]
gprofng: PR29646 Various warnings

gprofng/ChangeLog
2022-12-19  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR gprofng/29646
* common/core_pcbe.c: Fix missingReturn warning.
* libcollector/iolib.c: Fix -Waddress warnings.
* src/Settings.cc: Likewise.
* src/checks.cc: Likewise.
* libcollector/linetrace.c: Likewise.
* libcollector/iotrace.c: Fix va_end_missing error.
* libcollector/libcol_util.c: Fix uninitvar warning.
* src/Command.cc: Fix arrayIndexOutOfBounds error.
* src/Function.cc: Fix uninitStructMember warning.
* src/ipc.cc: Fix -Wwrite-strings warnings.

23 months agoAutomatic date update in version.in
GDB Administrator [Tue, 20 Dec 2022 00:00:54 +0000 (00:00 +0000)]
Automatic date update in version.in

23 months agoAvoid compiler warning in dwarf-do-refresh
Tom Tromey [Mon, 19 Dec 2022 16:46:54 +0000 (09:46 -0700)]
Avoid compiler warning in dwarf-do-refresh

The Emacs 28 compiler warns about dwarf-mode.el:

Warning (comp): dwarf-mode.el:180:32: Warning: Unused lexical argument `ignore'

This is easily fixed by prepending "_" to the parameter's name.

binutils/ChangeLog
2022-12-19  Tom Tromey  <tromey@adacore.com>

* dwarf-mode.el (dwarf-do-refresh): Avoid compiler warning.

23 months agoUse bool in bpstat
Tom Tromey [Fri, 11 Nov 2022 21:50:50 +0000 (14:50 -0700)]
Use bool in bpstat

This changes bpstat to use 'bool' rather than 'char', and updates the
uses.

23 months agoUse bool constants for value_print_options
Tom Tromey [Sun, 12 Jun 2022 20:13:22 +0000 (14:13 -0600)]
Use bool constants for value_print_options

This changes the uses of value_print_options to use 'true' and 'false'
rather than integers.

23 months agoRemove quick_symbol_functions::relocated
Tom Tromey [Thu, 20 Oct 2022 19:54:56 +0000 (13:54 -0600)]
Remove quick_symbol_functions::relocated

quick_symbol_functions::relocated is only needed for psymtabs, and
there it is only needed for Rust.  However, because we've switched the
DWARF reader away from psymtabs, this means there's no longer a need
for this method at all.

23 months agoRemove MI version 1
Tom Tromey [Wed, 10 Aug 2022 20:42:22 +0000 (14:42 -0600)]
Remove MI version 1

MI version 1 is long since obsolete.  Several years ago, I filed
PR mi/23170 for this.  I think it's finally time to remove this.
Any users of MI 1 can and should upgrade to a newer version.

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

23 months agoRemove vestiges of MI version 0
Tom Tromey [Wed, 10 Aug 2022 20:42:36 +0000 (14:42 -0600)]
Remove vestiges of MI version 0

I found a few vestiges of MI version 0 in the test suite.  This patch
removes them.

23 months agoTidy PR29893 and PR29908 fix
Alan Modra [Sun, 18 Dec 2022 02:37:51 +0000 (13:07 +1030)]
Tidy PR29893 and PR29908 fix

PR 29893
PR 29908
* dwarf.c (display_debug_addr): Combine dwarf5 unit_length checks.
Delete dead code.

23 months agogdb: fix command lookup in execute_command ()
Jan Vrany [Mon, 19 Dec 2022 11:24:36 +0000 (11:24 +0000)]
gdb: fix command lookup in execute_command ()

Commit b5661ff2 ("gdb: fix possible use-after-free when
executing commands") used lookup_cmd_exact () to lookup
command again after its execution to avoid possible
use-after-free error.

However this change broke test gdb.base/define.exp which
defines a post-hook for subcommand ("target testsuite").
In this case,  lookup_cmd_exact () returned NULL because
there's no command 'testsuite' in top-level commands.

This commit fixes this case by looking up the command again
using the original command line via lookup_cmd ().

Approved-By: Simon Marchi <simon.marchi@efficios.com>
23 months agoFix potential illegal memory accesses when parsing corrupt DWARF data.
Nick Clifton [Mon, 19 Dec 2022 11:13:46 +0000 (11:13 +0000)]
Fix potential illegal memory accesses when parsing corrupt DWARF data.

PR 29914
* dwarf.c (fetch_indexed_value): Fail if the section is not big
enough to contain a header size field.
(display_debug_addr): Fail if the computed address size is too big
or too small.

23 months agoNew Romainian translation for the GOLD subdirectory.
Nick Clifton [Mon, 19 Dec 2022 09:47:36 +0000 (09:47 +0000)]
New Romainian translation for the GOLD subdirectory.

23 months agogprofng/testsuite: skip Java test without JDK
Jan Beulich [Mon, 19 Dec 2022 08:36:21 +0000 (09:36 +0100)]
gprofng/testsuite: skip Java test without JDK

There's no point in even trying the Java test when gprofng was built
without Java support, and when the building of the constituents of the
testcase also would fail. On such systems this converts the respective
tests from "unresolved" to "unsupported", making the overall testsuite
run no longer report failure just because of this.

23 months agogprofng/testsuite: eliminate bogus casts
Jan Beulich [Mon, 19 Dec 2022 08:36:00 +0000 (09:36 +0100)]
gprofng/testsuite: eliminate bogus casts

Casting pointers to unsigned int is generally problematic and hence
compilers tend to warn about such. While here they're used only in
fprintf(), it still seems better to omit such casts, even if only to
avoid setting bad precedents.

23 months agogprofng/testsuite: correct line continuation in endcases.c
Jan Beulich [Mon, 19 Dec 2022 08:35:37 +0000 (09:35 +0100)]
gprofng/testsuite: correct line continuation in endcases.c

A backslash used to indicate line continuation (in a macro definition
here) is not supposed to be followed by blanks or other white space; the
end-of-line indicator is to follow immediately.

23 months agogprofng/testsuite: correct names for signal handling tests
Jan Beulich [Mon, 19 Dec 2022 08:35:18 +0000 (09:35 +0100)]
gprofng/testsuite: correct names for signal handling tests

The signal handling tests spend most of their time in the signal
handlers, and hence for profile output to match anything in program
output, the respective name fields need to hold the handler function
names. This converts both respective tests from "unresolved" to actually
succeeding.

23 months agogprofng/testsuite: adjust linking of synprog
Jan Beulich [Mon, 19 Dec 2022 08:23:34 +0000 (09:23 +0100)]
gprofng/testsuite: adjust linking of synprog

In order for so_syn.so and so_syx.so to be able to access the main
program's "testtime" variable, that variable needs exposing in the
dynamic symbol table. Since this is a test program only, do it the brute
force way and simply expose all global symbols.

23 months agoArm: break gas dependency on libopcodes
Jan Beulich [Mon, 19 Dec 2022 08:23:13 +0000 (09:23 +0100)]
Arm: break gas dependency on libopcodes

gas doesn't use anything from libopcodes (anymore?) - suppress linking
in that library.

23 months agox86: omit Cpu prefixes from opcode table
Jan Beulich [Mon, 19 Dec 2022 08:22:33 +0000 (09:22 +0100)]
x86: omit Cpu prefixes from opcode table

These enumerators can be used in only one specific field, and hence the
Cpu prefix isn't needed ther for disambiguation / name space separation.

23 months agoAutomatic date update in version.in
GDB Administrator [Mon, 19 Dec 2022 00:01:23 +0000 (00:01 +0000)]
Automatic date update in version.in

23 months agoComment bfd_get_section_limit_octets and bfd_get_section_alloc_size
Alan Modra [Sun, 18 Dec 2022 02:34:13 +0000 (13:04 +1030)]
Comment bfd_get_section_limit_octets and bfd_get_section_alloc_size

* bfd.c (bfd_get_section_limit_octets): Add comment.
(bfd_get_section_alloc_size): Likewise.
* libbfd.c (_bfd_generic_get_section_contents): Use
bfd_get_section_limit_octets.
* section.c (bfd_get_section_contents): Likewise.
* bfd-in2.h: Regenerate.

23 months agold bootstrap test in build dir with path containing symlinks
Alan Modra [Sun, 18 Dec 2022 02:24:49 +0000 (12:54 +1030)]
ld bootstrap test in build dir with path containing symlinks

This allows the bootstrap test to run if you have a symlink somewhere
in the build path directory.  $ld depends on $base_dir which is set
via tcl [pwd], collapsing the symlink like /usr/bin/pwd, while $objdir
contains the symlink.

* testsuite/ld-bootstrap/bootstrap.exp: Normalize paths when
checking for ld build directory.

23 months agoUpdate gdb/NEWS after GDB 13 branch creation.
Joel Brobecker [Sun, 18 Dec 2022 04:38:25 +0000 (08:38 +0400)]
Update gdb/NEWS after GDB 13 branch creation.

This commit a new section for the next release branch, and renames
the section of the current branch, now that it has been cut.

23 months agoBump version to 14.0.50.DATE-git.
Joel Brobecker [Sun, 18 Dec 2022 04:34:03 +0000 (08:34 +0400)]
Bump version to 14.0.50.DATE-git.

Now that the GDB 13 branch has been created,
this commit bumps the version number in gdb/version.in to
14.0.50.DATE-git

For the record, the GDB 13 branch was created
from commit 71c90666e601c511a5f495827ca9ba545e4cb463.

Also, as a result of the version bump, the following changes
have been made in gdb/testsuite:

* gdb.base/default.exp: Change $_gdb_major to 14.

23 months agoAutomatic date update in version.in
GDB Administrator [Sun, 18 Dec 2022 00:01:10 +0000 (00:01 +0000)]
Automatic date update in version.in

23 months agobfd_get_relocated_section_contents allow NULL data buffer
Alan Modra [Fri, 16 Dec 2022 11:07:29 +0000 (21:37 +1030)]
bfd_get_relocated_section_contents allow NULL data buffer

This patch removes the bfd_malloc in default_indirect_link_order and
bfd_simple_get_relocated_section_contents, pushing the allocation down
to bfd_get_relocated_section_contents.  The idea is to make use of the
allocation done with sanity checking in bfd_get_full_section_contents,
which is called by bfd_generic_get_relocated_section_contents.

Doing this exposed a bug in bfd_get_full_section_contents.  With
relaxation it is possible that an input section rawsize is different
to the section size.  In that case we want to use the larger of
rawsize (the on-disk size for input sections) and size.

* reloc.c (bfd_generic_get_relocated_section_contents),
* reloc16.c (bfd_coff_reloc16_get_relocated_section_contents),
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents),
* coff-sh.c (sh_coff_get_relocated_section_contents),
* elf-m10200.c (mn10200_elf_get_relocated_section_contents),
* elf-m10300.c (mn10300_elf_get_relocated_section_contents),
* elf32-avr.c (elf32_avr_get_relocated_section_contents),
* elf32-cr16.c (elf32_cr16_get_relocated_section_contents),
* elf32-crx.c (elf32_crx_get_relocated_section_contents),
* elf32-h8300.c (elf32_h8_get_relocated_section_contents),
* elf32-nds32.c (nds32_elf_get_relocated_section_contents),
* elf32-sh.c (sh_elf_get_relocated_section_contents),
* elfxx-mips.c (_bfd_elf_mips_get_relocated_section_contents):
Handle NULL data buffer.
* bfd.c (bfd_get_section_alloc_size): New function.
* bfd-in2.h: Regenerate.
* compress.c (bfd_get_full_section_contents): Correct section
malloc size.
* linker.c (default_indirect_link_order): Don't malloc memory
here before calling bfd_get_relocated_section_contents.
* simple.c (bfd_simple_get_relocated_section_contents): Likewise.

23 months agoasan: elf.c:12621:18: applying zero offset to null pointer
Alan Modra [Fri, 16 Dec 2022 07:43:38 +0000 (18:13 +1030)]
asan: elf.c:12621:18: applying zero offset to null pointer

That's this line in elf_parse_notes:
  while (p < buf + size)

* elf.c (_bfd_elf_make_section_from_shdr): Don't call
elf_parse_notes when sh_size is zero.

23 months agoRe: The problem with warning in elf_object_p
Alan Modra [Thu, 15 Dec 2022 12:37:10 +0000 (23:07 +1030)]
Re: The problem with warning in elf_object_p

Commit 5aa0f10c424e added a per_xvec_warn array to provide support for
warnings from elf_object_p (and a later patch for warnings from
pe_bfd_object_p) to be cached and then only printed if the target
matches.  It was quite limited in the style of message supported, only
one message could be printed, and didn't really meet the stated aim of
only warning when a target matches:  There are many other errors and
warnings that can be emitted by functions called from elf_object_p.

So this patch extends the error handler functions to support printing
to a string buffer, extends per_xvec_warn to support multiple errors/
warnings, and hooks this all into bfd_check_format_matches.  If
bfd_check_format_matches succeeds then any errors/warnings are printed
for the matching target.  If bfd_check_format_matches fails either due
to no match or to multiple matches and only one target vector produced
errors, then those errors are printed.

* bfd.c (MAX_ARGS): Define, use throughout.
(print_func): New typedef.
(_bfd_doprnt): Add new print param.  Replace calls to fprintf
with print.
(PRINT_TYPE): Similarly.
(error_handler_fprintf): Renamed from error_handler_internal.
Use _bfd_get_error_program_name.  Add fprintf arg.  Move code
setting up args..
(_bfd_doprnt_scan): ..to here.  Add ap param.
(struct buf_stream): New.
(err_sprintf): New function.
(error_handler_bfd): New static variable.
(error_handler_sprintf): New function.
(_bfd_set_error_handler_caching): New function.
(_bfd_get_error_program_name): New function.
* elfcode.h (elf_swap_shdr_in): Use _bfd_error_handler in
warning messages.
(elf_object_p): Likewise.
* format.c (print_warnmsg): New function.
(clear_warnmsg): Rewrite.
(null_error_handler): New function.
(bfd_check_format_matches): Ignore warnings from recursive calls
checking first element of an archive.  Use caching error handler
otherwise.  Print warnings on successful match, or when only one
target has emitted warnings/errors.
* peicode.h (pe_bfd_object_p): Use _bfd_error_handler in
warning messages.
* targets.c (per_xvec_warn): Change type of array elements.
(struct per_xvec_message): New.
(_bfd_per_xvec_warn): Rewrite.
* Makefile.am (LIBBFD_H_FILES): Add bfd.c.
* Makefile.in: Regenerate.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.

23 months agosframe: doc: update spec for the mangled-RA bit in FRE
Indu Bhagat [Sat, 17 Dec 2022 06:02:11 +0000 (22:02 -0800)]
sframe: doc: update spec for the mangled-RA bit in FRE

ChangeLog:

* libsframe/doc/sframe-spec.texi

23 months agogas: sframe: testsuite: add testcase for .cfi_negate_ra_state
Indu Bhagat [Sat, 17 Dec 2022 06:02:07 +0000 (22:02 -0800)]
gas: sframe: testsuite: add testcase for .cfi_negate_ra_state

Add a new test to check that .cfi_negate_ra_state on aarch64 is handled
well (a non-empty SFrame section with valid SFrame FREs is generated).

ChangeLog:

* testsuite/gas/cfi-sframe/cfi-sframe-aarch64-2.d: New test.
* testsuite/gas/cfi-sframe/cfi-sframe-aarch64-2.s: Likewise.
* testsuite/gas/cfi-sframe/cfi-sframe.exp: Adjust the list
accordingly.

23 months agoobjdump/readelf: sframe: emit marker for FREs with mangled RA
Indu Bhagat [Sat, 17 Dec 2022 06:02:02 +0000 (22:02 -0800)]
objdump/readelf: sframe: emit marker for FREs with mangled RA

In the textual dump of the SFrame section, when an SFrame FRE recovers a
mangled RA, use string "[s]" in the output to indicate that the return
address is a signed (mangled) one.

ChangeLog:

        * libsframe/sframe-dump.c (dump_sframe_func_with_fres): Postfix
with "[s]" if RA is signed with authorization code.

23 months agolibsframe: provide new access API for mangled RA bit
Indu Bhagat [Sat, 17 Dec 2022 06:01:57 +0000 (22:01 -0800)]
libsframe: provide new access API for mangled RA bit

include/ChangeLog:

* sframe-api.h (sframe_fre_get_ra_mangled_p): New declaration.

ChangeLog:

* libsframe/sframe.c (sframe_get_fre_ra_mangled_p): New
definition.
(sframe_fre_get_ra_mangled_p): New static function.

23 months agogas: sframe: add support for .cfi_negate_ra_state
Indu Bhagat [Sat, 17 Dec 2022 06:01:51 +0000 (22:01 -0800)]
gas: sframe: add support for .cfi_negate_ra_state

DW_CFA_AARCH64_negate_ra_state in aarch64 is multiplexed with
DW_CFA_GNU_window_save in the DWARF format.

Remove the common-empty-4 testcase because the generated SFrame section
will not be be empty anymore.  A relevant test will be added in a later
commit.

ChangeLog:

* gas/gen-sframe.c (sframe_v1_set_fre_info): Add new argument
for mangled_ra_p.
(sframe_set_fre_info): Likewise.
(output_sframe_row_entry): Handle mangled_ra_p.
(sframe_row_entry_new): Reset mangled_ra_p.
(sframe_row_entry_initialize): Initialize mangled_ra_p.
(sframe_xlate_do_gnu_window_save): New definition.
(sframe_do_cfi_insn): Handle DW_CFA_GNU_window_save.
* gas/gen-sframe.h (struct sframe_row_entry): New member.
(struct sframe_version_ops): Add a new argument for
mangled_ra_p.
* gas/testsuite/gas/cfi-sframe/cfi-sframe.exp: Remove test.
* gas/testsuite/gas/cfi-sframe/common-empty-4.d: Removed.
* gas/testsuite/gas/cfi-sframe/common-empty-4.s: Removed.

23 months agosframe.h: add support for .cfi_negate_ra_state
Indu Bhagat [Sat, 17 Dec 2022 06:01:40 +0000 (22:01 -0800)]
sframe.h: add support for .cfi_negate_ra_state

Use the last remaining bit in the 'SFrame FRE info' word to store whether
the RA is signed/unsigned with PAC authorization code: this bit is named
as the "mangled RA" bit.  This bit is still unused for x86-64.

The behaviour of the mangled-RA info bit in SFrame format closely
follows the behaviour of DW_CFA_AARCH64_negate_ra_state in DWARF.  During
unwinding, whenever an SFrame FRE with non-zero "mangled RA" bit is
encountered, it means the upper bits of the return address contain Pointer
Authentication code.  The unwinder, hence, must use appropriate means to
restore LR correctly in such cases.

include/ChangeLog:

* sframe.h (SFRAME_V1_FRE_INFO_UPDATE_MANGLED_RA_P): New macro.
(SFRAME_V1_FRE_MANGLED_RA_P): Likewise.

23 months agoAutomatic date update in version.in
GDB Administrator [Sat, 17 Dec 2022 00:01:15 +0000 (00:01 +0000)]
Automatic date update in version.in

23 months agoDelay checking whether /proc/pid/mem is writable (PR gdb/29907)
Pedro Alves [Fri, 16 Dec 2022 12:04:54 +0000 (12:04 +0000)]
Delay checking whether /proc/pid/mem is writable (PR gdb/29907)

As of 1bcb0708f229 ("gdb/linux-nat: Check whether /proc/pid/mem is
writable"), GDB checks if /proc/pid/mem is writable.  This is done
early at GDB startup, in order to get a consistent warning, instead of
a warning that depends on whenever GDB writes to inferior memory.

PR gdb/29907 points out that some build systems (like QEMU's,
apparently) may call 'gdb --version' to check GDB's presence & its
version on the system, and that Gentoo's build process has sandboxing
which blocks the /proc/pid/mem access and thus GDB warns, which
results in build fails.

To help with that, this patch delays the /proc/pid/mem check until we
start or attach to an inferior.  Ends up potentially emiting a warning
close where we already emit other ptrace- and /proc- related warnings,
which just Feels Right.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29907
Change-Id: I5537653ecfbbe76a04ab035e40e59d09b4980763

23 months agoFix previous delta to allow for compilation on 32-bit systems
Nick Clifton [Fri, 16 Dec 2022 15:44:55 +0000 (15:44 +0000)]
Fix previous delta to allow for compilation on 32-bit systems

23 months ago[gdb/testsuite] Fix race in gdb.threads/detach-step-over.exp
Tom de Vries [Fri, 16 Dec 2022 14:28:27 +0000 (15:28 +0100)]
[gdb/testsuite] Fix race in gdb.threads/detach-step-over.exp

Once in a while I run into:
...
FAIL: gdb.threads/detach-step-over.exp: \
  breakpoint-condition-evaluation=host: target-non-stop=off: non-stop=off: \
  displaced=off: iter 1: all threads running
...

In can easily reproduce this by doing:
...
     # Wait a bit, to give time for the threads to hit the
     # breakpoint.
-    sleep 1

     return true
...

Fix this by counting the running threads in a loop, effectively allowing 10
seconds (instead of 1) for the threads to start running, but only sleeping if
needed.

Reduces total execution time from 1m27s to 56s.

Tested on x86_64-linux.

23 months agogdb: fix crash when getting the value of a label symbol
Andrew Burgess [Mon, 12 Dec 2022 14:05:22 +0000 (14:05 +0000)]
gdb: fix crash when getting the value of a label symbol

When the source program contains a goto label, it turns out it's
actually pretty hard for a user to find out more about that label.
For example:

  (gdb) p some_label
  No symbol "some_label" in current context.
  (gdb) disassemble some_label
  No symbol "some_label" in current context.
  (gdb) x/10i some_label
  No symbol "some_label" in current context.
  (gdb) break some_label
  Breakpoint 2 at 0x401135: file /tmp/py-label-symbol-value.c, line 35.

In all cases, some_label is a goto label within the current frame.
Only placing a breakpoint on the label worked.

This all seems a little strange to me, it feels like asking about a
goto label would not be an unreasonable thing for a user to do.

This commit doesn't fix any of the above issues, I mention them just
to provide a little context for why the following issue has probably
not been seen before.

It turns out there is one way a user can access the symbol for a goto
label, through the Python API:

  python frame = gdb.selected_frame()
  python frame_pc = frame.pc()
  python block = gdb.current_progspace().block_for_pc(frame_pc)
  python symbol,_ = gdb.lookup_symbol('some_label', block, gdb.SYMBOL_LABEL_DOMAIN)
  python print(str(symbol.value()))
  ../../src/gdb/findvar.c:204: internal-error: store_typed_address: Assertion `type->is_pointer_or_reference ()' failed.

The problem is that label symbols are created using the
builtin_core_addr type, which is a pure integer type.

When GDB tries to fetch the value of a label symbol then we end up in
findvar.c, in the function language_defn::read_var_value, in the
LOC_LABEL case.  From here store_typed_address is called to store the
address of the label into a value object with builtin_core_addr type.

The problem is that store_typed_address requires that the destination
type be a pointer or reference, which the builtin_core_addr type is
not.

Now it's not clear what type a goto label address should have, but
GCC has an extension that allows users to take the address of a goto
label (using &&), in that case the result is of type 'void *'.

I propose that when we convert the CORE_ADDR value to a GDB value
object, we use builtin_func_ptr type instead of builtin_core_addr,
this means the result will be of type 'void (*) ()'.  The benefit of
this approach is that when gdbarch_address_to_pointer is called the
target type will be correctly identified as a pointer to code, which
should mean any architecture specific adjustments are done correctly.

We can then cast the new value to 'void *' type with a call to
value_cast_pointer, this should not change the values bit
representation, but will just update the type.

After this asking for the value of a label symbol works just fine:

  (gdb) python print(str(symbol.value()))
  0x401135 <main+35>

And the type is maybe what we'd expect:

  (gdb) python print(str(symbol.value().type))
  void *

23 months agogdb: convert linux-osdata.c from buffer to std::string
Simon Marchi [Fri, 16 Dec 2022 03:01:19 +0000 (22:01 -0500)]
gdb: convert linux-osdata.c from buffer to std::string

Replace the use of struct buffer in linux-osdata.c with std::string.
There is no change in the logic, so there should be no user-visible
change.

Change-Id: I27f53165d401650bbd0bebe8ed88221e25545b3f
Approved-By: Pedro Alves <pedro@palves.net>
23 months agogdbsupport: add string_xml_appendf
Simon Marchi [Thu, 20 Oct 2022 01:56:47 +0000 (21:56 -0400)]
gdbsupport: add string_xml_appendf

Add a version of buffer_xml_printf (defined in gdbsupport/buffer.{c,h})
that appends to an std::string, rather than a struct buffer.  Call it
"string" rather than "buffer" since it operates on an std::string rather
than a buffer.  And call it "appendf" rather than "printf", since it
appends to and does not replace the string's content.  This mirrors
string_appendf.

Place the new version in gdbsupport/xml-utils.h.

The code is a direct copy of buffer_xml_printf.  The old version is
going to disappear at some point, which is why I didn't do any effort to
share code.

Change-Id: I30e030627ab4970fd0b9eba3b7e8cec78fa561ba
Approved-By: Pedro Alves <pedro@palves.net>
23 months agogdb: clean up some inefficient std::string usage
Andrew Burgess [Thu, 15 Dec 2022 16:50:57 +0000 (16:50 +0000)]
gdb: clean up some inefficient std::string usage

This commit:

  commit 53cf95c3389a3ecd97276d322e4a60fe3396a201
  Date:   Wed Dec 14 14:17:44 2022 +0000

      gdb: make more use of make_target_connection_string

Introduced a couple of inefficient uses of std::string, both of which
are fixed in this commit.

There should be no user visible changes after this commit.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
23 months agoFix a potential illegal memory access when parsing corrupt DWARF information.
Nick Clifton [Fri, 16 Dec 2022 12:06:43 +0000 (12:06 +0000)]
Fix a potential illegal memory access when parsing corrupt DWARF information.

PR 29908
* dwarf.c (display_debug_addr): Check for corrupt header lengths.

23 months agogdb/testsuite: add test for Python commands redefining itself
Jan Vrany [Fri, 16 Dec 2022 11:38:28 +0000 (11:38 +0000)]
gdb/testsuite: add test for Python commands redefining itself

This commit adds a test that creates a Python command that redefines
itself during its execution. This is to test use-after-free in
execute_command ().

This test needs run with ASan enabled in order to fail when it
should.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
23 months ago[aarch64] Fix removal of non-address bits for PAuth
Luis Machado [Tue, 24 May 2022 22:31:09 +0000 (23:31 +0100)]
[aarch64] Fix removal of non-address bits for PAuth

PR gdb/28947

The address_significant gdbarch setting was introduced as a way to remove
non-address bits from pointers, and it is specified by a constant.  This
constant represents the number of address bits in a pointer.

Right now AArch64 is the only architecture that uses it, and 56 was a
correct option so far.

But if we are using Pointer Authentication (PAuth), we might use up to 2 bytes
from the address space to store the required information.  We could also have
cases where we're using both PAuth and MTE.

We could adjust the constant to 48 to cover those cases, but this doesn't
cover the case where GDB needs to sign-extend kernel addresses after removal
of the non-address bits.

This has worked so far because bit 55 is used to select between kernel-space
and user-space addresses.  But trying to clear a range of bits crossing the
bit 55 boundary requires the hook to be smarter.

The following patch renames the gdbarch hook from significant_addr_bit to
remove_non_address_bits and passes a pointer as opposed to the number of
bits.  The hook is now responsible for removing the required non-address bits
and sign-extending the address if needed.

While at it, make GDB and GDBServer share some more code for aarch64 and add a
new arch-specific testcase gdb.arch/aarch64-non-address-bits.exp.

Bug-url: https://sourceware.org/bugzilla/show_bug.cgi?id=28947

Approved-By: Simon Marchi <simon.marchi@efficios.com>
23 months agogas: restore Dwarf info generation after macro diagnostic adjustments
Jan Beulich [Fri, 16 Dec 2022 08:01:14 +0000 (09:01 +0100)]
gas: restore Dwarf info generation after macro diagnostic adjustments

While 6fdb723799e2 ("gas: re-work line number tracking for macros and
their expansions") was meant to leave generated Dwarf as is, it really
didn't (and the testcase intended to catch that wasn't covering the case
which broke). Its adjustment to buffer_and_nest() didn't go far enough,
leading to the "linefile" directive inserted at the top to also be
processed later in the PR gas/16908 workaround (which clearly isn't
intended - it's being put there for processing during macro expansion
only). That unnoticed flaw in turn led me to work around it by a
(suspicious to me already at the time) conditional in as_where().

23 months agox86: change representation of extension opcode
Jan Beulich [Fri, 16 Dec 2022 08:00:23 +0000 (09:00 +0100)]
x86: change representation of extension opcode

Having a "None" field in the vast majority of entries is needlessly
cluttering the overall table. Instead of this being a separate field,
use a representation matching that of Intel SDM and AMD PM for the main
use of the field: Append the value after a / as the separator.

23 months agogdbsupport: change xml_escape_text_append's parameter from pointer to reference
Simon Marchi [Thu, 20 Oct 2022 02:00:59 +0000 (22:00 -0400)]
gdbsupport: change xml_escape_text_append's parameter from pointer to reference

The passed in string can't be nullptr, it makes more sense to pass in a
reference.

Change-Id: Idc8bd38abe1d6d9b44aa227d7856956848c233b3

23 months agogdb: remove static buffer in command_line_input
Simon Marchi [Thu, 15 Dec 2022 19:06:25 +0000 (14:06 -0500)]
gdb: remove static buffer in command_line_input

[I sent this earlier today, but I don't see it in the archives.
Resending it through a different computer / SMTP.]

The use of the static buffer in command_line_input is becoming
problematic, as explained here [1].  In short, with this patch [2] that
attempt to fix a post-hook bug, when running gdb.base/commands.exp, we
hit a case where we read a "define" command line from a script file
using command_command_line_input.  The command line is stored in
command_line_input's static buffer.  Inside the define command's
execution, we read the lines inside the define using command_line_input,
which overwrites the define command, in command_line_input's static
buffer.  After the execution of the define command, execute_command does
a command look up to see if a post-hook is registered.  For that, it
uses a now stale pointer that used to point to the define command, in
the static buffer, causing a use-after-free.  Note that the pointer in
execute_command points to the dynamically-allocated buffer help by the
static buffer in command_line_input, not to the static object itself,
hence why we see a use-after-free.

Fix that by removing the static buffer.  I initially changed
command_line_input and other related functions to return an std::string,
which is the obvious but naive solution.  The thing is that some callees
don't need to return an allocated string, so this this an unnecessary
pessimization.  I changed it to passing in a reference to an std::string
buffer, which the callee can use if it needs to return
dynamically-allocated content.  It fills the buffer and returns a
pointers to the C string inside.  The callees that don't need to return
dynamically-allocated content simply don't use it.

So, it started with modifying command_line_input as described above, all
the other changes derive directly from that.

One slightly shady thing is in handle_line_of_input, where we now pass a
pointer to an std::string's internal buffer to readline's history_value
function, which takes a `char *`.  I'm pretty sure that this function
does not modify the input string, because I was able to change it (with
enough massaging) to take a `const char *`.

A subtle change is that we now clear a UI's line buffer using a
SCOPE_EXIT in command_line_handler, after executing the command.
This was previously done by this line in handle_line_of_input:

  /* We have a complete command line now.  Prepare for the next
     command, but leave ownership of memory to the buffer .  */
  cmd_line_buffer->used_size = 0;

I think the new way is clearer.

[1] https://inbox.sourceware.org/gdb-patches/becb8438-81ef-8ad8-cc42-fcbfaea8cddd@simark.ca/
[2] https://inbox.sourceware.org/gdb-patches/20221213112241.621889-1-jan.vrany@labware.com/

Change-Id: I8fc89b1c69870c7fc7ad9c1705724bd493596300
Reviewed-By: Tom Tromey <tom@tromey.com>
23 months agoAutomatic date update in version.in
GDB Administrator [Fri, 16 Dec 2022 00:01:08 +0000 (00:01 +0000)]
Automatic date update in version.in

23 months agolibsframe asan: avoid generating misaligned loads
Indu Bhagat [Thu, 15 Dec 2022 21:12:01 +0000 (13:12 -0800)]
libsframe asan: avoid generating misaligned loads

There are two places where unaligned loads were seen on aarch64:
  - #1. access to the SFrame FRE stack offsets in the in-memory
    representation/abstraction provided by libsframe.
  - #2. access to the SFrame FRE start address in the on-disk representation
    of the frame row entry.

For #1, we can fix this by reordering the struct members of
sframe_frame_row_entry in libsframe/sframe-api.h.

For #2, we need to default to using memcpy instead, and copy out the bytes
to a location for output.

SFrame format is an unaligned on-disk format. As such, there are other blobs
of memory in the on-disk SFrame FRE that are on not on their natural
boundaries.  But that does not pose further problems yet, because the users
are provided access to the on-disk SFrame FRE data via libsframe's
sframe_frame_row_entry, the latter has its' struct members aligned on their
respective natural boundaries (and initialized using memcpy).

PR 29856 libsframe asan: load misaligned at sframe.c:516

ChangeLog:

PR libsframe/29856
* bfd/elf64-x86-64.c: Adjust as the struct members have been
reordered.
* libsframe/sframe.c (sframe_decode_fre_start_address): Use
memcpy to perform 16-bit/32-bit reads.
* libsframe/testsuite/libsframe.encode/encode-1.c: Adjust as the
struct members have been reordered.

include/ChangeLog:

PR libsframe/29856
* sframe-api.h: Reorder fre_offsets for natural alignment.

23 months agogdb/testsuite: don't delete command files in gdb.base/commands.exp
Simon Marchi [Wed, 14 Dec 2022 21:14:03 +0000 (16:14 -0500)]
gdb/testsuite: don't delete command files in gdb.base/commands.exp

Don't delete the runtime-generated command files.  This makes it easier
to reproduce tests by hand.

Change-Id: I4e53484eea216512f1c5d7dfcb5c464b36950946
Approved-By: Tom Tromey <tom@tromey.com>
23 months agoMove streq and compare_cstrings to gdbsupport
Tom Tromey [Wed, 14 Dec 2022 19:28:32 +0000 (12:28 -0700)]
Move streq and compare_cstrings to gdbsupport

It seems to me that streq and compare_cstrings belong near the other
string utility functions in common-utils.h; and furthermore that streq
ought to be inlined.  This patch makes this change.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
23 months agoRemove subset_compare
Tom Tromey [Wed, 14 Dec 2022 19:22:58 +0000 (12:22 -0700)]
Remove subset_compare

I stumbled across subset_compare today, and after looking at the
callers I realized it could be removed and replaced with calls to
startswith.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
23 months agogdb: use gdb_assert not internal_error
Andrew Burgess [Mon, 12 Dec 2022 14:09:40 +0000 (14:09 +0000)]
gdb: use gdb_assert not internal_error

Spotted a couple of places in findvar.c where we use:

  if ( ! CONDITION )
    internal_error ("...");

this commit changes these to be:

  gdb_assert ( CONDITION );

which I think is better.

Unless we happen to hit the internal_error calls (which was bad) there
should be no user visible changes after this commit.

23 months agogdb: some int to bool conversion in remote-sim.c
Andrew Burgess [Thu, 15 Dec 2022 12:46:18 +0000 (12:46 +0000)]
gdb: some int to bool conversion in remote-sim.c

Some obvious int to bool conversion in remote-sim.c, there should be
no user visible changes after this commit.

23 months agogdb: make more use of make_target_connection_string
Andrew Burgess [Wed, 14 Dec 2022 14:17:44 +0000 (14:17 +0000)]
gdb: make more use of make_target_connection_string

I noticed that we have a function make_target_connection_string which
wraps all the logic for creating a string that describes a target
connection - but in some places we are not calling this function,
instead we duplicate the function's logic.

This commit cleans this up, and calls make_target_connection_string
where possible.

There should be no user visible changes after this commit.

23 months agogdb: int to bool conversion in tracefile.c
Andrew Burgess [Thu, 15 Dec 2022 11:33:37 +0000 (11:33 +0000)]
gdb: int to bool conversion in tracefile.c

Some obvious int to bool conversion in tracefile.c.

Should be no user visible changes after this commit.

23 months ago[gdb/testsuite] Fix gdb.base/condbreak-multi-context.exp with gcc 4.8.5
Tom de Vries [Thu, 15 Dec 2022 11:30:36 +0000 (12:30 +0100)]
[gdb/testsuite] Fix gdb.base/condbreak-multi-context.exp with gcc 4.8.5

With gcc 4.8.5, I run into:
...
Running gdb.base/condbreak-multi-context.exp ...
gdb compile failed, condbreak-multi-context.cc:21:11: warning: non-static \
  data member initializers only available with -std=c++11 or -std=gnu++11 \
  [enabled by default]
   int b = 20;
           ^
...

Fix this by making it a static const.

Tested on x86_64-linux, with gcc 4.8.5, 7.5.0 and clang 13.0.1.

23 months agoAutomatic date update in version.in
GDB Administrator [Thu, 15 Dec 2022 00:01:15 +0000 (00:01 +0000)]
Automatic date update in version.in

23 months agogdb/maint: add core file name to 'maint info program-spaces' output
Andrew Burgess [Fri, 23 Sep 2022 09:04:58 +0000 (10:04 +0100)]
gdb/maint: add core file name to 'maint info program-spaces' output

Each program space can have an associated core file.  Include this
information in the output of 'maint info program-spaces'.

23 months agogdb: ensure all targets are popped before an inferior is destructed
Andrew Burgess [Thu, 22 Sep 2022 17:11:30 +0000 (18:11 +0100)]
gdb: ensure all targets are popped before an inferior is destructed

Now that the inferiors target_stack automatically manages target
reference counts, we might think that we don't need to unpush targets
when an inferior is deleted...

...unfortunately that is not the case.  The inferior::unpush function
can do some work depending on the type of target, so it is important
that we still pass through this function.

To ensure that this is the case, in this commit I've added an assert
to inferior::~inferior that ensures the inferior's target_stack is
empty (except for the ever present dummy_target).

I've then added a pop_all_targets call to delete_inferior, otherwise
the new assert will fire in, e.g. the gdb.python/py-inferior.exp test.

23 months agogdb: remove the pop_all_targets (and friends) global functions
Andrew Burgess [Thu, 22 Sep 2022 11:22:22 +0000 (12:22 +0100)]
gdb: remove the pop_all_targets (and friends) global functions

This commit removes the global functions pop_all_targets,
pop_all_targets_above, and pop_all_targets_at_and_above, and makes
them methods on the inferior class.

As the pop_all_targets functions will unpush each target, which
decrements the targets reference count, it is possible that the target
might be closed.

Right now, closing a target, in some cases, depends on the current
inferior being set correctly, that is, to the inferior from which the
target was popped.

To facilitate this I have used switch_to_inferior_no_thread within the
new methods.  Previously it was the responsibility of the caller to
ensure that the correct inferior was selected.

In a couple of places (event-top.c and top.c) I have been able to
remove a previous switch_to_inferior_no_thread call.

In remote_unpush_target (remote.c) I have left the
switch_to_inferior_no_thread call as it is required for the
generic_mourn_inferior call.

23 months agogdb: remove decref_target
Andrew Burgess [Thu, 22 Sep 2022 18:10:52 +0000 (19:10 +0100)]
gdb: remove decref_target

The decref_target function is not really needed.  Calling
target_ops::decref will just redirect to decref_target anyway, so why
not just rename decref_target to target_ops::decref?

That's what this commit does.

It's not exactly renaming to target_ops::decref, because the decref
functionality is handled by a policy class, so the new name is now
target_ops_ref_policy::decref.

There should be no user visible change after this commit.

23 months agogdb: have target_stack automate reference count handling
Andrew Burgess [Thu, 22 Sep 2022 10:17:39 +0000 (11:17 +0100)]
gdb: have target_stack automate reference count handling

This commit changes the target_stack class from using a C style array
of 'target_ops *' to using a C++ std::array<target_ops_ref, ...>.  The
benefit of this change is that some of the reference counting of
target_ops objects is now done automatically.

This commit fixes a crash in gdb.python/py-inferior.exp where GDB
crashes at exit, leaving a core file behind.

The crash occurs in connpy_connection_dealloc, and is actually
triggered by this assert:

gdb_assert (conn_obj->target == nullptr);

Now a little aside...

    ... the assert is never actually printed, instead GDB crashes due
    to calling a pure virtual function.  The backtrace at the point of
    crash looks like this:

      #7  0x00007fef7e2cf747 in std::terminate() () from /lib64/libstdc++.so.6
      #8  0x00007fef7e2d0515 in __cxa_pure_virtual () from /lib64/libstdc++.so.6
      #9  0x0000000000de334d in target_stack::find_beneath (this=0x4934d78, t=0x2bda270 <the_dummy_target>) at ../../s>
      #10 0x0000000000df4380 in inferior::find_target_beneath (this=0x4934b50, t=0x2bda270 <the_dummy_target>) at ../.>
      #11 0x0000000000de2381 in target_ops::beneath (this=0x2bda270 <the_dummy_target>) at ../../src/gdb/target.c:3047
      #12 0x0000000000de68aa in target_ops::supports_terminal_ours (this=0x2bda270 <the_dummy_target>) at ../../src/gd>
      #13 0x0000000000dde6b9 in target_supports_terminal_ours () at ../../src/gdb/target.c:1112
      #14 0x0000000000ee55f1 in internal_vproblem(internal_problem *, const char *, int, const char *, typedef __va_li>

    Notice in frame #12 we called target_ops::supports_terminal_ours,
    however, this is the_dummy_target, which is of type dummy_target,
    and so we should have called dummy_target::supports_terminal_ours.
    I believe the reason we ended up in the wrong implementation of
    supports_terminal_ours (which is a virtual function) is because we
    made the call during GDB's shut-down, and, I suspect, the vtables
    were in a weird state.

    Anyway, the point of this patch is not to fix GDB's ability to
    print an assert during exit, but to address the root cause of the
    assert.  With that aside out of the way, we can return to the main
    story...

Connections are represented in Python with gdb.TargetConnection
objects (or its sub-classes).  The assert in question confirms that
when a gdb.TargetConnection is deallocated, the underlying GDB
connection has itself been removed from GDB.  If this is not true then
we risk creating multiple different gdb.TargetConnection objects for
the same connection, which would be bad.

To ensure that we have one gdb.TargetConnection object for each
connection, the all_connection_objects map exists, this maps the
process_stratum_target object (the connection) to the
gdb.TargetConnection object that represents the connection.

When a connection is removed in GDB the connection_removed observer
fires, which we catch with connpy_connection_removed, this function
then sets conn_obj->target to nullptr, and removes the corresponding
entry from the all_connection_objects map.

The first issue here is that connpy_connection_dealloc is being called
as part of GDB's exit code, which is run after the Python interpreter
has been shut down.  The connpy_connection_dealloc function is used to
deallocate the gdb.TargetConnection Python object.  Surely it is
wrong for us to be deallocating Python objects after the interpreter
has been shut down.

The reason why connpy_connection_dealloc is called during GDB's exit
is that the global all_connection_objects map is still holding a
reference to the gdb.TargetConnection object.  When the map is
destroyed during GDB's exit, the gdb.TargetConnection objects within
the map can finally be deallocated.

The reason why all_connection_objects has contents when GDB exits, and
the reason the assert fires, is that, when GDB exits, there are still
some connections that have not yet been removed from GDB, that is,
they have a non-zero reference count.

If we take a look at quit_force (top.c) you can see that, for each
inferior, we call pop_all_targets before we (later in the function)
call do_final_cleanups.  It is the do_final_cleanups call that is
responsible for shutting down the Python interpreter.  The
pop_all_targets calls should, in theory, cause all the connections to
be removed from GDB.

That this isn't working indicates that some targets have a non-zero
reference count even after this final pop_all_targets call, and
indeed, when I debug GDB, that is what I see.

I tracked the problem down to delete_inferior where we do some house
keeping, and then delete the inferior object, which calls
inferior::~inferior.

In neither delete_inferior or inferior::~inferior do we call
pop_all_targets, and it is this missing call that means we leak some
references to the target_ops objects on the inferior's target_stack.

In this commit I will provide a partial fix for the problem.  I say
partial fix, but this will actually be enough to resolve the crash.
In a later commit I will provide the final part of the fix.

As mentioned at the start of the commit message, this commit changes
the m_stack in target_stack to hold target_ops_ref objects.  This
means that when inferior::~inferior is called, and m_stack is
released, we automatically decrement the target_ops reference count.
With this change in place we no longer leak any references, and now,
in quit_force the final pop_all_targets calls will release the final
references.  This means that the targets will be correctly closed at
this point, which means the connections will be removed from GDB and
the Python objects deallocated before the Python interpreter shuts
down.

There's a slight oddity in target_stack::unpush, where we std::move
the reference out of m_stack like this:

  auto ref = std::move (m_stack[stratum]);

the `ref' isn't used explicitly, but it serves to hold the
target_ops_ref until the end of the scope while allowing the m_stack
entry to be reset back to nullptr.  The alternative would be to
directly set the m_stack entry to nullptr, like this:

  m_stack[stratum] = nullptr;

The problem here is that when we set the m_stack entry to nullptr we
first decrement the target_ops reference count, and then set the array
entry to nullptr.

If the decrement means that the target_ops object reaches a zero
reference count then the target_ops object will be closed by calling
target_close.  In target_close we ensure that the target being closed
is not in any inferiors target_stack.

As we decrement before clearing, then this check in target_close will
fail, and an assert will trigger.

By using std::move to move the reference out of m_stack, this clears
the m_stack entry, meaning the inferior no longer contains the
target_ops in its target_stack.  Now when the REF object goes out of
scope and the reference count is decremented, target_close can run
successfully.

I've made use of the Python connection_removed listener API to add a
test for this issue.  The test installs a listener and then causes
delete_inferior to be called, we can then see that the connection is
then correctly removed (because the listener triggers).

23 months agogdb/remote: remove some manual reference count handling
Andrew Burgess [Thu, 22 Sep 2022 17:57:27 +0000 (18:57 +0100)]
gdb/remote: remove some manual reference count handling

While working on some other target_ops reference count related code, I
spotted that in remote.c we do some manual reference count handling,
i.e. we call target_ops::incref and decref_target (which wraps
target_ops::decref).

I think it would be better to make use of gdb::ref_ptr to automate the
reference count management.

So, this commit updates scoped_mark_target_starting in two ways,
first, I use gdb::ref_ptr to handle the reference counts.  Then,
instead of using the scoped_mark_target_starting constructor and
destructor to set and reset the starting_up flag, I now use a
scoped_restore_tmpl object to set and restore the flag.

The above changes mean that the scoped_mark_target_starting destructor
can be completely removed, and the constructor body is now empty.

I've also fixed a typo in the class comment.

The only change in behaviour after this commit is that previously we
didn't care what the value of starting_up was, we just set it to true
in the constructor and false in the destructor.

Now, I assert that the flag is initially false, then set the flag true
when the scoped_mark_target_starting is created.

As the starting_up flag is initialized to false then, for the assert
to fire, we would need to recursively enter
remote_target::start_remote_1, which I don't think is something we
should be doing, so I think the new assert is an improvement.

23 months agoRe: ld, gold: remove support for -z bndplt (MPX prefix)
Alan Modra [Wed, 14 Dec 2022 13:28:14 +0000 (23:58 +1030)]
Re: ld, gold: remove support for -z bndplt (MPX prefix)

Don't attempt to run gold tests with -z bndplt

* testsuite/Makefile.am (exception_x86_64_bnd_test, bnd_plt_1.sh),
(bnd_ifunc_1.sh, bnd_ifunc_2.sh): Delete rules.
* testsuite/Makefile.in: Regenerate.
* testsuite/bnd_ifunc_1.s: Delete.
* testsuite/bnd_ifunc_1.sh: Delete.
* testsuite/bnd_ifunc_2.s: Delete.
* testsuite/bnd_ifunc_2.sh: Delete.
* testsuite/bnd_plt_1.s: Delete.
* testsuite/bnd_plt_1.sh: Delete.

23 months agoasan: buffer overflow in sh_reloc
Alan Modra [Wed, 14 Dec 2022 04:16:07 +0000 (14:46 +1030)]
asan: buffer overflow in sh_reloc

* coff-sh.c (sh_reloc): Use bfd_reloc_offset_in_range.

23 months agoFix haiku ld dependencies
Alan Modra [Wed, 14 Dec 2022 11:02:03 +0000 (21:32 +1030)]
Fix haiku ld dependencies

I noticed after commit 8ad93045ed, "ld, gold: remove support for -z
bndplt (MPX prefix)", that some of my builds were failing with

eelf_x86_64_haiku.c:650:9: error: no member named 'bndplt' in 'struct elf_linker_x86_params'
        params.bndplt = true;
        ~~~~~~ ^

* emulparams/aarch64haiku.sh: Use "source_sh" rather than ".".
* emulparams/armelf_haiku.sh: Likewise.
* emulparams/elf32ppchaiku.sh: Likewise.
* emulparams/elf_mipsel_haiku.sh: Likewise.
* emulparams/elf_x86_64_haiku.sh: Likewise.

23 months agogdb: add SYMBOL_LOOKUP_SCOPED_DEBUG_ENTER_EXIT
Andrew Burgess [Tue, 6 Dec 2022 12:49:55 +0000 (12:49 +0000)]
gdb: add SYMBOL_LOOKUP_SCOPED_DEBUG_ENTER_EXIT

After the previous commit converted symbol-lookup debug to use the new
debug scheme, this commit adds SYMBOL_LOOKUP_SCOPED_DEBUG_ENTER_EXIT.

The previous commit didn't add SYMBOL_LOOKUP_SCOPED_DEBUG_ENTER_EXIT
because symbol-lookup debug is controlled by an 'unsigned int' rather
than a 'bool' control variable, we use the numeric value to offer
different levels of verbosity for symbol-lookup debug.

The *_SCOPED_DEBUG_ENTER_EXIT mechanism currently relies on capturing
a reference to the bool control variable, and evaluating the variable
both on entry, and at exit, this is done in the scoped_debug_start_end
class (see gdbsupport/common-debug.h).

This commit templates scoped_debug_start_end so that the class can
accept either a 'bool &' or an invokable object, e.g. a lambda
function, or a function pointer.

The existing scoped_debug_start_end and scoped_debug_enter_exit macros
in common-debug.h are updated to support scoped_debug_enter_exit being
templated, however, nothing outside of common-debug.h needs to change.

I've then added SYMBOL_LOOKUP_SCOPED_DEBUG_ENTER_EXIT in symtab.h, and
added a couple of token uses in symtab.c.  I didn't want to add too
much in this first commit, this is really about updating
common-debug.h to support this new functionality.

Within symtab.h I created a couple of global functions that can be
used to query the status of the symbol_lookup_debug control variable,
these functions are then used within the two existing macros:

  symbol_lookup_debug_printf
  symbol_lookup_debug_printf_v

and also in the new SYMBOL_LOOKUP_SCOPED_DEBUG_ENTER_EXIT macro.

23 months agogdb: convert 'set debug symbol-lookup' to new debug printing scheme
Andrew Burgess [Fri, 2 Dec 2022 12:10:10 +0000 (12:10 +0000)]
gdb: convert 'set debug symbol-lookup' to new debug printing scheme

Convert the implementation of 'set debug symbol-lookup' to the new
debug printing scheme.

In a few places I've updated the debug output to remove places where
the printed debug message included the function name, the new debug
scheme already adds that, but I haven't done all the possible updates.

23 months agogdb/testsuite: new test for recent dwarf reader issue
Andrew Burgess [Wed, 7 Dec 2022 15:55:25 +0000 (15:55 +0000)]
gdb/testsuite: new test for recent dwarf reader issue

This commit provides a test for this commit:

  commit 55fc1623f942fba10362cb199f9356d75ca5835b
  Date:   Thu Nov 3 13:49:17 2022 -0600

      Add name canonicalization for C

Which resolves PR gdb/29105.  My reason for writing this test was a
desire to better understand the above commit, my process was to study
the commit until I thought I understood it, then write a test to
expose the issue.  As the original commit didn't have a test, I
thought it wouldn't hurt to commit this upstream.

The problem tested for here is already described in the above commit,
but I'll give a brief description here.  This description describes
GDB prior to the above commit:

  - Builtin types are added to GDB using their canonical name,
    e.g. "short", not "signed short",

  - When the user does something like 'p sizeof(short)', then this is
    handled in c-exp.y, and results in a call to lookup_signed_type
    for the name "int".  The "int" here is actually being looked up as
    the type for the result of the 'sizeof' expression,

  - In lookup_signed_type GDB first adds a 'signed' and looks for that
    type, so in this case 'signed int', and, if that lookup fails, GDB
    then looks up 'int',

  - The problem is that 'signed int' is not the canonical name for a
    signed int, so no builtin type with that name will be found, GDB
    will then go to each object file in turn looking for a matching
    type,

  - When checking each object file, GDB will first check the partial
    symtab to see if the full symtab should be expanded or not.
    Remember, at this point GDB is looking for 'signed int', there
    will be no partial symbols with that name, so GDB will not expand
    anything,

  - However, GDB checks each partial symbol using multiple languages,
    not just the current language (C in this case), so, when GDB
    checks using the C++ language, the symbol name is first
    canonicalized (the code that does this can be found
    lookup_name_info::language_lookup_name).  As the canonical form of
    'signed int' is just 'int', GDB then looks for any symbols with
    the name 'int', most partial symtabs will contain such a symbol,
    so GDB ends up expanding pretty much every symtab.

The above commit fixes this by avoiding the use of non-canonical names
with C, now the initial builtin type lookup will succeed, and GDB
never even considers whether to expand any additional symtabs.

The test case creates a library that includes char, short, int, and
long types, and a test program that links against the library.

In the test script we start the inferior, but don't allow it to
progress far enough that the debug information for the library has
been fully expanded yet.

Then we evaluate some 'sizeof(TYPE)' expressions.

In the buggy version of GDB this would cause the debug information
for the library to be fully expanded, while in the fixed version of
GDB this will not be the case.

We use 'info sources' to determine if the debug information has been
fully expanded or not.

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

23 months agogdb/testsuite: fix readnow detection
Andrew Burgess [Thu, 8 Dec 2022 11:33:50 +0000 (11:33 +0000)]
gdb/testsuite: fix readnow detection

The following commit broke the readnow detection in the testsuite:

  commit dfaa040b440084dd73ebd359326752d5f44fc02c
  Date:   Mon Mar 29 18:31:31 2021 -0600

      Remove some "OBJF_READNOW" code from dwarf2_debug_names_index

The testsuite checks if GDB was started with the -readnow flag by
using the 'maintenance print objfiles' command, and looking for the
string 'faked for "readnow"' in the output.  This is implemented in
two helper procs `readnow` (gdb.exp) and `mi_readnow` (mi-support.exp).

The following tests all currently depend on this detection:

  gdb.base/maint.exp
  gdb.cp/nsalias.exp
  gdb.dwarf2/debug-aranges-duplicate-offset-warning.exp
  gdb.dwarf2/dw2-stack-boundary.exp
  gdb.dwarf2/dw2-zero-range.exp
  gdb.dwarf2/gdb-index-nodebug.exp
  gdb.mi/mi-info-sources.exp
  gdb.python/py-symbol.exp
  gdb.rust/traits.exp

The following test also includes detection of 'readnow', but does the
detection itself by checking $::GDBFLAGS for the readnow flag:

  gdb.opt/break-on-_exit.exp

The above commit removed from GDB the code that produced the 'faked
for "readnow"' string, as a consequence the testsuite can no longer
correctly spot when readnow is in use, and many of the above tests
will fail (at least partially).

When looking at the above tests, I noticed that gdb.rust/traits.exp
does call `readnow`, but doesn't actually use the result, so I've
removed the readnow call, this simplifies the next part of this patch
as gdb.rust/traits.exp was the only place an extra regexp was passed
to the readnow call.

Next I have rewritten `readnow` to check the $GDBFLAGS for the
-readnow flag, and removed the `maintenance print objfiles` check.  At
least for all the tests above, when using the readnow board, this is
good enough to get everything passing again.

For the `mi_readnow` proc, I changed this to just call `readnow` from
gdb.exp, I left the mi_readnow name in place - in the future it might
be the case that we want to do some different checks here.

Finally, I updated gdb.opt/break-on-_exit.exp to call the `readnow`
proc.

With these changes, all of the tests listed above now pass correctly
when using the readnow board.

23 months agoRISC-V: Add string length check for operands in AS
Li Xu [Wed, 14 Dec 2022 07:32:40 +0000 (07:32 +0000)]
RISC-V: Add string length check for operands in AS

The current AS accepts invalid operands due to miss of operands length check.
For example, "e6" is an invalid operand in (vsetvli a0, a1, e6, mf8, tu, ma),
but it's still accepted by assembler.  In detail, the condition check "strncmp
(array[i], *s, len) == 0" in arg_lookup function passes with "strncmp ("e64",
"e6", 2)" in the case above.  So the generated encoding is same as that of
(vsetvli a0, a1, e64, mf8, tu, ma).

This patch fixes issue above by prompting an error in such case and also adds
a new testcase.

gas/ChangeLog:

        * config/tc-riscv.c (arg_lookup): Add string length check for operands.
        * testsuite/gas/riscv/vector-insns-fail-vsew.d: New testcase for an illegal vsew.
        * testsuite/gas/riscv/vector-insns-fail-vsew.l: Likewise.
        * testsuite/gas/riscv/vector-insns-fail-vsew.s: Likewise.

23 months agox86: adjust type checking constructs
Jan Beulich [Wed, 14 Dec 2022 09:07:44 +0000 (10:07 +0100)]
x86: adjust type checking constructs

As Alan points out, ASAN takes issue with these constructs, for
current_templates being NULL. Wrap them in sizeof(), so the expressions
aren't actually evaluated.

23 months agold, gold: remove support for -z bndplt (MPX prefix)
Martin Liska [Thu, 8 Dec 2022 08:12:13 +0000 (09:12 +0100)]
ld, gold: remove support for -z bndplt (MPX prefix)

bfd/ChangeLog:

* elf-linker-x86.h (struct elf_linker_x86_params): Remove
bndplt.
* elf64-x86-64.c (elf_x86_64_scan_relocs): Ignore
        R_X86_64_PLT32_BND.
(elf_x86_64_relocate_section): Similarly here.
(elf_x86_64_link_setup_gnu_properties): Ignore bndplt.
* elfxx-x86.c: Likewise.
* elfxx-x86.h: Likewise.

gold/ChangeLog:

* NEWS: Document -z bndplt.
* options.h (class General_options): Remove bndplt option.
* x86_64.cc (class Output_data_plt_x86_64_bnd): Remove.
(Target_x86_64::do_make_data_plt): Do not use
Output_data_plt_x86_64_bnd.
(Target_x86_64::Scan::get_reference_flags): Likewise.
(Target_x86_64::Scan::check_non_pic): Likewise.
(Target_x86_64::Scan::local): Likewise.
(Target_x86_64::Scan::global): Likewise.

ld/ChangeLog:

* NEWS: Document -z bndplt.
* emulparams/elf_x86_64.sh: Remove bndplt option.
* ld.texi: Likewise.
* testsuite/ld-x86-64/x86-64.exp:
* testsuite/ld-x86-64/bnd-branch-1-now.d: Removed.
* testsuite/ld-x86-64/bnd-branch-1.d: Removed.
* testsuite/ld-x86-64/bnd-branch-1.s: Removed.
* testsuite/ld-x86-64/bnd-ifunc-1-now.d: Removed.
* testsuite/ld-x86-64/bnd-ifunc-1.d: Removed.
* testsuite/ld-x86-64/bnd-ifunc-1.s: Removed.
* testsuite/ld-x86-64/bnd-ifunc-2-now.d: Removed.
* testsuite/ld-x86-64/bnd-ifunc-2.d: Removed.
* testsuite/ld-x86-64/bnd-ifunc-2.s: Removed.
* testsuite/ld-x86-64/bnd-plt-1-now.d: Removed.
* testsuite/ld-x86-64/bnd-plt-1.d: Removed.
* testsuite/ld-x86-64/mpx.exp: Removed.
* testsuite/ld-x86-64/mpx1.out: Removed.
* testsuite/ld-x86-64/mpx1a.c: Removed.
* testsuite/ld-x86-64/mpx1a.rd: Removed.
* testsuite/ld-x86-64/mpx1b.c: Removed.
* testsuite/ld-x86-64/mpx1c.c: Removed.
* testsuite/ld-x86-64/mpx1c.rd: Removed.
* testsuite/ld-x86-64/mpx2.out: Removed.
* testsuite/ld-x86-64/mpx2a.c: Removed.
* testsuite/ld-x86-64/mpx2a.rd: Removed.
* testsuite/ld-x86-64/mpx2b.c: Removed.
* testsuite/ld-x86-64/mpx2c.c: Removed.
* testsuite/ld-x86-64/mpx2c.rd: Removed.
* testsuite/ld-x86-64/mpx3.dd: Removed.
* testsuite/ld-x86-64/mpx3a.s: Removed.
* testsuite/ld-x86-64/mpx3b.s: Removed.
* testsuite/ld-x86-64/mpx3n.dd: Removed.
* testsuite/ld-x86-64/mpx4.dd: Removed.
* testsuite/ld-x86-64/mpx4a.s: Removed.
* testsuite/ld-x86-64/mpx4b.s: Removed.
* testsuite/ld-x86-64/mpx4n.dd: Removed.
* testsuite/ld-x86-64/pr20800a.S: Removed.
* testsuite/ld-x86-64/pr20800b.S: Removed.
* testsuite/ld-x86-64/pr21038a-now.d: Removed.
* testsuite/ld-x86-64/pr21038a.d: Removed.
* testsuite/ld-x86-64/pr21038a.s: Removed.
* testsuite/ld-x86-64/pr21038b-now.d: Removed.
* testsuite/ld-x86-64/pr21038b.d: Removed.
* testsuite/ld-x86-64/pr21038b.s: Removed.
* testsuite/ld-x86-64/pr21038c-now.d: Removed.
* testsuite/ld-x86-64/pr21038c.d: Removed.
* testsuite/ld-x86-64/pr21038c.s: Removed.

23 months agoasan: signed integer overflow in display_debug_frames
Alan Modra [Wed, 14 Dec 2022 01:44:13 +0000 (12:14 +1030)]
asan: signed integer overflow in display_debug_frames

* dwarf.c (struct Frame_Chunk): Make col_offset an int64_t.
Adjust all places allocating col_offset and col_type to use
the size of the array element rather than the size of a type.
(frame_display_row): Adjust printing of col_offset.
(display_debug_frames): Factor out multiplication by
code_factor and data_factor.  Avoid signed overflow.  Use
64-bit variables.

23 months agoDon't access freed memory printing objcopy warning
Alan Modra [Wed, 14 Dec 2022 01:12:00 +0000 (11:42 +1030)]
Don't access freed memory printing objcopy warning

abfd->filename will be freed if bfd_close gets far enough to delete
the bfd.  It's possible to have an error from fclose at this point.

* objcopy.c (copy_archive): Dup filename before closing bfd for
potential use in bfd_nonfatal_message.

23 months agoAutomatic date update in version.in
GDB Administrator [Wed, 14 Dec 2022 00:04:35 +0000 (00:04 +0000)]
Automatic date update in version.in

23 months agoFix control-c handling on Windows
Tom Tromey [Mon, 5 Dec 2022 17:56:23 +0000 (10:56 -0700)]
Fix control-c handling on Windows

As Hannes pointed out, the Windows target-async patches broke C-c
handling there.  Looking into this, I found a few oddities, fixed
here.

First, windows_nat_target::interrupt calls GenerateConsoleCtrlEvent.
I think this event can be ignored by the inferior, so it's not a great
way to interrupt.  Instead, using DebugBreakProcess (or a more
complicated thing for Wow64) seems better.

Second, windows_nat_target did not implement the pass_ctrlc method.
Implementing this lets us remove the special code to call
SetConsoleCtrlHandler and instead integrate into gdb's approach to C-c
handling.  I believe that this should also fix the race that's
described in the comment that's being removed.

Initially, I thought a simpler version of this patch would work.
However, I think what happens is that some other library (I'm not sure
what) calls SetConsoleCtrlHandler while gdb is running, and this
intercepts and handles C-c -- so that the gdb SIGINT handler is not
called.  C-break continues to work, presumably because whatever
handler is installed ignores it.

This patch works around this issue by ensuring that the gdb handler
always comes first.

23 months agoRefactor code to check for terminal sharing
Tom Tromey [Mon, 5 Dec 2022 18:15:09 +0000 (11:15 -0700)]
Refactor code to check for terminal sharing

This refactors the code to check for terminal sharing.
is_gdb_terminal is exported, and sharing_input_terminal_1 is renamed,
slightly refactored, and moved to posix-hdep.c.  A new
Windows-specific implementation of this function is added to
mingw-hdep.c.

MSDN has a warning about GetConsoleProcessList

    This API is not recommended and does not have a virtual terminal
    equivalent. [...] Applications remoting via cross-platform
    utilities and transports like SSH may not work as expected if
    using this API.

However, we believe this isn't likely to be an issue for gdb.

23 months agoUse gdb::optional for sigint_ours
Tom Tromey [Mon, 12 Dec 2022 17:17:18 +0000 (10:17 -0700)]
Use gdb::optional for sigint_ours

sigint_ours (and sigquit_ours) can be used without being set.  Avoid
this problem by changing them to gdb::optional and checking that they
are in fact set before using the value.