Commit Graph

122365 Commits

Author SHA1 Message Date
Alan Modra
f2172071e6 elfedit: segv with --enable-x86-feature
PR 33024
	PR 33025
	* elfedit.c (update_gnu_property): Sanity check program headers.
2025-05-28 22:34:50 +09:30
Alan Modra
ee623fdffd Further rs_code_align support refinement
Don't write the repeating nop pattern if it won't be used.
2025-05-28 21:10:48 +09:30
Alexandra Hájková
1c96b468be Call restore_original_signal_state after GDB forks.
When I run GDB under Valgrind, GDB seems to segfault
displaying:

Fatal signal: Segmentation fault
----- Backtrace -----
0x2803f7 ???
0x3c9696 ???
0x3c9899 ???
0x55f8fcf ???
0x486c000 ???
---------------------
A fatal error internal to GDB has been detected, further
debugging is not possible.  GDB will now terminate.

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

warning: linux_ptrace_test_ret_to_nx: PC 0x5821c09d is neither near return address 0x486c000 nor is the return instruction 0x4f8f4a!

but then, acts like nothing happened and excutes normally. This is
because it's the child from linux_ptrace_test_ret_to_nx that
segfaults and parent GDB carries on normally. Restore the original
signal states to not to print confusing backtrace. After restoring,
only such warning is displayed:

warning: linux_ptrace_test_ret_to_nx: WSTOPSIG 19 is neither SIGTRAP nor SIGSEGV!
2025-05-28 11:14:27 +02:00
Alan Modra
f601ffb521 PR 33029 segv in dwarf2_finish with --gdwarf-5
Specifying --gdwarf-5 with a source lacking a ".file 0" directive
results in this segfault.

	* dwarf2dbg.c (out_debug_str): Use files[1] if files[0] is
	empty regardless of dwarf level.
2025-05-28 18:27:23 +09:30
Alan Modra
5e3176dd79 PR 33023 memory leak in objdump when specifying --endian
* objdump.c (disassemble_data): Free modified xvec and replace
	original.
2025-05-28 15:55:27 +09:30
Alan Modra
5d4465be2b PR 33021, buffer overflow in write_dwarf_eh_frame_hdr
* elf-eh-frame.c (write_dwarf_eh_frame_hdr): Use size of
	contents, not section size, in bfd_set_section_contents call.
2025-05-28 15:26:01 +09:30
Alan Modra
04395ea004 PR 33018 segv in elf_x86_64_scan_relocs
* elf64-x86-64.c (elf_x86_64_scan_relocs): Error on NULL howto.
	Use bfd_reloc_offset_in_range.
2025-05-28 15:23:46 +09:30
GDB Administrator
882be0d57b Automatic date update in version.in 2025-05-28 00:00:19 +00:00
Simon Marchi
006fb76117 gdb: make objfile_has_full_symbols and objfile_has_symbols methods of objfile
They seem like good candidates to become methods, just like
objfile::has_partial_symbols.

Change-Id: Ic6df83012629c1137708b8ceb327f9868d8abcb5
Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
2025-05-27 09:46:28 -04:00
Thiago Jung Bauermann
95f0978bd0 gdb/testsuite: Clarify -lbl option in gdb_test_multiple
I was a bit confused about the -lbl option in gdb_test_multiple, and needed
to read its implementation to determine that it would be useful for my
needs.  Explicitly mention what the option does and why it's useful to
hopefully help other developers.

Reviewed-By: Keith Seitz <keiths@redhat.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-26 22:41:37 -03:00
Thiago Jung Bauermann
c833b2b5e8 gdb/testsuite: Fix flakiness in gdb.base/default.exp
The Linaro CI runs the GDB testsuite using the read1 tool, which
significantly increases the time it takes DejaGNU to read inferior output.
On top of that sometimes the test machine has higher than normal load,
which causes tests to run even slower.

Because gdb.base/default.exp tests some verbose commands such as "info
set", it sometimes times out while waiting for the complete command
output when running in the Linaro CI environment.

