binutils-gdb.git
19 months agoHandle function descriptors in call_site_target
Tom Tromey [Fri, 3 Mar 2023 17:29:06 +0000 (10:29 -0700)]
Handle function descriptors in call_site_target

call_site_target::iterate_over_addresses may look up a minimal symbol.
On platforms like PPC64 that use function descriptors, this may find
an unexpected address.  The fix is to use gdbarch_convert_from_func_ptr_addr
to convert from a function descriptor to the address recorded at the
call site.

I've added a new test case that is based on the internal AdaCore test
that provoked this bug.  However, I'm unable to test it as-is on
PPC64.

19 months agox86: drop (explicit) BFD64 dependency from disassembler
Jan Beulich [Fri, 21 Apr 2023 10:10:23 +0000 (12:10 +0200)]
x86: drop (explicit) BFD64 dependency from disassembler

get64() is unreachable when !BFD64 (due to a check relatively early in
print_insn()). Let's avoid the associated #ifdef-ary (or else we should
extend it to remove more dead code).

19 months agox86: drop use of setjmp() from disassembler
Jan Beulich [Fri, 21 Apr 2023 10:09:59 +0000 (12:09 +0200)]
x86: drop use of setjmp() from disassembler

With the longjmp() uses all gone, the setjmp() isn't necessary anymore
either.

19 months agox86: change fetch error handling for get<N>()
Jan Beulich [Fri, 21 Apr 2023 10:09:35 +0000 (12:09 +0200)]
x86: change fetch error handling for get<N>()

Make them return boolean and convert FETCH_DATA() uses to fetch_code().
With this no further users of FETCH_DATA() remain, so the macro and its
backing function are dropped as well.

Leave value types as they were for the helper functions, even if I don't
think that beyond get64() use of bfd_{,signed_}vma is really necessary.
With type change of "disp" in OP_E_memory(), change the 2nd parameter of
print_displacement() to a signed type as well, though (eliminating the
need for a local variable of signed type). This also eliminates the need
for custom printing of '-' in Intel syntax displacement expressions.

While there drop forward declarations which aren't really needed.

19 months agox86: change fetch error handling when processing operands
Jan Beulich [Fri, 21 Apr 2023 10:09:11 +0000 (12:09 +0200)]
x86: change fetch error handling when processing operands

Make the handler functions all return boolean and convert FETCH_DATA()
uses to fetch_code().

19 months agox86: change fetch error handling in get_valid_dis386()
Jan Beulich [Fri, 21 Apr 2023 10:08:45 +0000 (12:08 +0200)]
x86: change fetch error handling in get_valid_dis386()

Introduce a special error indicator node, for the sole (real) caller
to recognize and act upon.

19 months agox86: change fetch error handling in ckprefix()
Jan Beulich [Fri, 21 Apr 2023 10:08:15 +0000 (12:08 +0200)]
x86: change fetch error handling in ckprefix()

Use a tristate (enum) return value type to be able to express all three
cases which are of interest to the (sole) caller. This also allows doing
away with the abuse of "rex_used".

19 months agox86: change fetch error handling in top-level function
Jan Beulich [Fri, 21 Apr 2023 10:07:53 +0000 (12:07 +0200)]
x86: change fetch error handling in top-level function

... and its direct helper get_sib(). Using setjmp()/longjmp() for fetch
error handling is problematic, as per
https://sourceware.org/pipermail/binutils/2023-March/126687.html. Start
using more conventional error handling instead.

Also introduce a fetch_modrm() helper, for subsequent re-use.

19 months agox86: move fetch error handling into a helper function
Jan Beulich [Fri, 21 Apr 2023 10:07:26 +0000 (12:07 +0200)]
x86: move fetch error handling into a helper function

... such that it can be used from other than the setjmp() error handling
path.

Since I'd like the function's parameter to be pointer-to-const, two
other functions need respective constification then, too (along with
needing to be forward-declared).

19 months agobfd: fix STRICT_PE_FORMAT build
Jan Beulich [Fri, 21 Apr 2023 10:05:56 +0000 (12:05 +0200)]
bfd: fix STRICT_PE_FORMAT build

A semicolon was missing and "name" needs to be pointer-to-const. While
adding "const" there, also add it for "sec".

19 months agoRISC-V: Optimize relaxation of gp with max_alignment.
Lifang Xia [Thu, 27 Oct 2022 03:19:15 +0000 (11:19 +0800)]
RISC-V: Optimize relaxation of gp with max_alignment.

This should be the first related issue, which posted in riscv-gnu-toolchain,
https://github.com/riscv-collab/riscv-gnu-toolchain/issues/497

If the output sections are not between gp and the symbol, then their alignments
shouldn't affect the gp relaxation.  However, this patch improves this idea
even more, it limits the range to the gp+-2k, which means only the output
section which are in the [gp-2K, gp+2K) range need to be considered.

Even if the output section candidates may be different for each relax passes,
the symbol that can be relaxed ar this round will not be truncated at next
round.  That is because this round you can do relaxation which means that the
section where the symbol is located is within the [gp-2K, gp+2K) range, so all
the output section alignments between them should be considered.  In other
words, if the alignments between them may cause truncated, then we should
already preserve the size and won't do the gp relaxation this time.

This patch can resolve the github issue which mentioned above, and also passed
all gcc/binutils regressions of riscv-gnu-toolchain, so should be worth and
safe enough to commit.

Originally, this patch also do the same optimization for the call relaxations,
https://sourceware.org/pipermail/binutils/2022-October/123918.html
But just in case there is something that has not been considered, we only
deal with the gp relaxation at this time.

bfd/
* elfnn-riscv.c (riscv_elf_link_hash_table): Added new bfd_vma,
max_alignment_for_gp.  It is used to record the maximum alignment of
the output sections, which are in the [gp-2K, gp+2k) range.
(riscv_elf_link_hash_table_create): Init max_alignment_for_gp to -1.
(_bfd_riscv_get_max_alignment): Added new parameter, gp.  If gp is
zero, then all the output section alignments are possible candidates;
Otherwise, only the output sections which are in the [gp-2K, gp+2K)
range need to be considered.
(_bfd_riscv_relax_lui): Called _bfd_riscv_get_max_alignment with the
non-zero gp if the max_alignment_for_gp is -1.
(_bfd_riscv_relax_pc): Likewise.
(_bfd_riscv_relax_section): Record the first input section, so that
we can reset the max_alignment_for_gp for each repeated relax passes.
ld/
* testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated.
* testsuite/ld-riscv-elf/relax-max-align-gp.*: New testcase.  It fails
without this patch.

19 months agold: add missing period after @xref
Jan Beulich [Fri, 21 Apr 2023 05:54:19 +0000 (07:54 +0200)]
ld: add missing period after @xref

At least older versions of one of the doc generation tools complain
(warn) about it missing.

19 months agoKeeping track of rs6000-coff archive element pointers
Alan Modra [Thu, 20 Apr 2023 14:00:24 +0000 (23:30 +0930)]
Keeping track of rs6000-coff archive element pointers

rs6000-coff archives use a linked list of file offsets, where each
element points to the next element.  The idea is to allow updating of
large archives quickly without rewriting the whole archive.  (binutils
ar does not do this.)  Unfortunately this is an easy target for
fuzzers to create an archive that will cause ar or any other tool
processing archives to hang.  I'd implemented guards against pointing
back to the previous element, but of course that didn't last long.

So this patch implements a scheme to keep track of file offset ranges
used by elements as _bfd_read_ar_hdr is called for each element.  See
the add_range function comment.  I needed a place to stash the list,
so chose the obvious artdata.tdata backend extension to archive's
tdata, already used by xcoff.  That involved a little cleanup, because
while it would be possible to continue using different artdata.tdata
for the big and small archives, it's nicer to use a union.

If anyone is concerned this list of element ranges might grow large
and thus significantly slow down the tools, adjacent ranges are
merged.  In fact something like "ar t" will only ever have one range
on xcoff archives generated by binutils/ar.  I agree there might still
be a problem with ld random element access via the armap.

