Commit Graph

118612 Commits

Author SHA1 Message Date
GDB Administrator
cdf5362f56 Automatic date update in version.in 2024-05-07 00:00:21 +00:00
Bernd Edlinger
45e83f8658 Fix build issues with mingw toolchain
With a x86_64-pc-mingw32 toolchain there is a build issue
whether or not the --disable-threading option is used.
The problem happens because _WIN32_WINNT is defined to 0x501
before #include <mutex> which makes the compilation abort
due to missing support for __gthread_cond_t in std_mutex.h,
which is conditional on _WIN32_WINNT >= 0x600.

Fix the case when --disable-threading is used, by only
including <mutex> in gdb/complaints.c when STD_CXX_THREAD
is defined.

Additionally make the configure script try to #include <mutex>
to automatically select --disable-threading when the header file
is not able to compile.

Approved-By: Tom Tromey <tom@tromey.com>
2024-05-06 18:44:54 +02:00
Tom de Vries
147fe7f9fb [gdb/testsuite] Handle ptrace operation not permitted in can_spawn_for_attach
When running the testsuite on a system with kernel.yama.ptrace_scope set to 1,
we run into attach failures.

Fix this by recognizing "ptrace: Operation not permitted" in
can_spawn_for_attach.

Tested on aarch64-linux and x86_64-linux.

Approved-By: Pedro Alves <pedro@palves.net>
2024-05-06 14:27:09 +02:00
Tom de Vries
5edbb6ed92 [gdb/exp] Redo cast handling for indirection
In commit ed8fd0a342 ("[gdb/exp] Fix cast handling for indirection"), I
introduced the behaviour that even though we have:
...
(gdb) p *a_loc ()
'a_loc' has unknown return type; cast the call to its declared return type
...
we get:
...
(gdb) p (char)*a_loc ()
$1 = 97 'a'
...

In other words, the unknown return type of a_loc is inferred from the cast,
effectually evaluating:
...
(gdb) p (char)*(char *)a_loc ()
...

This is convient for the case that errno is defined as:
...
 #define errno (*__errno_location ())
...
and the return type of __errno_location is unknown but the macro definition is
known, such that we can use:
...
(gdb) p (int)errno
...
instead of
...
(gdb) p *(int *)__errno_location ()
...

However, as Pedro has pointed out in post-commit review [1], this makes it
harder to reason about the semantics of an expression.

For instance, this:
...
(gdb) p (long long)*a_loc ()"
...
would be evaluated without debug info as:
...
(gdb) p (long long)*(long long *)a_loc ()"
...
but with debug info as:
...
(gdb) p (long long)*(char *)a_loc ()"
...

Fix this by instead simply erroring out for this case:
...
(gdb) p (char)*a_loc ()
'a_loc' has unknown return type; cast the call to its declared return type
...

Tested on x86_64-linux.

Approved-By: Pedro Alves <pedro@palves.net>

[1] https://sourceware.org/pipermail/gdb-patches/2024-May/208821.html
2024-05-06 14:23:25 +02:00
Cui, Lili
c8866e3ec5 x86: Drop using extension_opcode to encode vvvv register
gas/ChangeLog:

        * config/tc-i386.c (build_modrm_byte): Dropped the use of
        extension_opcode to encode the vvvv register.
        * testsuite/gas/i386/x86-64-sse2avx.d: Added new testcases.
        * testsuite/gas/i386/x86-64-sse2avx.s: Diito.

opcodes/ChangeLog:

        * i386-opc.tbl: Added DstVVVV to some extension_opcode instructions.
	* i386-tbl.h: Regenerated.
2024-05-06 18:33:45 +08:00
Cui, Lili
0820c9f5fc x86: Drop SwapSources
gas/ChangeLog:

        * config/tc-i386.c (build_modrm_byte): Dropped the use of
	SWAP_SOURCES to encode the vvvv register.