Fix this problem by consuming each line of output from the most verbose
commands with gdb_test_multiple's -lbl (line-by-line) option — which
causes DejaGNU to reset the timeout after each match — and also by
breaking up regular expressions that try to match more than 2000
characters (the default Expect buffer size) in one go into multiple
matches.

Some tests use the same regular expression, so I created a procedure for
them.  This is the case for "i" / "info", "info set" / "show", and "set
print" tests.

The tests for "show print" don't actually test their output, so this
patch improves them by checking some lines of the output.

Reviewed-By: Keith Seitz <keiths@redhat.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-26 22:41:37 -03:00
GDB Administrator
d13aaae402 Automatic date update in version.in 2025-05-27 00:00:21 +00:00
Alan Modra
998d4443ea ALPHA_R_OP_STORE
In commit db4ab410de I rewrote OP_STORE handling to support writing
near the end of a section.  The rewrite had some bugs, fixed in commit
3e02c4891d.  However I wasn't entirely happy with the code writing
the bitfield:
- it doesn't support 64-bit fields with a bit offset,
- the code is duplicated and inelegant,
- the stack ought to be popped whenever seeing one of these relocs,
  even if the reloc can't be applied.
This patch fixes all of the above.

In addition, it is clear from the OP_STORE description in the ABI that
a 64-bit field is encoded as 0 in r_size, so I've decoded that in
alpha_ecoff_swap_reloc_in.  The aborts there are not appropriate as
they can be triggered by user input (fuzzed object files).  Also,
stack underflow wasn't checked in alpha_relocate_section.

	* coff-alpha.c (alpha_ecoff_swap_reloc_in): Replace aborts
	with asserts.  Decode ALPHA_R_OP_STORE r_size of zero.
	(write_bit_field): New function.
	(alpha_ecoff_get_relocated_section_contents): Use it.
	(alpha_relocate_section): Here too.  Catch stack underflow.
2025-05-27 09:02:12 +09:30
Jens Remus
2adbf167ca libsframe: handle SFrame FRE start/end IP offsets as unsigned
The SFrame FRE start address (fre_start_addr) is defined as unsigned
32-bit integer, as it is an offset from SFrame FDE function start
address (sfde_func_start_address) and functions only grow upwards
(towards higher addresses).

The SFrame FRE start IP offset is a synonym to the SFrame FRE start
address.  The SFrame FRE end IP offset is either the value of the
subsequent FDE start address minus one, if that exists, or the FDE
function size minus one otherwise.  Both should therefore be handled
as unsigned 32-bit integer.

In libsframe the "lookup PC" (pc) and SFrame FDE function start address
(sfde_func_start_address) are both signed integers, as they are actually
offsets from the SFrame section.  The unsigned FDE start/end IP offsets
may therefore only be safely compared against the offset of the lookup
PC from FDE function start address if the FDE function start address is
lower or equal to the lookup PC, as this guarantees the offset to be
always positive:

Given:

  lookup_pc = pc - sframe_addr

  sfde_func_start_address = func_start_addr - sframe_addr

If the FDE function start address is lower or equal than the lookup PC,
which both are signed offsets from SFrame section, then the function
start address is also lower or equal to the PC, which are both unsigned:

  sfde_func_start_address <= lookup_pc
  func_start_addr - sframe_addr <= pc - sframe_addr
  func_start_addr <= pc

With that the offset of the lookup PC from FDE function start address
(lookup_pc - sfde_func_start_address) must always be positive, if
FDE function start address is lower or equal to the lookup PC:

  lookup_pc - sfde_func_start_address
  = pc - sframe_addr - (func_start_addr - sframe_addr)
  = pc - func_start_addr

libsframe/
	* sframe.c (sframe_find_fre): Define and handle start_ip_offset
	and end_ip_offset as unsigned (same as FRE fre_start_addr).
	(sframe_fre_check_range_p): Likewise.  Define PC offset (from
	function start address) as unsigned.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
2025-05-26 11:02:47 -07:00
Jens Remus
ada5c6fa08 libsframe: stop search for SFrame FRE if its start IP is greater than PC
The SFrame FREs for an SFrame FDE are sorted on their start address.
Therefore the linear search for a matching SFrame FRE can be stopped,
if its start address is greater than the searched for PC.