include/
* coff/xcoff.h (SIZEOF_AR_FILE_HDR): Use sizeof.
(SIZEOF_AR_FILE_HDR_BIG, SIZEOF_AR_HDR, SIZEOF_AR_HDR_BIG): Likewise.
(struct ar_ranges, struct xcoff_artdata): New.
(x_artdata): Define.
(xcoff_big_format_p): Rewrite.
(xcoff_ardata, xcoff_ardata_big): Delete.
bfd/
* coff-rs6000.c: Replace uses of xcoff_ardata and
xcoff_ardata_big throughout file.
(_bfd_xcoff_archive_p): Adjust artdata.tdata allocation.
(add_range): New function.
(_bfd_xcoff_read_ar_hdr): Use it here.  Fix memory leak.
(_bfd_xcoff_openr_next_archived_file): Remove old sanity
checks.  Set up range for header.
(xcoff_write_archive_contents_old): Make the temporary
artdata.tdata used here to pass info down to
_bfd_compute_and_write_armap a struct xcoff_artdata.
(xcoff_write_archive_contents_big): Likewise.
* coff64-rs6000.c: Replace uses of xcoff_ardata and
xcoff_ardata_big throughout file.
(xcoff64_archive_p): Adjust artdata.tdata allocation.

19 months agoDelete struct artdata archive_head
Alan Modra [Thu, 20 Apr 2023 02:44:09 +0000 (12:14 +0930)]
Delete struct artdata archive_head

This element is unused.  Ideally we'd be moving archive_head and
other archive specific fields from struct bfd to here, but that's a
much larger change than this little bit of cleanup.

* libbfd-in.h (struct artdata): Delete archive_head.
* libbfd.h: Regenerate.
* archive.c,
* coff-rs6000.c,
* coff64-rs6000.c: Delete comments mentioning artdata archive_head.

19 months agoAutomatic date update in version.in
GDB Administrator [Fri, 21 Apr 2023 00:00:20 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agoAdd a SECURITY.txt file describing the GNU Binutils' project's stance on security...
Nick Clifton [Thu, 20 Apr 2023 15:52:11 +0000 (16:52 +0100)]
Add a SECURITY.txt file describing the GNU Binutils' project's stance on security related bugs.

19 months agox86: adjust an ILP32 testcase using .insn
Jan Beulich [Thu, 20 Apr 2023 09:26:10 +0000 (11:26 +0200)]
x86: adjust an ILP32 testcase using .insn

In commit 6967633c8b49 ("x86: convert testcases to use .insn") an ILP32
clone of a testcase was missed in the set of tests needing --divide
added.

Reported-by: Clément Chigot <chigot@adacore.com>
19 months agoAutomatic date update in version.in
GDB Administrator [Thu, 20 Apr 2023 00:00:23 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agosh4-linux segfaults running ld testsuite
Alan Modra [Wed, 19 Apr 2023 21:31:22 +0000 (07:01 +0930)]
sh4-linux segfaults running ld testsuite

Segmentation fault
FAIL: pr22269-1 (static pie undefined weak)
and others running "visibility (hidden undef)" tests

No code has any right to access bfd_link_hash_entry u.def without
first checking the type, and SYMBOL_REFERENCES_LOCAL isn't sufficient.

* elf32-sh.c (sh_elf_finish_dynamic_symbol): Don't use relative
relocs in GOT unless symbol is defined.

19 months agoPR30343 infrastructure
Alan Modra [Wed, 19 Apr 2023 04:51:15 +0000 (14:21 +0930)]
PR30343 infrastructure

Make ldemul_before_plugin_all_symbols_read more useful.

* ldlang.c (lang_process): Move call to
ldemul_before_plugin_all_symbols_read outside BFD_SUPPORTS_PLUGINS.
Allow backends to add to gc_sym_list before handling entry sym.
* ldelf.c (ldelf_before_plugin_all_symbols_read): Test
lto_plugin_active.

19 months agoubsan: signed integer overflow in display_debug_lines_raw
Alan Modra [Wed, 19 Apr 2023 13:46:47 +0000 (23:16 +0930)]
ubsan: signed integer overflow in display_debug_lines_raw

This one was caused by me unnecessarily promoting an "int adv" to
"int64_t adv".  The expression overflowing was 4259 + 9223372036854775807
with the left number being unsigned int.

* dwarf.h (DWARF2_Internal_LineInfo): Replace unsigned short
with uint16_t and unsigned char with uint8_t.  Make li_line_base
an int8_t.
* dwarf.c (display_debug_lines_raw): Revert "adv" back to an int.

19 months agoYet another out-of-memory fuzzed object
Alan Modra [Wed, 19 Apr 2023 13:02:15 +0000 (22:32 +0930)]
Yet another out-of-memory fuzzed object

Do I care about out of memory conditions triggered by fuzzers?  Not
much.  Your operating system ought to be able to handle it by killing
the memory hog.  Oh well, this one was an element of a coff-alpha
archive that said it was a little less that 2**64 in size.  The
coff-alpha compression scheme expands at most 8 times, so we can do
better in bfd_get_file_size.

* bfdio.c (bfd_get_file_size): Assume elements in compressed
archive can only expand a maximum of eight times.
* coffgen.c (_bfd_coff_get_external_symbols): Sanity check
size of symbol table agains file size.

19 months agobuffer overflow in print_symname
Alan Modra [Wed, 19 Apr 2023 12:23:18 +0000 (21:53 +0930)]
buffer overflow in print_symname

* ecoff.c (_bfd_ecoff_slurp_symbolic_info): Zero terminate
string sections.

19 months agolibsframe: minor formatting fixes in sframe_encoder_write_fre
Indu Bhagat [Wed, 19 Apr 2023 21:12:29 +0000 (14:12 -0700)]
libsframe: minor formatting fixes in sframe_encoder_write_fre

libsframe/
* sframe.c (sframe_encoder_write_fre): Formatting fixes for
  readability.

19 months agolibsframe: use consistent function argument names
Indu Bhagat [Wed, 19 Apr 2023 21:12:23 +0000 (14:12 -0700)]
libsframe: use consistent function argument names

libsframe/
* sframe.c (sframe_decoder_get_header): Use consistent function
arg names.
(sframe_decoder_free): Likewise.
(sframe_encode): Use more appropriate var name.

19 months agosframe: correct some typos
Indu Bhagat [Wed, 19 Apr 2023 21:12:17 +0000 (14:12 -0700)]
sframe: correct some typos

include/
* sframe.h: Correct a typo.

libsframe/
* sframe.c: Likewise.

19 months agolibsframe: use return type of bool for predicate functions
Indu Bhagat [Wed, 19 Apr 2023 21:12:12 +0000 (14:12 -0700)]
libsframe: use return type of bool for predicate functions

libsframe/
* sframe.c (sframe_header_sanity_check_p): Change return type to
bool.
(sframe_fre_sanity_check_p): Likewise.

19 months agogas: sframe: fix comment
Indu Bhagat [Wed, 19 Apr 2023 21:12:06 +0000 (14:12 -0700)]
gas: sframe: fix comment

19 months agogas: sframe: use ATTRIBUTE_UNUSED consistently
Indu Bhagat [Wed, 19 Apr 2023 21:11:56 +0000 (14:11 -0700)]
gas: sframe: use ATTRIBUTE_UNUSED consistently

gas/
* gen-sframe.c (sframe_set_version): Use ATTRIBUTE_UNUSED
consistently.
(output_sframe): Likewise.
(sframe_set_fre_info): Remove the usage of ATTRIBUTE_UNUSED.

19 months agoRemove adjust_type_signedness
Tom Tromey [Tue, 18 Apr 2023 16:59:53 +0000 (10:59 -0600)]
Remove adjust_type_signedness

I happened across adjust_type_signedness, which may be used to modify
a type when printing an Ada value.  Modifying a type like this is a
bad idea -- they should normally be considered immutable.  Removing
this function still passes both the dejagnu and internal AdaCore
tests, though, so this patch drops it.

As this was reviewed internally, and only affect Ada, I am checking it
in.

19 months agoFix: readelf: loc_offset XX too big
Nick Clifton [Wed, 19 Apr 2023 10:48:24 +0000 (11:48 +0100)]
Fix: readelf: loc_offset XX too big

  PR 30355
  * dwarf.c (read_and_display_attr_value): Correctly handle DW_loclistx attributes that index a version 5 .debug_loclists section.

19 months agogas: document that get_symbol_name() can clobber the input buffer
Jan Beulich [Wed, 19 Apr 2023 09:43:44 +0000 (11:43 +0200)]
gas: document that get_symbol_name() can clobber the input buffer

Callers which want to make further parsing attempts at the buffer passed
to the function need to be aware that due to the potential of string
concatenation the input buffer may be altered in ways beyond what can be
undone by putting back at *input_line_pointer the character that the
function returns.

19 months agox86: parse_register() must not alter the parsed string
Jan Beulich [Wed, 19 Apr 2023 09:43:26 +0000 (11:43 +0200)]
x86: parse_register() must not alter the parsed string

This reverts the code change done by 100f993c53a5 ("x86: Check
unbalanced braces in memory reference"), which wrongly identified
e87fb6a6d0cd ("x86/gas: support quoted address scale factor in AT&T
syntax") as the root cause of PR gas/30248. (The testcase is left in
place, no matter that it's at best marginally useful in that shape.)

The problem instead is that parse_register() alters the string handed to
it, thus breaking valid assumptions in subsequent parsing code. Since
the function's behavior is a result of get_symbol_name()'s, make a copy
of the incoming string before invoking that function.

Like for parse_real_register() follow the model of strtol() et al: input
string is const-qualified to signal that the string isn't altered, but
the returned "end" pointer is not const-qualified, requiring const to be
cast away (which generally is a bad idea, but the alternative would
again be more convoluted code).

19 months agox86: parse_real_register() does not alter the parsed string
Jan Beulich [Wed, 19 Apr 2023 09:42:51 +0000 (11:42 +0200)]
x86: parse_real_register() does not alter the parsed string

Follow the model of strtol() et al - input string is const-qualified to
signal that the string isn't altered, but the returned "end" pointer is
not const-qualified, requiring const to be cast away (which generally is
a bad idea, but the alternative would be more convoluted code).

19 months agoUpdated Hungarian translation for the gprof directory
Nick Clifton [Wed, 19 Apr 2023 09:37:33 +0000 (10:37 +0100)]
Updated Hungarian translation for the gprof directory

19 months agoAutomatic date update in version.in
GDB Administrator [Wed, 19 Apr 2023 00:00:33 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agogdb: re-format Python code with black 23
Simon Marchi [Tue, 18 Apr 2023 16:10:54 +0000 (12:10 -0400)]
gdb: re-format Python code with black 23

Change-Id: I849d10d69c254342bf01e955ffe62a2b60f9de4b

19 months agoPowerPC: fix _Float128 type output string
Carl Love [Thu, 23 Mar 2023 22:23:05 +0000 (18:23 -0400)]
PowerPC: fix _Float128 type output string

PowerPC supports two 128-bit floating point formats, the IBM long double
and IEEE 128-bit float.  The issue is the DWARF information does not
distinguish between the two.  There have been proposals of how to extend
the DWARF information as discussed in

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104194

but has not been fully implemented.

GCC introduced the _Float128 internal type as a work around for the issue.
The workaround is not transparent to GDB.  The internal _Float128 type
name is printed rather then the user specified long double type.  This
patch adds a new gdbarch method to allow PowerPC to detect the GCC
workaround.  The workaround checks for "_Float128" name when reading the
base typedef from the die_info.  If the workaround is detected, the type
and format fields from the _Float128 typedef are copied to the long
double typedef.  The same is done for the complex long double typedef.

This patch fixes 74 regression test failures in
gdb.base/whatis-ptype-typedefs.exp on PowerPC with IEEE float 128 as the
default on GCC.  It fixes one regression test failure in
gdb.base/complex-parts.exp.

The patch has been tested on Power 10 where GCC defaults to IEEE Float
128-bit and on Power 10 where GCC defaults to the IBM 128-bit float.  The
patch as also been tested on X86-64 with no new regression failures.

19 months agoSymbols with GOT relocatios do not fix adjustbale
mengqinggang [Tue, 18 Apr 2023 10:49:21 +0000 (11:49 +0100)]
Symbols with GOT relocatios do not fix adjustbale

  gas
    * config/tc-loongarch.c (loongarch_fix_adjustable): Symbols with GOT relocatios do not fix adjustbale.
    * testsuite/gas/loongarch/macro_op_large_abs.d: Regenerated.
    * testsuite/gas/loongarch/macro_op_large_pc.d: Regenerated.
  ld
     * testsuite/ld-loongarch-elf/macro_op.d: Regenerated. -

19 months agoAssembler Internal Docs: Describe handling of opcodes for relaxation a bit better.
Thomas Koenig [Tue, 18 Apr 2023 10:21:58 +0000 (11:21 +0100)]
Assembler Internal Docs: Describe handling of opcodes for relaxation a bit better.

19 months agoRISC-V: Cache the latest mapping symbol and its boundary.
Kito Cheng [Mon, 17 Apr 2023 12:16:33 +0000 (20:16 +0800)]
RISC-V: Cache the latest mapping symbol and its boundary.

This issue was reported from https://github.com/riscv-collab/riscv-gnu-toolchain/issues/1188

Current flow:
1) Scan any mapping symbol less than this instruciton.
2) If not found, did a backward search.

The flow seems not big issue, let run an example here:

$x:
0x0 a   <--- Found at step 1
0x4 b   <--- Not found in step 1, but found at step 2
0x8 c   <--- Not found in step 1, but found at step 2
$d
0x12 .word 1234 <-- Found at step 1

The instruciton didn't have the same address with mapping symbol will
still did backward search again and again.

So the new flow is:
1) Use the last mapping symbol status if the address is still within the range
   of the current mapping symbol.
2) Scan any mapping symbol less than this instruciton.
3) If not found, did a backward search.
4) If a proper mapping symbol is found in either step 2 or 3, find its boundary,
   and cache that.