opcodes/ChangeLog:

        * i386-opc.h (SWAP_SOURCES): Dropped.
        (NO_DEFAULT_MASK): Adjusted the value.
        (ADDR_PREFIX_OP_REG): Ditto.
        (DISTINCT_DEST): Ditto.
        (IMPLICIT_STACK_OP): Ditto.
        (VexVVVV_SRC2): New.
        * i386-opc.tbl: Dropped SwapSources and replaced its VexVVVV
	with Src1VVVV.
	* i386-tbl.h: Regenerated.
2024-05-06 18:21:28 +08:00
Cui, Lili
f2a3a8814d x86: Use vexvvvv as the switch state to encode the vvvv register
Use vexvvvv as the switch state, and replace VexVVVV with Src1VVVV.
Src1VVVV means using VEX.vvvv encodes the first source register
operand. The old logic did not check vexvvvv first, which made the
logic here very complicated.

gas/ChangeLog:

        * config/tc-i386.c (optimize_encoding): Replaced 1 with Src1VVVV.
        (build_modrm_byte): Used vexvvvv to encode the vvvv register.
        (s_insn): Replaced 1 with Src1VVVV.

opcodes/ChangeLog:

        * i386-opc.h (VexVVVV_DST): Adjusted the value.
        (Src1VVVV): New.
        * i386-opc.tbl: Replaced part VexVVVV with Src1VVVV.
	* i386-tbl.h: Regenerated.
2024-05-06 18:16:42 +08:00
GDB Administrator
f4c1c984bf Automatic date update in version.in 2024-05-06 00:00:15 +00:00
GDB Administrator
bf79d8caea Automatic date update in version.in 2024-05-05 00:00:13 +00:00
Hannes Domani
5140d8e013 Fix heap-use-after-free in index-cached with --disable-threading
If threads are disabled, either by --disable-threading explicitely, or by
missing std::thread support, you get the following ASAN error when
loading symbols:

==7310==ERROR: AddressSanitizer: heap-use-after-free on address 0x614000002128 at pc 0x00000098794a bp 0x7ffe37e6af70 sp 0x7ffe37e6af68
READ of size 1 at 0x614000002128 thread T0
    #0 0x987949 in index_cache_store_context::store() const ../../gdb/dwarf2/index-cache.c:163
    #1 0x943467 in cooked_index_worker::write_to_cache(cooked_index const*, deferred_warnings*) const ../../gdb/dwarf2/cooked-index.c:601
    #2 0x1705e39 in std::function<void ()>::operator()() const /gcc/9/include/c++/9.2.0/bits/std_function.h:690
    #3 0x1705e39 in gdb::task_group::impl::~impl() ../../gdbsupport/task-group.cc:38

0x614000002128 is located 232 bytes inside of 408-byte region [0x614000002040,0x6140000021d8)
freed by thread T0 here:
    #0 0x7fd75ccf8ea5 in operator delete(void*, unsigned long) ../../.././libsanitizer/asan/asan_new_delete.cc:177
    #1 0x9462e5 in cooked_index::index_for_writing() ../../gdb/dwarf2/cooked-index.h:689
    #2 0x9462e5 in operator() ../../gdb/dwarf2/cooked-index.c:657
    #3 0x9462e5 in _M_invoke /gcc/9/include/c++/9.2.0/bits/std_function.h:300

It's happening because cooked_index_worker::wait always returns true in
this case, which tells cooked_index::wait it can delete the m_state
cooked_index_worker member, but cooked_index_worker::write_to_cache tries
to access it immediately afterwards.

Fixed by making cooked_index_worker::wait only return true if desired_state
is CACHE_DONE, same as if threading was enabled, so m_state will not be
prematurely deleted.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31694
Approved-By: Tom Tromey <tom@tromey.com>
2024-05-04 18:55:20 +02:00
Tom Tromey
b42d685452 Remove dwarf2_per_objfile::adjust
All the calls to dwarf2_per_objfile::adjust have been removed, so we
can remove this function entirely.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31261
2024-05-04 09:30:31 -06:00
Tom Tromey
12fddc10c3 Remove call to dwarf2_per_objfile::adjust from read_attribute_value
Currently, read_attribute_value calls dwarf2_per_objfile::adjust on
any address.  This seems wrong, because the address may not even be in
the text section.

