Commit Graph

121638 Commits

Author SHA1 Message Date
Tom de Vries
f9f0332200 [gdb/record] Support recording syscall accept4
While reviewing the enum gdb_syscall entries with values >= 500, I noticed
that gdb_sys_accept exists, but gdb_sys_accept4 doesn't, while recording
support is essentially the same, given that the difference in interface is
only an extra int parameter:
...
int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
...

Fix this by:
- adding gdb_sys_accept4,
- supporting it in record_linux_system_call alongside gdb_sys_accept, and
- mapping to gdb_sys_accept4 in various syscall canonicalization functions.

The usual thing to do before the rewrite of i386_canonicalize_syscall would
have been to use the value from arch/x86/entry/syscalls/syscall_32.tbl:
...
  gdb_sys_accept4 = 364,
...
but that's no longer necessary, so instead we use some >= 500 value:
...
  gdb_sys_accept4 = 533,
...
to steer clear of the space where ppc_canonicalize_syscall and
s390_canonicalize_syscall do hard-coded number magic.

Tested on x86_64-linux, with and without target board unix/-m32, and
aarch64-linux.

Approved-By: Guinevere Larsen <guinevere@redhat.com>
2025-03-13 07:41:51 +01:00
Tom de Vries
fbfb29b304 [gdb/tdep] Rewrite i386_canonicalize_syscall
On openSUSE Tumbleweed x86_64, with target board unix/-m32 and test-case
gdb.reverse/recvmsg-reverse.exp, I run into:
...
(gdb) continue^M
Continuing.^M
Process record and replay target doesn't support syscall number 360^M
Process record: failed to record execution log.^M
^M
Program stopped.^M
0xf7fc5575 in __kernel_vsyscall ()^M
(gdb) FAIL: $exp: continue to breakpoint: marker2
...

The syscall number 360 in i386 is for syscall socketpair, as we can see in
arch/x86/entry/syscalls/syscall_32.tbl:
...
<number>  <abi>  <name>      <entry point>
360       i386   socketpair  sys_socketpair
...

Function i386_canonicalize_syscall assumes that any syscall below 500 maps to
an identically valued enum in enum gdb_syscall:
...
static enum gdb_syscall
i386_canonicalize_syscall (int syscall)
{
  enum { i386_syscall_max = 499 };

  if (syscall <= i386_syscall_max)
    return (enum gdb_syscall) syscall;
  else
    return gdb_sys_no_syscall;
}
...

However, that's not the case.  The value of gdb_sys_socketpair is not 360,
but 512:
...
enum gdb_syscall {
  ...
  gdb_sys_getrandom = 355,
  gdb_sys_statx = 383,
  ...
  gdb_sys_socketpair = 512,
...

Consequently, when record_linux_system_call is called with
syscall == i386_canonicalize_syscall (360), we hit the default case here:
....
  switch (syscall)
    {
    ...
    default:
      gdb_printf (gdb_stderr,
                  _("Process record and replay target doesn't "
                    "support syscall number %d\n"), syscall);
      return -1;
      break;
    }
...
rather than hitting the case for gdb_sys_socketpair.

I initially wrote a trivial fix for this, changing the value of
gdb_sys_socketpair to 360.  However, Andreas Schwab pointed out that there are
other functions (ppc_canonicalize_syscall and s390_canonicalize_syscall) that
make assumptions about specific values of enum gdb_syscall, and fixing this
for i386 may break things for ppc or s390.

So instead, I decided to rewrite i386_canonicalize_syscall to match the
approach taken in aarch64_canonicalize_syscall, which allows
gdb_sys_socketpair to keep the same value.

So, fix this by:
- adding a new table file gdb/i386-syscalls.def, using a SYSCALL entry for
  each syscall, generated from arch/x86/entry/syscalls/syscall_32.tbl,
- using gdb/i386-syscalls.def to define enum i386_syscall, and
- using macros SYSCALL_MAP, SYSCALL_MAP_RENAME and UNSUPPORTED_SYSCALL_MAP to
  define the mapping from enum i386_syscall to enum gdb_syscall in
  i386_canonicalize_syscall.

I've created the mapping as follows:
- I used arch/x86/entry/syscalls/syscall_32.tbl to generate an initial mapping
  using SYSCALL_MAP for each syscall,
- I attempted to compile this and used the compilation errors about
  non-existing gdb_sys_ values to change those entries to
  UNSUPPORTED_SYSCALL_MAP, which got me a compiling version,
- I reviewed the UNSUPPORTED_SYSCALL_MAP entries, changing to
  SYSCALL_MAP_RENAME where necessary,
- I then reviewed syscalls below 500 that mapped to a gdb_syscall value below
  500, but not the same, and fixed those using SYSCALL_MAP_RENAME, and
- reviewed the mapping for gdb_syscall entries >= 500.

On the resulting mapping, I was able to do the following sanity check:
...
  for (int i = 0; i < 500; ++i)
    {
      int res = i386_canonicalize_syscall (i);
      if (res == i)
	continue;
      if (res == -1)
	continue;
      if (res >= 500)
	continue;
      gdb_assert_not_reached ("");
    }
}
...
to make sure that any syscall below 500 either:
- maps to the same number,
- is unsupported, or
- maps to a number >= 500.