Use the same example to run the new flow again:

$x:
0x0 a   <--- Found at step 2, the boundary is 0x12
0x4 b   <--- Cache hit at step 1, within the boundary.
0x8 c   <--- Cache hit at step 1, within the boundary.
$d
0x12 .word 1234 <-- Found at step 2, the boundary is the end of section.

The disassemble time of the test cases has been reduced from ~20 minutes to ~4
seconds.

opcode/ChangeLog
PR 30282
* riscv-dis.c (last_map_symbol_boundary): New.
(last_map_state): New.
(last_map_section): New.
(riscv_search_mapping_symbol): Cache the result of latest
mapping symbol.

19 months agoobjdump use of uninitialised value in pr_string_field
Alan Modra [Tue, 18 Apr 2023 00:52:08 +0000 (10:22 +0930)]
objdump use of uninitialised value in pr_string_field

PR 30365
* rdcoff.c (parse_coff_struct_type): Leave bitsize zero when no
auxents.

19 months agoobjdump buffer overflow in fetch_indexed_string
Alan Modra [Tue, 18 Apr 2023 00:50:08 +0000 (10:20 +0930)]
objdump buffer overflow in fetch_indexed_string

PR 30361
* dwarf.c (fetch_indexed_string): Sanity check string index.

19 months agoAutomatic date update in version.in
GDB Administrator [Tue, 18 Apr 2023 00:00:35 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agogprofng: 30360 Seg. Fault when application uses std::thread
Vladimir Mezentsev [Sun, 16 Apr 2023 20:55:48 +0000 (13:55 -0700)]
gprofng: 30360 Seg. Fault when application uses std::thread

We interpose a lot of libC functions (dlopen, fork, pthread_create, etc.).
Some of these functions have versions. For example,

% nm -D /lib64/gprofng/libgp-collector.so  | grep thread_create@ | sort
000000000004b420 T pthread_create@GLIBC_2.34
000000000004b490 T pthread_create@GLIBC_2.17
000000000004b500 T pthread_create@GLIBC_2.2.5
000000000004b570 T pthread_create@GLIBC_2.1
000000000004b5e0 T pthread_create@GLIBC_2.0

Our library does not set the default version for symbols.
This is correct because we don't know which libC will be used.

gcc and g++ links differently the version symbols when the default version is
not set. c-linker is using our pthread_create@GLIBC_2.34 and c++-linker is using
our pthread_create@GLIBC_2.0 by default.

The current implementation of the interposed functions is:
  If we are in our pthread_create@GLIBC_<NN>,
  we use dlvsym (dlflag, "pthread_create", "GLIBC_<NN>") to find and call
  the same function from libC.
In the test from PR 30360, pthread_create@GLIBC_2.0 is not in the current libC.
We need to call the default version symbol from libC.

gprofng/ChangeLog
2023-04-16  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR gprofng/30360
* libcollector/iotrace.c: Find and call a default libC version symbol.
* libcollector/dispatcher.c: Likewise.
* libcollector/iotrace.c: Likewise.
* libcollector/linetrace.c: Likewise.
* libcollector/mmaptrace.c: Likewise.
* libcollector/synctrace.c: Likewise.
* libcollector/collector.h (REAL_DCL): Remove an unused argument.

19 months agogprofng: Update documentation
Vladimir Mezentsev [Sun, 16 Apr 2023 00:54:15 +0000 (17:54 -0700)]
gprofng: Update documentation

This patch addresses bugzilla 29521:
Bug 29521 - [docs] man pages are not in the release tarball

The dependence on help2man to create the man pages has been eliminated.
All man pages are now written in Texinfo. Texi2pod and pod2man are used
to generate the man pages from the source.

The user guide has been significantly expanded. It also includes all
the man pages. These are formatted appropriately in the INFO, PDF, and
HTML formats.

The index in the user guide has been enhanced to include an overview
of all options and commands that have been documented so far.

The work on the documentation has not been completed, but this is
a significant step forward.

gprofng/ChangeLog
2023-04-15  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR gprofng/29521
* doc/Makefile.am: Build documentation.
* doc/gprofng.texi: Update documentation.
* doc/version.texi: Likewise.
* src/Makefile.am: Move the man pages generation to doc/Makefile.am.
* gp-display-html/Makefile.am: Likewise.
* doc/gp-archive.texi: New file.
* doc/gp-collect-app.texi: New file.
* doc/gp-display-html.texi: New file.
* doc/gp-display-src.texi: New file.
* doc/gp-display-text.texi: New file.
* doc/gp-macros.texi: New file.
* doc/gprofng_ug.texi: New file.
* doc/Makefile.in: Rebuild.
* gp-display-html/Makefile.in: Rebuild.
* src/Makefile.in" Rebuild.

19 months agoRemove some unnecessary casts from ada-lang.c
Tom Tromey [Mon, 17 Apr 2023 19:36:51 +0000 (13:36 -0600)]
Remove some unnecessary casts from ada-lang.c

I noticed some unnecessary casts to LONGEST in ada-lang.c.  This patch
removes the ones I think are very clearly not needed.  I'm checking
this in as obvious.

19 months agogdb/amdgpu: add follow fork and exec support
Simon Marchi [Mon, 3 Apr 2023 18:52:08 +0000 (14:52 -0400)]
gdb/amdgpu: add follow fork and exec support

Prior to this patch, it's not possible for GDB to debug GPU code in fork
children or after an exec.  The amd-dbgapi target attaches to processes
when an inferior appears due to a "run" or "attach" command, but not
after a fork or exec.  This patch adds support for that, such that it's
possible to for an inferior to fork and for GDB to debug the GPU code in
the child.

To achieve that, use the inferior_forked and inferior_execd observers.

In the case of fork, we have nothing to do if `child_inf` is nullptr,
meaning that GDB won't debug the child.  We also don't attach if the
inferior has vforked.  We are already attached to the parent's address
space, which is shared with the child, so trying to attach would cause
problems.  And anyway, the inferior can't do anything other than exec or
exit, it certainly won't start GPU kernels before exec'ing.

In the case of exec, we detach from the exec'ing inferior and attach to
the following inferior.  This works regardless of whether they are the
same or not.  If they are the same, meaning the execution continues in
the existing inferior, we need to do a detach/attach anyway, as
amd-dbgapi needs to be aware of the new address space created by the
exec.

Note that we use observers and not target_ops::follow_{fork,exec} here.
When the amd-dbgapi target is compiled in, it will attach (in the
amd_dbgapi_process_attach sense, not the ptrace sense) to native
inferiors when they appear, but won't push itself on the inferior's
target stack just yet.  It only pushes itself if the inferior
initializes the ROCm runtime.  So, if a non-GPU-using inferior calls
fork, an amd_dbgapi_target::follow_fork method would not get called.
Same for exec.  A previous version of the code had the amd-dbgapi target
pushed all the time, in which case we could use the target methods.  But
we prefer having the target pushed only when necessary, it's less
intrusive when doing native debugging that doesn't involve the GPU.

Change-Id: I5819c151c371120da8bab2fa9cbfa8769ba1d6f9
Reviewed-By: Pedro Alves <pedro@palves.net>
19 months agogdb: switch to right inferior in fetch_inferior_event
Simon Marchi [Mon, 3 Apr 2023 18:52:07 +0000 (14:52 -0400)]
gdb: switch to right inferior in fetch_inferior_event

The problem explained and fixed in the previous patch could have also
been fixed by this patch.  But I think it's good change anyhow, that
could prevent future bugs, so here it is.

fetch_inferior_event switches to an arbitrary (in practice, the first) inferior
of the process target of the inferior used to fetch the event.  The idea is
that the event handling code will need to do some target calls, so we want to
switch to an inferior that has target target.

However, you can have two inferiors that share a process target, but with one
inferior having an additional target on top:

        inf 1            inf 2
        -----            -----
                         another target
        process target   process target
        exec             exec

Let's say inferior 2 is selected by do_target_wait and returns an event that is
really synthetized by "another target".  This "another target" could be a
thread or record stratum target (in the case explained by the previous patch,
it was the arch stratum target, but it's because the amd-dbgapi abuses the arch
layer).  fetch_inferior_event will then switch to the first inferior with
"process target", so inferior 1.  handle_signal_stop then tries to fetch the
thread's registers:

    ecs->event_thread->set_stop_pc
      (regcache_read_pc (get_thread_regcache (ecs->event_thread)));

This will try to get the thread's register by calling into the current target
stack, the stack of inferior 1.  This is problematic because "another target"
might have a special fetch_registers implementation.

I think it would be a good idea to switch to the inferior for which the
even was reported, not just some inferior of the same process target.
This will ensure that any target call done before we eventually call
context_switch will be done on the full target stack that reported the
event.

Not all events are associated to an inferior though.  For instance,
TARGET_WAITKIND_NO_RESUMED.  In those cases, some targets return
null_ptid, some return minus_one_ptid (ideally the expected return value
should be clearly defined / documented).  So, if the ptid returned is
either of these, switch to an arbitrary inferior with that process
target, as before.

Change-Id: I1ffc8c1095125ab591d0dc79ea40025b1d7454af
Reviewed-By: Pedro Alves <pedro@palves.net>
19 months agogdb: make regcache::raw_update switch to right inferior
Simon Marchi [Mon, 3 Apr 2023 18:52:06 +0000 (14:52 -0400)]
gdb: make regcache::raw_update switch to right inferior

With the following patch, which teaches the amd-dbgapi target to handle
inferiors that fork, we end up with target stacks in the following
state, when an inferior that does not use the GPU forks an inferior that
eventually uses the GPU.

    inf 1            inf 2
    -----            -----
                     amd-dbgapi
    linux-nat        linux-nat
    exec             exec

When a GPU thread from inferior 2 hits a breakpoint, the following
sequence of events would happen, if it was not for the current patch.

 - we start with inferior 1 as current
 - do_target_wait_1 makes inferior 2 current, does a target_wait, which
   returns a stop event for an amd-dbgapi wave (thread).
 - do_target_wait's scoped_restore_current_thread restores inferior 1 as
   current
 - fetch_inferior_event calls switch_to_target_no_thread with linux-nat
   as the process target, since linux-nat is officially the process
   target of inferior 2.  This makes inferior 1 the current inferior, as
   it's the first inferior with that target.
 - In handle_signal_stop, we have:

    ecs->event_thread->suspend.stop_pc
      = regcache_read_pc (get_thread_regcache (ecs->event_thread));

    context_switch (ecs);

   regcache_read_pc executes while inferior 1 is still the current one
   (because it's before the `context_switch`).  This is a problem,
   because the regcache is for a ptid managed by the amd-dbgapi target
   (e.g. (12345, 1, 1)), a ptid that does not make sense for the
   linux-nat target.  The fetch_registers target call goes directly
   to the linux-nat target, which gets confused.
 - We would then get an error like:

     Couldn't get extended state status: No such process.

   ... since linux-nat tries to do a ptrace call on tid 1.

GDB should switch to the inferior the ptid belongs to before doing the
target call to fetch registers, to make sure the call hits the right
target stack (it should be handled by the amd-dbgapi target in this
case).  In fact the following patch does this change, and it would be
enough to fix this specific problem.

However, I propose to change regcache to make it switch to the right
inferior, if needed, before doing target calls.  That makes the
interface as a whole more independent of the global context.

My first attempt at doing this was to find an inferior using the process
stratum target and the ptid that regcache already knows about:

      gdb::optional<scoped_restore_current_thread> restore_thread;
      inferior *inf = find_inferior_ptid (this->target (), this->ptid ());
      if (inf != current_inferior ())
{
  restore_thread.emplace ();
  switch_to_inferior_no_thread (inf);
}

However, this caused some failures in fork-related tests and gdbserver
boards.  When we detach a fork child, we may create a regcache for the
child, but there is no corresponding inferior.  For instance, to restore
the PC after a displaced step over the fork syscall.  So
find_inferior_ptid would return nullptr, and
switch_to_inferior_no_thread would hit a failed assertion.

So, this patch adds to regcache the information "the inferior to switch
to to makes target calls".  In typical cases, it will be the inferior
that matches the regcache's ptid.  But in some cases, like the detached
fork child one, it will be another inferior (in this example, it will be
the fork parent inferior).

The problem that we witnessed was in regcache::raw_update specifically,
but I looked for other regcache methods doing target calls, and added
the same inferior switching code to raw_write too.

In the regcache constructor and in get_thread_arch_aspace_regcache,
"inf_for_target_calls" replaces the process_stratum_target parameter.
We suppose that the process stratum target that would be passed
otherwise is the same that is in inf_for_target_calls's target stack, so
we don't need to pass both in parallel.  The process stratum target is
still used as a key in the `target_pid_ptid_regcache_map` map, but
that's it.

There is one spot that needs to be updated outside of the regcache code,
which is the path that handles the "restore PC after a displaced step in
a fork child we're about to detach" case mentioned above.

regcache_test_data needs to be changed to include full-fledged mock
contexts (because there now needs to be inferiors, not just targets).

Change-Id: Id088569ce106e1f194d9ae7240ff436f11c5e123
Reviewed-By: Pedro Alves <pedro@palves.net>
19 months agogdb: add maybe_switch_inferior function
Simon Marchi [Mon, 3 Apr 2023 18:52:05 +0000 (14:52 -0400)]
gdb: add maybe_switch_inferior function

Add the maybe_switch_inferior function, which ensures that the given
inferior is the current one.  Return an instantiated
scoped_restore_current_thread object only we actually needed to switch
inferior.

Returning a scoped_restore_current_thread requires it to be
move-constructible, so give it a move constructor.

Change-Id: I1231037102ed6166f2530399e8257ad937fb0569
Reviewed-By: Pedro Alves <pedro@palves.net>
19 months agogdb: remove regcache::target
Simon Marchi [Mon, 3 Apr 2023 18:52:04 +0000 (14:52 -0400)]
gdb: remove regcache::target

The regcache class takes a process_stratum_target and then exposes it
through regcache::target.  But it doesn't use it itself, suggesting it
doesn't really make sense to put it there.  The only user of
regcache::target is record_btrace_target::fetch_registers, but it might
as well just get it from the current target stack.  This simplifies a
little bit a patch later in this series.

Change-Id: I8878d875805681c77f469ac1a2bf3a508559a62d
Reviewed-By: Pedro Alves <pedro@palves.net>
19 months agogdb: add inferior_forked observable
Simon Marchi [Mon, 3 Apr 2023 18:52:03 +0000 (14:52 -0400)]
gdb: add inferior_forked observable

In the upcoming patch to support fork in the amd-dbgapi target, the
amd-dbgapi target will need to be notified of fork events through an
observer, to attach itself (attach in the amd-dbgapi sense, not ptrace
sense) to the new inferior / process.

The reason that this can't be done through target_ops::follow_fork is
that the amd-dbgapi target isn't pushed on the inferior's target stack
right away.  It attaches itself to the process and only pushes itself on
its target stack if and when the inferior initializes the ROCm runtime.

If an inferior that is not using the ROCm runtime forks, we want to be
notified of it, so we can attach to the child, and catch if the child
starts using the ROCm runtime.

So, add a new observable and notify it in follow_fork_inferior.  It will
be used later in this series.

Change-Id: I67fced5a9cba6d5da72b9c7ea1c8397644ca1d54
Reviewed-By: Pedro Alves <pedro@palves.net>
19 months agogdb: pass execing and following inferior to inferior_execd observers
Simon Marchi [Mon, 3 Apr 2023 18:52:02 +0000 (14:52 -0400)]
gdb: pass execing and following inferior to inferior_execd observers

The upcoming patch to support exec in the amd-dbgapi target needs to
detach amd-dbgapi from the inferior doing the exec and attach amd-dbgapi
to the inferior continuing the execution.  They may or may not be the
same, depending on the `set follow-exec-mode` setting.  But even if they
are the same, we need to do the detach / attach dance.

With the current observable signature, the observers only receive the
inferior in which execution continues (the "following" inferior).

Change the signature to pass both inferiors, and update all existing
observers.

Change-Id: I259d1ea09f70f43be739378d6023796f2fce2659
Reviewed-By: Pedro Alves <pedro@palves.net>
19 months agoAdd 128-bit integer support to the Ada parser
Tom Tromey [Mon, 27 Mar 2023 20:26:53 +0000 (14:26 -0600)]
Add 128-bit integer support to the Ada parser

This adds support for 128-bit integers to the Ada parser.

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

19 months agoRemove some Ada parser helper functions
Tom Tromey [Mon, 27 Mar 2023 19:52:01 +0000 (13:52 -0600)]
Remove some Ada parser helper functions

These helper functions in the Ada parser don't seem all that
worthwhile to me, so this patch removes them.

19 months agoAdd overload of fits_in_type
Tom Tromey [Mon, 27 Mar 2023 19:42:38 +0000 (13:42 -0600)]
Add overload of fits_in_type

This adds an overload of fits_in_type that accepts a gdb_mpz.  A
subsequent patch will use this.

19 months agoAdd 128-bit integer support to the Rust parser
Tom Tromey [Mon, 27 Mar 2023 19:05:03 +0000 (13:05 -0600)]
Add 128-bit integer support to the Rust parser

This adds support for 128-bit integers to the Rust parser.

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

19 months agoConvert long_const_operation to use gdb_mpz
Tom Tromey [Mon, 27 Mar 2023 18:54:51 +0000 (12:54 -0600)]
Convert long_const_operation to use gdb_mpz

This changes long_const_operation to use gdb_mpz for its storage.

19 months agoAdditions to gdb_mpz
Tom Tromey [Mon, 27 Mar 2023 20:35:17 +0000 (14:35 -0600)]
Additions to gdb_mpz

In preparation for adding more 128-bit support to gdb, a few additions
to gdb_mpz are needed.

First, this adds a new 'as_integer_truncate' method.  This method
works like 'as_integer' but does not require the value to fit in the
target type -- it just truncates.

Second, gdb_mpz::export_bits is changed to handle the somewhat unusual
situation of zero-length types.  This can happen for a Rust '()' type;
but I think other languages have zero-bit integer types as well.

Finally, this adds some operator== overloads.

19 months agoMake the .rsrc section read only.
Nick Clifton [Mon, 17 Apr 2023 16:19:21 +0000 (17:19 +0100)]
Make the .rsrc section read only.

  PR 30142
  * peXXigen.c (_bfd_XXi_swap_scnhdr_out): Do not force the .rsrc section to be writeable.
  * rescoff.c (write_coff_file): Add the SEC_READONLY flag to the .rsrc section.

19 months ago[gdb/symtab] Handle empty file name in .debug_line section
Tom de Vries [Mon, 17 Apr 2023 16:09:32 +0000 (18:09 +0200)]
[gdb/symtab] Handle empty file name in .debug_line section

With DWARF 5, it's possible to produce an empty file name in the File Name
Table of the .debug_line section:
...
 The File Name Table (offset 0x112, lines 1, columns 2):
  Entry Dir     Name
  0     1       (indirect line string, offset: 0x2d):
...

Currently, when gdb reads an exec containing such debug info, it segfaults:
...
Thread 1 "gdb" received signal SIGSEGV, Segmentation fault.
0x000000000072cd38 in dwarf2_start_subfile (cu=0x2badc50, fe=..., lh=...) at \
  gdb/dwarf2/read.c:18716
18716     if (!IS_ABSOLUTE_PATH (filename) && dirname != NULL)
...
because read_direct_string transforms "" into a nullptr, and we end up
dereferencing the nullptr.

Note that the behaviour of read_direct_string has been present since repo
creation.

Fix this in read_formatted_entries, by transforming nullptr filenames in to ""
filenames.

Tested on x86_64-linux.

Reviewed-By: Tom Tromey <tom@tromey.com>
PR symtab/30357
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30357

19 months agoAdd support for the .gnu.sgstubs section to the linker for ARM/ELF based targets.
Nick Clifton [Mon, 17 Apr 2023 14:48:45 +0000 (15:48 +0100)]
Add support for the .gnu.sgstubs section to the linker for ARM/ELF based targets.

  PR 30354
  * emulparams/armelf.sh (OTHER_PLT_SECTIONS): Define in order to handle the .gnu.sgstubs section.

19 months agoAutomatic date update in version.in
GDB Administrator [Mon, 17 Apr 2023 00:00:21 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agoAutomatic date update in version.in
GDB Administrator [Sun, 16 Apr 2023 00:00:18 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agoAutomatic date update in version.in
GDB Administrator [Sat, 15 Apr 2023 00:00:19 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agogdb/testsuite: accept script argument for mi_make_breakpoint_pending
Andrew Burgess [Tue, 4 Apr 2023 17:10:48 +0000 (18:10 +0100)]
gdb/testsuite: accept script argument for mi_make_breakpoint_pending

This commit changes mi_make_breakpoint_pending to accept the 'script'
and 'times' arguments.

I've then added a new test that makes use of 'scripts' in
gdb.mi/mi-pending.exp and gdb.mi/mi-dprintf-pending.exp.

There is already a test in gdb.mi/mi-pending.exp that uses the 'times'
argument -- previously this argument was being ignored, but is now
used.

Reviewed-By: Tom Tromey <tom@tromey.com>
19 months agogdb/testsuite: avoid {"} pattern in lib/mi-support.exp
Andrew Burgess [Tue, 4 Apr 2023 17:19:54 +0000 (18:19 +0100)]
gdb/testsuite: avoid {"} pattern in lib/mi-support.exp

Commit:

  commit c569a946f6925d3f210c3eaf74dcda56843350ef
  Date:   Fri Mar 24 10:45:37 2023 +0100

      [gdb/testsuite] Fix unbalanced quotes in mi_expect_stop argument

Introduced the use of {"} in mi-support.exp.  There is absolutely
nothing wrong with this in any way.  However, this is causing my
editor to get the syntax highlighting of this file wrong after this
point.

Maybe the real answer is to use a better editor, or fix my current
editor.... but I'm hoping I can instead take the lazy approach of just
changing {"} to "\"", which is handled fine, and means exactly the
same as far as I understand it.

There should be no change in what is tested after this commit.

Reviewed-By: Tom Tromey <tom@tromey.com>
19 months agopauth: Create new feature string for pauth to prevent crashing older gdb's
Luis Machado [Mon, 3 Apr 2023 09:43:34 +0000 (10:43 +0100)]
pauth: Create new feature string for pauth to prevent crashing older gdb's

Older gdb's (9, 10, 11 and 12) have a bug that causes them to crash whenever
a target reports the pauth feature string in the target description and also
provide additional register outside of gdb's known and expected feature
strings.

This was fixed in gdb 13 onwards, but that means we're stuck with gdb's out
there that will crash on connection to the above targets.

QEMU has postponed inclusion of the pauth feature string in version 8, and
instead we agreed to use a new feature name to prevent crashing those older
gdb's.

Initially there was a plan to backport a trivial fix all the way to gdb 9, but
given QEMU's choice, this is no longer needed.

This new feature string is org.gnu.gdb.aarch64.pauth_v2, and should be used
by all targets going forward, except native linux gdb and gdbserver, for
backwards compatibility with older gdb's/gdbserver's.

gdb/gdbserver will still emit the old feature string for Linux since it doesn't
report additional system registers and thus doesn't cause a crash of older
gdb's. We can revisit this in the future once the problematic gdb's are likely
no longer in use.

I've added some documentation to explain the situation.

19 months agodebug registers: Add missing debug version entry for FEAT_Debugv8p8
Luis Machado [Thu, 13 Apr 2023 13:42:31 +0000 (14:42 +0100)]
debug registers: Add missing debug version entry for FEAT_Debugv8p8

The Arm Architecture Reference Manual defines debug version 0b1010 for
FEAT_Debugv8p8. This is used to identify valid hardware debug registers.

gdb currently only knows about versions up to FEAT_Debugv8p4. This patch
teaches gdb about this new version.

No visible changes should happen as consequence of this patch, but in the
future gdb will be able to identify debug registers in newer hardware.

Regression-tested on aarch64-linux Ubuntu 20.04/22.04.

19 months agogdb/testsuite: Skip dump ihex for 64-bit address in gdb.base/dump.exp
Hui Li [Mon, 6 Mar 2023 03:55:15 +0000 (11:55 +0800)]
gdb/testsuite: Skip dump ihex for 64-bit address in gdb.base/dump.exp

(1) Description of problem

In the current code, when execute the following test on LoongArch:

$make check-gdb TESTS="gdb.base/dump.exp"
```
FAIL: gdb.base/dump.exp: dump array as value, intel hex
FAIL: gdb.base/dump.exp: dump struct as value, intel hex
FAIL: gdb.base/dump.exp: dump array as memory, ihex
FAIL: gdb.base/dump.exp: dump struct as memory, ihex

```
These tests passed on the X86_64,

(2) Root cause

On LoongArch, variable intarray address 0x120008068 out of range for IHEX,
so dump ihex test failed.

gdb.base/dump.exp has the following code to check 64-bit address

```
 # Check the address of a variable.  If it is bigger than 32-bit,
 # assume our target has 64-bit addresses that are not supported by SREC,
 # IHEX and TEKHEX.  We skip those tests then.
 set max_32bit_address "0xffffffff"
 set data_address [get_hexadecimal_valueof "&intarray" 0x100000000]
 if {${data_address} > ${max_32bit_address}} {
    set is64bitonly "yes"
}
```

We check the "&intarray" on different target as follow:

```
$gdb gdb/testsuite/outputs/gdb.base/dump/dump
...
(gdb) start
...

On X86_64:
(gdb) print /x &intarray
$1 = 0x404060

On LoongArch:
(gdb) print /x &intarray
$1 = 0x120008068
```
The variable address difference here is due to the link script
of linker.

```
On X86_64:
$ld --verbose
...
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000));
. = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;

On LoongArch:
$ld --verbose
...
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x120000000));
. = SEGMENT_START("text-segment", 0x120000000) + SIZEOF_HEADERS;

```

(3) How to fix

Because 64-bit variable address out of range for IHEX, it's not an
functional problem for LoongArch. Refer to the handling of 64-bit
targets in this testsuite, use the "is64bitonly" flag to skip those
tests for the target has 64-bit addresses.

Signed-off-by: Hui Li <lihui@loongson.cn>
Approved-By: Tom Tromey <tom@tromey.com>
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
19 months ago[gdb/testsuite] Add regression test for PR30325
Tom de Vries [Fri, 14 Apr 2023 11:47:19 +0000 (13:47 +0200)]
[gdb/testsuite] Add regression test for PR30325

Add regression tests for PR30325, one for the asm window and one for the
source window.

Use maint set tui-left-margin verbose to make the extend of the left margin
clear.

Tested on x86_64-linux.

Approved-By: Andrew Burgess <aburgess@redhat.com>
19 months agoAutomatic date update in version.in
GDB Administrator [Fri, 14 Apr 2023 00:00:26 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agoAvoid double-free with debuginfod
Tom Tromey [Tue, 6 Dec 2022 19:07:12 +0000 (12:07 -0700)]
Avoid double-free with debuginfod

PR gdb/29257 points out a possible double free when debuginfod is in
use.  Aside from some ugly warts in the symbol code (an ongoing
issue), the underlying issue in this particular case is that elfread.c
seems to assume that symfile_bfd_open will return NULL on error,
whereas in reality it throws an exception.  As this code isn't
prepared for an exception, bad things result.

This patch fixes the problem by introducing a non-throwing variant of
symfile_bfd_open and using it in the affected places.

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

19 months agoarc: Update ARC specific linker tests.
Claudiu Zissulescu [Thu, 13 Apr 2023 08:09:26 +0000 (11:09 +0300)]
arc: Update ARC specific linker tests.

All the tests are designed for a little-endian ARC system. Thus,
update the arc predicate in arc.exp, improve the matching pattern for
linker relaxation test, and add linker scripts to nps-1x tests.

Signed-off-by: Claudiu Zissulescu <claziss@synopsys.com>
19 months agoarc: Update ARC's CFI tests.
Claudiu Zissulescu [Thu, 13 Apr 2023 07:22:48 +0000 (10:22 +0300)]
arc: Update ARC's CFI tests.

The double store/loads instructions (e.g. STD/LDD) are not baseline
ARC ISA.  The same holds for some short instructions.  Update the
tests to use base ARC ISA.

Signed-off-by: Claudiu Zissulescu <claziss@synopsys.com>
19 months agoarc: Update GAS test
Claudiu Zissulescu [Thu, 13 Apr 2023 07:04:41 +0000 (10:04 +0300)]
arc: Update GAS test

Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
19 months agoPreserve a few more bfd fields in check_format_matches
Alan Modra [Thu, 13 Apr 2023 05:33:16 +0000 (15:03 +0930)]
Preserve a few more bfd fields in check_format_matches

AOUT and COFF targets set symcount and start_address in their object_p
functions.  If these are used anywhere then it would pay to save and
restore them so that a successful match gets the values expected
rather than that for a later unsuccessful target match.

* format.c (struct bfd_preserve): Move some fields.  Add
symcount, read_only and start_address.
(bfd_preserve_save): Save..
(bfd_preserve_restore): ..and restore..
(bfd_reinit): ..and zero new fields.

19 months agoRe: pe_ILF_object_p and bfd_check_format_matches
Alan Modra [Thu, 13 Apr 2023 02:14:41 +0000 (11:44 +0930)]
Re: pe_ILF_object_p and bfd_check_format_matches

The last patch wasn't quite correct.  bfd_preserve_restore also needs
to handle an in-memory to file backed transition, seen in a testcase
ILF object matching both pei-arm-little and pei-arm-wince-little.
There the first match is saved in preserve_match, and restored at the
end of the bfd_check_format_matches loop making the bfd in-memory.  On
finding more than one match the function wants to restore the bfd back
to its original state with another bfd_preserve_restore call before
exiting with a bfd_error_file_ambiguously_recognized error.

It is also not correct to restore abfd->iostream unless the iovec
changes.  abfd->iostream is a FILE* when using cache_iovec, and if
the file has been closed and reopened the iostream may have changed.

* format.c (io_reinit): New function.
(bfd_reinit, bfd_preserve_restore): Use it.

19 months agoAutomatic date update in version.in
GDB Administrator [Thu, 13 Apr 2023 00:00:22 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months ago[gdb/tui] Revert workaround in tui_source_window::show_line_number
Tom de Vries [Wed, 12 Apr 2023 22:18:12 +0000 (00:18 +0200)]
[gdb/tui] Revert workaround in tui_source_window::show_line_number

The m_digits member of tui_source_window is documented as having semantics:
...
  /* How many digits to use when formatting the line number.  This
     includes the trailing space.  */
...

The commit 1b6d4bb2232 ("Redraw both spaces between line numbers and source
code") started printing two trailing spaces instead:
...
-  xsnprintf (text, sizeof (text), "%*d ", m_digits - 1, lineno);
+  xsnprintf (text, sizeof (text), "%*d  ", m_digits - 1, lineno);
...

Now that PR30325 is fixed, this no longer has any effect.

Fix this by reverting to the original behaviour: print one trailing space
char.

Tested on x86_64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
19 months ago[gdb/tui] Fix left margin in disassembly window
Tom de Vries [Wed, 12 Apr 2023 22:18:12 +0000 (00:18 +0200)]
[gdb/tui] Fix left margin in disassembly window

With a hello world a.out, and maint set tui-left-margin-verbose on, we have
this disassembly window:
...
┌───────────────────────────────────────────────────────────┐
│___ 0x555555555149 <main>           endbr64                │
│___ 0x55555555514d <main+4>         push   %rbp            │
│___ 0x55555555514e <main+5>         mov    %rsp,%rbp       │
│B+> 0x555555555151 <main+8>         lea    0xeac(%rip),%rax│
│___ 0x555555555158 <main+15>        mov    %rax,%rdi       │
...
Note the space between "B+>" and 0x555555555151.  The space shows that a bit
of the left margin is not written, which is a problem because that location is
showing a character previously written, which happens to be a space, but also
may be something else, for instance a '[' as reported in PR tui/30325.

The problem is caused by confusion about the meaning of:
...
 #define TUI_EXECINFO_SIZE 4
...

There's the meaning of defining the size of this zero-terminated char array:
...
      char element[TUI_EXECINFO_SIZE];
...
which is used to print the "B+>" bit, which is 3 chars wide.

And there's the meaning of defining part of the size of the left margin:
...
  int left_margin () const
  { return 1 + TUI_EXECINFO_SIZE + extra_margin (); }
...
where it represents 4 chars.

The discrepancy between the two causes the space between "B+>" and
"0x555555555151".

Fix this by redefining TUI_EXECINFO_SIZE to 3, and using:
...
      char element[TUI_EXECINFO_SIZE + 1];
...
such that we have:
...
|B+>0x555555555151 <main+8>         lea    0xeac(%rip),%rax │
...

This changes the layout of the disassembly window back to what it was before
commit 9e820dec13e ("Use a curses pad for source and disassembly windows"),
the commit that introduced the PR30325 regression.

This also changes the source window from:
...
│___000005__{                                               |
...
to:
...
│___000005_{                                                |
...

Tested on x86_64-linux.

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

Approved-By: Tom Tromey <tom@tromey.com>
19 months ago[gdb/tui] Add maint set/show tui-left-margin-verbose
Tom de Vries [Wed, 12 Apr 2023 22:18:12 +0000 (00:18 +0200)]
[gdb/tui] Add maint set/show tui-left-margin-verbose

The TUI has two types of windows derived from tui_source_window_base:
- tui_source_window (the source window), and
- tui_disasm_window (the disassembly window).

The two windows share a common concept: the left margin.

With a hello world a.out, we can see the source window:
...
┌─/home/vries/hello.c───────────────────────────────────────┐
│        5  {                                               │
│B+>     6    printf ("hello\n");                           │
│        7    return 0;                                     │
│        8  }                                               │
│        9                                                  │

...
where the left margin is the part holding "B+>" and the line number, and the
disassembly window:
...
┌───────────────────────────────────────────────────────────┐
│    0x555555555149 <main>           endbr64                │
│    0x55555555514d <main+4>         push   %rbp            │
│    0x55555555514e <main+5>         mov    %rsp,%rbp       │
│B+> 0x555555555151 <main+8>         lea    0xeac(%rip),%rax│
│    0x555555555158 <main+15>        mov    %rax,%rdi       │
...
where the left margin is just the bit holding "B+>".

Because the left margin contains some spaces, it's not clear where it starts
and ends, making it harder to observe problems related to it.

Add a new maintenance command "maint set tui-left-margin-verbose", that when
set to on replaces the spaces in the left margin with either '_' or '0',
giving us this for the source window:
...
┌─/home/vries/hello.c───────────────────────────────────────┐
│___000005__{                                               │
│B+>000006__  printf ("hello\n");                           │
│___000007__  return 0;                                     │
│___000008__}                                               │
...
and this for the disassembly window:
...
┌───────────────────────────────────────────────────────────┐
│___ 0x555555555149 <main>           endbr64                │
│___ 0x55555555514d <main+4>         push   %rbp            │
│___ 0x55555555514e <main+5>         mov    %rsp,%rbp       │
│B+> 0x555555555151 <main+8>         lea    0xeac(%rip),%rax│
│___ 0x555555555158 <main+15>        mov    %rax,%rdi       │
...

Note the space between "B+>" and 0x555555555151.  The space shows that a bit
of the left margin is not written, a problem reported as PR tui/30325.

Specifically, PR tui/30325 is about the fact that the '[' character from the
string "[ No Assembly Available ]" ends up in that same spot:
...
│B+>[0x555555555151 <main+8>         lea    0xeac(%rip),%rax│
...
which only happens for certain window widths.

The new command allows us to spot the problem with any window width.

Likewise, when we revert the fix from commit 1b6d4bb2232 ("Redraw both spaces
between line numbers and source code"), we have:
...
┌─/home/vries/hello.c───────────────────────────────────────┐
│___000005_ {                                               │
│B+>000006_   printf ("hello\n");                           │
│___000007_   return 0;                                     │
│___000008_ }                                               │
...
showing a similar problem at the space between '_' and '{'.

Tested on x86_64-linux.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom Tromey <tom@tromey.com>
19 months agoUse SELF_CHECK in all unit tests
Tom Tromey [Fri, 7 Apr 2023 20:51:58 +0000 (14:51 -0600)]
Use SELF_CHECK in all unit tests

I noticed a few unit tests are using gdb_assert.  I think this was an
older style, before SELF_CHECK was added.  This patch switches them
over.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
19 months agoarc: remove faulty instructions
Claudiu Zissulescu [Wed, 12 Apr 2023 15:35:58 +0000 (18:35 +0300)]
arc: remove faulty instructions

Clean not implemented ARC instruction from ARC instruction table.

19 months agoUse 'require' with gnatmake_version_at_least
Tom Tromey [Wed, 12 Apr 2023 14:36:15 +0000 (08:36 -0600)]
Use 'require' with gnatmake_version_at_least

I found a couple of tests that check gnatmake_version_at_least using
"if" where "require" would be a little cleaner.  This patch converts
these.

19 months agoMIPS: make mipsisa32 and mipsisa64 link more systematic
YunQiang Su [Wed, 12 Apr 2023 12:25:46 +0000 (13:25 +0100)]
MIPS: make mipsisa32 and mipsisa64 link more systematic

Introduce `static const struct mips_mach_extension mips_mach_32_64[]`
and `mips_mach_extends_32_64 (unsigned long base, unsigned long extension)`,
to make mipsisa32 and mipsisa64 interlink more systemtic.

Normally, the ISA mipsisa64rN has two subset: mipsisa64r(N-1) and
mipsisa32rN. `mips_mach_extensions` can hold only mipsisa64r(N-1),
so we need to introduce a new instruction `mips_mach_32_64`, which holds the pair 32vs64.

Note: R6 is not compatible with pre-R6.

bfd/ChangeLog:

* elfxx-mips.c (mips_mach_extends_p): make mipsisa32 and
  mipsisa64 interlink more systematic.
  (mips_mach_32_64): new struct added.
  (mips_mach_extends_32_64): new function added.

19 months agoFix typos in the linker's documentation of the --enable-non-contiguous-regions option.
Nick Clifton [Wed, 12 Apr 2023 08:54:48 +0000 (09:54 +0100)]
Fix typos in the linker's documentation of the --enable-non-contiguous-regions option.

19 months agoPR30326, uninitialised value in objdump compare_relocs
Alan Modra [Wed, 12 Apr 2023 01:30:42 +0000 (11:00 +0930)]
PR30326, uninitialised value in objdump compare_relocs

This is a fuzzing PR, with a testcase involving a SHF_ALLOC and
SHF_COMPRESSED SHT_RELA section, ie. a compressed dynamic reloc
section.  BFD doesn't handle compressed relocation sections, with most
of the code reading relocs using sh_size (often no bfd section is
created) but in the case of SHF_ALLOC dynamic relocs we had some code
using the bfd section size.  This led to a mismatch, sh_size is
compressed, size is uncompressed, and from that some uninitialised
memory.  Consistently using sh_size is enough to fix this PR, but I've
also added tests to exclude SHF_COMPRESSED reloc sections from
consideration.

PR 30362
* elf.c (bfd_section_from_shdr): Exclude reloc sections with
SHF_COMPRESSED flag from normal reloc processing.
(_bfd_elf_get_dynamic_reloc_upper_bound): Similarly exclude
SHF_COMPRESSED sections from consideration.  Use sh_size when
sizing to match slurp_relocs.
(_bfd_elf_canonicalize_dynamic_reloc): Likewise.
(_bfd_elf_get_synthetic_symtab): Use NUM_SHDR_ENTRIES to size
plt relocs.
* elf32-arm.c (elf32_arm_get_synthetic_symtab): Likewise.
* elf32-ppc.c (ppc_elf_get_synthetic_symtab): Likewise.
* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Likewise.
* elfxx-mips.c (_bfd_mips_elf_get_synthetic_symtab): Likewise.

19 months agoubsan: dwarf2.c:2232:7: runtime error: index 16 out of bounds
Alan Modra [Wed, 12 Apr 2023 00:00:26 +0000 (09:30 +0930)]
ubsan: dwarf2.c:2232:7: runtime error: index 16 out of bounds

Except it isn't out of bounds because space for a larger array has
been allocated.

* dwarf2.c (struct trie_leaf): Make ranges a C99 flexible array.
(alloc_trie_leaf, insert_arange_in_trie): Adjust sizing.

19 months agoFail of x86_64 AMX-COMPLEX insns (Intel disassembly)
Alan Modra [Tue, 11 Apr 2023 13:54:34 +0000 (23:24 +0930)]
Fail of x86_64 AMX-COMPLEX insns (Intel disassembly)

x86_64-w64-mingw32 pads sections.

* testsuite/gas/i386/x86-64-amx-complex-intel.d: Don't fail
due to nop padding.

19 months agope_ILF_object_p and bfd_check_format_matches
Alan Modra [Tue, 11 Apr 2023 12:41:26 +0000 (22:11 +0930)]
pe_ILF_object_p and bfd_check_format_matches

If pe_ILF_object_p succeeds, pe_ILF_build_a_bfd will have changed the
bfd from being file backed to in-memory.  This can have unfortunate
results for targets checked by bfd_check_format_matches after that
point as they will be matching against the created in-memory image
rather than the file.  bfd_preserve_restore also has a problem if it
flips the BFD_IN_MEMORY flag, because the flag affects iostream
meaning and should be set if using _bfd_memory_iovec.  To fix these
problems, save and restore iostream and iovec along with flags, and
modify bfd_reinit to make the bfd file backed again.  Restoring the
iovec and iostream allows the hack in bfd_reinit keeping BFD_IN_MEMORY
(part of BFD_FLAGS_SAVED) to be removed.
One more detail: If restoring from file backed to in-memory then the
bfd needs to be forcibly removed from the cache lru list, since after
the bfd becomes in-memory a bfd_close will delete the bfd's memory
leaving the lru list pointing into freed memory.

* cache.c (bfd_cache_init): Clear BFD_CLOSED_BY_CACHE here..
(bfd_cache_lookup_worker): ..rather than here.
(bfd_cache_close): Comment.
* format.c (struct bfd_preserve): Add iovec and iostream fields.
(bfd_preserve_save): Save them..
(bfd_preserve_restore): ..and restore them, calling
bfd_cache_close if the iovec differs.
(bfd_reinit): Add preserve param.  If the bfd has been flipped
to in-memory, reopen the file.  Restore flags.
* peicode.h (pe_ILF_cleanup): New function.
(pe_ILF_object_p): Return it.
* bfd.c (BFD_FLAGS_SAVED): Delete.
* bfd-in2.h: Regenerate.

19 months agoComment typo fix
Alan Modra [Tue, 11 Apr 2023 02:45:58 +0000 (12:15 +0930)]
Comment typo fix

19 months agoAutomatic date update in version.in
GDB Administrator [Wed, 12 Apr 2023 00:00:16 +0000 (00:00 +0000)]
Automatic date update in version.in

19 months agobfd: optimize bfd_elf_hash
Nathan Sidwell [Tue, 11 Apr 2023 21:47:31 +0000 (17:47 -0400)]
bfd: optimize bfd_elf_hash

The bfd_elf_hash loop is taken straight from the sysV document, but it
is poorly optimized. This refactoring removes about 5 x86 insns from
the 15 insn loop.

1) The if (..) is meaningless -- we're xoring with that value, and of
course xor 0 is a nop. On x86 (at least) we actually compute the xor'd
value and then cmov.  Removing the if test removes the cmov.

2) The 'h ^ g' to clear the top 4 bits is not needed, as those 4 bits
will be shifted out in the next iteration.  All we need to do is sink
a mask of those 4 bits out of the loop.

3) anding with 0xf0 after shifting by 24 bits can allow betterin
encoding on RISC ISAs than masking with '0xf0 << 24' before shifting.
RISC ISAs often require materializing larger constants.

bfd/
* elf.c (bfd_elf_hash): Refactor to optimize loop.
(bfd_elf_gnu_hash): Refactor to use 32-bit type.

19 months agogdb, doc: correct argument description for info connections/inferiors
Nils-Christian Kempke [Thu, 25 Nov 2021 10:53:30 +0000 (10:53 +0000)]
gdb, doc: correct argument description for info connections/inferiors

It said for 'info inferiors' and 'info connections' that the argument
could be 'a space separated list of inferior numbers' which is correct
but incomplete.  In fact the arguments can be any space separated
combination of numbers and (ascending) ranges.

The beginning of the section now describes the ID list as a new keyword.

Co-Authored-By: Christina Schimpe <christina.schimpe@intel.com>
19 months agoReplace an assertion in the dwarf code with a warning message.
Nick Clifton [Tue, 11 Apr 2023 16:24:09 +0000 (17:24 +0100)]
Replace an assertion in the dwarf code with a warning message.

  PR 30327
  * dwarf.c (read_and_display_attr_value): Warn if the number of views is greater than the number of locations.

19 months agoFix an illegal memorty access when running gprof over corrupt data.
Nick Clifton [Tue, 11 Apr 2023 15:22:28 +0000 (16:22 +0100)]
Fix an illegal memorty access when running gprof over corrupt data.

  PR 30324
  * symtab.c (symtab_finalize): Only change the end address if dst has been updated.

19 months agoFix an attempt to allocate an excessive amount of memory when parsing a corrupt DWARF...
Nick Clifton [Tue, 11 Apr 2023 15:14:23 +0000 (16:14 +0100)]
Fix an attempt to allocate an excessive amount of memory when parsing a corrupt DWARF file.

  PR 30313
  * dwarf.c (display_debug_lines_decoded): Check for an overlarge number of files or directories.

19 months agoFix a potential illegal memory access when displaying corrupt DWARF information.
Nick Clifton [Tue, 11 Apr 2023 14:59:07 +0000 (15:59 +0100)]
Fix a potential illegal memory access when displaying corrupt DWARF information.

  PR 30312
  * dwarf.c (prealloc_cu_tu_list): Always allocate at least one entry.