Luckily, this call is also not needed, because read_func_scope calls
'relocate', which does the same work.
2024-05-04 09:30:30 -06:00
Tom Tromey
6142f7cd83 Remove call to dwarf2_per_objfile::adjust from read_call_site_scope
read_call_site_scope does not need to call 'adjust', because in
general the call site is not a symbol address, but rather just the
address of some particular call.
2024-05-04 09:30:30 -06:00
Tom Tromey
a5a4010189 Remove more calls to dwarf2_per_objfile::adjust
As with the previous patch, this patch removes some calls to
dwarf2_per_objfile::adjust.  These calls are not needed by the cooked
indexer, as it does not create symbols or look up symbols by address.

The call in dwarf2_ranges_read is similarly not needed, as it is only
used to update an addrmap; and in any case I believe this particular
call is only reached by the indexer.
2024-05-04 09:30:30 -06:00
Tom Tromey
91fc201ed4 Remove call to dwarf2_per_objfile::adjust from ranges readers
dwarf2_per_objfile::adjust applies gdbarch_adjust_dwarf2_addr to an
address, leaving the result unrelocated.  However, this adjustment is
only needed for text-section symbols -- it isn't needed for any sort
of address mapping.  Therefore, these calls can be removed from
read_addrmap_from_aranges and create_addrmap_from_gdb_index.

Approved-By: Andrew Burgess <aburgess@redhat.com>
2024-05-04 09:30:30 -06:00
Alan Modra
c7a1fe2286 bus error with fuzzed archive element
* libbfd.c (bfd_mmap_local): Sanity check rsize against actual
	file offset and size, not an archive element offset and size.