libsframe/
	* sframe.c (sframe_find_fre): Stop search if FRE's start IP is
	greater than PC.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
2025-05-26 11:02:29 -07:00
Jens Remus
9d2a24349e libsframe: correct binary search for SFrame FDE
sframe_get_funcdesc_with_addr_internal erroneously returns the last FDE,
if its function start address is lower than the searched for address.

Simplify the binary search for a SFrame FDE for a given address.  Only
return an FDE, if the searched for address is within the bounds of the
FDE function start address and function size.

libsframe/
	* sframe.c (sframe_get_funcdesc_with_addr_internal): Correct
	binary search for SFrame FDE.

libsframe/testsuite/
	* libsframe.find/plt-findfre-1.c: Add test for out of range
	PLT6.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
2025-05-26 11:01:14 -07:00
Indu Bhagat
f0d72d3508 libsframe: testsuite: improve findfunc-1 testcase
The testcase had usages of some magic numbers, making it difficult to
keep up when format changes come along.

libsframe/testsuite/
	* libsframe.find/findfunc-1.c: Restructure a bit.  Run test for two
	ways of placement of .sframe and .text.
2025-05-26 10:54:56 -07:00
Indu Bhagat
0d15aea98b libsframe: testsuite: improve findfre-1 testcase
The testcase had usages of some magic numbers, making it difficult to
keep up when format changes come along.

libsframe/testsuite/
	* libsframe.find/findfre-1.c: Restructure a bit.  Run test for two
	ways of placement of .sframe and .text.
2025-05-26 10:54:35 -07:00
Indu Bhagat
4e94f00756 libsframe: fix issue finding FRE in PCMASK type SFrame FDEs
SFrame FDEs of type SFRAME_FDE_TYPE_PCMASK are used for repetitive code
patterns, e.g., pltN entries.  For SFrame FDEs of type
SFRAME_FDE_TYPE_PCMASK, sframe_fre_check_range_p erroneously tested the
given PC instead of the masked PC offset from function start address.
Therefore it only worked correctly by chance, e.g., if the function start
address was aligned on the repetition block size.

For regular SFrame FDEs the PC offset from function start address must
be within a SFrame FRE's start IP offset and end IP offset.  For SFrame
FDEs of type SFRAME_FDE_TYPE_PCMASK, the masked PC offset must be within
that range.

SFrame FRE start/end IP offsets are relative to the SFrame FDE function
start address. For regular SFrame FDEs, the PC offset from function
start address must be within a SFrame FRE's start IP offset and end IP
offset.  For SFRAME_FDE_TYPE_PCMASK type FDEs, the masked PC offset must
be within that range.

Exercise the testcase for a variety of placements; without the fix some
of these tests will fail.  Also, make the testcase itself easier to
follow by adding appropriate vars where applicable.

libsframe/
	* sframe.c (sframe_fre_check_range_p): Fix logic for
	SFRAME_FDE_TYPE_PCMASK type FDE.
libsframe/testsuite/
	* libsframe.find/plt-findfre-1.c: Adjust the test for a variety
	of placements of .sframe and .plt.

Co-Authored-by: Jens Remus <jremus@linux.ibm.com>
2025-05-26 10:54:06 -07:00
Indu Bhagat
5bd7ac079a gas: sframe: handle .cfi_same_value
Fix PR gas/32953 - sframe: incorrect handling of .cfi_same_value in gas

As per documentation, .cfi_same_value indicates that the current value
of register is the same like in the previous frame, i.e. no restoration
needed.

gas/
	* gen-sframe.c (sframe_xlate_do_same_value): New definition.
	(sframe_do_cfi_insn): Handle DW_CFA_same_value.
gas/testsuite/
	* gas/cfi-sframe/cfi-sframe.exp: Add new tests.
	* gas/cfi-sframe/cfi-sframe-common-11.d: New test.
	* gas/cfi-sframe/cfi-sframe-common-11.s: New test.
2025-05-26 09:51:36 -07:00
Tom de Vries
2c29fd2026 [gdb] Factor out compare_pointers
Factor out compare_pointers, use it in compare_symbols and compare_msymbols,
and add comments about unstable sorting result.

