]> git.ipfire.org Git - thirdparty/binutils-gdb.git/log
thirdparty/binutils-gdb.git
2 years agogdb: use intrusive list for step-over chain
Simon Marchi [Tue, 15 Jun 2021 18:49:32 +0000 (14:49 -0400)] 
gdb: use intrusive list for step-over chain

The threads that need a step-over are currently linked using an
hand-written intrusive doubly-linked list, so that seems a very good
candidate for intrusive_list, convert it.

For this, we have a use case of appending a list to another one (in
start_step_over).  Based on the std::list and Boost APIs, add a splice
method.  However, only support splicing the other list at the end of the
`this` list, since that's all we need.

Add explicit default assignment operators to
reference_to_pointer_iterator, which are otherwise implicitly deleted.
This is needed because to define thread_step_over_list_safe_iterator, we
wrap reference_to_pointer_iterator inside a basic_safe_iterator, and
basic_safe_iterator needs to be able to copy-assign the wrapped
iterator.  The move-assignment operator is therefore not needed, only
the copy-assignment operator is.  But for completeness, add both.

Change-Id: I31b2ff67c7b78251314646b31887ef1dfebe510c

2 years agogdb: make inferior_list use intrusive_list
Pedro Alves [Sun, 14 Jun 2020 19:57:04 +0000 (20:57 +0100)] 
gdb: make inferior_list use intrusive_list

Change inferior_list, the global list of inferiors, to use
intrusive_list.  I think most other changes are somewhat obvious
fallouts from this change.

There is a small change in behavior in scoped_mock_context.  Before this
patch, constructing a scoped_mock_context would replace the whole
inferior list with only the new mock inferior.  Tests using two
scoped_mock_contexts therefore needed to manually link the two inferiors
together, as the second scoped_mock_context would bump the first mock
inferior from the thread list.  With this patch, a scoped_mock_context
adds its mock inferior to the inferior list on construction, and removes
it on destruction.  This means that tests run with mock inferiors in the
inferior list in addition to any pre-existing inferiors (there is always
at least one).  There is no possible pid clash problem, since each
scoped mock inferior uses its own process target, and pids are per
process target.

Co-Authored-By: Simon Marchi <simon.marchi@efficios.com>
Change-Id: I7eb6a8f867d4dcf8b8cd2dcffd118f7270756018

2 years agogdb: introduce intrusive_list, make thread_info use it
Pedro Alves [Fri, 11 Jun 2021 22:28:32 +0000 (18:28 -0400)] 
gdb: introduce intrusive_list, make thread_info use it

GDB currently has several objects that are put in a singly linked list,
by having the object's type have a "next" pointer directly.  For
example, struct thread_info and struct inferior.  Because these are
simply-linked lists, and we don't keep track of a "tail" pointer, when
we want to append a new element on the list, we need to walk the whole
list to find the current tail.  It would be nice to get rid of that
walk.  Removing elements from such lists also requires a walk, to find
the "previous" position relative to the element being removed.  To
eliminate the need for that walk, we could make those lists
doubly-linked, by adding a "prev" pointer alongside "next".  It would be
nice to avoid the boilerplate associated with maintaining such a list
manually, though.  That is what the new intrusive_list type addresses.

With an intrusive list, it's also possible to move items out of the
list without destroying them, which is interesting in our case for
example for threads, when we exit them, but can't destroy them
immediately.  We currently keep exited threads on the thread list, but
we could change that which would simplify some things.

Note that with std::list, element removal is O(N).  I.e., with
std::list, we need to walk the list to find the iterator pointing to
the position to remove.  However, we could store a list iterator
inside the object as soon as we put the object in the list, to address
it, because std::list iterators are not invalidated when other
elements are added/removed.  However, if you need to put the same
object in more than one list, then std::list<object> doesn't work.
You need to instead use std::list<object *>, which is less efficient
for requiring extra memory allocations.  For an example of an object
in multiple lists, see the step_over_next/step_over_prev fields in
thread_info:

  /* Step-over chain.  A thread is in the step-over queue if these are
     non-NULL.  If only a single thread is in the chain, then these
     fields point to self.  */
  struct thread_info *step_over_prev = NULL;
  struct thread_info *step_over_next = NULL;

The new intrusive_list type gives us the advantages of an intrusive
linked list, while avoiding the boilerplate associated with manually
maintaining it.

intrusive_list's API follows the standard container interface, and thus
std::list's interface.  It is based the API of Boost's intrusive list,
here:

 https://www.boost.org/doc/libs/1_73_0/doc/html/boost/intrusive/list.html

Our implementation is relatively simple, while Boost's is complicated
and intertwined due to a lot of customization options, which our version
doesn't have.

The easiest way to use an intrusive_list is to make the list's element
type inherit from intrusive_node.  This adds a prev/next pointers to
the element type.  However, to support putting the same object in more
than one list, intrusive_list supports putting the "node" info as a
field member, so you can have more than one such nodes, one per list.

As a first guinea pig, this patch makes the per-inferior thread list use
intrusive_list using the base class method.

Unlike Boost's implementation, ours is not a circular list.  An earlier
version of the patch was circular: the intrusive_list type included an
intrusive_list_node "head".  In this design, a node contained pointers
to the previous and next nodes, not the previous and next elements.
This wasn't great for when debugging GDB with GDB, as it was difficult
to get from a pointer to the node to a pointer to the element.  With the
design proposed in this patch, nodes contain pointers to the previous
and next elements, making it easy to traverse the list by hand and
inspect each element.

The intrusive_list object contains pointers to the first and last
elements of the list.  They are nullptr if the list is empty.
Each element's node contains a pointer to the previous and next
elements.  The first element's previous pointer is nullptr and the last
element's next pointer is nullptr.  Therefore, if there's a single
element in the list, both its previous and next pointers are nullptr.
To differentiate such an element from an element that is not linked into
a list, the previous and next pointers contain a special value (-1) when
the node is not linked.  This is necessary to be able to reliably tell
if a given node is currently linked or not.

A begin() iterator points to the first item in the list.  An end()
iterator contains nullptr.  This makes iteration until end naturally
work, as advancing past the last element will make the iterator contain
nullptr, making it equal to the end iterator.  If the list is empty,
a begin() iterator will contain nullptr from the start, and therefore be
immediately equal to the end.

Iterating on an intrusive_list yields references to objects (e.g.
`thread_info&`).  The rest of GDB currently expects iterators and ranges
to yield pointers (e.g. `thread_info*`).  To bridge the gap, add the
reference_to_pointer_iterator type.  It is used to define
inf_threads_iterator.

Add a Python pretty-printer, to help inspecting intrusive lists when
debugging GDB with GDB.  Here's an example of the output:

    (top-gdb) p current_inferior_.m_obj.thread_list
    $1 = intrusive list of thread_info = {0x61700002c000, 0x617000069080, 0x617000069400, 0x61700006d680, 0x61700006eb80}

It's not possible with current master, but with this patch [1] that I
hope will be merged eventually, it's possible to index the list and
access the pretty-printed value's children:

    (top-gdb) p current_inferior_.m_obj.thread_list[1]
    $2 = (thread_info *) 0x617000069080
    (top-gdb) p current_inferior_.m_obj.thread_list[1].ptid
    $3 = {
      m_pid = 406499,
      m_lwp = 406503,
      m_tid = 0
    }

Even though iterating the list in C++ yields references, the Python
pretty-printer yields pointers.  The reason for this is that the output
of printing the thread list above would be unreadable, IMO, if each
thread_info object was printed in-line, since they contain so much
information.  I think it's more useful to print pointers, and let the
user drill down as needed.

[1] https://sourceware.org/pipermail/gdb-patches/2021-April/178050.html

Co-Authored-By: Simon Marchi <simon.marchi@efficios.com>
Change-Id: I3412a14dc77f25876d742dab8f44e0ba7c7586c0