2024-05-04 19:20:24 +09:30
Tom de Vries
c479e964a8 [gdb/testsuite] Use unique portnum in parallel testing (check//% case)
Make target check//% is the gdb variant of a similar gcc make target [1].

When running tests using check//%:
...
$ cd build/gdb
$ make check//unix/{-fPIE/-pie,-fno-PIE/-no-pie} -j2 TESTS=gdb.server/*.exp
...
we get:
...
$ cat build/gdb/testsuite.unix.-fPIE.-pie/cache/portnum
2427
$ cat build/gdb/testsuite.unix.-fno-PIE.-no-pie/cache/portnum
2423
...

The problem is that there are two portnum files used in parallel.

Fix this by:
- creating a common lockdir build/gdb/testsuite.lockdir for make target
  check//%,
- passing this down to the runtests invocations using variable GDB_LOCK_DIR,
  and
- using GDB_LOCK_DIR in lock_dir.

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>

PR testsuite/31632
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31632

[1] https://gcc.gnu.org/install/test.html
2024-05-04 10:41:09 +02:00
Tom de Vries
e82dca2a57 [gdb/testsuite] Use unique portnum in parallel testing
When instrumenting get_portnum using:
...
puts "PORTNUM: $res"
...
and running:
...
$ cd build/gdb
$ make check-parallel -j2 TESTS=gdb.server/*.exp
...
we run into:
...
Running gdb.server/abspath.exp ...
PORTNUM: 2345
...
and:
...
Running gdb.server/bkpt-other-inferior.exp ...
PORTNUM: 2345
...

This is because the test-cases are run in independent runtest invocations.

Fix this by handling the parallel case in get_portnum using:
- a file $objdir/cache/portnum to keep the portnum variable, and
- a file $objdir/cache/portnum.lock to serialize access to it.

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
2024-05-04 10:41:09 +02:00
Tom de Vries
a0a6e11019 [gdb/testsuite] Move gpu-parallel.lock to cache dir
The lock directory returned by lock_dir is currently $objdir.

It seems possible to leave a stale lock file that blocks progress in a
following run.

Fix this by using a directory that is guaranteed to be initially empty when
using GDB_PARALLEL, like temp or cache.

In gdb/testsuite/README I found:
...
cache in particular is used to share data across invocations of runtest
...
which seems appropriate, so let's use cache for this.

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
2024-05-04 10:41:09 +02:00
Tom de Vries
007a7cb675 [gdb/testsuite] Factor out proc lock_dir
In lib/rocm.exp we have:
...
set gpu_lock_filename $objdir/gpu-parallel.lock
...

This decides both the lock file name and directory.

Factor out a new proc lock_dir that decides on the directory, leaving just:
...
set gpu_lock_filename gpu-parallel.lock
...

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
2024-05-04 10:41:09 +02:00
Tom de Vries
fbb0edfe60 [gdb/testsuite] Factor out proc with_lock
Factor out proc with_lock from with_rocm_gpu_lock, and move required procs
lock_file_acquire and lock_file_release to lib/gdb-utils.exp.

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
2024-05-04 10:41:09 +02:00
Tom de Vries
c42c12f9bf [gdb/testsuite] Make portnum a persistent global
When instrumenting get_portnum using:
...
    puts "PORTNUM: $res"
...
and running:
...
$ cd build/gdb
$ make check TESTS=gdb.server/*.exp
...
we get:
...
Running gdb.server/target-exec-file.exp ...
PORTNUM: 2345
Running gdb.server/stop-reply-no-thread-multi.exp ...
PORTNUM: 2345
PORTNUM: 2346
PORTNUM: 2347
PORTNUM: 2348
PORTNUM: 2349
PORTNUM: 2350
...

So, while get_portnum does return increasing numbers in a single test-case, it
restarts at each test-case.

This is a regression since the introduction of persistent globals.

Fix this by using "gdb_persistent_global portnum", such that we get:
...
Running gdb.server/target-exec-file.exp ...
PORTNUM: 2345
Running gdb.server/stop-reply-no-thread-multi.exp ...
PORTNUM: 2346
PORTNUM: 2347
PORTNUM: 2348
PORTNUM: 2349
PORTNUM: 2350
PORTNUM: 2351
...

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
2024-05-04 10:41:09 +02:00
Tom de Vries
b6dfea2438 [gdb/testsuite] Factor out proc get_portnum
In gdbserver_start, we have some code that determines what port number to use:
...
    # Port id -- either specified in baseboard file, or managed here.
    if [target_info exists gdb,socketport] {
       set portnum [target_info gdb,socketport]
    } else {
       # Bump the port number to avoid conflicts with hung ports.
       incr portnum
    }
...

Factor this out into a new proc get_portnum.

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
2024-05-04 10:41:09 +02:00
GDB Administrator
f4b228ee68 Automatic date update in version.in 2024-05-04 00:00:12 +00:00
Pedro Alves
ccdb887584 Adjust gdb_continue_to_end for Windows
On Cygwin, supposely single-threaded programs are always
multi-threaded, due to the extra threads spawned by the Cygwin
runtime.  Because of that, any gdb_continue_to_end call that doesn't
specify "allow_extra" fails, like so:

 (gdb) PASS: gdb.base/langs.exp: show language at main
 continue
 Continuing.
 [Thread 16140.0x1fbc exited with code 0]
 [Thread 16140.0x2458 exited with code 0]
 [Thread 16140.0x3494 exited with code 0]
 [Inferior 1 (process 16140) exited normally]
 (gdb) FAIL: gdb.base/langs.exp: continue until exit at first session (the program exited)

Similarly, with this simple program compiled with MinGW:

 $ cat ~/sleeper.c
 #include <windows.h>

 int main ()
 {
   Sleep (2000);
   return 0;
 }

and with a MinGW GDB, I see:

 (gdb) start
 ...
 (gdb) info threads
   Id   Target Id           Frame
 * 1    Thread 15292.0x3850 main () at /home/alves/sleeper.c:5
   2    Thread 15292.0x3048 0x00007ff9630d2fb7 in ntdll!ZwWaitForWorkViaWorkerFactory () from C:\Windows\SYSTEM32\ntdll.dll
 (gdb) c
 Continuing.
 [Thread 15292.0x3850 exited with code 0]
 [Inferior 1 (process 15292) exited normally]
 (gdb)

This commit adjusts gdb_continue_to_end to expect the thread exited
messages, on Cygwin and MinGW.

Change-Id: I5e410a7252c11cd9ecea632f1e00c2a7fcd69098
Approved-By: Andrew Burgess <aburgess@redhat.com>
2024-05-03 17:39:17 +01:00
Mark Wielaard
67fe874896 [gdb/build] Fix gdbserver/linux-aarch64-low.cc build
Commit 0ee25f97d2 ("Fix regression on aarch64-linux gdbserver")
removed the last use of i in gdbserver/linux-aarch64-low.cc
(aarch64_target::low_stopped_data_address). Breaking the build on
aarch64 with:

gdbserver/linux-aarch64-low.cc: In member function ?virtual CORE_ADDR aarch64_target::low_stopped_data_address()?:
gdbserver/linux-aarch64-low.cc:557:12: error: unused variable ?i? [-Werror=unused-variable]
  557 |   int pid, i;
      |            ^
cc1plus: all warnings being treated as errors

Fix this by removing the variable i completely.

Fixes: 0ee25f97d2 ("Fix regression on aarch64-linux gdbserver")
2024-05-03 15:17:42 +02:00
Tom de Vries
9dd1e64208 [gdb/testsuite] Use save_vars to restore GDBFLAGS
There's a pattern of using:
...
set saved_gdbflags $GDBFLAGS
set GDBFLAGS "$GDBFLAGS ..."
<do something with GDBFLAGS>
set GDBFLAGS $saved_gdbflags
...

Simplify this by using save_vars:
...
save_vars { GDBFLAGS } {
    set GDBFLAGS "$GDBFLAGS ..."
    <do something with GDBFLAGS>
}
...

Tested on x86_64-linux.
2024-05-03 15:07:33 +02:00
Tom de Vries
bab7860fa7 [gdb/testsuite] Remove superfluous -quiet and -ex set width/height 0
INTERNAL_GDBFLAGS contains:
- -quiet
- -iex "set width 0"
- -iex "set height 0"

There are test-cases that add these once more.

Clean this up.

Tested on x86_64-linux.

PR testsuite/31649
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31649
2024-05-03 15:07:33 +02:00
Tom de Vries
47d6a24298 [gdb/testsuite] Update INTERNAL_GDBFLAGS example
In commit 31c5028017 ("[gdb/testsuite] Add -q to INTERNAL_GDBFLAGS") I added
-q to the INTERNAL_GDBFLAGS, but I forgot to update the INTERNAL_GDBFLAGS
example in gdb/testsuite/README.

Fix this by adding the -q there as well.
2024-05-03 15:07:33 +02:00
Tom de Vries
ed8fd0a342 [gdb/exp] Fix cast handling for indirection
Consider a test-case compiled without debug info, containing:
...
char a = 'a';

char *
a_loc (void)
{
  return &a;
}
...

We get:
...
(gdb) p (char)*a_loc ()
Cannot access memory at address 0x10
...

There's a bug in unop_ind_base_operation::evaluate that evaluates
"(char)*a_loc ()" the same as:
...
(gdb) p (char)*(char)a_loc ()
Cannot access memory at address 0x10
...

Fix this by instead evaluating it the same as:
...
(gdb) p (char)*(char *)a_loc ()
$1 = 97 'a'
...

Tested on x86_64-linux.

PR exp/31693
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31693
2024-05-03 09:37:19 +02:00
Jan Beulich
e6d60e7624 x86: tidy <sse*> templates
Some of them no longer need a separate vvvv attribute, thus allowing
them to be simplified. For <aes> the situation is slightly different:
None of the remaining uses make use of vvvv anymore.
2024-05-03 09:27:25 +02:00
Jan Beulich
1d026d6b19 x86/APX: further extend SSE2AVX coverage
Since {vex}/{vex3} are respected on legacy mnemonics when -msse2avx is
in use, {evex} should be respected, too. So far this is the case only
for insns where eGPR-s can come into play. Extend coverage to insns with
only %xmm register and possibly immediate operands.
2024-05-03 09:27:00 +02:00
Jan Beulich
24187fb9c0 x86/APX: extend SSE2AVX coverage
Legacy encoded SIMD insns are converted to AVX ones in that mode. When
eGPR-s are in use, i.e. with APX, convert to AVX10 insns (where
available; there are quite a few which can't be converted).

Note that LDDQU is represented as VMOVDQU32 (and the prior use of the
sse3 template there needs dropping, to get the order right).

Note further that in a few cases, due to the use of templates, AVX512VL
is used when AVX512F would suffice. Since AVX10 is the main reference,
this shouldn't be too much of a problem.
2024-05-03 09:26:25 +02:00
Jan Beulich
d125c4bbce x86: zap value-less Disp8MemShift from non-EVEX templates
In order to allow to continue to use templatized SSE2AVX templates when
enhancing those to also cover eGPR usage, Disp8MemShift wants using to
deviate from what general template attributes supply. That requires
using Disp8MemShift in a way also affecting non-EVEX templates, yet
having this attribute set would so far implicitly mean EVEX encoding.
Recognize the case and instead zap the attribute if no other attribute
indicates EVEX encoding.

No change in generated tables.
2024-05-03 09:24:48 +02:00
GDB Administrator
84a069db67 Automatic date update in version.in 2024-05-03 00:00:18 +00:00
Tom Tromey
0ee25f97d2 Fix regression on aarch64-linux gdbserver
Commit 9a03f218 ("Fix gdb.base/watchpoint-unaligned.exp on aarch64")
fixed a watchpoint bug in gdb -- but did not touch the corresponding
code in gdbserver.

This patch moves the gdb code into gdb/nat, so that it can be shared
with gdbserver, and then changes gdbserver to use it, fixing the bug.

This is yet another case where having a single back end would prevent
bugs.

I tested this using the AdaCore internal gdb testsuite.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29423
Approved-By: Luis Machado <luis.machado@arm.com>
2024-05-02 10:04:14 -06:00
Alan Modra
635d05b88f PR31692, objdump fails .debug_info size check
PR 31692
	* objdump.c (load_specific_debug_section): Replace bfd_get_size
	check with bfd_section_size_insane.  Call free_debug_section
	after printing error messages.  Set section->start NULL when
	freeing.
2024-05-02 19:07:50 +09:30
Tom de Vries
5ce0e02478 [gdb/symtab] Work around PR gas/29517, dwarf2 case
In commit 1d45d90934 ("[gdb/symtab] Work around PR gas/29517") we added a
workaround for PR gas/29517.

The problem is present in gas version 2.39, and fixed in 2.40, so the
workaround is only active for gas version == 2.39.

However, the problem in gas is only fixed for dwarf version >= 3, which
supports DW_TAG_unspecified_type.

Fix this by also activating the workaround for dwarf version == 2.

Tested on x86_64-linux.

Approved-by: Kevin Buettner <kevinb@redhat.com>

PR symtab/31689
https://sourceware.org/bugzilla/show_bug.cgi?id=31689
2024-05-02 09:34:46 +02:00
GDB Administrator
75d933919d Automatic date update in version.in 2024-05-02 00:00:10 +00:00
Tom de Vries
347775edd4 [gdb/testsuite] Fix stray file in get_compiler_info
When running test-case gdb.dwarf2/gdb-index-nodebug.exp with host board
local-remote-host and target board remote-gdbserver-on-localhost, I get:
...
$ ls build/gdb/testsuite
cache    compiler.i  config.log  config.status  gdb.log  gdb.sum  lib  Makefile
outputs  site.bak    site.exp    temp
...

The file compiler.i is there because get_compiler_info uses:
...
	set ppout "$outdir/compiler.i"
...

The file is a temporary, and as such belongs in a temp dir.  Fix this by using
standard_temp_file, moving the file to build/gdb/testsuite/temp/<pid>/compiler.i.

Tested on x86_64-linux.
2024-05-01 11:46:05 +02:00
Tom de Vries
385ab37c5b [gdb/testsuite] Fix stray file in gdb.dwarf2/gdb-index-nodebug.exp
After running test-case gdb.dwarf2/gdb-index-nodebug.exp I have:
...
$ ls build/gdb/testsuite
cache       config.status                gdb.log  lib       outputs   site.exp
config.log  gdb-index-nodebug.gdb-index  gdb.sum  Makefile  site.bak  temp
...

The file gdb-index-nodebug.gdb-index doesn't belong there.

It happens to be there because we do:
...
set index_file ${testfile}.gdb-index
set cmd "save gdb-index [file dirname ${index_file}]"
...
which results in:
...
(gdb) save gdb-index .
...

The intention was possibly to use $binfile instead of $testfile, but using
that wouldn't work for remote host.

Fix this by using host_standard_output_file.

Tested on x86_64-linux.
2024-05-01 11:11:24 +02:00
GDB Administrator
7320840f19 Automatic date update in version.in 2024-05-01 00:00:19 +00:00
Nelson Chu
7bd696ef49 RISC-V: PR29823, defined the missing elf_backend_obj_attrs_handle_unknown.
bfd/
	PR 29823
	* elfnn-riscv.c (riscv_elf_obj_attrs_handle_unknown): New function.
	(elf_backend_obj_attrs_handle_unknown): Defined to
	riscv_elf_obj_attrs_handle_unknown.
2024-04-30 13:45:04 +08:00
Thiago Jung Bauermann
6b4b601b35 gdb/testsuite: Add gdb.base/memops-watchpoint.exp
Test behaviour of watchpoints triggered by libc's memset/memcpy/memmove.
These functions are frequently optimized with specialized instructions
that favor larger memory access operations, so make sure GDB behaves
correctly in their presence.

There's a separate watched variable for each function so that the testcase
can test whether GDB correctly identified the watchpoint that triggered.

Also, the watchpoint is 28 bytes away from the beginning of the buffer
being modified, so that large memory accesses (if present) are exercised.

PR testsuite/31484
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31484

Approved-by: Kevin Buettner <kevinb@redhat.com>
2024-04-29 23:59:43 -03:00
Thiago Jung Bauermann
c930a07722 gdb/nat/linux: Fix attaching to process when it has zombie threads
When GDB attaches to a multi-threaded process, it calls
linux_proc_attach_tgid_threads () to go through all threads found in
/proc/PID/task/ and call attach_proc_task_lwp_callback () on each of
them.  If it does that twice without the callback reporting that a new
thread was found, then it considers that all inferior threads have been
found and returns.

The problem is that the callback considers any thread that it hasn't
attached to yet as new.  This causes problems if the process has one or
more zombie threads, because GDB can't attach to it and the loop will
always "find" a new thread (the zombie one), and get stuck in an
infinite loop.

This is easy to trigger (at least on aarch64-linux and powerpc64le-linux)
with the gdb.threads/attach-many-short-lived-threads.exp testcase, because
its test program constantly creates and finishes joinable threads so the
chance of having zombie threads is high.

This problem causes the following failures:

FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: attach (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: no new threads (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: set breakpoint always-inserted on (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: break break_fn (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: break at break_fn: 1 (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: break at break_fn: 2 (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: break at break_fn: 3 (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: reset timer in the inferior (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: print seconds_left (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: detach (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: set breakpoint always-inserted off (timeout)
FAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 8: delete all breakpoints, watchpoints, tracepoints, and catchpoints in delete_breakpoints (timeout)
ERROR: breakpoints not deleted

The iteration number is random, and all tests in the subsequent iterations
fail too, because GDB is stuck in the attach command at the beginning of
the iteration.

The solution is to make linux_proc_attach_tgid_threads () remember when it
has already processed a given LWP and skip it in the subsequent iterations.

PR testsuite/31312
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31312

Reviewed-By: Luis Machado <luis.machado@arm.com>
Approved-By: Pedro Alves <pedro@palves.net>
2024-04-29 23:14:11 -03:00
Thiago Jung Bauermann
16a447bec5 gdb/nat: Factor linux_proc_get_stat_field out of linux_common_core_of_thread
The new function will be used in a subsequent patch to read a different
stat field.

The new code is believed to be equivalent to the old code, so there
should be no change in GDB behaviour.  The only material change was to
use std::string and string_printf rather than a fixed char array to
build the path to the stat file.

Also, take the opportunity to move the function's documentation comment to
the header file, to conform with GDB practice.

Reviewed-By: Luis Machado <luis.machado@arm.com>
Approved-By: Pedro Alves <pedro@palves.net>
2024-04-29 23:14:06 -03:00
Thiago Jung Bauermann
3de4256ca3 gdb/nat: Use procfs(5) indexes in linux_common_core_of_thread
The code and comment reference stat fields by made-up indexes.  The
procfs(5) man page, which describes the /proc/PID/stat file, has a numbered
list of these fields so it's more convenient to use those numbers instead.

This is currently an implementation detail inside the function so it's
not really relevant with the code as-is, but a future patch will do some
refactoring which will make the index more prominent.

Therefore, make this change in a separate patch so that it's simpler to
review.

Reviewed-By: Luis Machado <luis.machado@arm.com>
Approved-By: Pedro Alves <pedro@palves.net>
2024-04-29 23:13:57 -03:00
GDB Administrator
a75d04db22 Automatic date update in version.in 2024-04-30 00:00:23 +00:00
Pedro Alves
43ca4ec299 gdb/Cygwin: Fix attach pid error message
On Cygwin, with "attach PID":

 - GDB first tries to interpret PID as a Windows native PID, and tries
   to attach to that.

 - if the attach fails, GDB then tries to interpret the PID as a
   Cygwin PID, and attach to that.

If converting the user-provided PID from a Cygwin PID to a Windows PID
fails, you get this:

 (gdb) attach 12345
 Can't attach to process 0 (error 2: The system cannot find the file specified.)

Note "process 0".

With the fix in this commit, we'll now get:

 (gdb) attach 12345
 Can't attach to process 12345 (error 2: The system cannot find the file specified.)

I noticed this while looking at gdb.log after running
gdb.base/attach.exp on Cygwin.

Change-Id: I05b9dc1f3a634a822ea49bb5c61719f5e62c8514
Approved-By: Luis Machado <luis.machado@arm.com>
2024-04-29 16:20:46 +01:00
Andrew Burgess
2fb3ca4e88 gdb/doc: document how filename arguments are formatted
In the following commits I intend to improve GDB's filename
completion.  However, how filenames should be completed is a little
complex because GDB is not consistent with how it expects filename
arguments to be formatted.

This commit documents the current state of GDB when it comes to
formatting filename arguments.

Currently GDB will not correctly complete filenames inline with this
documentation; GDB will either fail to complete, or complete
incorrectly (i.e. the result of completion will not then be accepted
by GDB).  However, later commits in this series will fix completion.

Approved-By: Eli Zaretskii <eliz@gnu.org>
2024-04-29 10:08:59 +01:00