Tested on x86_64-linux.

Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-26 15:15:31 +02:00
Tom de Vries
511aa7976d [gdb] Partially stabilize sort in compare_{symbols,msymbols}
In compare_symbols in gdb/linespec.c:
...
  uia = (uintptr_t) a.symbol->symtab ()->compunit ()->objfile ()->pspace ();
  uib = (uintptr_t) b.symbol->symtab ()->compunit ()->objfile ()->pspace ();

  if (uia < uib)
    return true;
  if (uia > uib)
     return false;
...
we compare pointers to struct program_space, which gives unstable sorting
results.

The assumption is that this doesn't matter, but as PR32202 demonstrates,
sometimes it does.

While PR32202 is fixed elsewhere, it seems like a good idea to stabilize this
comparison, because it comes at a small cost and possibly prevents
hard-to-reproduce user-visible ordering issues.

Fix this by comparing the program space IDs instead of the pointers.

Likewise in compare_msymbols.

Tested on x86_64-linux.

Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-26 15:15:31 +02:00
Tom de Vries
6b4f72a01e [gdb/breakpoints] Stabilize info breakpoints output
With test-case gdb.multi/pending-bp-del-inferior.exp, occasionally I run into:
...
(gdb) info breakpoints^M
Num     Type           Disp Enb Address    What^M
3       dprintf        keep y   <MULTIPLE> ^M
        printf "in foo"^M
3.1                         y   0x004004dc in foo at $c:21 inf 2^M
3.2                         y   0x004004dc in foo at $c:21 inf 1^M
(gdb) FAIL: $exp: bp_pending=false: info breakpoints before inferior removal
...

The FAIL happens because the test-case expects:
- breakpoint location 3.1 to be in inferior 1, and
- breakpoint location 3.2 to be in inferior 2
but it's the other way around.

I managed to reproduce this with a trigger patch in
compare_symbols from gdb/linespec.c:
...
   uia = (uintptr_t) a.symbol->symtab ()->compunit ()->objfile ()->pspace ();
   uib = (uintptr_t) b.symbol->symtab ()->compunit ()->objfile ()->pspace ();

-  if (uia < uib)
+  if (uia > uib)
     return true;
-  if (uia > uib)
+  if (uia < uib)
     return false;
...

The order enforced by compare_symbols shows up in the "info breakpoints"
output because breakpoint::add_location doesn't enforce an ordering for equal
addresses:
...
  auto ub = std::upper_bound (m_locations.begin (), m_locations.end (),
			      loc,
			      [] (const bp_location &left,
				  const bp_location &right)
				{ return left.address < right.address; });
   m_locations.insert (ub, loc);
...

Fix this by using new function bp_location_is_less_than
(forwarding to bp_location_ptr_is_less_than) in breakpoint::add_location.

Tested on x86_64-linux.

Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>

PR gdb/32202
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32202
2025-05-26 15:15:31 +02:00
Tom de Vries
8dd54de0a8 [gdb/breakpoints] Rename bp_location_is_less_than to bp_location_ptr_is_less_than
In breakpoint.c, we have:
...
/* A comparison function for bp_location AP and BP being interfaced to
   std::sort.  Sort elements primarily by their ADDRESS (no matter what
   bl_address_is_meaningful says), secondarily by ordering first
   permanent elements and tertiarily just ensuring the array is sorted
   stable way despite std::sort being an unstable algorithm.  */

static int
bp_location_is_less_than (const bp_location *a, const bp_location *b)
...

There are few problems here:
- the return type is int.  While std::sort allows this, because int is
  convertible to bool, it's clearer to use bool directly,
- it's not abundantly clear from either function name or comment that we can
  use this to sort std::vector<bp_location *> but not
  std::vector<bp_location>, and
- the comment mentions AP and BP, but there are no such parameters.

Fix this by:
- changing the return type to bool,
- renaming the function to bp_location_ptr_is_less_than and mentioning
  std::vector<bp_location *> in the comment, and
- updating the comment to use the correct parameter names.