2 years agoAutomatic date update in version.in
GDB Administrator [Tue, 13 Jul 2021 00:00:09 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agoAdd the SEC_ELF_OCTETS flag to debug sections created by the assembler.
Tucker [Mon, 12 Jul 2021 16:12:13 +0000 (17:12 +0100)] 
Add the SEC_ELF_OCTETS flag to debug sections created by the assembler.

PR 28054
gas * config/obj-elf.c (obj_elf_change_section): Set the
SEF_ELF_OCTETS flag on debug sections.

2 years ago[gdb/testsuite] Fix gdb.btrace/tsx.exp on system with tsx disabled in microcode
Tom de Vries [Mon, 12 Jul 2021 15:24:59 +0000 (17:24 +0200)] 
[gdb/testsuite] Fix gdb.btrace/tsx.exp on system with tsx disabled in microcode

Recently I started to see this fail with trunk:
...
(gdb) record instruction-history^M
1          0x00000000004004ab <main+4>: call   0x4004b7 <test>^M
2          0x00000000004004c6 <test+15>:        mov    $0x1,%eax^M
3          0x00000000004004cb <test+20>:        ret    ^M
(gdb) FAIL: gdb.btrace/tsx.exp: speculation indication
...

This is due to an intel microcode update (1) that disables Intel TSX by default.

Fix this by updating the pattern.

Tested on x86_64-linux, with both gcc 7.5.0 and clang 12.0.1.

[1] https://www.intel.com/content/www/us/en/support/articles/000059422/processors.html

gdb/testsuite/ChangeLog:

2021-07-12  Tom de Vries  <tdevries@suse.de>

PR testsuite/28057
* gdb.btrace/tsx.exp: Add pattern for system with tsx disabled in
microcode.

2 years agoUpdated French translation for the binutils sub-directory
Nick Clifton [Mon, 12 Jul 2021 13:20:14 +0000 (14:20 +0100)] 
Updated French translation for the binutils sub-directory

2 years agoFix a translation problem for the text generated by readelf at the start of a dump...
Nick Clifton [Mon, 12 Jul 2021 13:14:33 +0000 (14:14 +0100)] 
Fix a translation problem for the text generated by readelf at the start of a dump of a dynamic section.

PR 28072
binutils * readelf.c (process_dynamic_section): Use ngettext to help with translation of header text.

2 years ago[gdb/testsuite] Fix gdb.mi/mi-info-sources.exp for extra debug info
Tom de Vries [Mon, 12 Jul 2021 11:13:38 +0000 (13:13 +0200)] 
[gdb/testsuite] Fix gdb.mi/mi-info-sources.exp for extra debug info

When running test-case gdb.mi/mi-info-sources.exp, I run into:
...
Running src/gdb/testsuite/gdb.mi/mi-info-sources.exp ...
ERROR: internal buffer is full.
...
due to extra debug info from the shared libraries.

Fix this by using "nosharedlibrary".

Then I run into these FAILs:
...
FAIL: gdb.mi/mi-info-sources.exp: debug_read=false: \
  -file-list-exec-source-files (unexpected output)
FAIL: gdb.mi/mi-info-sources.exp: debug_read=true: \
  -file-list-exec-source-files (unexpected output)
FAIL: gdb.mi/mi-info-sources.exp: debug_read=true: \
  -file-list-exec-source-files --group-by-objfile, look for \
  mi-info-sources.c (unexpected output)
FAIL: gdb.mi/mi-info-sources.exp: debug_read=true: \
  -file-list-exec-source-files --group-by-objfile, look for \
  mi-info-sources-base.c (unexpected output)
...
due to openSUSE executables which have debug info for objects from sources
like sysdeps/x86_64/crtn.S.

Fix these by updating the patterns, and adding "maint expand-symtabs" to
reliably get fully-read objfiles.

Then I run into FAILs when using the readnow target board.  Fix these by
skipping the relevant tests.

Then I run into FAILs when using the cc-with-gnu-debuglink board.  Fix these
by updating the patterns.

Tested on x86_64-linux, with native, check-read1, readnow, cc-with-gdb-index,
cc-with-debug-names, cc-with-gnu-debuglink, cc-with-dwz, cc-with-dwz-m.

gdb/testsuite/ChangeLog:

2021-07-05  Tom de Vries  <tdevries@suse.de>

* lib/mi-support.exp (mi_readnow): New proc.
* gdb.mi/mi-info-sources.exp: Use nosharedlibrary.  Update patterns.
Skip tests for readnow.  Use "maint expand-symtabs".

2 years agotestsuite: fix whitespace problems in gdb.mi/mi-break.exp
Tankut Baris Aktemur [Mon, 12 Jul 2021 09:30:23 +0000 (11:30 +0200)] 
testsuite: fix whitespace problems in gdb.mi/mi-break.exp

Replace leading 8-spaces with tab and remove trailing space in
gdb.mi/mi-break.exp.

2 years agoAutomatic date update in version.in
GDB Administrator [Mon, 12 Jul 2021 00:00:11 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agoAutomatic date update in version.in
GDB Administrator [Sun, 11 Jul 2021 00:00:10 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agoTidy commit 49910fd88dcd
Alan Modra [Sat, 10 Jul 2021 00:37:17 +0000 (10:07 +0930)] 
Tidy commit 49910fd88dcd

Pointer range checking is UB if the values compared are outside the
underlying array elements (plus one).

* dwarf2.c (read_address): Remove accidental commit.
(read_ranges): Compare offset rather than pointers.

2 years agoPR28069, assertion fail in dwarf.c:display_discr_list
Alan Modra [Sat, 10 Jul 2021 00:04:30 +0000 (09:34 +0930)] 
PR28069, assertion fail in dwarf.c:display_discr_list

We shouldn't be asserting on anything to do with leb128 values, or
reporting file and line numbers when something unexpected happens.
leb128 data is of indeterminate length, perfect for fuzzer mayhem.
It would only make sense to assert or report dwarf.c/readelf.c source
lines if the code had already sized and sanity checked the leb128
values.

After removing the assertions, the testcase then gave:

    <37>   DW_AT_discr_list  : 5 byte block: 0 0 0 0 0  (label 0, label 0, label 0, label 0, <corrupt>
readelf: Warning: corrupt discr_list - unrecognized discriminant byte 0x5

    <3d>   DW_AT_encoding    : 0 (void)
    <3e>   DW_AT_identifier_case: 0 (case_sensitive)
    <3f>   DW_AT_virtuality  : 0 (none)
    <40>   DW_AT_decimal_sign: 5 (trailing separate)

So the DW_AT_discr_list was showing more data than just the 5 byte
block.  That happened due to "end" pointing a long way past the end of
block, and uvalue decrementing past zero on one of the leb128 bytes.

PR 28069
* dwarf.c (display_discr_list): Remove assertions.  Delete "end"
parameter, use initial "data" pointer as the end.  Formatting.
Don't count down bytes as they are read.
(read_and_display_attr_value): Adjust display_discr_list call.
(read_and_print_leb128): Don't pass __FILE__ and __LINE__ to
report_leb_status.
* dwarf.h (report_leb_status): Don't report file and line
numbers.  Delete file and lnum parameters,
(READ_ULEB, READ_SLEB): Adjust.

2 years agoAutomatic date update in version.in
GDB Administrator [Sat, 10 Jul 2021 00:00:12 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agold/NEWS: Clarify -z [no]indirect-extern-access
H.J. Lu [Fri, 9 Jul 2021 14:36:42 +0000 (07:36 -0700)] 
ld/NEWS: Clarify -z [no]indirect-extern-access

-z [no]indirect-extern-access are only for x86 ELF linker.

2 years agoelf: Limits 2 GNU_PROPERTY_1_NEEDED tests to Linux/x86
H.J. Lu [Fri, 9 Jul 2021 03:11:31 +0000 (20:11 -0700)] 
elf: Limits 2 GNU_PROPERTY_1_NEEDED tests to Linux/x86

Run property-1_needed-1b.d and property-1_needed-1c.d, which pass
-z [no]indirect-extern-access to linker, only run for Linux/x86 targets.

* testsuite/ld-elf/property-1_needed-1b.d: Only run for
Linux/x86 targets.
* testsuite/ld-elf/property-1_needed-1c.d: Likewise.

2 years agoelf: Add GNU_PROPERTY_1_NEEDED check
H.J. Lu [Thu, 17 Jun 2021 21:11:28 +0000 (14:11 -0700)] 
elf: Add GNU_PROPERTY_1_NEEDED check

If GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS is set on any input
relocatable files:

1. Don't generate copy relocations.
2. Turn off extern_protected_data since it implies
GNU_PROPERTY_NO_COPY_ON_PROTECTED.
3. Treate reference to protected symbols with indirect external access
as local.
4. Set GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS on output.
5. When generating executable, clear this bit when there are non-GOT or
non-PLT relocations in input relocatable files without the bit set.
6. Add -z [no]indirect-extern-access to control indirect external access.

bfd/

* elf-bfd (elf_obj_tdata): Add has_indirect_extern_access.
(elf_has_indirect_extern_access): New.
* elf-properties.c (_bfd_elf_parse_gnu_properties): Set
elf_has_indirect_extern_access and elf_has_no_copy_on_protected
when seeing GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.
(elf_write_gnu_propertie): Add an argument to pass link_info.
Set needed_1_p for GNU_PROPERTY_1_NEEDED in memory.
(_bfd_elf_link_setup_gnu_properties): Handle
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS for
-z indirect-extern-access.  Set nocopyreloc to true and
extern_protected_data to false for indirect external access.
(_bfd_elf_convert_gnu_properties): Updated.
* elf32-i386.c (elf_i386_check_relocs): Set
non_got_ref_without_indirect_extern_access on legacy non-GOT or
non-PLT references.
* elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
* elflink.c (_bfd_elf_symbol_refs_local_p): Return true for
STV_PROTECTED symbols with indirect external access.
* elfxx-x86.c (_bfd_x86_elf_adjust_dynamic_symbol): Clear
indirect_extern_access for legacy non-GOT/non-PLT references.
* elfxx-x86.h (elf_x86_link_hash_entry): Add
non_got_ref_without_indirect_extern_access.

include/

* bfdlink.h (bfd_link_info): Add indirect_extern_access and
needed_1_p.  Change nocopyreloc to int.

ld/

* NEWS: Mention -z [no]indirect-extern-access
* ld.texi: Document -z [no]indirect-extern-access
* ldmain.c (main): Initialize link_info.indirect_extern_access
to -1.
* emulparams/extern_protected_data.sh: Support
-z [no]indirect-extern-access.
* testsuite/ld-elf/indirect-extern-access-1.rd: New file
* testsuite/ld-elf/indirect-extern-access-1a.c: Likewise.
* testsuite/ld-elf/indirect-extern-access-1b.c: Likewise.
* testsuite/ld-elf/indirect-extern-access-2.rd: Likewise.
* testsuite/ld-elf/indirect-extern-access-2a.c: Likewise.
* testsuite/ld-elf/indirect-extern-access-2b.c: Likewise.
* testsuite/ld-elf/indirect-extern-access-3.rd: Likewise.
* testsuite/ld-elf/indirect-extern-access.S: Likewise.
* testsuite/ld-elf/property-1_needed-1b.d: Likewise.
* testsuite/ld-elf/property-1_needed-1c.d: Likewise.
* testsuite/ld-x86-64/indirect-extern-access.rd: Likewise.
* testsuite/ld-x86-64/protected-data-1.h: Likewise.
* testsuite/ld-x86-64/protected-data-1a.c: Likewise.
* testsuite/ld-x86-64/protected-data-1b.c: Likewise.
* testsuite/ld-x86-64/protected-data-2a.S: Likewise.
* testsuite/ld-x86-64/protected-data-2b.S: Likewise.
* testsuite/ld-x86-64/protected-func-2a.S: Likewise.
* testsuite/ld-x86-64/protected-func-2b.S: Likewise.
* testsuite/ld-x86-64/protected-func-2c.c: Likewise.
* testsuite/ld-elf/linux-x86.exp: Run test with
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.
* testsuite/ld-x86-64/x86-64.exp: Run tests for protected
function and data with indirect external access.

2 years agoelf: Add GNU_PROPERTY_1_NEEDED
H.J. Lu [Thu, 17 Jun 2021 19:35:18 +0000 (12:35 -0700)] 
elf: Add GNU_PROPERTY_1_NEEDED

Add GNU_PROPERTY_1_NEEDED:

 #define GNU_PROPERTY_1_NEEDED      GNU_PROPERTY_UINT32_OR_LO

to indicate the needed properties by the object file.

Add GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS:

 #define GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS  (1U << 0)

to indicate that the object file requires canonical function pointers and
cannot be used with copy relocation.

binutils/

* readelf.c (decode_1_needed): New.
(print_gnu_property_note): Handle GNU_PROPERTY_1_NEEDED.

include/

* elf/common.h (GNU_PROPERTY_1_NEEDED): New.
(GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS): Likewise.

ld/

* testsuite/ld-elf/property-1_needed-1a.d: New file.
* testsuite/ld-elf/property-1_needed-1.s: Likewise.

2 years agoAutomatic date update in version.in
GDB Administrator [Fri, 9 Jul 2021 00:00:12 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agoRemove unused parameter in maybe_software_singlestep
Lancelot SIX [Thu, 8 Jul 2021 23:09:11 +0000 (00:09 +0100)] 
Remove unused parameter in maybe_software_singlestep

While working around, I noticed that the last parameter of
maybe_software_singlestep is never used.  This path removes
it.

Built on x86_64-linux-gnu and riscv64-linux-gnu.

gdb/ChangeLog:

* infrun.c (maybe_software_singlestep): Remove unused PC
parameter.
(resume_1): Update calls to maybe_software_singlestep.

2 years agox86-64: Disallow PC reloc against weak undefined symbols in PIE
H.J. Lu [Thu, 8 Jul 2021 20:49:17 +0000 (13:49 -0700)] 
x86-64: Disallow PC reloc against weak undefined symbols in PIE

Disallow PC relocations against weak undefined symbols in PIE since they
can lead to non-zero address at run-time.

bfd/

PR ld/21782
* elf64-x86-64.c (elf_x86_64_relocate_section): Disallow PC
relocations against weak undefined symbols in PIE.

ld/

PR ld/21782
* testsuite/ld-x86-64/pie3.d: Expect linker error.

2 years agold: Limit cache size and add --max-cache-size=SIZE
H.J. Lu [Tue, 27 Feb 2018 20:22:58 +0000 (12:22 -0800)] 
ld: Limit cache size and add --max-cache-size=SIZE

When link_info.keep_memory is true, linker caches the relocation
information and symbol tables of input files in memory.  When there
are many input files with many relocations, we may run out of memory.
Add --max-cache-size=SIZE to set the maximum cache size.

bfd/

PR ld/18028
* bfd.c (bfd): Add alloc_size.
* elf-bfd.h (_bfd_elf_link_info_read_relocs): New.
* elf32-i386.c (elf_i386_check_relocs): Use _bfd_link_keep_memory.
Update cache_size.
* elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
* elflink.c (_bfd_elf_link_read_relocs): Renamed to ...
(_bfd_elf_link_info_read_relocs): This.  Update cache_size.
(_bfd_elf_link_read_relocs): New.
(_bfd_elf_link_check_relocs): Call _bfd_elf_link_info_read_relocs
instead of _bfd_elf_link_read_relocs.
(elf_link_add_object_symbols): Likewise.
(elf_link_input_bfd): Likewise.
(init_reloc_cookie_rels): Likewise.
(init_reloc_cookie): Update cache_size.  Call
_bfd_elf_link_info_read_relocs instead of
_bfd_elf_link_read_relocs.
(link_info_ok): New.
(elf_gc_smash_unused_vtentry_relocs): Updated.  Call
_bfd_elf_link_info_read_relocs instead of
_bfd_elf_link_read_relocs.
(bfd_elf_gc_sections): Use link_info_ok.  Pass &link_info_ok
to elf_gc_smash_unused_vtentry_relocs.
* libbfd-in.h (_bfd_link_keep_memory): New.
* linker.c (_bfd_link_keep_memory): New.
* opncls.c (bfd_alloc): Update alloc_size.
* bfd-in2.h: Regenerated.
* libbfd.h: Likewise.

include/

PR ld/18028
* bfdlink.h (bfd_link_info): Add cache_size and max_cache_size.

ld/

PR ld/18028
* NEWS: Mention --max-cache-size=SIZE.
* ld.texi: Document --max-cache-size=SIZE.
* ldlex.h (option_values): Add OPTION_MAX_CACHE_SIZE.
* ldmain.c: (main): Set link_info.max_cache_size to -1.
* lexsup.c (ld_options): Add --max-cache-size=SIZE.
(parse_args): Support OPTION_MAX_CACHE_SIZE.
* testsuite/ld-bootstrap/bootstrap.exp: Add test for
--max-cache-size=-1.

2 years agogdb: don't set Linux-specific displaced stepping methods in s390_gdbarch_init
Simon Marchi [Wed, 7 Jul 2021 12:57:36 +0000 (08:57 -0400)] 
gdb: don't set Linux-specific displaced stepping methods in s390_gdbarch_init

According to bug 28056, running an s390x binary gives:

    (gdb) run
    Starting program: /usr/bin/ls
    /home/ubuntu/tmp/gdb-11.0.90.20210705/gdb/linux-tdep.c:2550: internal-error: displaced_step_prepare_status linux_displaced_step_prepare(gdbarch*, thread_info*, CORE_ADDR&): Assertion `gdbarch_data->num_disp_step_buffers > 0' failed.

This is because the s390 architecture registers some Linux-specific
displaced stepping callbacks in the OS-agnostic s390_gdbarch_init:

    set_gdbarch_displaced_step_prepare (gdbarch, linux_displaced_step_prepare);
    set_gdbarch_displaced_step_finish (gdbarch, linux_displaced_step_finish);
    set_gdbarch_displaced_step_restore_all_in_ptid
      (gdbarch, linux_displaced_step_restore_all_in_ptid);

But then the Linux-specific s390_linux_init_abi_any passes
num_disp_step_buffers=0 to linux_init_abi:

    linux_init_abi (info, gdbarch, 0);

The problem happens when linux_displaced_step_prepare is called for the
first time.  It tries to allocate the displaced stepping buffers, but
sees that the number of displaced stepping buffers for that architecture
is 0, which is unexpected / invalid.

s390_gdbarch_init should not register the linux_* callbacks, that is
expected to be done by linux_init_abi.  If debugging a bare-metal s390
program, or an s390 program on another OS GDB doesn't know about, we
wouldn't want to use them.  We would either register no callbacks, if
displaced stepping isn't supported, or register a different set of
callbacks if we wanted to support displaced stepping in those cases.

The commit that refactored the displaced stepping machinery and
introduced these set_gdbarch_displaced_step_* calls is 187b041e2514
("gdb: move displaced stepping logic to gdbarch, allow starting
concurrent displaced steps").  However, even before that,
s390_gdbarch_init did:

  set_gdbarch_displaced_step_location (gdbarch, linux_displaced_step_location);

... which already seemed wrong.  The Linux-specific callback was used
even for non-Linux system.  Maybe that was on purpose, because it would
also happen to work in some other non-Linux case, or maybe it was simply
a mistake.  I'll assume that this was a small mistake when
s390-tdep.{h,c} where factored out of s390-linux-tdep.c, in d6e589456475
("s390: Split up s390-linux-tdep.c into two files").

Fix this by removing the setting of these displaced step callbacks from
s390_gdbarch_init.  Instead, pass num_disp_step_buffers=1 to
linux_init_abi, in s390_linux_init_abi_any.  Doing so will cause
linux_init_abi to register these same callbacks.  It will also mean that
when debugging a bare-metal s390 executable or an executable on another
OS that GDB doesn't know about, gdbarch_displaced_step_prepare won't be
set, so displaced stepping won't be used.

This patch will need to be merged in the gdb-11-branch, since this is a
GDB 11 regression, so here's the ChangeLog entry:

gdb/ChangeLog:

* s390-linux-tdep.c (s390_linux_init_abi_any): Pass 1 (number
of displaced stepping buffers to linux_init_abi.
* s390-tdep.c (s390_gdbarch_init): Don't set the Linux-specific
displaced-stepping gdbarch callbacks.

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

2 years agogdb/Makefile.in: remove testsuite from SUBDIRS
Simon Marchi [Wed, 7 Jul 2021 13:09:32 +0000 (09:09 -0400)] 
gdb/Makefile.in: remove testsuite from SUBDIRS

When distclean-ing a configured / built gdb directory, like so:

    $ ./configure && make all-gdb && make distclean

The distclean operation fails with:

    Missing testsuite/Makefile

If we look at the SUBDIRS variable in the generated gdb/Makefile,
testsuite is there twice:

    SUBDIRS = doc  testsuite data-directory testsuite

So we try distclean-ing the testsuite directory twice.  The second time,
gdb/testsuite/Makefile doesn't exist, so it fails.

The first "testsuite" comes from the @subdirs@ replacement, because of
the `AC_CONFIG_SUBDIRS` macro in gdb/configure.ac.  The second one is
hard-coded in gdb/Makefile.in:

    SUBDIRS = doc @subdirs@ data-directory testsuite

The hard-coded was added by:

    bdbbcd577460 ("Always build 'all' in gdb/testsuite")

which came after `testsuite` was removed from @subdirs@ by:

    f99d1d37496f ("Remove gdb/testsuite/configure")

My commit a100a94530eb ("gdb/testsuite: restore configure script")
should have removed the hard-coded `testsuite`, since it added it back
as a "subdir", but I missed it because I only looked f99d1d37496f to
write my patch.

Fix this by removing the hard-coded one.

This patch should be pushed to both master and gdb-11-branch, hence the
ChangeLog entry:

gdb/ChangeLog:

* Makefile.in (SUBDIRS): Remove testsuite.

Change-Id: I63e5590b1a08673c646510b3ecc74600eae9f92d

2 years agoUpdated Portuguese translation for the BFD sub-directory
Nick Clifton [Thu, 8 Jul 2021 11:39:31 +0000 (12:39 +0100)] 
Updated Portuguese translation for the BFD sub-directory

2 years ago[gdb/testsuite] Fix gdb.guile/scm-breakpoint.exp with guile 3.0
Tom de Vries [Thu, 8 Jul 2021 07:57:34 +0000 (09:57 +0200)] 
[gdb/testsuite] Fix gdb.guile/scm-breakpoint.exp with guile 3.0

When running test-case gdb.guile/scm-breakpoint.exp on openSUSE Tumbleweed
with guile 3.0, I run into:
...
(gdb) guile (define cp (make-breakpoint "syscall" #:type BP_CATCHPOINT))^M
ERROR: In procedure make-breakpoint:^M
In procedure gdbscm_make_breakpoint: unsupported breakpoint type in \
  position 3: "BP_CATCHPOINT"^M
Error while executing Scheme code.^M
(gdb) FAIL: gdb.guile/scm-breakpoint.exp: test_catchpoints: \
  create a catchpoint via the api
...

The same test passes on openSUSE Leap 15.2 with guile 2.0, where the second
line of the error message starts with the same prefix as the first:
...
ERROR: In procedure gdbscm_make_breakpoint: unsupported breakpoint type in \
  position 3: "BP_CATCHPOINT"^M
...

I observe the same difference in many other tests, f.i.:
...
(gdb) gu (print (value-add i '()))^M
ERROR: In procedure value-add:^M
In procedure gdbscm_value_add: Wrong type argument in position 2: ()^M
Error while executing Scheme code.^M
(gdb) PASS: gdb.guile/scm-math.exp: catch error in guile type conversion
...
but it doesn't cause FAILs anywhere else.

Fix this by updating the regexp to make the "ERROR: " prefix optional.

Tested on x86_64-linux, with both guile 2.0 and 3.0.

gdb/testsuite/ChangeLog:

2021-07-07  Tom de Vries  <tdevries@suse.de>

* gdb.guile/scm-breakpoint.exp: Make additional "ERROR: " prefix in
exception printing optional.

2 years agosim: erc32: use libsim.a for common objects
Mike Frysinger [Wed, 7 Jul 2021 03:50:06 +0000 (23:50 -0400)] 
sim: erc32: use libsim.a for common objects

We're starting to move more objects to the common build that sis did
not need before, so linking them is causing problems (when common
objects end up needing symbols from non-common objects).  Switch it
to the libsim.a archive which will allow the link to pull out only
what it needs.

2 years agoAutomatic date update in version.in
GDB Administrator [Thu, 8 Jul 2021 00:00:10 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agoRemove an accidental change to elfcode.h included as part of commit 6e0dfbf420.
Nick Clifton [Wed, 7 Jul 2021 15:50:33 +0000 (16:50 +0100)] 
Remove an accidental change to elfcode.h included as part of commit 6e0dfbf420.

PR 27659
* elfcode.h (elf_swap_symbol_out): Revert accidental change that
removed an abort if the shndx pointer is NULL.

2 years agold: Check archive only for archive member
H.J. Lu [Tue, 6 Jul 2021 13:21:54 +0000 (06:21 -0700)] 
ld: Check archive only for archive member

Since plugin_maybe_claim calls bfd_close on the original input BFD if it
isn't an archive member, pass NULL to bfd_plugin_close_file_descriptor
to indicate that the BFD isn't an archive member.

bfd/

PR ld/18028
* plugin.c (bfd_plugin_close_file_descriptor): Check archive
only of abfd != NULL.
(try_claim): Pass NULL to bfd_plugin_close_file_descriptor if
it isn't an archive member.

ld/

PR ld/18028
* plugin.c (plugin_input_file): Add comments for abfd and ibfd.
(plugin_object_p): Set input->ibfd to NULL if it isn't an
archive member.

2 years agoAdd changelog entries for last commit
Andreas Krebbel [Wed, 7 Jul 2021 12:15:33 +0000 (14:15 +0200)] 
Add changelog entries for last commit

2 years agoIBM Z: Add another arch14 instruction
Andreas Krebbel [Wed, 7 Jul 2021 12:05:00 +0000 (14:05 +0200)] 
IBM Z: Add another arch14 instruction

opcodes/

* opcodes/s390-opc.txt: Add qpaci.

gas/

* testsuite/gas/s390/zarch-arch14.d: Add qpaci.
* testsuite/gas/s390/zarch-arch14.s: Add qpaci.

2 years agoFix Solaris gprof build with --disable-nls
Rainer Orth [Wed, 7 Jul 2021 11:51:55 +0000 (13:51 +0200)] 
Fix Solaris gprof build with --disable-nls

gprof fails to compile on Solaris 10 and 11.3 with --disable-nls:

In file included from /vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/gprof.h:33,
                 from /vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/basic_blocks.c:24:
/usr/include/libintl.h:45:14: error: expected identifier or '(' before 'const'
   45 | extern char *dcgettext(const char *, const char *, const int);
      |              ^~~~~~~~~
/usr/include/libintl.h:46:14: error: expected identifier or '(' before 'const'
   46 | extern char *dgettext(const char *, const char *);
      |              ^~~~~~~~
/usr/include/libintl.h:47:14: error: expected identifier or '(' before 'const'
   47 | extern char *gettext(const char *);
      |              ^~~~~~~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/../bfd/sysdep.h:165:33:
error: expected identifier or '(' before 'do'
  165 | # define textdomain(Domainname) do {} while (0)
      |                                 ^~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/../bfd/sysdep.h:165:39:
error: expected identifier or '(' before 'while'
  165 | # define textdomain(Domainname) do {} while (0)
      |                                       ^~~~~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/../bfd/sysdep.h:166:46:
error: expected identifier or '(' before 'do'
  166 | # define bindtextdomain(Domainname, Dirname) do {} while (0)
      |                                              ^~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/gprof/../bfd/sysdep.h:166:52:
error: expected identifier or '(' before 'while'
  166 | # define bindtextdomain(Domainname, Dirname) do {} while (0)
      |                                                    ^~~~~
/usr/include/libintl.h:55:14: error: expected identifier or '(' before 'unsigned'
   55 | extern char *dcngettext(const char *, const char *,
      |              ^~~~~~~~~~
/usr/include/libintl.h:57:14: error: expected identifier or '(' before 'unsigned'
   57 | extern char *dngettext(const char *, const char *,
      |              ^~~~~~~~~
/usr/include/libintl.h:59:14: error: expected identifier or '(' before 'unsigned'
   59 | extern char *ngettext(const char *, const char *, unsigned long int);
      |              ^~~~~~~~

This is a known issue already partially fixed in binutils/sysdep.h.  For
gprof, the same fix needs to be applied in bfd/sysdep.h, as the
following patch does.  Tested on i386-pc-solaris2.10 and
i386-pc-solaris2.11.

2021-07-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

bfd:
* sysdep.h [!ENABLE_NLS]: Prevent inclusion of <libintl.h> on
Solaris.

2 years agoCheck for strnlen declaration to fix Solaris 10 build
Rainer Orth [Wed, 7 Jul 2021 11:44:31 +0000 (13:44 +0200)] 
Check for strnlen declaration to fix Solaris 10 build

binutils currently fails to compile on Solaris 10:

/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c: In function 'bfd_get_debug_link_info_1':
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c:1231:16: error: implicit declaration of function 'strnlen' [-Werror=implicit-function-declaration]
 1231 |   crc_offset = strnlen (name, size) + 1;
      |        ^~~~~~~
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c:1231:16: error: incompatible implicit declaration of built-in function 'strnlen' [-Werror]
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c: In function 'bfd_get_alt_debug_link_info':
/vol/src/gnu/binutils/hg/binutils-2.37-branch/git/bfd/opncls.c:1319:20: error: incompatible implicit declaration of built-in function 'strnlen' [-Werror]
 1319 |   buildid_offset = strnlen (name, size) + 1;
      |    ^~~~~~~

and in a couple of other places.  The platform lacks strnlen, and while
libiberty.h can provide a fallback declaration, the necessary configure
test isn't run.

Fixed with the following patch.  Tested on i386-pc-solaris2.10.

2021-07-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

bfd:
* configure.ac: Check for strnlen declaration.
* configure, config.in: Regenerate.

binutils:
* configure.ac: Check for strnlen declaration.
* configure, config.in: Regenerate.

2 years agoFix problems translating messages when a percentage sign appears at the end of a...
Nick Clifton [Wed, 7 Jul 2021 09:25:41 +0000 (10:25 +0100)] 
Fix problems translating messages when a percentage sign appears at the end of a string.

PR 28051
gas * config/tc-i386.c (offset_in_range): Reformat error messages in
order to fix problems when translating.
(md_assemble): Likewise.
* messages.c (as_internal_value_out_of_range): Likewise.
* read.c (emit_expr_with_reloc): Likewise.
* testsuite/gas/all/overflow.l Change expected output format.
* po/gas.pot: Regenerate.

bfd * coff-rs6000.c (xcoff_reloc_type_tls): Reformat error messages in
order to fix problems when translating.
* cofflink.c (_bfd_coff_write_global_sym): Likewise.
* elfnn-aarch64.c (_bfd_aarch64_erratum_843419_branch_to_stub):
Likewise.
* po/bfd.pot: Regenerate.

2 years agoAutomatic date update in version.in
GDB Administrator [Wed, 7 Jul 2021 00:00:10 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agogdb: introduce iterator_range, remove next_adapter
Simon Marchi [Fri, 18 Jun 2021 16:00:38 +0000 (12:00 -0400)] 
gdb: introduce iterator_range, remove next_adapter

I was always a bit confused by next_adapter, because it kind of mixes
the element type and the iterator type.  In reality, it is not much more
than a class that wraps two iterators (begin and end).  However, it
assumes that:

 - you can construct the begin iterator by passing a pointer to the
   first element of the iterable
 - you can default-construct iterator to make the end iterator

I think that by generalizing it a little bit, we can re-use it at more
places.

Rename it to "iterator_range".  I think it describes a bit better: it's
a range made by wrapping a begin and end iterator.  Move it to its own
file, since it's not related to next_iterator anymore.

iterator_range has two constructors.  The variadic one, where arguments
are forwarded to construct the underlying begin iterator.  The end
iterator is constructed through default construction.  This is a
generalization of what we have today.

There is another constructor which receives already constructed begin
and end iterators, useful if the end iterator can't be obtained by
default-construction.  Or, if you wanted to make a range that does not
end at the end of the container, you could pass any iterator as the
"end".

This generalization allows removing some "range" classes, like
all_inferiors_range.  These classes existed only to pass some arguments
when constructing the begin iterator.  With iterator_range, those same
arguments are passed to the iterator_range constructed and then
forwarded to the constructed begin iterator.

There is a small functional difference in how iterator_range works
compared to next_adapter.  next_adapter stored the pointer it received
as argument and constructeur an iterator in the `begin` method.
iterator_range constructs the begin iterator and stores it as a member.
Its `begin` method returns a copy of that iterator.

With just iterator_range, uses of next_adapter<foo> would be replaced
with:

  using foo_iterator = next_iterator<foo>;
  using foo_range = iterator_range<foo_iterator>;

However, I added a `next_range` wrapper as a direct replacement for
next_adapter<foo>.  IMO, next_range is a slightly better name than
next_adapter.

The rest of the changes are applications of this new class.

gdbsupport/ChangeLog:

* next-iterator.h (class next_adapter): Remove.
* iterator-range.h: New.

gdb/ChangeLog:

* breakpoint.h (bp_locations_range): Remove.
(bp_location_range): New.
(struct breakpoint) <locations>: Adjust type.
(breakpoint_range): Use iterator_range.
(tracepoint_range): Use iterator_range.
* breakpoint.c (breakpoint::locations): Adjust return type.
* gdb_bfd.h (gdb_bfd_section_range): Use iterator_range.
* gdbthread.h (all_threads_safe): Pass argument to
all_threads_safe_range.
* inferior-iter.h (all_inferiors_range): Use iterator_range.
(all_inferiors_safe_range): Use iterator_range.
(all_non_exited_inferiors_range): Use iterator_range.
* inferior.h (all_inferiors, all_non_exited_inferiors): Pass
inferior_list as argument.
* objfiles.h (struct objfile) <compunits_range>: Remove.
<compunits>: Return compunit_symtab_range.
* progspace.h (unwrapping_objfile_iterator)
<unwrapping_objfile_iterator>: Take parameter by value.
(unwrapping_objfile_range): Use iterator_range.
(struct program_space) <objfiles_range>: Define with "using".
<objfiles>: Adjust.
<objfiles_safe_range>: Define with "using".
<objfiles_safe>: Adjust.
<solibs>: Return so_list_range, define here.
* progspace.c (program_space::solibs): Remove.
* psymtab.h (class psymtab_storage) <partial_symtab_iterator>:
New.
<partial_symtab_range>: Use iterator_range.
* solist.h (so_list_range): New.
* symtab.h (compunit_symtab_range):
New.
(symtab_range): New.
(compunit_filetabs): Change to a function.
* thread-iter.h (inf_threads_range,
inf_non_exited_threads_range, safe_inf_threads_range,
all_threads_safe_range): Use iterator_range.
* top.h (ui_range): New.
(all_uis): Use ui_range.

Change-Id: Ib7a9d2a3547f45f01aa1c6b24536ba159db9b854

2 years agogdb/testsuite: restore configure script
Simon Marchi [Tue, 22 Jun 2021 18:11:32 +0000 (14:11 -0400)] 
gdb/testsuite: restore configure script

Commit f99d1d37496f ("Remove gdb/testsuite/configure") removed
gdb/testsuite/configure, as anything gdb/testsuite/configure did could
be done by gdb/configure.

There is however one use case that popped up when this changed
propagated to downstream consumers, to run the testsuite on an already
built GDB.  In the workflow of ROCm-GDB at AMD, a GDB package is built
in a CI job.  This GDB package is then tested on different machines /
hardware configurations as part of other CI jobs.  To achieve this,
those CI jobs only configure the testsuite directory and run "make
check" with an appropriate board file.

In light of this use case, the way I see it is that gdb/testsuite could
be considered its own project.  It could be stored in a completely
different repo if we want to, it just happens to be stored inside gdb/.

Since the only downside of having gdb/testsuite/configure is that it
takes a few more seconds to run, but on the other hand it's quite useful
for some people, I propose re-adding it.

In a sense, this is revert of f99d1d37496f, but it's not a direct
git-revert, as some things have changed since.

gdb/ChangeLog:

* configure.ac: Remove things that were moved from
testsuite/configure.ac.
* configure: Re-generate.

gdb/testsuite/ChangeLog:

* configure.ac: Restore.
* configure: Re-generate.
* aclocal.m4: Re-generate.
* Makefile.in (distclean): Add config.status.
(Makefile): Adjust paths.
(lib/pdtrace): Adjust paths.
(config.status): Add.

Change-Id: Ic38c79485e1835712d9c99649c9dfb59667254f1

2 years agoRename gdb/ChangeLog to gdb/ChangeLog-2021
Joel Brobecker [Sat, 3 Jul 2021 23:29:08 +0000 (16:29 -0700)] 
Rename gdb/ChangeLog to gdb/ChangeLog-2021

Now that ChangeLog entries are no longer used for GDB patches,
this commit renames the file gdb/ChangeLog to gdb/ChangeLog-2021,
similar to what we would do in the context of the "Start of New
Year" procedure.

The purpose of this change is to avoid people merging ChangeLog
entries by mistake when applying existing commits that they are
currently working on.

2 years agosim: ppc: add missing empty targets
Dan Streetman [Tue, 11 May 2021 13:28:15 +0000 (09:28 -0400)] 
sim: ppc: add missing empty targets

These are copied from sim/common/Make-common.in.

On ppc the build fails without at least the 'info' target, e.g.:

Making info in ppc
make[4]: Entering directory '/<<BUILDDIR>>/gdb-10.2.2974.g5b45e89f56d+21.10.20210510155809/build/default/sim/ppc'
make[4]: *** No rule to make target 'info'.  Stop.

2 years agoPR 28053: Fix spelling mistakes: usupported -> unsupported and relocatation -> reloca...
Yuri Chornoivan [Tue, 6 Jul 2021 13:56:05 +0000 (14:56 +0100)] 
PR 28053: Fix spelling mistakes: usupported -> unsupported and relocatation -> relocation.

2 years agoelf/riscv: Fix relaxation with aliases [PR28021]
Michael Matz [Mon, 28 Jun 2021 15:57:17 +0000 (17:57 +0200)] 
elf/riscv: Fix relaxation with aliases [PR28021]

the fix for PR22756 only changed behaviour for hidden aliases,
but the same situation exists for non-hidden aliases: sym_hashes[]
can contain multiple entries pointing to the same symbol structure
leading to relaxation adjustment to be applied twice.

Fix this by testing for duplicates for everything that looks like it
has a version.

PR ld/28021

bfd/
* elfnn-riscv.c (riscv_relax_delete_bytes): Check for any
versioning.

ld/
* testsuite/ld-riscv-elf/relax-twice.ver: New.
* testsuite/ld-riscv-elf/relax-twice-1.s: New.
* testsuite/ld-riscv-elf/relax-twice-2.s: New.
* testsuite/ld-riscv-elf/ld-riscv-elf.exp
(run_relax_twice_test): New, and call it.

2 years agoUpdate gdb performance testsuite to be compatible with Python 3.8
Pedro Alves [Thu, 3 Jun 2021 13:59:54 +0000 (09:59 -0400)] 
Update gdb performance testsuite to be compatible with Python 3.8

Running "make check-perf" on a system with Python 3.8 (e.g., Ubuntu
20.04) runs into this Python problem:

  Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/perftest.py", line 65, in run
      self.execute_test()
    File "<string>", line 35, in execute_test
    File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/measure.py", line 45, in measure
      m.start(id)
    File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/measure.py", line 102, in start
      self.start_time = time.clock()
  AttributeError: module 'time' has no attribute 'clock'
  Error while executing Python code.
  (gdb) FAIL: gdb.perf/single-step.exp: python SingleStep(1000).run()

... many times over.

The problem is that the testsuite is using time.clock(), deprecated in
Python 3.3 and finaly removed in Python 3.8.  The guidelines say to
use time.perf_counter() or time.process_time() instead depending on
requirements.  Looking at the current description of those functions,
at:

   https://docs.python.org/3.10/library/time.html

we have:

   time.perf_counter() -> float

       Return the value (in fractional seconds) of a performance
       counter, i.e. a clock with the highest available resolution to
       measure a short duration. It does include time elapsed during
       sleep and is system-wide. (...)

   time.process_time() -> float

       Return the value (in fractional seconds) of the sum of the
       system and user CPU time of the current process. It does not
       include time elapsed during sleep. It is process-wide by
       definition. (...)

I'm thinking that it's just best to record both instead of picking
one.  So this patch replaces the MeasurementCpuTime measurement class
with two new classes -- MeasurementPerfCounter and
MeasurementProcessTime.  Correspondingly, this changes the reports in
testsuite/perftest.log -- we have two new "perf_counter" and
"process_time" measurements and the "cpu_time" measurement is gone.  I
don't suppose breaking backward compatibility here is a big problem.
I suspect no one is really tracking long term performance using the
perf testsuite today.  And if they are, it shouldn't be hard to adjust.

For backward compatility, with Python < 3.3, both perf_counter and
process_time use the old time.clock.

gdb/testsuite/ChangeLog:
yyyy-mm-dd  Qingchuan Shi  <qingchuan.shi@amd.com>
    Pedro Alves  <pedro@palves.net>

* gdb.perf/lib/perftest/perftest.py: Import sys.
(time.perf_counter, time.process_time): Map to time.clock on
Python < 3.3.
(MeasurementCpuTime): Delete, replaced by...
(MeasurementPerfCounter, MeasurementProcessTime): .. these two new
classes.
* gdb.perf/lib/perftest/perftest.py: Import MeasurementPerfCounter
and MeasurementProcessTime instead of MeasurementCpuTime.
(TestCaseWithBasicMeasurements): Use MeasurementPerfCounter and
MeasurementProcessTime instead of MeasurementCpuTime.

Co-authored-by: Qingchuan Shi <qingchuan.shi@amd.com>
Change-Id: Ia850c05d5ce57d2dada70ba5b0061f566444aa2b

2 years agogdb.perf/: FAIL on Python errors, avoid "ERROR: internal buffer is full"
Pedro Alves [Fri, 18 Jun 2021 12:50:45 +0000 (13:50 +0100)] 
gdb.perf/: FAIL on Python errors, avoid "ERROR: internal buffer is full"

Currently, if you run make check-perf on a system with Python 3.8,
tests seen to PASS, but they actually test a lot less than intended,
due to:

 PerfTest::assemble, run ...
 python BackTrace(64).run()
 Traceback (most recent call last):
   File "<string>", line 1, in <module>
   File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/perftest.py", line 65, in run
     self.execute_test()
   File "<string>", line 49, in execute_test
   File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/measure.py", line 45, in measure
     m.start(id)
   File "/home/pedro/rocm/gdb/src/gdb/testsuite/gdb.perf/lib/perftest/measure.py", line 102, in start
     self.start_time = time.clock()
 AttributeError: module 'time' has no attribute 'clock'
 Error while executing Python code.
 (gdb) PASS: gdb.perf/backtrace.exp: python BackTrace(64).run()

And then, after fixing the above Python compatibility issues (which
will be a separate patch), I get 86 instances of overflowing expect's
buffer, like:

  ERROR: internal buffer is full.
  UNRESOLVED: gdb.perf/single-step.exp: python SingleStep(1000).run()

This patch fixes both problems by adding & using a gdb_test_python_run
routine that:

 - checks for Python errors
 - consumes output line by line

gdb/testsuite/ChangeLog:
yyyy-mm-dd  Pedro Alves  <pedro@palves.net>

* gdb.perf/backtrace.exp: Use gdb_test_python_run.
* gdb.perf/disassemble.exp: Use gdb_test_python_run.
* gdb.perf/single-step.exp: Use gdb_test_python_run.
* gdb.perf/skip-command.exp: Use gdb_test_python_run.
* gdb.perf/skip-prologue.exp: Use gdb_test_python_run.
* gdb.perf/solib.exp: Use gdb_test_python_run.
* gdb.perf/template-breakpoints.exp: Use gdb_test_python_run.
* lib/perftest.exp (gdb_test_python_run): New.

Change-Id: I007af36f164b3f4cda41033616eaaa4e268dfd2f

2 years ago[gdb/testsuite] Remove read1 timeout factor from gdb.base/info-macros.exp
Tom de Vries [Tue, 6 Jul 2021 10:05:37 +0000 (12:05 +0200)] 
[gdb/testsuite] Remove read1 timeout factor from gdb.base/info-macros.exp

At the moment some check-read1 timeouts are handled like this in
gdb.base/info-macros.exp:
...
gdb_test_multiple_with_read1_timeout_factor 10 "$test" $testname {
  -re "$r1$r2$r3" {
     pass $testname
  }
  -re ".*#define TWO.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
}
...
which is not ideal.

We could use gdb_test_lines, but it currently doesn't support verifying
the absence of regexps, which is done using the clauses above calling fail.

Fix this by using gdb_test_lines and adding a -re-not syntax to
gdb_test_lines, such that we can do:
...
gdb_test_lines $test $testname $r1.*$r2 \
    -re-not "#define TWO" \
    -re-not "#define THREE" \
    -re-not "#define FOUR"
...

Tested on x86_64-linux, whith make targets check and check-read1.

Also observed that check-read1 execution time is reduced from 6m35s to 13s.

gdb/testsuite/ChangeLog:

2021-07-06  Tom de Vries  <tdevries@suse.de>

* gdb.base/info-macros.exp: Replace use of
gdb_test_multiple_with_read1_timeout_factor with gdb_test_lines.
(gdb_test_multiple_with_read1_timeout_factor): Remove.
* lib/gdb.exp (gdb_test_lines): Add handling or -re-not <regexp>.

2 years agoRISC-V: Fix the build broken with -Werror.
Nelson Chu [Tue, 6 Jul 2021 09:27:22 +0000 (17:27 +0800)] 
RISC-V: Fix the build broken with -Werror.

ChangeLog:

bfd/

* elfnn-riscv.c(riscv_elf_additional_program_headers): Removed the
unused variable s.
(riscv_elf_modify_segment_map): Added ATTRIBUTE_UNUSED for the
unused parameter info.

2 years ago[gdb/symtab] Fix skipping of import of C++ CU
Tom de Vries [Tue, 6 Jul 2021 08:58:43 +0000 (10:58 +0200)] 
[gdb/symtab] Fix skipping of import of C++ CU

Tom Tromey observed that when changing the language in
gdb.dwarf2/imported-unit-bp.exp from c to c++, the test failed.

This is due to this code in process_imported_unit_die:
...
      /* We're importing a C++ compilation unit with tag DW_TAG_compile_unit
         into another compilation unit, at root level.  Regard this as a hint,
         and ignore it.  */
      if (die->parent && die->parent->parent == NULL
          && per_cu->unit_type == DW_UT_compile
          && per_cu->lang == language_cplus)
        return;
...
which should have a partial symtabs counterpart.

Add the missing counterpart in process_psymtab_comp_unit.

Tested on x86_64-linux (openSUSE Leap 15.2), no regressions for config:
- using default gcc version 7.5.0
  (with 5 unexpected FAILs)
- gcc 10.3.0 and target board
  unix/-flto/-O0/-flto-partition=none/-ffat-lto-objects
  (with 1000 unexpected FAILs)

gdb/ChangeLog:

2021-07-06  Tom de Vries  <tdevries@suse.de>

* dwarf2/read.c (scan_partial_symbols): Skip top-level imports of
c++ CU.
* testsuite/gdb.dwarf2/imported-unit-bp.exp: Moved to ...
* testsuite/gdb.dwarf2/imported-unit-bp.exp.tcl: ... here.
* testsuite/gdb.dwarf2/imported-unit-bp-c++.exp: New test.
* testsuite/gdb.dwarf2/imported-unit-bp-c.exp: New test.
* testsuite/gdb.dwarf2/imported-unit.exp: Update.

2 years agoRISC-V: Add PT_RISCV_ATTRIBUTES and add it to PHDR.
Kito Cheng [Tue, 29 Jun 2021 06:36:35 +0000 (14:36 +0800)] 
RISC-V: Add PT_RISCV_ATTRIBUTES and add it to PHDR.

We added PT_RISCV_ATTRIBUTES to program header to make
.riscv.attribute easier to find in dynamic loader or kernel.

Ref:
https://github.com/riscv/riscv-elf-psabi-doc/pull/71

ChangeLog:

bfd/

* elfnn-riscv.c(RISCV_ATTRIBUTES_SECTION_NAME): New.
(riscv_elf_additional_program_headers): Ditto.
(riscv_elf_modify_segment_map): Ditto.
(elf_backend_additional_program_headers): Ditto.
(elf_backend_modify_segment_map): Ditto.
(elf_backend_obj_attrs_section): Use RISCV_ATTRIBUTES_SECTION_NAME
rather than string literal.

binutils/

* readelf.c(get_riscv_segment_type): New.
(get_segment_type): Handle EM_RISCV.

include/

* elf/riscv.h (PT_RISCV_ATTRIBUTES): New.
* testsuite/ld-elf/orphan-region.ld: Discard .riscv.attributes
section for simplify testcase.
* testsuite/ld-riscv-elf/attr-phdr.d: New.
* testsuite/ld-riscv-elf/attr-phdr.s: Ditto.
* testsuite/ld-riscv-elf/ld-riscv-elf.exp: Add attr-phdr to
testcase.

2 years agoRe: PR28055, segfault in bpf special reloc function
Alan Modra [Tue, 6 Jul 2021 00:53:10 +0000 (10:23 +0930)] 
Re: PR28055, segfault in bpf special reloc function

PR 28055
* elf64-bpf.c (bpf_elf_generic_reloc): Add missing ATTRIBUTE_UNUSED.

2 years agoAutomatic date update in version.in
GDB Administrator [Tue, 6 Jul 2021 00:00:11 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agoSimplify debug_names index writing
Tom Tromey [Sat, 29 May 2021 13:25:57 +0000 (07:25 -0600)] 
Simplify debug_names index writing

This changes the .debug_names writer to find the TU indices in the
main loop over all CUs and TUs.  (An earlier patch applied this same
treatment to the .gdb_index writer.)

2 years agoSimplify gdb_index writing
Tom Tromey [Fri, 28 May 2021 22:25:32 +0000 (16:25 -0600)] 
Simplify gdb_index writing

write_gdbindex writes the CUs first, then walks the signatured type
hash table to write out the TUs.  However, now that CUs and TUs are
unified in the DWARF reader, it's simpler to handle both of these in
the same loop.

2 years agoMinor cleanup to addrmap_index_data::previous_valid
Tom Tromey [Thu, 27 May 2021 22:28:10 +0000 (16:28 -0600)] 
Minor cleanup to addrmap_index_data::previous_valid

This changes addrmap_index_data::previous_valid to a bool, and
initializes it inline.

2 years agoFix oddity in write_gdbindex
Tom Tromey [Fri, 28 May 2021 22:20:03 +0000 (16:20 -0600)] 
Fix oddity in write_gdbindex

My recent patch to unify CUs and TUs introduced an oddity in
write_gdbindex.  Here, we pass 'i' to recursively_write_psymbols, but
we must instead pass 'counter', to handle the situation where a TU is
mixed in with the CUs.

I am not sure a test case for this is possible.  I think it can only
happen when using DWARF 5, where a TU appears in .debug_info.
However, this situation is already not handled correctly by
.gdb_index.  I filed a bug about this.

2 years agoFix warning in symtab.c
Tom Tromey [Mon, 5 Jul 2021 17:44:54 +0000 (11:44 -0600)] 
Fix warning in symtab.c

The compiler gives this warning when building symtab.c:

../../binutils-gdb/gdb/symtab.c:4247:28: warning: 'to_match' may be used uninitialized in this function [-Wmaybe-uninitialized]

This patch fixes the warning by adding a gdb_assert_not_reached.

2 years agold: Cache and reuse the IR archive file descriptor
H.J. Lu [Fri, 2 Jul 2021 20:42:32 +0000 (13:42 -0700)] 
ld: Cache and reuse the IR archive file descriptor

Linker plugin_object_p opens the IR archive for each IR archive member.
For GCC plugin, plugin_object_p closes the archive file descriptor.  But
for LLVM plugin, the archive file descriptor remains open.  If there are
3000 IR archive members, there are 3000 file descriptors for them.  We
can run out of file descriptors petty easily.

1. Add archive_plugin_fd and archive_plugin_fd_open_count to bfd so that
we can cache and reuse the IR archive file descriptor for all IR archive
members in the archive.
2. Add bfd_plugin_close_file_descriptor to properly close the IR archive
file descriptor.

bfd/

PR ld/28040
* archive.c (_bfd_archive_close_and_cleanup): Close the archive
plugin file descriptor if needed.
* bfd.c (bfd): Add archive_plugin_fd and
archive_plugin_fd_open_count.
* opncls.c (_bfd_new_bfd): Initialize to -1.
* plugin.c (bfd_plugin_open_input): Cache and reuse the archive
plugin file descriptor.
(bfd_plugin_close_file_descriptor): New function.
(try_claim): Call bfd_plugin_close_file_descriptor.
* plugin.h (bfd_plugin_close_file_descriptor): New.
* bfd-in2.h: Regenerated.

ld/

PR ld/28040
* plugin.c (plugin_input_file): Add ibfd.
(release_plugin_file_descriptor): New function.
(release_input_file): Call release_plugin_file_descriptor to
close input->fd.
(plugin_object_p): Call release_plugin_file_descriptor to close
input->fd.  Also call release_plugin_file_descriptor if not
claimed.
* testsuite/config/default.exp (RANLIB): New.
* testsuite/ld-plugin/lto.exp: Run ranlib test.

2 years agoRestore the libiberty component of commit 50ad1254d5030d0804cbf89c758359ae202e8d55.
Nick Clifton [Mon, 5 Jul 2021 15:16:38 +0000 (16:16 +0100)] 
Restore the libiberty component of commit 50ad1254d5030d0804cbf89c758359ae202e8d55.

This commit has not yet been applied to the master sources in the gcc repository.
It was submitted here: https://gcc.gnu.org/pipermail/gcc-patches/2021-July/574405.html
The commit allows options to be set for the AR and RANLIB programs used when building libiberty, which in turn allows building with LTO enabled.

2 years agoUpdated translations (mainly Ukranian and French) triggered by creation of 2.37 branch.
Nick Clifton [Mon, 5 Jul 2021 14:54:35 +0000 (15:54 +0100)] 
Updated translations (mainly Ukranian and French) triggered by creation of 2.37 branch.

2 years ago[gdb/testsuite] Fix fail in gdb.fortran/ptype-on-functions.exp with gcc-7
Tom de Vries [Mon, 5 Jul 2021 14:26:42 +0000 (16:26 +0200)] 
[gdb/testsuite] Fix fail in gdb.fortran/ptype-on-functions.exp with gcc-7

Since commit 05b85772061 "gdb/fortran: Add type info of formal parameter for
clang" I see:
...
(gdb) ptype say_string^M
type = void (character*(*), integer(kind=4))^M
(gdb) FAIL: gdb.fortran/ptype-on-functions.exp: ptype say_string
...

The part of the commit causing the fail is:
...
 gdb_test "ptype say_string" \
-    "type = void \\(character\\*\\(\\*\\), integer\\(kind=\\d+\\)\\)"
+    "type = void \\(character\[^,\]+, $integer8\\)"
...
which fails to take into account that for gcc-7 and before, the type for
string length of a string argument is int, not size_t.

Fix this by allowing both $integer8 and $integer4.

Tested on x86_64-linux, with gcc-7 and gcc-10.

gdb/testsuite/ChangeLog:

2021-07-05  Tom de Vries  <tdevries@suse.de>

* gdb.fortran/ptype-on-functions.exp: Allow both $integer8 and
$integer4 for size of string length.

2 years agogdb: fall back on sigpending + sigwait if sigtimedwait is not available
Simon Marchi [Sun, 27 Jun 2021 19:13:14 +0000 (15:13 -0400)] 
gdb: fall back on sigpending + sigwait if sigtimedwait is not available

The macOS platform does not provide sigtimedwait, so we get:

      CXX    compile/compile.o
    In file included from /Users/smarchi/src/binutils-gdb/gdb/compile/compile.c:46:
    /Users/smarchi/src/binutils-gdb/gdb/../gdbsupport/scoped_ignore_signal.h:69:4: error: use of undeclared identifier 'sigtimedwait'
              sigtimedwait (&set, nullptr, &zero_timeout);
              ^

An alternative to sigtimedwait with a timeout of 0 is to use sigpending,
to first check which signals are pending, and then sigwait, to consume
them.  Since that's slightly more expensive (2 syscalls instead of 1),
keep using sigtimedwait for the platforms that provide it, and fall back
to sigpending + sigwait for the others.

gdbsupport/ChangeLog:

* scoped_ignore_signal.h (struct scoped_ignore_signal)
<~scoped_ignore_signal>: Use sigtimedwait if HAVE_SIGTIMEDWAIT
is defined, else use sigpending + sigwait.

Change-Id: I2a72798337e81dd1bbd21214736a139dd350af87
Co-Authored-By: John Baldwin <jhb@FreeBSD.org>
2 years agogdbsupport/common.m4: check for sigtimedwait
Simon Marchi [Mon, 5 Jul 2021 13:53:33 +0000 (09:53 -0400)] 
gdbsupport/common.m4: check for sigtimedwait

The next patch will make the use of sigtimedwait conditional to whether
the platform provides it.  Start by adding a configure check for it.

gdbsupport/ChangeLog:

* common.m4 (GDB_AC_COMMON): Check for sigtimedwait.
* config.in, configure: Re-generate.

gdb/ChangeLog:

* config.in, configure: Re-generate.

gdbserver/ChangeLog:

* config.in, configure: Re-generate.

Change-Id: Ic7613fe14521b966b4d991bbcd0933ab14629c05

2 years agoRe: opcodes: constify & local meps macros
Alan Modra [Sat, 3 Jul 2021 02:09:24 +0000 (11:39 +0930)] 
Re: opcodes: constify & local meps macros

Commit f375d32b35ce changed a generated file.  Edit the source instead.

* mep.opc (macros): Make static and const.
(lookup_macro): Return and use const pointer.
(expand_macro): Make mac param const.
(expand_string): Make pmacro const.

2 years agoPR28055, segfault in bpf special reloc function
Alan Modra [Mon, 5 Jul 2021 07:01:30 +0000 (16:31 +0930)] 
PR28055, segfault in bpf special reloc function

The testcase in this PR tickled two bugs fixed here.  output_bfd is
NULL when a reloc special_function is called for final linking and
when called from bfd_generic_get_relocated_section_contents.  Clearly
using output_bfd is wrong as it results in segfaults.  Not only that,
the endianness of the reloc field really should be that of the input.
The second bug was not checking that the entire reloc field was
contained in the section contents.

PR 28055
* elf64-bpf.c (bpf_elf_generic_reloc): Use correct bfd for bfd_put
and bfd_put_32 calls.  Correct section limit checks.

2 years agoPR28047, readelf crash due to assertion failure
Alan Modra [Sat, 3 Jul 2021 00:08:40 +0000 (09:38 +0930)] 
PR28047, readelf crash due to assertion failure

DW_FORM_ref1, DW_FORM_ref2, DW_FORM_ref4, DW_FORM_ref1, and
DW_FORM_ref_udata are all supposed to be within the containing unit.

PR 28047
* dwarf.c (get_type_abbrev_from_form): Add cu_end parameter.
Check DW_FORM_ref1 etc. arg against cu_end rather than end of
section.  Adjust all callers.

2 years agoAutomatic date update in version.in
GDB Administrator [Mon, 5 Jul 2021 00:00:10 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agogdb: return early if no execution in darwin_solib_create_inferior_hook
Simon Marchi [Sun, 27 Jun 2021 03:31:24 +0000 (23:31 -0400)] 
gdb: return early if no execution in darwin_solib_create_inferior_hook

When loading a file using the file command on macOS, we get:

    $ ./gdb -nx --data-directory=data-directory -q -ex "file ./test"
    Reading symbols from ./test...
    Reading symbols from /Users/smarchi/build/binutils-gdb/gdb/test.dSYM/Contents/Resources/DWARF/test...
    /Users/smarchi/src/binutils-gdb/gdb/thread.c:72: internal-error: struct thread_info *inferior_thread(): Assertion `current_thread_ != nullptr' failed.
    A problem internal to GDB has been detected,
    further debugging may prove unreliable.
    Quit this debugging session? (y or n)

The backtrace is:

    * frame #0: 0x0000000101fcb826 gdb`internal_error(file="/Users/smarchi/src/binutils-gdb/gdb/thread.c", line=72, fmt="%s: Assertion `%s' failed.") at errors.cc:52:3
      frame #1: 0x00000001018a2584 gdb`inferior_thread() at thread.c:72:3
      frame #2: 0x0000000101469c09 gdb`get_current_regcache() at regcache.c:421:31
      frame #3: 0x00000001015f9812 gdb`darwin_solib_get_all_image_info_addr_at_init(info=0x0000603000006d00) at solib-darwin.c:464:34
      frame #4: 0x00000001015f7a04 gdb`darwin_solib_create_inferior_hook(from_tty=1) at solib-darwin.c:515:5
      frame #5: 0x000000010161205e gdb`solib_create_inferior_hook(from_tty=1) at solib.c:1200:3
      frame #6: 0x00000001016d8f76 gdb`symbol_file_command(args="./test", from_tty=1) at symfile.c:1650:7
      frame #7: 0x0000000100abab17 gdb`file_command(arg="./test", from_tty=1) at exec.c:555:3
      frame #8: 0x00000001004dc799 gdb`do_const_cfunc(c=0x000061100000c340, args="./test", from_tty=1) at cli-decode.c:102:3
      frame #9: 0x00000001004ea042 gdb`cmd_func(cmd=0x000061100000c340, args="./test", from_tty=1) at cli-decode.c:2160:7
      frame #10: 0x00000001018d4f59 gdb`execute_command(p="t", from_tty=1) at top.c:674:2
      frame #11: 0x0000000100eee430 gdb`catch_command_errors(command=(gdb`execute_command(char const*, int) at top.c:561), arg="file ./test", from_tty=1, do_bp_actions=true)(char const*, int), char const*, int, bool) at main.c:523:7
      frame #12: 0x0000000100eee902 gdb`execute_cmdargs(cmdarg_vec=0x00007ffeefbfeba0 size=1, file_type=CMDARG_FILE, cmd_type=CMDARG_COMMAND, ret=0x00007ffeefbfec20) at main.c:618:9
      frame #13: 0x0000000100eed3a4 gdb`captured_main_1(context=0x00007ffeefbff780) at main.c:1322:3
      frame #14: 0x0000000100ee810d gdb`captured_main(data=0x00007ffeefbff780) at main.c:1343:3
      frame #15: 0x0000000100ee8025 gdb`gdb_main(args=0x00007ffeefbff780) at main.c:1368:7
      frame #16: 0x00000001000044f1 gdb`main(argc=6, argv=0x00007ffeefbff8a0) at gdb.c:32:10
      frame #17: 0x00007fff20558f5d libdyld.dylib`start + 1

The solib_create_inferior_hook call in symbol_file_command was added by
commit ea142fbfc9c1 ("Fix breakpoints on file reloads for PIE
binaries").  It causes solib_create_inferior_hook to be called while
the inferior is not running, which darwin_solib_create_inferior_hook
does not expect.  darwin_solib_get_all_image_info_addr_at_init, in
particular, assumes that there is a current thread, as it tries to get
the current thread's regcache.

Fix it by adding a target_has_execution check and returning early.  Note
that there is a similar check in svr4_solib_create_inferior_hook.

gdb/ChangeLog:

* solib-darwin.c (darwin_solib_create_inferior_hook): Return
early if no execution.

Change-Id: Ia11dd983a1e29786e5ce663d0fcaa6846dc611bb

2 years agoAutomatic date update in version.in
GDB Administrator [Sun, 4 Jul 2021 00:00:09 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agogprof: Regenerate configure
H.J. Lu [Sat, 3 Jul 2021 19:51:45 +0000 (12:51 -0700)] 
gprof: Regenerate configure

* configure: Regenerated.

2 years agoUpdate NEWS post GDB 11 branch creation.
Joel Brobecker [Sat, 3 Jul 2021 17:52:20 +0000 (10:52 -0700)] 
Update NEWS post GDB 11 branch creation.

gdb/ChangeLog:

* NEWS: Create a new section for the next release branch.
Rename the section of the current branch, now that it has
been cut.

2 years agoBump version to 12.0.50.DATE-git.
Joel Brobecker [Sat, 3 Jul 2021 17:42:03 +0000 (10:42 -0700)] 
Bump version to 12.0.50.DATE-git.

Now that the GDB 11 branch has been created, we can
bump the version number.

gdb/ChangeLog:

GDB 11 branch created (4b51505e33441c6165e7789fa2b6d21930242927):
* version.in: Bump version to 12.0.50.DATE-git.

gdb/testsuite/ChangeLog:

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

2 years agoUse 'bool' more idiomatically in dwarf_decode_lines
Tom Tromey [Sat, 3 Jul 2021 17:40:54 +0000 (11:40 -0600)] 
Use 'bool' more idiomatically in dwarf_decode_lines

I noticed a couple of spots related to dwarf_decode_lines where the
'include_p' field was not being used idiomatically -- it is of type
bool now, so treat it as such.

gdb/ChangeLog
2021-07-03  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (lnp_state_machine::record_line): Use 'true'.
(dwarf_decode_lines): Remove '=='.

2 years agoMore minor updates to the how-to-make-a-release documentation gdb-11-branchpoint
Nick Clifton [Sat, 3 Jul 2021 14:57:56 +0000 (15:57 +0100)] 
More minor updates to the how-to-make-a-release documentation

2 years agoUpdate version number and regenerate files
Nick Clifton [Sat, 3 Jul 2021 14:16:48 +0000 (15:16 +0100)] 
Update version number and regenerate files

2 years agoAdd markers for 2.37 branch
Nick Clifton [Sat, 3 Jul 2021 13:50:57 +0000 (14:50 +0100)] 
Add markers for 2.37 branch

2 years agoSynchronize libiberty sources (and include/demangle.h) with GCC master version
Nick Clifton [Sat, 3 Jul 2021 13:00:33 +0000 (14:00 +0100)] 
Synchronize libiberty sources (and include/demangle.h) with GCC master version

2 years agoAutomatic date update in version.in
GDB Administrator [Sat, 3 Jul 2021 00:00:10 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agoUse 'const' in ada-exp.y
Tom Tromey [Fri, 2 Jul 2021 19:22:18 +0000 (13:22 -0600)] 
Use 'const' in ada-exp.y

I found a few spots in ada-exp.y that could use 'const'.
Tested by rebuilding.

2021-07-02  Tom Tromey  <tromey@adacore.com>

* ada-exp.y (chop_selector, chop_separator, write_selectors)
(write_ambiguous_var, get_symbol_field_type): Use const.

2 years agoDocument TUI improvements in the manual & NEWS
Pedro Alves [Fri, 4 Jun 2021 16:12:41 +0000 (17:12 +0100)] 
Document TUI improvements in the manual & NEWS

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <pedro@palves.net>
    Hannes Domani  <ssbssa@yahoo.de>

* NEWS: Add new "TUI Improvements" section and mention mouse
support and that unrecognized special keys are now passed to
GDB.  Mention Python Window.click in the Python improvements
section.

gdb/doc/ChangeLog:
yyyy-mm-dd  Pedro Alves  <pedro@palves.net>

* gdb.texinfo (TUI): <TUI Mouse Support>: New node/section.

Co-Authored-By: Hannes Domani <ssbssa@yahoo.de>
Change-Id: I0d79a795d8ac561fd28cdc5184bff029ba28bc64

2 years agoFix an illegal memory access triggered by an attempt to parse a corrupt input file.
Nick Clifton [Fri, 2 Jul 2021 13:56:36 +0000 (14:56 +0100)] 
Fix an illegal memory access triggered by an attempt to parse a corrupt input file.

PR 28046
* dwarf2.c (read_ranges): Check that range_ptr does not exceed
range_end.

2 years agoPR28048, heap-buffer-overflow on readelf -Ww
Alan Modra [Fri, 2 Jul 2021 13:48:04 +0000 (23:18 +0930)] 
PR28048, heap-buffer-overflow on readelf -Ww

PR 28048
* dwarf.c (get_type_signedness): Don't run off end of buffer
printing DW_FORM_string attribute.

2 years agoRe: Fix minor NDS32 renaming snafu
Alan Modra [Fri, 2 Jul 2021 07:57:31 +0000 (17:27 +0930)] 
Re: Fix minor NDS32 renaming snafu

Some extern declarations differ in constnes to their definitions too.
Let's make sure this sort of thing doesn't happen again, but putting
the externs in a header where they belong.

gas/
* config/tc-nds32.c (nds32_keyword_gpr): Don't declare.
(md_begin): Constify k.
opcodes/
* nds32-dis.c (nds32_find_reg_keyword): Constify arg and return.
(nds32_parse_audio_ext, nds32_parse_opcode): Constify psys_reg.
(nds32_field_table, nds32_opcode_table, nds32_keyword_table),
(nds32_opcodes, nds32_operand_fields, nds32_keywords),
(nds32_keyword_gpr): Move declarations to..
* nds32-asm.h: ..here, constifying to match definitions.

2 years agoFix minor NDS32 renaming snafu.
Nick Clifton [Fri, 2 Jul 2021 09:45:02 +0000 (10:45 +0100)] 
Fix minor NDS32 renaming snafu.

* config/tc-nds32.c: Change all references of keyword_gpr to
nds32_keyword_gpr.

2 years agosim: unify reserved instruction bits settings
Mike Frysinger [Thu, 1 Jul 2021 05:04:48 +0000 (01:04 -0400)] 
sim: unify reserved instruction bits settings

Move these options up to the common dir so we only test & export
them once across all ports.

The setting only affects igen based ports, and they were turning
this on by default, so keep the default in place.

2 years agosim: m32r: merge with common configure script
Mike Frysinger [Thu, 1 Jul 2021 04:50:17 +0000 (00:50 -0400)] 
sim: m32r: merge with common configure script

Now that the traps code has been unified, the configure script has no
unique logic in it, so it can be merged into the single common one.

2 years agosim: m32r: reformat linux traps code
Mike Frysinger [Thu, 1 Jul 2021 04:49:33 +0000 (00:49 -0400)] 
sim: m32r: reformat linux traps code

Do this as a sep commit to try and make the history easier to review.

2 years agosim: m32r: unify ELF & Linux traps logic
Mike Frysinger [Thu, 1 Jul 2021 04:28:10 +0000 (00:28 -0400)] 
sim: m32r: unify ELF & Linux traps logic

This makes the simulator work the same regardless of the target (bare
metal m32r-elf or Linux m32r-linux-gnu) by unifying the traps code.
It was mostly already the same with the only difference being support
for trap #2 reserved for Linux syscalls.  We can move that logic to
runtime by checking the current environment operating mode instead.

2 years agosim: m32r: replace custom endian helpers with sim-endian
Mike Frysinger [Thu, 1 Jul 2021 04:17:38 +0000 (00:17 -0400)] 
sim: m32r: replace custom endian helpers with sim-endian

This improves the logic a bit by making the host<->target translations
a bit more clear.  The structs still bleed way too much between the two
worlds, but let's fix one thing at a time.

2 years agosim: m32r: fix virtual environment with Linux targets
Mike Frysinger [Thu, 1 Jul 2021 00:30:43 +0000 (20:30 -0400)] 
sim: m32r: fix virtual environment with Linux targets

We don't want to handle Linux syscalls when in the virtual environment,
just the user environment, so adjust the Linux traps logic to check for
that specifically (instead of just skipping the operating environment).

Also tweak some testcases to explicitly specify the environment they run
under rather than relying on the default matching their needs.  This gets
the tests passing for all m32r targets.

2 years agosim: m32r: namespace Linux syscall table
Mike Frysinger [Wed, 30 Jun 2021 22:39:17 +0000 (18:39 -0400)] 
sim: m32r: namespace Linux syscall table

The use of __NR_ defines in here conflicts a lot with the standard
host syscalls, sometimes leading to build errors (when the numbers
happen to be the same we get duplicate case handlers), and other
times leading to misbehavior (where the m32r syscall # is not what
is actually checked).

Namespace these using the standard that we already use: change the
__NR_ to TARGET_LINUX_SYS_ with a simple `sed`.

Also add a few missing includes so the code at least compiles.

2 years agoAutomatic date update in version.in
GDB Administrator [Fri, 2 Jul 2021 00:00:12 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 years agocgen: split GUILE setting out
Mike Frysinger [Tue, 29 Jun 2021 01:26:48 +0000 (21:26 -0400)] 
cgen: split GUILE setting out

This makes it easier to override to point to an older version of guile.
The current cgen code doesn't work with guile-2, so need to point to an
older guile-1.8.

2 years agoopcodes: constify & local meps macros
Mike Frysinger [Sun, 27 Jun 2021 06:17:27 +0000 (02:17 -0400)] 
opcodes: constify & local meps macros

Avoid exporting this common variable name into writable data.

2 years agoopcodes: cleanup nds32 variables
Mike Frysinger [Sun, 27 Jun 2021 06:14:29 +0000 (02:14 -0400)] 
opcodes: cleanup nds32 variables

For the variables that don't need to be exported, mark them static.
For the ones shared between modules, add a "nds32_" prefix to avoid
collisions with these common variable names.

2 years agoopcodes: constify & localize z80 opcodes
Mike Frysinger [Sun, 27 Jun 2021 05:58:18 +0000 (01:58 -0400)] 
opcodes: constify & localize z80 opcodes

These aren't used outside of this module, and are never modified.
Mark it static to avoid bad exported variable name issues.

2 years agoopcodes: constify & scope microblaze opcodes
Mike Frysinger [Sun, 27 Jun 2021 05:55:50 +0000 (01:55 -0400)] 
opcodes: constify & scope microblaze opcodes

This is exporting the variable "opcodes" as a large writable blob.
This is not a namespace friendly name, so add a "microblaze" prefix,
and then sprinkle const over its definition & use.

2 years agoopcodes: constify aarch64_opcode_tables
Mike Frysinger [Sun, 27 Jun 2021 05:37:24 +0000 (01:37 -0400)] 
opcodes: constify aarch64_opcode_tables

This table is huge (~350k), so stop putting it into writable .data
since it's only const data.

2 years agoPartially fix debuginfod tests in binutils testsuite.
Nick Clifton [Thu, 1 Jul 2021 13:10:38 +0000 (14:10 +0100)] 
Partially fix debuginfod tests in binutils testsuite.

PR 28029
* testsuite/binutils-all/debuginfod.exp: Replace -wK with -wk.

2 years agoLinux: Access memory even if threads are running
Pedro Alves [Fri, 11 Jun 2021 16:56:32 +0000 (17:56 +0100)] 
Linux: Access memory even if threads are running

Currently, on GNU/Linux, if you try to access memory and you have a
running thread selected, GDB fails the memory accesses, like:

 (gdb) c&
 Continuing.
 (gdb) p global_var
 Cannot access memory at address 0x555555558010

Or:

 (gdb) b main
 Breakpoint 2 at 0x55555555524d: file access-mem-running.c, line 59.
 Warning:
 Cannot insert breakpoint 2.
 Cannot access memory at address 0x55555555524d

This patch removes this limitation.  It teaches the native Linux
target to read/write memory even if the target is running.  And it
does this without temporarily stopping threads.  We now get:

 (gdb) c&
 Continuing.
 (gdb) p global_var
 $1 = 123
 (gdb) b main
 Breakpoint 2 at 0x555555555259: file access-mem-running.c, line 62.

(The scenarios above work correctly with current GDBserver, because
GDBserver temporarily stops all threads in the process whenever GDB
wants to access memory (see prepare_to_access_memory /
done_accessing_memory).  Freezing the whole process makes sense when
we need to be sure that we have a consistent view of memory and don't
race with the inferior changing it at the same time as GDB is
accessing it.  But I think that's a too-heavy hammer for the default
behavior.  I think that ideally, whether to stop all threads or not
should be policy decided by gdb core, probably best implemented by
exposing something like gdbserver's prepare_to_access_memory /
done_accessing_memory to gdb core.)

Currently, if we're accessing (reading/writing) just a few bytes, then
the Linux native backend does not try accessing memory via
/proc/<pid>/mem and goes straight to ptrace
PTRACE_PEEKTEXT/PTRACE_POKETEXT.  However, ptrace always fails when
the ptracee is running.  So the first step is to prefer
/proc/<pid>/mem even for small accesses.  Without further changes
however, that may cause a performance regression, due to constantly
opening and closing /proc/<pid>/mem for each memory access.  So the
next step is to keep the /proc/<pid>/mem file open across memory
accesses.  If we have this, then it doesn't make sense anymore to even
have the ptrace fallback, so the patch disables it.

I've made it such that GDB only ever has one /proc/<pid>/mem file open
at any time.  As long as a memory access hits the same inferior
process as the previous access, then we reuse the previously open
file.  If however, we access memory of a different process, then we
close the previous file and open a new one for the new process.

If we wanted, we could keep one /proc/<pid>/mem file open per
inferior, and never close them (unless the inferior exits or execs).
However, having seen bfd patches recently about hitting too many open
file descriptors, I kept the logic to have only one file open tops.
Also, we need to handle memory accesses for processes for which we
don't have an inferior object, for when we need to detach a
fork-child, and we'd probaly want to handle caching the open file for
that scenario (no inferior for process) too, which would probably end
up meaning caching for last non-inferior process, which is very much
what I'm proposing anyhow.  So always having one file open likely ends
up a smaller patch.

The next step is handling the case of GDB reading/writing memory
through a thread that is running and exits.  The access should not
result in a user-visible failure if the inferior/process is still
alive.

Once we manage to open a /proc/<lwpid>/mem file, then that file is
usable for memory accesses even if the corresponding lwp exits and is
reaped.  I double checked that trying to open the same
/proc/<lwpid>/mem path again fails because the lwp is really gone so
there's no /proc/<lwpid>/ entry on the filesystem anymore, but the
previously open file remains usable.  It's only when the whole process
execs that we need to reopen a new file.

When the kernel destroys the whole address space, i.e., when the
process exits or execs, the reads/writes fail with 0 aka EOF, in which
case there's nothing else to do than returning a memory access
failure.  Note this means that when we get an exec event, we need to
reopen the file, to access the process's new address space.

If we need to open (or reopen) the /proc/<pid>/mem file, and the LWP
we're opening it for exits before we open it and before we reap the
LWP (i.e., the LWP is zombie), the open fails with EACCES.  The patch
handles this by just looking for another thread until it finds one
that we can open a /proc/<pid>/mem successfully for.

If we need to open (or reopen) the /proc/<pid>/mem file, and the LWP
we're opening has exited and we already reaped it, which is the case
if the selected thread is in THREAD_EXIT state, the open fails with
ENOENT.  The patch handles this the same way as a zombie race
(EACCES), instead of checking upfront whether we're accessing a
known-exited thread, because that would result in more complicated
code, because we also need to handle accessing lwps that are not
listed in the core thread list, and it's the core thread list that
records the THREAD_EXIT state.

The patch includes two testcases:

#1 - gdb.base/access-mem-running.exp

  This is the conceptually simplest - it is single-threaded, and has
  GDB read and write memory while the program is running.  It also
  tests setting a breakpoint while the program is running, and checks
  that the breakpoint is hit immediately.

#2 - gdb.threads/access-mem-running-thread-exit.exp

  This one is more elaborate, as it continuously spawns short-lived
  threads in order to exercise accessing memory just while threads are
  exiting.  It also spawns two different processes and alternates
  accessing memory between the two processes to exercise the reopening
  the /proc file frequently.  This also ends up exercising GDB reading
  from an exited thread frequently.  I confirmed by putting abort()
  calls in the EACCES/ENOENT paths added by the patch that we do hit
  all of them frequently with the testcase.  It also exits the
  process's main thread (i.e., the main thread becomes zombie), to
  make sure accessing memory in such a corner-case scenario works now
  and in the future.

The tests fail on GNU/Linux native before the code changes, and pass
after.  They pass against current GDBserver, again because GDBserver
supports memory access even if all threads are running, by
transparently pausing the whole process.

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <pedro@palves.net>

PR mi/15729
PR gdb/13463
* linux-nat.c (linux_nat_target::detach): Close the
/proc/<pid>/mem file if it was open for this process.
(linux_handle_extended_wait) <PTRACE_EVENT_EXEC>: Close the
/proc/<pid>/mem file if it was open for this process.
(linux_nat_target::mourn_inferior): Close the /proc/<pid>/mem file
if it was open for this process.
(linux_nat_target::xfer_partial): Adjust.  Do not fall back to
inf_ptrace_target::xfer_partial for memory accesses.
(last_proc_mem_file): New.
(maybe_close_proc_mem_file): New.
(linux_proc_xfer_memory_partial_pid): New, with bits factored out
from linux_proc_xfer_partial.
(linux_proc_xfer_partial): Delete.
(linux_proc_xfer_memory_partial): New.

gdb/testsuite/ChangeLog
yyyy-mm-dd  Pedro Alves  <pedro@palves.net>

PR mi/15729
PR gdb/13463
* gdb.base/access-mem-running.c: New.
* gdb.base/access-mem-running.exp: New.
* gdb.threads/access-mem-running-thread-exit.c: New.
* gdb.threads/access-mem-running-thread-exit.exp: New.

Change-Id: Ib3c082528872662a3fc0ca9b31c34d4876c874c9

2 years agoreadelf: Reset file position to beginning for thin archive members
Andrei Homescu [Thu, 1 Jul 2021 11:01:55 +0000 (12:01 +0100)] 
readelf: Reset file position to beginning for thin archive members

* readelf.c (process_archive): Reset file position to the
beginning when calling process_object for thin archive members.
* testsuite/binutils-all/readelf.exp: Add test.
* testsuite/binutils-all/readelf.h.thin: New file.