Coming back to our original problem, the socket pair syscall is addressed by
an entry:
...
      SYSCALL_MAP (socketpair);
...
which maps i386_sys_socketpair (360) to gdb_sys_socketpair (512).

Tested on x86_64-linux with target board unix/-m32.

Approved-By: Guinevere Larsen <guinevere@redhat.com>

PR tdep/32770
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32770
2025-03-13 07:41:51 +01:00
Simon Marchi
0d1d256715 gdb/dwarf: use all_units_range in dwarf2_base_index_functions::expand_all_symtabs
Commit 2920415622 ("gdb/dwarf: use ranged for loop in some spots")
broke some tests notably gdb.base/maint.exp with the fission board.

    $ ./gdb -nx -q --data-directory=data-directory testsuite/outputs/gdb.base/maint/maint -ex start -ex "maint expand-sym" -batch
    ...
    Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdc48, envp=0x7fffffffdc58) at /home/smarchi/src/binutils-gdb/gdb/testsuite/gdb.base/break.c:43
    43          if (argc == 12345) {  /* an unlikely value < 2^16, in case uninited */ /* set breakpoint 6 here */
    /usr/include/c++/14.2.1/debug/safe_iterator.h:392:
    In function:
        gnu_debug::_Safe_iterator<_Iterator, _Sequence, _Category>&
        gnu_debug::_Safe_iterator<_Iterator, _Sequence, _Category>::operator++()
        [with _Iterator = gnu_cxx::
        normal_iterator<std::unique_ptr<dwarf2_per_cu, dwarf2_per_cu_deleter>*,
        std::vector<std::unique_ptr<dwarf2_per_cu, dwarf2_per_cu_deleter>,
        std::allocator<std::unique_ptr<dwarf2_per_cu, dwarf2_per_cu_deleter> > >
        >; _Sequence = std::debug::vector<std::unique_ptr<dwarf2_per_cu,
        dwarf2_per_cu_deleter> >; _Category = std::forward_iterator_tag]

    Error: attempt to increment a singular iterator.

Note that this is caught because I build with -D_GLIBCXX_DEBUG=1.
Otherwise, it might crash more randomly, or just not crash at all (but
still be buggy).

While iterating on the all_units vector, some type units get added
there:

    #0  add_type_unit (per_bfd=0x51b000044b80, section=0x50e0000c2280, sect_off=0, length=74, sig=4367013491293299229) at /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.c:2576
    #1  0x00005555618a3a40 in lookup_dwo_signatured_type (cu=0x51700009b580, sig=4367013491293299229) at /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.c:2664
    #2  0x00005555618ee176 in queue_and_load_dwo_tu (dwo_unit=0x521000120e00, cu=0x51700009b580) at /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.c:8329
    #3  0x00005555618eeafe in queue_and_load_all_dwo_tus (cu=0x51700009b580) at /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.c:8366
    #4  0x00005555618966a6 in dw2_do_instantiate_symtab (per_cu=0x50f0000043c0, per_objfile=0x516000065a80, skip_partial=true) at /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.c:1695
    #5  0x00005555618968d4 in dw2_instantiate_symtab (per_cu=0x50f0000043c0, per_objfile=0x516000065a80, skip_partial=true) at /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.c:1719
    #6  0x000055556189ac3f in dwarf2_base_index_functions::expand_all_symtabs (this=0x502000024390, objfile=0x516000065780) at /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.c:1977

This invalidates the iterator in
dwarf2_base_index_functions::expand_all_symtabs, which is caught by the
libstdc++ debug mode.

I'm not entirely sure that it is correct to append type units from dwo
files to the all_units vector like this.  The
dwarf2_find_containing_comp_unit function expects a precise ordering of
the elements of the all_units vector, to be able to do a binary search.
Appending a type unit at the end at this point certainly doesn't respect
that ordering.

For now I'd just like to undo the regression.  Do that by using
all_units_range in the ranged for loop.  I will keep in mind to
investigate whether this insertion of type units in all_units after the
fact really makes sense or not.

Change-Id: Iec131e59281cf2dbd12d3f3d163b59018fdc54da
2025-03-12 23:19:12 -04:00
Simon Marchi
c8016181cb gdb/dwarf: remove unused parameter of create_dwo_cu_reader
Change-Id: I0c5b7591eab8e6616b653be7c04bc75159427ad6
2025-03-12 22:27:12 -04:00
Simon Marchi
69e80b754d gdb/dwarf: remove unnecessary braces
Change-Id: I3cd6b932d0dfb4cc07b6d48a1dc9ec35e7bfa03e
2025-03-12 22:27:12 -04:00
Simon Marchi
2920415622 gdb/dwarf: use ranged for loop in some spots
I noticed that these loops could be written to avoid the iteration
variable `i`.

Change-Id: I8b58eb9913b6ac8505ee45eb8009ef7027236cb9
2025-03-12 22:27:12 -04:00
GDB Administrator
053438d7dd Automatic date update in version.in 2025-03-13 00:00:18 +00:00
Sam James
8bf41b4c56 gprofng: regenerate Makefile.in
Needed after 90803ffdcc.

gprofng/ChangeLog
	* src/Makefile.in: Regenerate.
2025-03-12 21:33:26 +00:00
Zheng Junjie
90803ffdcc gprofng: Fix cross-compilation binary name.
commit d25ba4596e create symbolic link
no care cross-compilation prefix.

gprofng/ChangeLog
2025-02-10  Zheng Junjie  <zhengjunjie@iscas.ac.cn>
	* src/Makefile.am: create symbolic link respect cross-compilation.
	* src/Makefile.in: Rebuild.
2025-03-12 14:06:04 -07:00
Tom Tromey
b6cc4ef6d2 Use correct types in string-set.h
My earlier patch to introduce string-set.h used the wrong type in the
hash functions.  This patch fixes the error.
2025-03-12 14:23:50 -06:00
Simon Marchi
add96080cf gdb: remove unused includes in exceptions.c
These are reported as unused by clangd.

Change-Id: I54b3fba4d7a73c955a9a26c0d340a384b2d37b32
2025-03-12 14:14:24 -04:00
Simon Marchi
b21f6439cc gdb: remove trailing whitespaces in exceptions.c
Change-Id: Icc7b468b85c09a9721fc9580892c9ad424e0a29a
2025-03-12 14:14:24 -04:00
Simon Marchi
bb19646159 gdb: remove include from process-stratum-target.h
It is reported as unused by clangd.

Change-Id: I73c03577c521c1b71128409b5cf085a4d1785080
2025-03-12 14:14:23 -04:00
GDB Administrator
cf4fdbd491 Automatic date update in version.in 2025-03-12 00:00:15 +00:00
Tom Tromey
383aa019ae Use gdb map in mi-cmds.c
This changes mi-cmds.c to use gdb::unordered_map.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:40:07 -06:00
Tom Tromey
0c9953e0e0 Use gdb map in py-connection.c
This changes py-connection.c to use gdb::unordered_map.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:40:06 -06:00
Tom Tromey
ca19833332 Use gdb set in dwarf2/aranges.c
This changes dwarf2/aranges.c to use gdb::unordered_set.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:40:06 -06:00
Tom Tromey
054f8e32fe Use gdb set in all_non_exited_process_targets
This changes all_non_exited_process_targets to return
gdb::unordered_set.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:40:06 -06:00
Tom Tromey
8c830ad96e Use gdb set and map in remote.c
This changes remote.c to use gdb::unordered_set and
gdb::unordered_map.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:40:06 -06:00
Tom Tromey
d99b43c298 Use gdb set and map in mi-main.c
This changes mi-main.c to use gdb::unordered_set and
gdb::unordered_map.

this may change the order of core ids that are emitted, but that seems
fine as MI generally doesn't guarantee ordering.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:40:06 -06:00
Tom Tromey
58984e4ad2 Use gdb::function_view in iterate_over_threads
This C++-ifies iterate_over_threads, changing it to accept a
gdb::function_view and to return bool.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:39:58 -06:00
Tom Tromey
d8a30dd2a6 Use gdb set and map in TUI
This changes the TUI to use gdb::unordered_map and gdb::unordered_set
rather than the std:: variants.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:33:08 -06:00
Tom Tromey
d9c531fd64 Use gdb set and map in source_cache
This changes source_cache to use gdb::unordered_map and
gdb::unordered_set rather than the std:: variants.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-11 08:31:43 -06:00
Tom de Vries
674d485673 [gdb/testsuite] Fix gdb.base/step-over-syscall.exp with glibc 2.41
On openSUSE Tumbleweed, with glibc 2.41, when running test-case
gdb.base/step-over-syscall.exp I run into:
...
(gdb) stepi^M
0x00007ffff7cfd09b in __abort_lock_rdlock () from /lib64/libc.so.6^M
1: x/i $pc^M
=> 0x7ffff7cfd09b <__abort_lock_rdlock+29>:     syscall^M
(gdb) p $eax^M
$1 = 14^M
(gdb) FAIL: $exp: fork: displaced=off: syscall number matches
FAIL: $exp: fork: displaced=off: find syscall insn in fork (timeout)
...

We're stepi-ing through fork trying to find the fork syscall, but encounter
another syscall.

The test-case attempts to handle this:
...
      gdb_test_multiple "stepi" "find syscall insn in $syscall" {
            -re ".*$syscall_insn.*$gdb_prompt $" {
                # Is the syscall number the correct one?
		if {[syscall_number_matches $syscall]} {
                    pass $gdb_test_name
                } else {
		    exp_continue
                }
            }
            -re "x/i .*=>.*\r\n$gdb_prompt $" {
                incr steps
                if {$steps == $max_steps} {
                    fail $gdb_test_name
                } else {
                    send_gdb "stepi\n"
                    exp_continue
                }
            }
        }
...
but fails to do so because it issues an exp_continue without issuing a new
stepi command, and consequently the "find syscall insn in fork" test times
out.

Also, the call to syscall_number_matches produces a PASS or FAIL, so skipping
one syscall would produce:
...
FAIL: $exp: fork: displaced=off: syscall number matches
PASS: $exp: fork: displaced=off: syscall number matches
DUPLICATE: $exp: fork: displaced=off: syscall number matches
...

Fix this by:
- not producing PASS or FAIL in syscall_number_matches, and
- issuing stepi when encountering another syscall.

While we're at it, fix indentation in syscall_number_matches.

Tested on x86_64-linux, specifically:
- openSUSE Tumbleweed (glibc 2.41), and
- openSUSE Leap 15.6 (glibc 2.38).

PR testsuite/32780
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32780
2025-03-11 09:38:50 +01:00
GDB Administrator
827f39f7e5 Automatic date update in version.in 2025-03-11 00:00:21 +00:00
Tom Tromey
d03f69e746 Remove pid from test name in gcore-memory-usage.exp
The new gcore-memory-usage.exp test puts a PID into a test case name,
causing spurious comparison failures.  This patch changes the test
name to avoid this.
2025-03-10 15:11:25 -06:00
Tom Tromey
2609ee6f19 Add string cache and use it in cooked index
The cooked index needs to allocate names in some cases -- when
canonicalizing or when synthesizing Ada package names.  This process
currently uses a vector of unique_ptrs to manage the memory.

Another series I'm writing adds another spot where this allocation
must be done, and examining the result showed that certain names were
allocated multiple times.

To clean this up, this patch introduces a string cache object and
changes the cooked indexer to use it.  I considered using bcache here,
but bcache doesn't work as nicely with string_view -- because bcache
is fundamentally memory-based, a temporary copy of the contents must
be made to ensure that bcache can see the trailing \0.  Furthermore,
writing a custom class lets us avoid another copy when canonicalizing
C++ names.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-10 15:05:34 -06:00
Simon Marchi
c19c928f7b Revert past commits
I accidentally pushed my work-in-progress branch... revert that.  Sorry
for the noise :(.

The list of commits reverted are:

    ae2a50a9ae attempt to revamp to the CU/TU list
    e9386435c9 gdb/dwarf: print DWARF CUs/TUs in "maint print objfiles"
    6cbd64aa3e gdb/dwarf: add dwarf_source_language_name
    32a187da76 libiberty: move DW_LANG_* definitions to dwarf2.def
    b3fa38aef5 gdb/dwarf: move index unit vectors to debug names reader and use them
    30ba744189 gdb/dwarf: track comp and type units count
    bedb4e09f2 gdb/dwarf: remove unnecessary braces
    b4f18de12c gdb/dwarf: use ranged for loop in some pots

Change-Id: I80aed2847025f5b15c16c997680783b39858a703
2025-03-10 16:15:42 -04:00
Simon Marchi
ae2a50a9ae attempt to revamp to the CU/TU list
Change-Id: I1c8214413583d540c10c9a2322ef2a21f8bb54e7
2025-03-10 16:09:02 -04:00
Simon Marchi
e9386435c9 gdb/dwarf: print DWARF CUs/TUs in "maint print objfiles"
This was useful to me, to debug some problems.

Before printing cooked index entries, print a list of CUs and TUs.  The
information printed for each is a bit arbitrary, I took a look at the
types and printed what seemed relevant.

An example of output for a CU:

    [0] ((dwarf2_per_cu_data *) 0x50f000007840)
    type:       DW_UT_compile
    offset:     0x0
    size:       0x1bff
    artificial: false
    GDB lang:   c++
    DWARF lang: DW_LANG_C_plus_plus

And for a TU:

    [2] ((signatured_type *) 0x511000040000)
    type:      DW_UT_type
    offset:    0x0
    size:      0x94
    signature: 0x2e966c0dc94b065b

I moved the call to cooked_index_functions::wait before printing the
CU/TU list, otherwise trying to call "maint print objfiles" quickly,
like this, would lead to an internal error:

  $ ./gdb  -nx -q --data-directory=data-directory testsuite/outputs/gdb.dwarf2/struct-with-sig/struct-with-sig -ex "maint print objfiles"

This is because dwarf2_per_cu_data::m_unit_type was not yet set, when
trying to read it.  Waiting for the index to be built ensures that it is
set, since setting the unit type is done as a side-effect somewhere.

Change-Id: Ic810ec3bb4d3f5abb481cf1cee9b2954ff4f0874
2025-03-10 16:09:02 -04:00
Simon Marchi
6cbd64aa3e gdb/dwarf: add dwarf_source_language_name
Add dwarf_source_language_name, to convert a DW_LANG_* constant to
string.  This will be used in a following patch.

Change-Id: I552ebd318e2e770d590de5920edbd0b75075c1b7
Approved-By: Tom Tromey <tom@tromey.com>
2025-03-10 16:09:02 -04:00
Simon Marchi
32a187da76 libiberty: move DW_LANG_* definitions to dwarf2.def
In order to get a "DW_LANG_* to string" function:

  - move the "DW_LANG_*" definitions from dwarf2.h to dwarf2.def
  - add the necessary macros in dwarf2.h to generate the enumeration
  - add the necessary macros in dwarfnames.c to generate the "to string"
    function

include/ChangeLog:

	* dwarf2.h (DW_LANG, DW_FIRST_LANG, DW_END_LANG): Define then
	undefine.
	(enum dwarf_source_language): Remove.
	(get_DW_LANG_name): Declare.
	* dwarf2.def: Define DW_LANG_* constants.

libiberty/ChangeLog:

	* dwarfnames.c (DW_FIRST_LANG, DW_END_LANG, DW_LANG): Define
	then undefine.

Change-Id: I440aa2b1f55c7585d7e44c8fa7c41310b0ef2b3a
Cc: binutils@sourceware.org
2025-03-10 16:09:02 -04:00
Simon Marchi
b3fa38aef5 gdb/dwarf: move index unit vectors to debug names reader and use them
Since these vectors contain the CU and TU lists as found in the
.debug_names header, it seems like they are meant to be used by the
.debug_names reader when handling a DW_IDX_compile_unit or
DW_IDX_type_unit attribute.  The value of the attribute would translate
directly into an index into one of these vectors.

However there's something fishy: it looks like these vectors aren't
actually used in practice.  They are used in the
dwarf2_per_bfd::get_index_{c,t}u methods, which in turn aren't used
anywhere.

The handlers of DW_IDX_compile_unit and DW_IDX_type_unit use the
dwarf2_per_bfd::get_cu method, assuming that all compile units are
placed before type units in the dwarf2_per_bfd::all_units vector.  I see
several problems with that:

 1. I found out [1] that the dwarf2_per_bfd::all_units didn't always
    have the CUs before the TUs.  So indexing dwarf2_per_bfd::all_units
    with that assumption will not work.

 2. The dwarf2_find_containing_comp_unit function assumes an ordering of
    units by section offset (among other criteria) in order to do a
    binary search.  Even though it's probably commonly the case, nothing
    guarantees that the order of CUs and TUs in the .debug_names header
    (which defines the indices used to refer to them) will be sorted by
    section offset.  It's not possible to make
    dwarf2_find_containing_comp_unit (assuming it wants to do a binary
    search by section offset) and the DW_IDX_compile_unit /
    DW_IDX_type_unit handlers use the same vector.

 3. I have not tested this, but in the presence of a dwz supplementary
    file, the .debug_names reader should probably not put the units from
    the main and dwz files in the same vectors to look them up by index.
    Presumably, if both the main and dwz files have a .debug_names
    index, they have distinct CU / TU lists.  So, an CU index of 1 in an
    index entry in the main file would refer to a different CU than an
    index of 1 in an index entry in the dwz file.  The current code
    doesn't seem to account for that, it just indexes
    dwarf2_per_bfd::all_units.

Since those vectors are kind of specific to the .debug_names reader,
move them there, in the mapped_debug_names_reader struct.  Then, update
the handlers of DW_IDX_compile_unit and DW_IDX_type_unit to use them.

[1] https://inbox.sourceware.org/gdb-patches/87a5ab5i5m.fsf@tromey.com/T/#mbdcfe35f94db33e59500eb0d3d225661cab016a4

Change-Id: I3958d70bb3875268143471da745aa09336ab2500
2025-03-10 16:09:02 -04:00
Simon Marchi
30ba744189 gdb/dwarf: track comp and type units count
A subsequent commit will remove the all_comp_units and all_type_units
array views, since the all_units vector will no longer be segmented
between comp and type units.  Some callers still need to know the number
of each kind, so track that separately.

Change-Id: I6ef184767a96e5be095bbf9142aa850adbb083ac
2025-03-10 16:09:02 -04:00
Simon Marchi
bedb4e09f2 gdb/dwarf: remove unnecessary braces
Change-Id: If0b38b860e79771a16ea914af3e337fca0ee3a7d
2025-03-10 16:09:02 -04:00
Simon Marchi
b4f18de12c gdb/dwarf: use ranged for loop in some pots
I noticed that these loops could be written to avoid the iteration
variable `i`.

Change-Id: Ia3717acbbf732f0337870d35ac60fe6400383324
2025-03-10 16:09:02 -04:00
Simon Marchi
f62cf22157 gdb/dwarf: save DWARF version in dwarf2_loclist_baton, remove it from dwarf2_per_cu
When running:

    $ make check TESTS="gdb.cp/cpexprs-debug-types.exp" RUNTESTFLAGS="--target_board=fission"

I get:

    (gdb) break -qualified main
    /home/smarchi/src/binutils-gdb/gdb/dwarf2/read.h:295: internal-error: version: Assertion `m_dwarf_version != 0' failed.

The problem is that dwarf2_per_cu objects created in the
read_cutu_die_from_dwo code path never have their DWARF version set.  A
seemingly obvious solution would be to add a call to
dwarf2_per_cu::set_version in there (there's a patch in the referenced
PR that does that).  However, this comment in
read_comp_units_from_section is a bit scary:

      /* Init this asap, to avoid a data race in the set_version in
	 cutu_reader::cutu_reader (which may be run in parallel for the cooked
	 index case).  */
      this_cu->set_version (cu_header.version);

I don't know if a DWO file can be read while the cooked indexer runs, so
if it would be a problem here, but I prefer to be safe than sorry.  This
patch side-steps the problem by deleting the DWARF version from
dwarf2_per_cu.

The only users of dwarf2_per_cu::version are the loclists callbacks in
`loc.c`.  Add the DWARF version to dwarf2_loclist_baton and modify those
callbacks to get the version from there instead.  Initialize that new
field in fill_in_loclist_baton.

I like this approach because there is no version field that is possibly
unset now.

I wasn't keen on doing this at first because I thought it would waste
space, but the dwarf2_loclist_baton has 7 bytes of padding at the end
anyway, so we might as well use that.

Cc: Ricky Zhou <ricky@rzhou.org>
Cc: Tom de Vries <tdevries@suse.de>
Cc: Tom Tromey <tom@tromey.com>
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32309
Change-Id: I30d4ede7d67da5d80ff65c6122f5868e1098ec52
Approved-By: Tom Tromey <tom@tromey.com>
2025-03-10 16:09:01 -04:00
Tom Tromey
c05c9914b1 Use flags enum for cooked_index_entry::full_name
I found a small bug coming from a couple of  recent patches of mine for
cooked_index_entry::full_name.

First, commit aab26529b3 (Add "Ada linkage" mode to
cooked_index_entry::full_name) added a small hack to optionally
compute the Ada linkage name.

Then, commit aab2ac34d7 (Avoid excessive CU expansion on failed
matches) changed the relevant expand_symtabs_matching implementation
to use this feature.

However, the feature was used unconditionally, causing a bad side
effect: the non-canonical name is now used for all languages, not just
Ada.  But, for C++ this is wrong.

Furthermore, consider the declaration of full_name:

   const char *full_name (struct obstack *storage,
			 bool for_main = false,
			 bool for_ada_linkage = false,
 			 const char *default_sep = nullptr) const;

... and then consider this call in cooked_index::dump:

       gdb_printf ("    qualified:  %s\n",
		  entry->full_name (&temp_storage, false, "::"));

Oops!  The "::" is silently converted to 'true' here.

To fix both of these problems, this patch changes full_name to accept
a flags enum rather than booleans.  This avoids the type-safety
problem.

Then, full_name is changed to remove the "Ada" flag when the entry is
not in fact an Ada symbol.

Regression tested on x86-64 Fedora 40.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-10 13:40:25 -06:00
Tom Tromey
eb39f6d01e Remove eval_op_scope
eval_op_scope is very similar to
scope_operation::evaluate_for_address.  This patch combines the two
into a single method of scope_operation.

Regression tested on x86-64 Fedora 40.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-10 13:23:57 -06:00
Simon Marchi
cc0fdf9861 gdb/dwarf: rename comp_unit_die to top_level_die
The name "comp_unit_die" is a bit misleading, because it can also
represent a type unit (DW_TAG_type_unit).  I think that "top_level_die"
is clear.

Change-Id: Ibaac99897f0ac7499f0f82caeed3385e1e6ee870
Approved-By: Tom Tromey <tom@tromey.com>
2025-03-10 11:28:10 -04:00
Simon Marchi
3f239fd3ff gdb/dwarf: add doc for cutu_reader::is_dummy
Change-Id: Ifb80557187c12822bdea7ad400c32c3dce968a7f
Approved-By: Tom Tromey <tom@tromey.com>
2025-03-10 11:28:10 -04:00
Tom Tromey
0e7e416246 Fix check-include-guards.py
I noticed that check-include-guards.py doesn't error in certain
situations -- but in situations where the --update flag would cause a
file to be changed.

This patch changes the script to issue an error for any discrepancy.
It also fixes the headers that weren't correct.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
2025-03-10 09:18:40 -06:00
H.J. Lu
72088cbe29 gprof: Append -l to tst-gmon-gprof-l.sh data files
Append -l to tst-gmon-gprof-l.sh data files to avoid conflicts with
tst-gmon-gprof.sh data files.

	* testsuite/tst-gmon-gprof-l.sh (actual): Append -l.
	(expected): Likewise.
	(expected_dot): Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-03-10 08:07:17 -07:00
H.J. Lu
48691f6650 gprof: Add a simple test for gprof -l
Verify that "gprof -l" works properly.

	* testsuite/Makefile.am (check_SCRIPTS): Add tst-gmon-gprof-l.sh.
	* testsuite/Makefile.in: Regenerated.
	* testsuite/tst-gmon-gprof-l.sh: New.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-03-10 06:41:42 -07:00
Alan Modra
ebed0bfecc meaningless p_offset for zero p_filesz PT_LOAD
This patch avoids generating PT_LOAD segments that trip a bug in
glibc's loader.

	PR 25237
	PR 32763
	* elf.c (assign_file_positions_for_load_sections): Don't put
	p_offset zero for empty PT_LOAD.
2025-03-10 23:02:19 +10:30
Alan Modra
b8c5ada174 Further tidies to bed->p_align code
align_pagesize was used for two things, reducing p->p_align from
maxpagesize to the bed->p_align value (section alignment permitting),
and increasing p->p_align above maxpagesize if section alignment
required that.  This patch untangles those two, making align_pagesize
only do the former.  p->p_align is set directly for the latter.  I've
made that change to p->p_align only when D_PAGED to keep things
consistent with other early assignments to p->p_align.  p->p_align is
set later according to section alignment when not D_PAGED.

I've also moved the place where align_pagesize adjusts p->p_align to
be with other code setting p->p_align.  That seemed better to me than
leaving it until the last possible moment.  Note that it isn't
necessary to have this adjustment done inside a test for a PT_LOAD
header, since we never set align_pagesize non-zero outside a PT_LOAD
test.

	* elf.c (assign_file_positions_for_load_sections): Clear
	align_pagesize whenever we have a section alignment more than
	bed->p_align.  Set p->p_align rather than align_pagesize
	when section alignment exceeds maxpagesize.  Assign p->p_align
	from align_pagesize earlier.
2025-03-10 23:01:54 +10:30
Alan Modra
ce53bc06f6 Tidy code handling bed->p_align a little.
No functional changes here, just preparation for the next patch.

	* elf.c (assign_file_positions_for_load_sections): Replace
	p_align_p and p_align with align_pagesize.  Revise comments
	on code handling bed->p_align.
2025-03-10 23:00:10 +10:30
Jens Remus
28704396ab ld: Cleanup sframe_decoder_init_func_bfdinfo use of reloc cookie
The loop did set cookie->rel to the i-th relocation twice.  At the
beginning using the loop counter.  At the end by incrementing.  One
approach is sufficient.

Change cookie to pointer-to-const, replace cookie->rel by rel,
initialize before the loop and increment at the end, and merge the
two assertions (for cookie->rel) into one.

While at it change sec to pointer-to-const.

bfd/
	* elf-sframe.c (sframe_decoder_init_func_bfdinfo): Cleanup use
	of relocation cookie.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
2025-03-10 13:14:08 +01:00
Jens Remus
768a8d310d gas: Use SFrame header and FDE field sizes when generating .sframe
The use of SFRAME_RELOC_SIZE in generation of SFrame stack trace
information from CFI directives erroneously suggested that this could
be used to configure a different relocation size.  But in practice it
is tied to the SFrame field sizes it is used for and therefore cannot
be changed.

Replace the uses of SFRAME_RELOC_SIZE by the size of the respective
SFrame header and FDE fields when emitting SFrame information.  While
at it enhance some comments.

gas/
	* gen-sframe.c (SFRAME_RELOC_SIZE): Delete.
	(sizeof_member): Define.
	(output_sframe_funcdesc): Use size of SFrame FDE fields instead
	of SFRAME_RELOC_SIZE.
	(output_sframe_internal): Use size of SFrame header fields
	instead of SFRAME_RELOC_SIZE.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
2025-03-10 13:14:08 +01:00
GDB Administrator
74f583e625 Automatic date update in version.in 2025-03-10 00:00:14 +00:00