Tested on x86_64-linux.

Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-26 15:15:31 +02:00
Janne Ramstedt
3e02c4891d alpha, bfd: Fixes for ALPHA_R_OP_STORE
ALPHA_R_OP_STORE copies one byte too many and also will cause out of
range error when it tries to copy from the end of section.  Since
"endbyte" is already rounded to next full byte, there is enough bits
to copy and the additional "+ 1" is erroneous in bytes count.  I also
believe size is incorrectly decreased.
2025-05-26 18:31:35 +09:30
Markus Metzger
a93443f5c2 gdb, btrace: remove record_btrace_target::supports_*()
Let's not introduce support for breakpoint types the target beneath does
not support, even though we could while replaying.

Otherwise, users may set breakpoints during replay that then couldn't be
inserted into the target when switching back to recording.

Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-26 07:00:43 +00:00
Lulu Cai
95d54e0c6e LoongArch: overflow and underflow checks for R_LARCH_32_PCREL
Relocation overflows can silently write incorrect value to
the file, so overflow checks are added to avoid this.
2025-05-26 14:59:42 +08:00
GDB Administrator
378d39e87f Automatic date update in version.in 2025-05-26 00:00:21 +00:00
GDB Administrator
a3a8dd48ed Automatic date update in version.in 2025-05-25 00:00:17 +00:00
Simon Marchi
f76436396f gdb/solib-svr4: check that solib is SVR4 in tls_maybe_fill_slot and tls_maybe_erase_slot
Functions tls_maybe_fill_slot and tls_maybe_erase_slot blindly assume
that the passe solibs come from solib-svr4.  This is not always the
case, because they are called even on the systems where the solib
implementation isn't solib-svr4.  Add some checks to return early in
that case.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32990
Change-Id: I0a281e1f4826aa1914460c2213f0fae1bdc9af7c
Tested-By: Hannes Domani <ssbssa@yahoo.de>
Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-24 10:07:42 -04:00
Simon Marchi
77307a766b gdb: use local addrmap_mutable in addrmap selftest
There is no need to allocate the addrmap_mutable on the heap.

Change-Id: Ia6ec17101a44ae5eaffbf3382c9639414ce5343e
Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-24 10:06:40 -04:00
Simon Marchi
265cdb307f gdb: turn CHECK_ADDRMAP_FIND into a function
Replace the macro with a function.  I don't see a need to use a macro
here, a function is easier to read.

Change-Id: I22370040cb546470498d64939b246b03700af398
Approved-By: Andrew Burgess <aburgess@redhat.com>
2025-05-24 10:06:40 -04:00
Tom de Vries
e64cd55419 [gdb/build] Fix unused var in lookup_dwo_unit_in_dwp
On x86_64-linux, with gcc 7.5.0 I ran into a build breaker:
...
gdb/dwarf2/read.c: In function ‘dwo_unit* lookup_dwo_unit_in_dwp()’:
gdb/dwarf2/read.c:7403:22: error: unused variable ‘inserted’ \
  [-Werror=unused-variable]
    auto [it, inserted] = dwo_unit_set.emplace (std::move (dwo_unit));
                      ^
...

Fix this by dropping the unused variable.

Tested on x86_64-linux, by completing a build.
2025-05-24 10:27:12 +02:00
Simon Marchi
c8ed94e143 gdb: guard <mutex> include with CXX_STD_THREAD
Change-Id: I4335fbfdabe49778fe37b08689eec59be94c424b
2025-05-23 22:27:32 -04:00
GDB Administrator
f92db640ca Automatic date update in version.in 2025-05-24 00:00:12 +00:00
Andrew Burgess
1a8f9feaf5 gdb/NEWS: minor white space fix
Spotted a small white space mistake in the NEWS file.  Fixed.
2025-05-23 19:26:08 +01:00
Simon Marchi
291b72ad02 gdb: include <mutex> in dwarf2/read.h
The buildbot pointed out this compilation failure on AlmaLinux, with g++
8.5.0, which is not seen on more recent systems:

     CXX    gdbtypes.o
    In file included from ../../binutils-gdb/gdb/gdbtypes.c:39:
    ../../binutils-gdb/gdb/dwarf2/read.h:639:8: error: ‘mutex’ in namespace ‘std’ does not name a type
       std::mutex dwo_files_lock;
            ^~~~~
    ../../binutils-gdb/gdb/dwarf2/read.h:639:3: note: ‘std::mutex’ is defined in header ‘<mutex>’; did you forget to ‘#include <mutex>’?
    ../../binutils-gdb/gdb/dwarf2/read.h:35:1:
    +#include <mutex>

    ../../binutils-gdb/gdb/dwarf2/read.h:639:3:
       std::mutex dwo_files_lock;
       ^~~

Fix it by including <mutex> in dwarf2/read.h.

Change-Id: Iba334a3dad217c86841a5e804d0f386876f5ff2f
2025-05-23 14:06:15 -04:00
Tom de Vries
514a857f43 [gdb] Make make-init-c more robust
In commit 2711e4754f ("Ensure cooked_index_entry self-tests are run"), we
rewrite the function definition of _initialize_dwarf2_entry into a normal
form that allows the make-init-c script to detect it:
...
 void _initialize_dwarf2_entry ();
-void _initialize_dwarf2_entry ()
+void
+_initialize_dwarf2_entry ()
...

Update make-init-c to also detect the "void _initialize_dwarf2_entry ()"
variant.

Tested on x86_64-linux, by reverting commit 2711e4754f, rebuilding and
checking that build/gdb/init.c doesn't change.
2025-05-23 18:54:43 +02:00
Tom de Vries
8cfde4a018 [gdb/testsuite] Add gdb.dwarf2/fission-dw-form-strx.exp
Add a dwarf assembly test-case using a DW_FORM_strx in a .dwo file.

Tested on x86_64-linux.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-05-23 18:38:20 +02:00
Simon Marchi
fbf19b6cc6 gdb/dwarf: split dwo_lock in more granular locks
The dwo_lock mutex is used to synchronize access to some dwo/dwp-related
data structures, such as dwarf2_per_bfd::dwo_files and
dwp_file::loaded_{cus,tus}.  Right now the scope of the lock is kind of
coarse.  It is taken in the top-level lookup_dwo_unit function, and held
while the thread:

 - looks up an existing dwo_file in the per-bfd hash table for the given
   id/signature
 - if there's no existing dwo_file, attempt to find a .dwo file, open
   it, build the list of units it contains
 - if a new dwo_file was created, insert it in the per-bfd hash table
 - look up the desired unit in the dwo_file

And something similar for the dwp code path.  This means that two
indexing thread can't read in two dwo files simultaneously.  This isn't
ideal in terms of parallelism.

This patch breaks this lock into 3 more fine grained locks:

 - one lock to access dwarf2_per_bfd::dwo_files
 - one lock to access dwp_file::loaded_{cus,tus}
 - one lock in try_open_dwop_file, where we do two operations that
   aren't thread safe (bfd_check_format and gdb_bfd_record_inclusion)

Unfortunately I don't see a clear speedup on my computer with 8 threads.
But the change shouldn't hurt, in theory, and hopefully this can be a
piece that helps in making GDB scale better on machines with many cores
(if we ever bump the max number of worker threads).

This patch uses "double-checked locking" to avoid holding the lock(s)
for the whole duration of reading in dwo files.  The idea is, when
looking up a dwo with a given name:

 - with the lock held, check for an existing dwo_file with that name in
   dwarf2_per_bfd::dwo_files, if found return it
 - if not found, drop the lock, load the dwo file and create a dwo_file
   describing it
 - with the lock held, attempt to insert the new dwo_file in
   dwarf2_per_bfd::dwo_files.  If an entry exists, it means another
   thread simultaneously created an equivalent dwo_file, but won the
   race.  Drop the new dwo_file and use the existing one.  The new
   dwo_file is automatically deleted, because it is help by a unique_ptr
   and the insertion into the unordered_set fails.

Note that it shouldn't normally happen for two threads to look up a dwo
file with the same name, since different units will point to different
dwo files.  But it were to happen, we handle it.  This way of doing
things allows two threads to read in two different dwo files
simulatenously, which in theory should help get better parallelism.  The
same technique is used for dwp_file::loaded_{cus,tus}.

I have some local CI jobs that run the fission and fission-dwp boards,
and I haven't seen regressions.  In addition to the regular testing, I
ran a few tests using those boards on a ThreadSanitizer build of GDB.

Change-Id: I625c98b0aa97b47d5ee59fe22a137ad0eafc8c25
Reviewed-By: Andrew Burgess <aburgess@redhat.com>
2025-05-23 11:14:20 -04:00
Simon Marchi
e95749bd0d gdb/dwarf: allocate DWP dwarf2_section_info with new
For the same reason as explained in the previous patch (allocations on
obstacks aren't thread-safe), change the allocation of
dwarf2_section_info object for dwo files within dwp files to use "new".

The dwo_file::section object is not always owned by the dwo_file, so
introduce a new "dwo_file::section_holder" object that is only set when
the dwo_file owns the dwarf2_section_info.

Change-Id: I74c4608573c7a435bf3dadb83f96a805d21798a2
Approved-By: Tom Tromey <tom@tromey.com>
2025-05-23 11:12:53 -04:00
Simon Marchi
e82c588969 gdb/dwarf: allocate dwo_unit with new
The following patch reduces the duration where the dwo_lock mutex is
taken.  One operation that is not thread safe is the allocation on
dwo_units on the per_bfd obstack:

    dwo_unit *dwo_unit = OBSTACK_ZALLOC (&per_bfd->obstack, struct dwo_unit);

We could take the lock around this allocation, but I think it's just
easier to avoid the problem by having the dwo_unit objects allocated
with "new".

Change-Id: Ida04f905cb7941a8826e6078ed25dbcf57674090
Approved-By: Tom Tromey <tom@tromey.com>
2025-05-23 11:12:53 -04:00
Tom Tromey
8d13d83aba Handle an argument-less operator in the C++ name parser
While debugging a new failure in my long-suffering "search-in-psyms"
series, I found that the C++ name canonicalizer did not handle a case
like "some_name::operator new []".  This should remove the space,
resulting in "some_name::operator new[]" -- but does not.

This happens because the parser requires an operator to be followed by
argument types.  That is, it's expected.

However, it seems to me that we do want to be able to canonicalize a
name like this.  It will appear in the DWARF as a DW_AT_name, and
furthermore it could be entered by the user.

This patch fixes this problem by changing the grammar to supply the
"()" itself, then removing the trailing "()" when changing to string
form (in the functions that matter).

This isn't ideal -- it might miss a very obscure case involving the
gdb extension of providing fully-qualified names for function-local
statics -- but it improves the situation at least.

It's possible a better solution might be to rewrite the name
canonicalizer.  I was wondering if this could perhaps be done without
reference to the grammar -- just by examining the tokens.  However,
that's much more involved.

Let me know what you think.

Regression tested on x86-64 Fedora 40.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32939
Reviewed-By: Keith Seitz <keiths@redhat.com>
2025-05-23 08:48:18 -06:00
Nick Alcock
14303d6295 libctf: archive, open: when opening, always set errp to something
ctf_arc_import_parent, called by the cached-opening machinery used by
ctf_archive_next and archive-wide lookup functions like
ctf_arc_lookup_symbol, has an err-pointer parameter like all other opening
functions.  Unfortunately it unconditionally initializes it whenever
provided, even if there was no error, which can lead to its being
initialized to an uninitialized value.  This is not technically an
API-contract violation, since we don't define what happens to the error
value except when an error happens, but it is still unpleasant.

Initialize it only when there is an actual error, so we never initialize it
to an uninitialized value.

While we're at it, improve all the opening pathways: on success, set errp to
0, rather than leaving it what it was, reducing the likelihood of
uninitialized error param returns in callers too.  (This is inconsistent
with the treatment of ctf_errno(), but the err value being a parameter
passed in from outside makes the divergence acceptable: in open functions,
you're never going to be overwriting some old error value someone might want
to keep around across multiple calls, some of which are successful and some
of which are not.)

Soup up existing tests to verify all this.

Thanks to Bruce McCulloch for the original patch, and Stephen Brennan for
the report.

libctf/
	PR libctf/32903
	* ctf-archive.c (ctf_arc_open_internal): Zero errp on success.
	(ctf_dict_open_sections): Zero errp at the start.
	(ctf_arc_import_parent): Intialize err.
	* ctf-open.c (ctf_bufopen): Zero errp at the start.
	* testsuite/libctf-lookup/add-to-opened.c: Make sure one-element
	archive opens update errp.
	* testsuite/libctf-writable/ctf-compressed.c: Make sure real archive
	opens update errp.
2025-05-23 12:34:35 +01:00
Jiawei
a3d6596ecf RISC-V: Add support for RISC-V Profiles 23.
This patch adds support for RISC-V RVA23 and RVB23 Profiles[1].

[1] https://github.com/riscv/riscv-profiles/releases/tag/rva23-rvb23-ratified

bfd/ChangeLog:

	* elfxx-riscv.c: New profiles.

gas/ChangeLog:

	* testsuite/gas/riscv/attribute-19.d: New test.
	* testsuite/gas/riscv/attribute-20.d: New test.
2025-05-23 09:21:55 +08:00
Jiawei
3d7fb9fa5c RISC-V: Add support for RISC-V Profiles 20/22.
This patch introduces support for RISC-V Profiles RV20 and RV22 [1],
enabling developers to utilize these profiles through the -march option.

[1] https://github.com/riscv/riscv-profiles/releases/tag/v1.0

bfd/ChangeLog:

	* elfxx-riscv.c (struct riscv_profiles): New struct.
	(riscv_parse_extensions): New argument.
	(riscv_find_profiles): New checking function.
	(riscv_parse_subset): Add Profiles handler.

gas/ChangeLog:

	* NEWS: Add RISC-V Profiles.
	* doc/as.texi: Update -march input type.
	* doc/c-riscv.texi: Ditto.
	* testsuite/gas/riscv/option-arch-fail.l: Modify hint info.
	* testsuite/gas/riscv/attribute-17.d: New test.
	* testsuite/gas/riscv/attribute-18.d: New test.
	* testsuite/gas/riscv/march-fail-rvi20u64v.d: New test.
	* testsuite/gas/riscv/march-fail-rvi20u64v.l: New test.
2025-05-23 09:21:49 +08:00
GDB Administrator
13a5dd968f Automatic date update in version.in 2025-05-23 00:00:14 +00:00
QBos07
6cd9586f7f PR 3298 Fix SuperH relaxation overriding wrong intruction
when doing load store switching it wrongly adjusts the address of the
R_SH_USES reloc and not the actual offset from that instruction. This is
an issue if the pc-relative function call relaxation gets done in a
later pass wich will result in overriding the wrong instruction.
2025-05-23 08:57:50 +09:30
Alan Modra
689f3edfb8 rs_fill_nop and md_generate_nops
Make rs_fill_nop behave like rs_fill in using a repeat count
(fr_offset) to emit fr_var length repeated nop patterns.  Besides
being more elegant, this reduces memory required for large .nops
directives.

	* as.h (rs_fill_nop): Update comment.
	* config/tc-i386.c (i386_generate_nops): Handle rs_fill_nop as
	for rs_align_code.
	* config/tc-i386.h (MAX_MEM_FOR_RS_SPACE_NOP): Define.
	* listing.c (calc_hex): Handle rs_fill_nop as for rs_fill.
	* read.c (MAX_MEM_FOR_RS_SPACE_NOP): Define.
	(s_nops): Use MAX_MEM_FOR_RS_SPACE_NOP setting up frag.
	* write.c (write_contents): Call md_generate_nops for rs_fill_nop
	before the fr_fix part is written, so that rs_fill_nop can be
	handled as for rs_fill.
2025-05-23 08:26:08 +09:30
Alan Modra
0c951ab895 Re: gas .align limit
Now that rs_align_code has been corrected for all targets, put the
.align limit back to bits_per_address-1.  Also fix a comment.

	* frags.h (fr_var): Correct comment.
	* read.c (TC_ALIGN_LIMIT): Revert commit ff4c03516c change.
2025-05-23 08:26:08 +09:30