binutils-gdb.git
21 months agoWild pointer reads in _bfd_ecoff_locate_line
Alan Modra [Fri, 17 Feb 2023 01:56:13 +0000 (12:26 +1030)]
Wild pointer reads in _bfd_ecoff_locate_line

* ecofflink.c (mk_fdrtab): Sanity check fdr procedure descriptor
pointer and isymBase.  Set fdrtab_len after possible discards.
Use size_t vars and catch possible size overflows.

21 months agoAutomatic date update in version.in
GDB Administrator [Fri, 17 Feb 2023 00:00:09 +0000 (00:00 +0000)]
Automatic date update in version.in

21 months agoPR30046, power cmpi leads to unknown architecture
Alan Modra [Thu, 16 Feb 2023 10:17:44 +0000 (20:47 +1030)]
PR30046, power cmpi leads to unknown architecture

PowerPC ELF always uses bfd_arch_powerpc, so we shouldn't allow the
gas -mpwr, -mpwr2 or -mpwrx options to choose bfd_arch_rs6000.
Given the possible values of ppc_cpu, I think the as_fatal at the end
of ppc_arch will never be reached, so it can be deleted and the code
simplified a little.

PR 30046
* config/tc-ppc.c (ppc_arch): Return bfd_arch_powerpc for ELF.
Delete dead code.

21 months agoRename parameter of create_ada_exception_catchpoint
Tom Tromey [Thu, 16 Feb 2023 17:27:26 +0000 (10:27 -0700)]
Rename parameter of create_ada_exception_catchpoint

create_ada_exception_catchpoint has a parameter named "disabled", but
both its callers and callees use it to mean "enabled".  This is
confusing, so this patch renames the parameter.

21 months agoUpdate the 'g' packet documentation
Tom Tromey [Wed, 11 Jan 2023 18:37:25 +0000 (11:37 -0700)]
Update the 'g' packet documentation

The 'g' packet documentation references a macro that no longer exists,
and it also claims that the 'x' response for an unavailable register
is limited to trace frames.  This patch updates the documentation to
reflect what I think is currently correct.

Co-Authored-By: Pedro Alves <pedro@palves.net>
Approved-By: Eli Zaretskii <eliz@gnu.org>
Change-Id: I863baa3b9293059cfd4aa3d534602cbcb693ba87

21 months agoAdd support for the ASCII directive inside linker scripts.
Nick Clifton [Thu, 16 Feb 2023 16:27:08 +0000 (16:27 +0000)]
Add support for the ASCII directive inside linker scripts.

 * ldlex.l: Add ASCII token.
 * ldgram.y: Add parsing of the ASCII command.
 * ldlang.c (lang_add_string): Add maximum size parameter.  Move escape character handling code into separate function.
 * ldlang.h (lang_add_string): Update prototype.
 * NEWS: Mention the new feature.
 * ld.texi (Output Section Data): Document the new directives.
 * testsuite/ld-scripts/asciz.t: Adjust to work on more architectures and to test more aspects of the ASCIZ directive.
 * testsuite/ld-scripts/asciz.d: Adjust to match the changes to the test linker script.
 * testsuite/ld-scripts/ascii.d: New test driver.
 * testsuite/ld-scripts/ascii.s: New test assembler source.
 * testsuite/ld-scripts/ascii.t: New test script.
 * testsuite/ld-scripts/script.exp: Run the new test.

21 months agoConstify ada_main_name
Tom Tromey [Thu, 16 Feb 2023 15:10:59 +0000 (08:10 -0700)]
Constify ada_main_name

Unlike the other *_main_name functions, ada_main_name returns a
non-const "char *".  This is strange, though, because the caller
should not in fact modify or free this pointer.  This patch changes
this function to constify its return type.

21 months agoRemove unused declaration from ada-lang.h
Tom Tromey [Thu, 16 Feb 2023 15:08:31 +0000 (08:08 -0700)]
Remove unused declaration from ada-lang.h

I stumbled across this declaration in ada-lang.h.  I don't know what
function did, but it no longer exists, so remove the declaration.
Tested by rebuilding.

21 months agoDelete PROGRESS macros
Alan Modra [Wed, 15 Feb 2023 22:45:57 +0000 (09:15 +1030)]
Delete PROGRESS macros

I don't see much point in cluttering the source with the PROGRESS
macros, which of course do nothing at all with the definitions in
progress.h.  progress.h is unchanged apart from the copyright comment
since commit d4d4c53c68f0 in 1994.

binutils/
* ar.c: Don't include progress.h, or invoke PROGRESS macros.
* nm.c: Likewise.
* objcopy.c: Likewise.
* objdump.c: Likewise.
gas/
* as.h: Don't include progress.h.
* as.c: Don't invoke PROGRESS macros.
* write.c: Likewise.
include/
* progress.h: Delete.
ld/
* ldmain.c: Don't include progress.h, or invoke PROGRESS macros.

21 months agogas_init
Alan Modra [Wed, 15 Feb 2023 22:58:29 +0000 (09:28 +1030)]
gas_init

Rename gas_late_init to plain gas_init, to reinforce the idea that
this is where the bulk of gas initialisation belongs.  Also reorder
some initialisation.

* as.c (gas_init): Rename from gas_late_init.  Open output
file and arrange for dump_statistics to be called here rather
than in main.  Create .gasversion. local symbol earlier,
because we can.

21 months agoRISC-V: as_warn() already emits a newline
Jan Beulich [Thu, 16 Feb 2023 08:56:50 +0000 (09:56 +0100)]
RISC-V: as_warn() already emits a newline

Therefore there shouldn't be any at the end of the format string.

21 months agogdb/doc: document MI -remove-inferior command
Andrew Burgess [Wed, 15 Feb 2023 11:42:12 +0000 (11:42 +0000)]
gdb/doc: document MI -remove-inferior command

Back in 2010 the -remove-inferior command was added in commit
a79b8f6ea8c2, unfortunately this command was never added to the
documentation.

This commit addresses that oversight.

Approved-By: Eli Zaretskii <eliz@gnu.org>
21 months agox86/gas: replace inappropriate assertion when parsing registers
Jan Beulich [Thu, 16 Feb 2023 08:40:08 +0000 (09:40 +0100)]
x86/gas: replace inappropriate assertion when parsing registers

PR gas/30117
Once a symbol had its expression evaluated, the "segment" of the symbol
may be reg_section if a register is merely involved in the expression,
not just when the expression references a "plain" register. Therefore
the first of the assertions put in place by 4d1bb7955a8b was too strict.
Convert it to an if() to deal with situations like this one found by
fuzzing:

x=s
s=%eax+0
y=s
or $6,x

In non-debug builds this also avoids potentially silently generating bad
code.

21 months agoAutomatic date update in version.in
GDB Administrator [Thu, 16 Feb 2023 00:00:23 +0000 (00:00 +0000)]
Automatic date update in version.in

21 months agoReturn bool from more value methods
Tom Tromey [Tue, 14 Feb 2023 17:21:58 +0000 (10:21 -0700)]
Return bool from more value methods

There are several more value methods that currently return 'int' but
that should return 'bool'.  This patch updates these.

Reviewed-By: Bruno Larsen <blarsen@redhat.com>
21 months agoHave value::bits_synthetic_pointer return bool
Tom Tromey [Tue, 14 Feb 2023 17:16:26 +0000 (10:16 -0700)]
Have value::bits_synthetic_pointer return bool

This changes value::bits_synthetic_pointer to return bool and fixes up
some fallout from this.

Reviewed-By: Bruno Larsen <blarsen@redhat.com>
21 months agoChange value::m_stack to bool
Tom Tromey [Tue, 14 Feb 2023 16:43:26 +0000 (09:43 -0700)]
Change value::m_stack to bool

This changes value::m_stack to be a bool and updates the various uses.

Reviewed-By: Bruno Larsen <blarsen@redhat.com>
21 months agoChange value::m_initialized to bool
Tom Tromey [Tue, 14 Feb 2023 16:40:35 +0000 (09:40 -0700)]
Change value::m_initialized to bool

This changes value::m_initialized to be a bool and updates the various
uses.

Reviewed-By: Bruno Larsen <blarsen@redhat.com>
21 months agoChange value::m_lazy to bool
Tom Tromey [Tue, 14 Feb 2023 16:37:47 +0000 (09:37 -0700)]
Change value::m_lazy to bool

This changes value::m_lazy to be a bool and updates the various uses.

Reviewed-By: Bruno Larsen <blarsen@redhat.com>
21 months agoChange value::m_modifiable to bool
Tom Tromey [Tue, 14 Feb 2023 16:34:53 +0000 (09:34 -0700)]
Change value::m_modifiable to bool

This changes value::m_modifiable to be a bool and updates the various
uses.

Reviewed-By: Bruno Larsen <blarsen@redhat.com>
21 months agoDon't throw quit while handling inferior events, part II
Pedro Alves [Thu, 9 Feb 2023 18:31:07 +0000 (18:31 +0000)]
Don't throw quit while handling inferior events, part II

I noticed that if Ctrl-C was typed just while GDB is evaluating a
breakpoint condition in the background, and GDB ends up reaching out
to the Python interpreter, then the breakpoint condition would still
fail, like:

  c&
  Continuing.
  (gdb) Error in testing breakpoint condition:
  Quit

That happens because while evaluating the breakpoint condition, we
enter Python, and end up calling PyErr_SetInterrupt (it's called by
gdbpy_set_quit_flag, in frame #0):

 (top-gdb) bt
 #0  gdbpy_set_quit_flag (extlang=0x558c68f81900 <extension_language_python>) at ../../src/gdb/python/python.c:288
 #1  0x0000558c6845f049 in set_quit_flag () at ../../src/gdb/extension.c:785
 #2  0x0000558c6845ef98 in set_active_ext_lang (now_active=0x558c68f81900 <extension_language_python>) at ../../src/gdb/extension.c:743
 #3  0x0000558c686d3e56 in gdbpy_enter::gdbpy_enter (this=0x7fff2b70bb90, gdbarch=0x558c6ab9eac0, language=0x0) at ../../src/gdb/python/python.c:212
 #4  0x0000558c68695d49 in python_on_memory_change (inferior=0x558c6a830b00, addr=0x555555558014, len=4, data=0x558c6af8a610 "") at ../../src/gdb/python/py-inferior.c:146
 #5  0x0000558c6823a071 in std::__invoke_impl<void, void (*&)(inferior*, unsigned long, long, unsigned char const*), inferior*, unsigned long, long, unsigned char const*> (__f=@0x558c6a8ecd98: 0x558c68695d01 <python_on_memory_change(inferior*, CORE_ADDR, ssize_t, bfd_byte const*)>) at /usr/include/c++/11/bits/invoke.h:61
 #6  0x0000558c68237591 in std::__invoke_r<void, void (*&)(inferior*, unsigned long, long, unsigned char const*), inferior*, unsigned long, long, unsigned char const*> (__fn=@0x558c6a8ecd98: 0x558c68695d01 <python_on_memory_change(inferior*, CORE_ADDR, ssize_t, bfd_byte const*)>) at /usr/include/c++/11/bits/invoke.h:111
 #7  0x0000558c68233e64 in std::_Function_handler<void (inferior*, unsigned long, long, unsigned char const*), void (*)(inferior*, unsigned long, long, unsigned char const*)>::_M_invoke(std::_Any_data const&, inferior*&&, unsigned long&&, long&&, unsigned char const*&&) (__functor=..., __args#0=@0x7fff2b70bd40: 0x558c6a830b00, __args#1=@0x7fff2b70bd38: 93824992247828, __args#2=@0x7fff2b70bd30: 4, __args#3=@0x7fff2b70bd28: 0x558c6af8a610 "") at /usr/include/c++/11/bits/std_function.h:290
 #8  0x0000558c6830a96e in std::function<void (inferior*, unsigned long, long, unsigned char const*)>::operator()(inferior*, unsigned long, long, unsigned char const*) const (this=0x558c6a8ecd98, __args#0=0x558c6a830b00, __args#1=93824992247828, __args#2=4, __args#3=0x558c6af8a610 "") at /usr/include/c++/11/bits/std_function.h:590
 #9  0x0000558c6830a620 in gdb::observers::observable<inferior*, unsigned long, long, unsigned char const*>::notify (this=0x558c690828c0 <gdb::observers::memory_changed>, args#0=0x558c6a830b00, args#1=93824992247828, args#2=4, args#3=0x558c6af8a610 "") at ../../src/gdb/../gdbsupport/observable.h:166
 #10 0x0000558c68309d95 in write_memory_with_notification (memaddr=0x555555558014, myaddr=0x558c6af8a610 "", len=4) at ../../src/gdb/corefile.c:363
 #11 0x0000558c68904224 in value_assign (toval=0x558c6afce910, fromval=0x558c6afba6c0) at ../../src/gdb/valops.c:1190
 #12 0x0000558c681e3869 in expr::assign_operation::evaluate (this=0x558c6af8e150, expect_type=0x0, exp=0x558c6afcfe60, noside=EVAL_NORMAL) at ../../src/gdb/expop.h:1902
 #13 0x0000558c68450c89 in expr::logical_or_operation::evaluate (this=0x558c6afab060, expect_type=0x0, exp=0x558c6afcfe60, noside=EVAL_NORMAL) at ../../src/gdb/eval.c:2330
 #14 0x0000558c6844a896 in expression::evaluate (this=0x558c6afcfe60, expect_type=0x0, noside=EVAL_NORMAL) at ../../src/gdb/eval.c:110
 #15 0x0000558c6844a95e in evaluate_expression (exp=0x558c6afcfe60, expect_type=0x0) at ../../src/gdb/eval.c:124
 #16 0x0000558c682061ef in breakpoint_cond_eval (exp=0x558c6afcfe60) at ../../src/gdb/breakpoint.c:4971
 ...

The fix is to disable cooperative SIGINT handling while handling
inferior events, so that SIGINT is saved in the global quit flag, and
not in the extension language, while handling an event.

This commit augments the testcase added by the previous commit to test
this scenario as well.

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

21 months agoGC get_active_ext_lang
Pedro Alves [Fri, 10 Feb 2023 19:23:01 +0000 (19:23 +0000)]
GC get_active_ext_lang

get_active_ext_lang is not used anywhere.  Delete it.

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

21 months agoDon't throw quit while handling inferior events
Pedro Alves [Thu, 9 Feb 2023 13:46:28 +0000 (13:46 +0000)]
Don't throw quit while handling inferior events

This implements what I suggested here:

 https://inbox.sourceware.org/gdb-patches/ab97c553-f406-b094-cdf3-ba031fdea925@palves.net/

Here is the current default quit_handler, a function that ends up
called by the QUIT macro:

 void
 default_quit_handler (void)
 {
   if (check_quit_flag ())
     {
       if (target_terminal::is_ours ())
  quit ();
       else
  target_pass_ctrlc ();
      }
 }

As we can see above, when the inferior is running in the foreground,
then a Ctrl-C is translated into a call to target_pass_ctrlc().

The target_terminal::is_ours() case above is there to handle the
scenario where GDB has the terminal, meaning it is handling some
command the user typed, like "list", or "p a + b" or some such.

However, when the inferior is running on the background, say with
"c&", GDB also has the terminal.  Run control handling is now done in
the "background".  The CLI is responsive to user commands.  If users
type Ctrl-C, they're expecting it to interrupt whatever command they
next type in the CLI, which again, could be "list", "p a + b", etc.
It's as if background run control was handled by a separate thread,
and the Ctrl-C is meant to go to the main thread, handling the CLI.

However, when handling an event, inside fetch_inferior_event &
friends, a Ctrl-C _also_ results in a Quit exception, from the same
default_quit_handler function shown above.  This quit aborts run
control handling, breakpoint condition evaluation, etc., and may even
leave run control in an inconsistent state.

The testcase added by this patch illustrates this.  The test program
just loops a number of times calling the "foo" function.

The idea is to set a breakpoint in the "foo" function with a condition
that sends SIGINT to GDB, and then evaluates to false, which results
in the program being re-resumed in the background.  The SIGINT-sending
emulates pressing Ctrl-C just while GDB was evaluating the breakpoint
condition, except, it's more deterministic.

It looks like this:

  (gdb) p $counter = 0
  $1 = 0
  (gdb) b foo if $counter++ == 10 || $_shell("kill -SIGINT `pidof gdb`") != 0
  Breakpoint 2 at 0x555555555131: file gdb.base/bg-exec-sigint-bp-cond.c, line 21.
  (gdb) c&
  Continuing.
  (gdb)

After that background continue, the breakpoint should be hit 10 times,
and we should see 10 "Quit" being printed on the screen.  As if the
user typed Ctrl-C on the prompt a number of times with no inferior
running:

  (gdb)        <<< Ctrl-C
  (gdb) Quit   <<< Ctrl-C
  (gdb) Quit   <<< Ctrl-C
  (gdb)

However, here's what you see instead:

  (gdb) c&
  Continuing.
  (gdb) Quit
  (gdb)

Just one Quit, and nothing else.  If we look at the thread's state, we see:

  (gdb) info threads
    Id   Target Id                                            Frame
  * 1    Thread 0x7ffff7d6f740 (LWP 112192) "bg-exec-sigint-" foo () at gdb.base/bg-exec-sigint-bp-cond.c:21

So the thread stopped, but we didn't report a stop...

Issuing another continue shows the same immediate-and-silent-stop:

  (gdb) c&
  Continuing.
  (gdb) Quit
  (gdb) p $counter
  $2 = 2

As mentioned, since the run control handling, and breakpoint and
watchpoint evaluation, etc. are running in the background from the
perspective of the CLI, when users type Ctrl-C in this situation,
they're thinking of aborting whatever other command they were typing
or running at the prompt, not the run control side, not the previous
"c&" command.

So I think that we should install a custom quit_handler while inside
fetch_inferior_event, where we already disable pagination and other
things for a similar reason.  This custom quit handler does nothing if
GDB has the terminal, and forwards Ctrl-C to the inferior otherwise.

With the patch implementing that, and the same testcase, here's what
you see instead:

 (gdb) p $counter = 0
 $1 = 0
 (gdb) b foo if $counter++ == 10 || $_shell("kill -SIGINT `pidof gdb`") != 0
 Breakpoint 2 at 0x555555555131: file gdb.base/bg-exec-sigint-bp-cond.c, line 21.
 (gdb) c&
 Continuing.
 (gdb) Quit
 (gdb) Quit
 (gdb) Quit
 (gdb) Quit
 (gdb) Quit
 (gdb) Quit
 (gdb) Quit
 (gdb) Quit
 (gdb) Quit
 (gdb) Quit
 (gdb)
 Breakpoint 2, foo () at gdb.base/bg-exec-sigint-bp-cond.c:21
 21        return 0;

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

21 months agoAdd new "$_shell(CMD)" internal function
Pedro Alves [Wed, 8 Feb 2023 16:06:23 +0000 (16:06 +0000)]
Add new "$_shell(CMD)" internal function

For testing a following patch, I wanted a way to send a SIGINT to GDB
from a breakpoint condition.  And I didn't want to do it from a Python
breakpoint or Python function, as I wanted to exercise non-Python code
paths.  So I thought I'd add a new $_shell internal function, that
runs a command under the shell, and returns the exit code.  With this,
I could write:

  (gdb) b foo if $_shell("kill -SIGINT $gdb_pid") != 0 || <other condition>

I think this is generally useful, hence I'm proposing it here.

Here's the new function in action:

 (gdb) p $_shell("true")
 $1 = 0
 (gdb) p $_shell("false")
 $2 = 1
 (gdb) p $_shell("echo hello")
 hello
 $3 = 0
 (gdb) p $_shell("foobar")
 bash: line 1: foobar: command not found
 $4 = 127
 (gdb) help function _shell
 $_shell - execute a shell command and returns the result.
 Usage: $_shell (command)
 Returns the command's exit code: zero on success, non-zero otherwise.
 (gdb)

NEWS and manual changes included.

Approved-By: Andrew Burgess <aburgess@redhat.com>
Approved-By: Tom Tromey <tom@tromey.com>
Approved-By: Eli Zaretskii <eliz@gnu.org>
Change-Id: I7e36d451ee6b428cbf41fded415ae2d6b4efaa4e

21 months agoMake "ptype INTERNAL_FUNCTION" in Ada print like other languages
Pedro Alves [Fri, 10 Feb 2023 11:55:00 +0000 (11:55 +0000)]
Make "ptype INTERNAL_FUNCTION" in Ada print like other languages

Currently, printing the type of an internal function in Ada shows
double <>s, like:

 (gdb) with language ada -- ptype $_isvoid
 type = <<internal function>>

while all other languages print it with a single <>, like:

 (gdb) with language c -- ptype $_isvoid
 type = <internal function>

I don't think there's a reason that Ada needs to be different.  We
currently print the double <>s because we take this path in
ada_print_type:

    switch (type->code ())
      {
      default:
gdb_printf (stream, "<");
c_print_type (type, "", stream, show, level, language_ada, flags);
gdb_printf (stream, ">");
break;

... and the type's name already has the <>s.

Fix this by simply adding an early check for
TYPE_CODE_INTERNAL_FUNCTION.

Approved-By: Andrew Burgess <aburgess@redhat.com>
Approved-By: Tom Tromey <tom@tromey.com>
Change-Id: Ic2b6527b9240a367471431023f6e27e6daed5501
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30105

21 months agoFix "ptype INTERNAL_FUNC" (PR gdb/30105)
Pedro Alves [Fri, 10 Feb 2023 11:32:35 +0000 (11:32 +0000)]
Fix "ptype INTERNAL_FUNC" (PR gdb/30105)

Currently, looking at the type of an internal function, like below,
hits an odd error:

 (gdb) ptype $_isvoid
 type = <internal function>type not handled in c_type_print_varspec_prefix()

That is an error thrown from
c-typeprint.c:c_type_print_varspec_prefix, where it reads:

    ...
    case TYPE_CODE_DECFLOAT:
    case TYPE_CODE_FIXED_POINT:
      /* These types need no prefix.  They are listed here so that
 gcc -Wall will reveal any types that haven't been handled.  */
      break;
    default:
      error (_("type not handled in c_type_print_varspec_prefix()"));
      break;

Internal function types have type code TYPE_CODE_INTERNAL_FUNCTION,
which is not explicitly handled by that switch.

That comment quoted above says that gcc -Wall will reveal any types
that haven't been handled, but that's not actually true, at least with
modern GCCs.  You would need to enable -Wswitch-enum for that, which
we don't.  If I do enable that warning, then I see that we're missing
handling for the following type codes:

   TYPE_CODE_INTERNAL_FUNCTION,
   TYPE_CODE_MODULE,
   TYPE_CODE_NAMELIST,
   TYPE_CODE_XMETHOD

TYPE_CODE_MODULE and TYPE_CODE_NAMELIST and Fortran-specific, so it'd
be a little weird to handle them here.

I tried to reach this code with TYPE_CODE_XMETHOD, but couldn't figure
out how to.  ptype on an xmethod isn't treated specially, it just
complains that the method doesn't exist.  I've extended the
gdb.python/py-xmethods.exp testcase to make sure of that.

My thinking is that whatever type code we add next, the most likely
scenario is that it won't need any special handling, so we'd just be
adding another case to that "do nothing" list.  If we do need special
casing for whatever type code, I think that tests added at the same
time as the feature would uncover it anyhow.  If we do miss adding the
special casing, then it still looks better to me to print the type
somewhat incompletely than to error out and make it harder for users
to debug whatever they need.  So I think that the best thing to do
here is to just remove all those explicit "do nothing" cases, along
with the error default case.

After doing that, I decided to write a testcase that iterates over all
supported languages doing "ptype INTERNAL_FUNC".  That revealed that
Pascal has a similar problem, except the default case hits a
gdb_assert instead of an error:

 (gdb) with language pascal -- ptype $_isvoid
 type =
 ../../src/gdb/p-typeprint.c:268: internal-error: type_print_varspec_prefix: unexpected type
 A problem internal to GDB has been detected,
 further debugging may prove unreliable.

That is fixed by this patch in the same way.

You'll notice that the new testcase special-cases the Ada expected
output:

} elseif {$lang == "ada"} {
    gdb_test "ptype \$_isvoid" "<<internal function>>"
} else {
    gdb_test "ptype \$_isvoid" "<internal function>"
}

That will be subject of the following patch.

Approved-By: Andrew Burgess <aburgess@redhat.com>
Change-Id: I81aec03523cceb338b5180a0b4c2e4ad26b4c4db
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30105

21 months agogdb/dwarf2: split .debug_names reading code to own file
Simon Marchi [Tue, 14 Feb 2023 19:55:58 +0000 (14:55 -0500)]
gdb/dwarf2: split .debug_names reading code to own file

Move everything related to reading .debug_names from read.c to
read-debug-names.c.  The only entry point exposed by
read-debug-names.{c,h} is dwarf2_read_debug_names.

Change-Id: I18b23f3c7a61b14abc3a46e4bf559bc2d078e8bc
Approved-By: Tom Tromey <tom@tromey.com>
21 months agogdb/dwarf2: split .gdb_index reading code to own file
Simon Marchi [Tue, 14 Feb 2023 19:55:57 +0000 (14:55 -0500)]
gdb/dwarf2: split .gdb_index reading code to own file

Move everything related to reading .gdb_index from read.c to
read-gdb-index.c.  The only entry point exposed by read-gdb-index.{c,h}
is dwarf2_read_gdb_index.

Change-Id: I1e32c8f0720086538de8d2f612f27545377099bc
Approved-By: Tom Tromey <tom@tromey.com>
21 months agogdb/dwarf2: move some things to read.h
Simon Marchi [Tue, 14 Feb 2023 19:55:56 +0000 (14:55 -0500)]
gdb/dwarf2: move some things to read.h

The following 2 patches move .gdb_index and .debug_names reading code to
their own file.  Prepare this by exposing some things used by that code
to read.h.

Change-Id: If8ef135758a2ff0ab3b765cc92596da8189f3bbd
Approved-By: Tom Tromey <tom@tromey.com>
21 months agogdb: fix dealloc function not being called for frame 0
Simon Marchi [Thu, 9 Feb 2023 18:54:26 +0000 (13:54 -0500)]
gdb: fix dealloc function not being called for frame 0

Tom de Vries reported [1] a regression in gdb.btrace/record_goto.exp
caused by 6d3717d4c4 ("gdb: call frame unwinders' dealloc_cache methods
through destroying the frame cache").  This issue is caught by ASan.  On
a non-ASan build, it may or may not cause a crash or some other issue, I
haven't tried.

I managed to narrow it down to:

    $ ./gdb -nx -q --data-directory=data-directory testsuite/outputs/gdb.btrace/record_goto/record_goto -ex "start" -ex "record btrace" -ex "next"

... and then doing repeatedly "record goto 19" and "record goto 27".
Eventually, I get:

    (gdb) record goto 27
    =================================================================
    ==1527735==ERROR: AddressSanitizer: heap-use-after-free on address 0x6210003392a8 at pc 0x55e4c26eef86 bp 0x7ffd229f24e0 sp 0x7ffd229f24d8
    READ of size 8 at 0x6210003392a8 thread T0
        #0 0x55e4c26eef85 in bfcache_eq /home/simark/src/binutils-gdb/gdb/record-btrace.c:1639
        #1 0x55e4c37cdeff in htab_find_slot_with_hash /home/simark/src/binutils-gdb/libiberty/hashtab.c:659
        #2 0x55e4c37ce24a in htab_find_slot /home/simark/src/binutils-gdb/libiberty/hashtab.c:703
        #3 0x55e4c26ef0c6 in bfcache_new /home/simark/src/binutils-gdb/gdb/record-btrace.c:1653
        #4 0x55e4c26f1242 in record_btrace_frame_sniffer /home/simark/src/binutils-gdb/gdb/record-btrace.c:1820
        #5 0x55e4c1b926a1 in frame_unwind_try_unwinder /home/simark/src/binutils-gdb/gdb/frame-unwind.c:136
        #6 0x55e4c1b930d7 in frame_unwind_find_by_frame(frame_info_ptr, void**) /home/simark/src/binutils-gdb/gdb/frame-unwind.c:196
        #7 0x55e4c1bb867f in get_frame_type(frame_info_ptr) /home/simark/src/binutils-gdb/gdb/frame.c:2925
        #8 0x55e4c2ae6798 in print_frame_info(frame_print_options const&, frame_info_ptr, int, print_what, int, int) /home/simark/src/binutils-gdb/gdb/stack.c:1049
        #9 0x55e4c2ade3e1 in print_stack_frame(frame_info_ptr, int, print_what, int) /home/simark/src/binutils-gdb/gdb/stack.c:367
        #10 0x55e4c26fda03 in record_btrace_set_replay /home/simark/src/binutils-gdb/gdb/record-btrace.c:2779
        #11 0x55e4c26fddc3 in record_btrace_target::goto_record(unsigned long) /home/simark/src/binutils-gdb/gdb/record-btrace.c:2843
        #12 0x55e4c2de2bb2 in target_goto_record(unsigned long) /home/simark/src/binutils-gdb/gdb/target.c:4169
        #13 0x55e4c275ed98 in record_goto(char const*) /home/simark/src/binutils-gdb/gdb/record.c:372
        #14 0x55e4c275edba in cmd_record_goto /home/simark/src/binutils-gdb/gdb/record.c:383

    0x6210003392a8 is located 424 bytes inside of 4064-byte region [0x621000339100,0x62100033a0e0)
    freed by thread T0 here:
        #0 0x7f6ca34a5b6f in __interceptor_free ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:123
        #1 0x55e4c38a4c17 in rpl_free /home/simark/src/binutils-gdb/gnulib/import/free.c:44
        #2 0x55e4c1bbd378 in xfree<void> /home/simark/src/binutils-gdb/gdb/../gdbsupport/gdb-xfree.h:37
        #3 0x55e4c37d1b63 in call_freefun /home/simark/src/binutils-gdb/libiberty/obstack.c:103
        #4 0x55e4c37d25a2 in _obstack_free /home/simark/src/binutils-gdb/libiberty/obstack.c:280
        #5 0x55e4c1bad701 in reinit_frame_cache() /home/simark/src/binutils-gdb/gdb/frame.c:2112
        #6 0x55e4c27705a3 in registers_changed_ptid(process_stratum_target*, ptid_t) /home/simark/src/binutils-gdb/gdb/regcache.c:564
        #7 0x55e4c27708c7 in registers_changed_thread(thread_info*) /home/simark/src/binutils-gdb/gdb/regcache.c:573
        #8 0x55e4c26fd922 in record_btrace_set_replay /home/simark/src/binutils-gdb/gdb/record-btrace.c:2772
        #9 0x55e4c26fddc3 in record_btrace_target::goto_record(unsigned long) /home/simark/src/binutils-gdb/gdb/record-btrace.c:2843
        #10 0x55e4c2de2bb2 in target_goto_record(unsigned long) /home/simark/src/binutils-gdb/gdb/target.c:4169
        #11 0x55e4c275ed98 in record_goto(char const*) /home/simark/src/binutils-gdb/gdb/record.c:372
        #12 0x55e4c275edba in cmd_record_goto /home/simark/src/binutils-gdb/gdb/record.c:383

    previously allocated by thread T0 here:
        #0 0x7f6ca34a5e8f in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:145
        #1 0x55e4c0b55c60 in xmalloc /home/simark/src/binutils-gdb/gdb/alloc.c:57
        #2 0x55e4c37d1a6d in call_chunkfun /home/simark/src/binutils-gdb/libiberty/obstack.c:94
        #3 0x55e4c37d1c20 in _obstack_begin_worker /home/simark/src/binutils-gdb/libiberty/obstack.c:141
        #4 0x55e4c37d1ed7 in _obstack_begin /home/simark/src/binutils-gdb/libiberty/obstack.c:164
        #5 0x55e4c1bad728 in reinit_frame_cache() /home/simark/src/binutils-gdb/gdb/frame.c:2113
        #6 0x55e4c27705a3 in registers_changed_ptid(process_stratum_target*, ptid_t) /home/simark/src/binutils-gdb/gdb/regcache.c:564
        #7 0x55e4c27708c7 in registers_changed_thread(thread_info*) /home/simark/src/binutils-gdb/gdb/regcache.c:573
        #8 0x55e4c26fd922 in record_btrace_set_replay /home/simark/src/binutils-gdb/gdb/record-btrace.c:2772
        #9 0x55e4c26fddc3 in record_btrace_target::goto_record(unsigned long) /home/simark/src/binutils-gdb/gdb/record-btrace.c:2843
        #10 0x55e4c2de2bb2 in target_goto_record(unsigned long) /home/simark/src/binutils-gdb/gdb/target.c:4169
        #11 0x55e4c275ed98 in record_goto(char const*) /home/simark/src/binutils-gdb/gdb/record.c:372
        #12 0x55e4c275edba in cmd_record_goto /home/simark/src/binutils-gdb/gdb/record.c:383

The problem is a stale entry in the bfcache hash table (in
record-btrace.c), left across a reinit_frame_cache.  This entry points
to something that used to be allocated on the frame obstack, that has
since been wiped by reinit_frame_cache.

Before the aforementioned, unwinder deallocation functions were called
by iterating on the frame chain, starting with the sentinel frame, like
so:

  /* Tear down all frame caches.  */
  for (frame_info *fi = sentinel_frame; fi != NULL; fi = fi->prev)
    {
      if (fi->prologue_cache && fi->unwind->dealloc_cache)
fi->unwind->dealloc_cache (fi, fi->prologue_cache);
      if (fi->base_cache && fi->base->unwind->dealloc_cache)
fi->base->unwind->dealloc_cache (fi, fi->base_cache);
    }

After that patch, we relied on the fact that all frames are (supposedly)
in the frame_stash.  A deletion function was added to the frame_stash
hash table, so that dealloc functions would be called when emptying the
frame stash.  There is one case, however, where a frame_info is not in
the frame stash.  That is when we create the frame_info for the current
frame (level 0, unwound from the sentinel frame), but don't compute its
frame id.  The computation of the frame id for that frame (and only that
frame, AFAIK) is done lazily.  And putting a frame_info in the frame stash
requires knowing its id.  So a frame 0 whose frame id is not computed
yet is necessarily not in the frame stash.

When replaying with btrace, record_btrace_frame_sniffer insert entries
corresponding to frames in the "bfcache" hash table.  It then relies on
record_btrace_frame_dealloc_cache being called for each frame to remove
all those entries when the frames get invalidated.  If a frame reinit
happens while frame 0's id is not computed  (and therefore that frame is
not in frame_stash), record_btrace_frame_dealloc_cache does not get
called for it, and it leaves a stale entry in bfcache.  That then leads
to a use-after-free when that entry is accessed later, which ASan
catches.

The proposed solution is to explicitly call frame_info_del on frame 0,
if it exists, and if its frame id is not computed.  If its frame id is
computed, it is expected that it will be in the frame stash, so it will
be "deleted" through that.

[1] https://inbox.sourceware.org/gdb-patches/20230130200249.131155-1-simon.marchi@efficios.com/T/#mcf1340ce2906a72ec7ed535ec0c97dba11c3d977

Reported-By: Tom de Vries <tdevries@suse.de>
Tested-By: Tom de Vries <tdevries@suse.de>
Change-Id: I2351882dd511f3bbc01e4152e9db13b69b3ba384

21 months agoRemove RETURNS from BFD chew comments
Tom Tromey [Wed, 8 Feb 2023 04:43:37 +0000 (21:43 -0700)]
Remove RETURNS from BFD chew comments

When reading the BFD manual, I noticed text like this:

     -- Function: bool bfd_close (bfd *abfd);
 Close a BFD. If the BFD was open for writing, then pending
 operations are completed and the file written out and closed.  If
    ...
       *Returns*
    'TRUE' is returned if all is ok, otherwise 'FALSE'.

The *Returns*, like the *Synopsis* in the earlier patch, is
un-info-like.  It's also used inconsistently.

This patch removes all the uses of the RETURNS word and removes it
entirely from the chew scripts.  Now this example reads:

     -- Function: bool bfd_close (bfd *abfd);
 Close a BFD. If the BFD was open for writing, then pending
 operations are completed and the file written out and closed.  If
    ...
 'TRUE' is returned if all is ok, otherwise 'FALSE'.

In a few cases I had to slightly reword the comment.  There were also
a couple of cases where there was redundant text.  In these cases I
just dropped the RETURNS copy.

2023-02-07  Tom Tromey  <tom@tromey.com>

* bfd.c, cache.c, compress.c, opncls.c: Remove RETURNS from
documentation comments.
* doc/doc.str, doc/proto.str (RETURNS): Remove.

21 months agoUse @deftypefn in chew output
Tom Tromey [Wed, 8 Feb 2023 04:40:53 +0000 (21:40 -0700)]
Use @deftypefn in chew output

When reading the BFD info manual, function definitions looked very
strange to me:

    *Synopsis*
 long bfd_get_mtime (bfd *abfd);
       *Description*
    Return the file modification time (as read from the file system, or from
    the archive header for archive members).

The *Synopsis* and *Description* text in particular is very un-info-like.

To fix this, I tried removing the *Synopsis* text and having FUNCTION
use @deftypefn instead.  However, this ended up requiring some new
state, because SYNOPSIS can appear without FUNCTION.  This in turn
required "catstrif" (I considered adding FORTH-style if-else-then, but
in the end decided on an ad hoc approach).

After this the result looks like:

 -- Function: long bfd_get_mtime (bfd *abfd);
     Return the file modification time (as read from the file system, or
     from the archive header for archive members).

This patch also reorders a few documentation comments to ensure that
SYNOPSIS comes before DESCRIPTION.  This is the more common style and
is also now required by doc.str.

2023-02-07  Tom Tromey  <tom@tromey.com>

* syms.c (bfd_decode_symclass, bfd_is_undefined_symclass)
(bfd_symbol_info): Reorder documentation comment.
* doc/doc.str (synopsis_seen): New variable.
(SYNOPSIS): Set synopsis_seen.  Emit @deftypefn.
(DESCRIPTION): Use synopsis_seen.
* doc/chew.c (catstrif): New function.
(main): Add catstrif intrinsic.
(compile): Recognize "variable" command.

21 months agoChange internalmode to be an intrinsic variable
Tom Tromey [Tue, 7 Feb 2023 19:14:54 +0000 (12:14 -0700)]
Change internalmode to be an intrinsic variable

Currently, internalmode is a special word to set an internal state
variable.  Because this series adds variables anyway, change this to
be a variable instead.

I saw some commits in the history that made sure that chew did not
leak memory, so I put some extra effort into trying to handle this for
variables as well.

2023-02-07  Tom Tromey  <tom@tromey.com>

* doc/proto.str (external, internal, ifinternal, ENUMEQ, ENUMDOC):
Update.
* doc/chew.c (internalmode): Remove.
(add_intrinsic_variable): New function.
(main): Add internalmode as intrinsic.
(internal_mode): Remove global.
(maybecatstr): Update.
(free_words): Free variables.

21 months agoUse intptr_t rather than long in chew
Tom Tromey [Tue, 7 Feb 2023 19:03:37 +0000 (12:03 -0700)]
Use intptr_t rather than long in chew

To implement variables in chew, it's convenient to have a
pointer-sized integer on the stack.  To this end, use intptr_t rather
than long.

2023-02-07  Tom Tromey  <tom@tromey.com>

* doc/chew.c (pcu) <l>: Now intptr_t.
(internal_mode, istack, isp): Likewise.
(bang, atsign): Use intptr_t.

21 months agoRemove the paramstuff word
Tom Tromey [Tue, 7 Feb 2023 18:52:24 +0000 (11:52 -0700)]
Remove the paramstuff word

The chew "paramstuff" word has been a no-op since:

    commit c58b95236ce4c9345c4fa76e7ef16762e5229380
    Author: Alan Modra <amodra@gmail.com>
    Date:   Sun Jun 29 10:06:40 2003 +0000

Convert to C90 and a few tweaks.

Remove it and its one use.

2023-02-07  Tom Tromey  <tom@tromey.com>

* doc/proto.str (SYNOPSIS): Don't use paramstuff.
* doc/chew.c (paramstuff): Remove.
(main): Don't add paramstuff intrinsic.

21 months agoAdd copyright headers to the .str files
Tom Tromey [Tue, 7 Feb 2023 18:39:16 +0000 (11:39 -0700)]
Add copyright headers to the .str files

The .str script files don't have copyright headers, but I think they
should.  I used the same dates that chew.c uses, which I think makes
sense because these are inputs to chew.

2023-02-07  Tom Tromey  <tom@tromey.com>

* doc/doc.str, doc/proto.str: Add copyright header.

21 months agoSimplify @node use in BFD documentation
Tom Tromey [Tue, 7 Feb 2023 18:34:56 +0000 (11:34 -0700)]
Simplify @node use in BFD documentation

The BFD docs currently specify all the parameters to @node.  However,
this results in bad navigation in certain nodes -- the "space" command
in info doesn't know how to find the next node.

I think this style of @node is a leftover from ancient times.
Makeinfo can figure out the node structure on its own now, so simplify
everything to a single-argument @node.

2023-02-07  Tom Tromey  <tom@tromey.com>

* doc/webassembly.texi (File layout): Remove second argument from
@node.
* doc/bfd.texi: Use single-argument @node everywhere.

21 months agoRemove H_CFLAGS from doc/local.mk
Tom Tromey [Wed, 8 Feb 2023 04:15:51 +0000 (21:15 -0700)]
Remove H_CFLAGS from doc/local.mk

I couldn't see that H_CFLAGS is defined anywhere, so remove it.

2023-02-07  Tom Tromey  <tom@tromey.com>

* Makefile.in: Rebuild.
* doc/local.mk (%D%/chew.stamp): Don't use H_CFLAGS.

21 months agogdb: store internalvars in an std::map
Simon Marchi [Tue, 14 Feb 2023 19:23:27 +0000 (14:23 -0500)]
gdb: store internalvars in an std::map

In a test downstream in ROCgdb, we had a test case failing when
GDB_REVERSE_INIT_FUNCTIONS was set.  The test was assuming a particular
order in the output of "show convenience".  And the order changes when
running with GDB_REVERSE_INIT_FUNCTIONS.

I think that a nice way to fix it is to make the output of "show
convenience" sorted, and therefore stable.  Ideally, I think that the
the user-visible behavior of GDB should not change when using
GDB_REVERSE_INIT_FUNCTIONS.  Plus, it makes the output of "show
convenience" look nice, not that it's really important.

Implement this by storing the internal vars in an std::map, which is a
sorted container.

Change-Id: I1fca7e7877cc984a3a3432c7639d45e68d437241
Approved-By: Tom Tromey <tom@tromey.com>
21 months agogdb: add constructor to internalvar
Simon Marchi [Tue, 14 Feb 2023 19:23:26 +0000 (14:23 -0500)]
gdb: add constructor to internalvar

Add a constructor that takes the name as a parameter.  Initialize the
next and kind fields inline.

Change-Id: Ic4db0aba85f1da9f12f3eee0ac62c0e5ef0cfe88
Approved-By: Tom Tromey <tom@tromey.com>
21 months agogdb: use std::string for internalvar::name
Simon Marchi [Tue, 14 Feb 2023 19:23:25 +0000 (14:23 -0500)]
gdb: use std::string for internalvar::name

Change internalvar::name to std::string, automating memory management.
It becomes necessary to allocate internalvar with new instead of XNEW.

I didn't find how to trigger the code in complete_internalvar.  It is
called from condition_completer, so it should be by using the
"condition" command, but I never managed to get in the right code path.

Change-Id: I814d61361663e7becb8f3fb5f58c0180cdc414bc
Approved-By: Tom Tromey <tom@tromey.com>
21 months agoDo not record a rejected target description
Tom Tromey [Fri, 6 Jan 2023 16:30:40 +0000 (09:30 -0700)]
Do not record a rejected target description

When connecting to a certain target, gdb issues a warning about the
target description:

    (gdb) target remote localhost:7947
    Remote debugging using localhost:7947
    warning: Architecture rejected target-supplied description

If you then kill the inferior and change the exec-file, this will
happen:

    (gdb) file bar
    Architecture of file not recognized.

After this, debugging doesn't work very well.

What happens here is that, despite the warning,
target_find_description records the downloaded description in the
target_desc_info.  Then the "file" command ends up calling
set_gdbarch_from_file, which uses that description.

It seems to me that, because the architecture rejected the
description, it should not be used.  That is what this patch
implements.

21 months agogdb/manual: Move @findex entries
Pedro Alves [Mon, 13 Feb 2023 16:14:55 +0000 (16:14 +0000)]
gdb/manual: Move @findex entries

The manual currently has many cases like these:

 @item $_gdb_setting_str (@var{setting})
 @findex $_gdb_setting_str@r{, convenience function}

As suggested by Eli, move the @findex entries before @item so that the
index records the position of @item, and the Info reader places you
there when you use index-search.

I went over all @findex calls in the manual, and most are like the
above.  Most either appear before @item, or before @subheading, like:

 @subheading The @code{-break-after} Command
 @findex -break-after

I fixed all of them.

There are findex entries in annotate.texinfo,python.texi, and
stabs.texinfo as well, though those all look right to me already.

Tested by typing "i _isvoid" (@item case) and "i -complete"
(@subheading case) in an Info reader, and checking where those took
me.

Change-Id: Idb6903b0bb39ff03f93524628dcef86b5585c97e
Suggested-By: Eli Zaretskii <eliz@gnu.org>
21 months agoobjdump read_section_stabs
Alan Modra [Wed, 15 Feb 2023 10:50:47 +0000 (21:20 +1030)]
objdump read_section_stabs

This function is used to read sections other than stabs, and there is
now another version of it that extracts different info from the bfd
section.  Rename it and return the bfd section instead of assorted
fields of the bfd section.

* objcopy.c (read_section): Renamed from read_section_stabs.
Delete size_ptr and entsize_ptr params, add contents param.
Return asection pointer.  Don't unnecessarily free contents on
failure from bfd_malloc_and_get_section.
(find_stabs_section): Use read_section.
(dump_ctf, dump_section_sframe): Likewise.
(read_section_sframe): Delete.

21 months agoobjdump -G memory leak
Alan Modra [Wed, 15 Feb 2023 08:13:20 +0000 (18:43 +1030)]
objdump -G memory leak

* objdump.c (find_stabs_section): Free stabs.

21 months agoFix the linker's merge4 test for the HPPA architecture.
Nick Clifton [Wed, 15 Feb 2023 09:26:10 +0000 (09:26 +0000)]
Fix the linker's merge4 test for the HPPA architecture.

 PR 30078 * testsuite/ld-elf/merge4b.s: Use .asciz instead of .string in order to avoid the special behaviour of the .string directive on HPPA architectures.

21 months agogdb, fortran: Fix quad floating-point type for ifort compiler.
Felix Willgerodt [Mon, 13 Feb 2023 10:02:23 +0000 (11:02 +0100)]
gdb, fortran: Fix quad floating-point type for ifort compiler.

I fixed this a while ago for ifx, one of the two Intel compilers, in
8d624a9d8050ca96e154215c7858ac5c2d8b0b19.

Apparently I missed that the older ifort Intel compiler actually emits
slightly different debug info again:

0x0000007a:   DW_TAG_base_type
                DW_AT_byte_size (0x20)
                DW_AT_encoding (DW_ATE_complex_float)
                DW_AT_name ("COMPLEX(16)")

0x00000081:   DW_TAG_base_type
                DW_AT_byte_size (0x10)
                DW_AT_encoding (DW_ATE_float)
                DW_AT_name ("REAL(16)")

This fixes two failures in gdb.fortran/complex.exp with ifort.

Approved-By: Tom Tromey <tom@tromey.com>
21 months agogas: buffer_and_nest() needs to pass nul-terminated string to temp_ilp()
Jan Beulich [Wed, 15 Feb 2023 07:46:02 +0000 (08:46 +0100)]
gas: buffer_and_nest() needs to pass nul-terminated string to temp_ilp()

In 7545aa2dd2eb ("gas: improve interaction between read_a_source_file()
and s_linefile()") I didn't pay attention to the dual purpose of the
nul character previously used. This was to a fair degree because of the
open-coding of certain operations. Insert the earlier found line
terminator instead of a hard-coded newline, and do so early in this
special case (bypassing the later general insertion point). Plus
properly use sb_terminate() to mark the end of the string. (Note that
saved_eol_char was misnamed: Without calling sb_terminate() there's
simply random data at that position in the buffer.)

21 months agoMore ecoff sanity checks
Alan Modra [Wed, 15 Feb 2023 05:58:07 +0000 (16:28 +1030)]
More ecoff sanity checks

Change FIX so that unused pointers that escape the UPDATE_RAW_END
sanity checks won't result in overflows.  Also sanity check the local
sym fdr isymBase and csym values.

* ecoff.c (_bfd_ecoff_slurp_symbolic_info): Define FIX to set
pointers into swapped internal data to NULL if count is zero.
Sanity check local sym fdr_ptr->isymBase and fdr_ptr->csym.

21 months agobinutils stabs type list
Alan Modra [Tue, 14 Feb 2023 21:21:00 +0000 (07:51 +1030)]
binutils stabs type list

Fuzzers have found that specifying a large stab type number results in
lots of memory being requested, as the list is extended with a 16
element array at a time until we reach the given stab type.  It also
takes a long time.  Of course normal sane stab types use small
positive integers, but it's not hard to modify the code to handle type
numbers starting anyhere.

* stabs.c (struct stab_types): Add base_index.
(stab_find_slot): Simplify filenum check.  Delete type number
check.  Don't allocate entire array from 0 to type number,
allocate a sparse array.

21 months agoAutomatic date update in version.in
GDB Administrator [Wed, 15 Feb 2023 00:00:24 +0000 (00:00 +0000)]
Automatic date update in version.in

21 months agoRemove a use of pagination_enabled
Tom Tromey [Sat, 28 Jan 2023 15:23:52 +0000 (08:23 -0700)]
Remove a use of pagination_enabled

I noticed that the TUI temporarily sets pagination_enabled and
gdb_stdout in one spot.  However, I don't believe these settings are
necessary here, as a ui_file is passed to
gdbarch_print_registers_info.  This patch removes these settings.

21 months agogdb/dwarf2: rename some things, index -> gdb_index
Simon Marchi [Mon, 13 Feb 2023 14:55:56 +0000 (09:55 -0500)]
gdb/dwarf2: rename some things, index -> gdb_index

This renaming helps make it clearer that these entites (classes,
functions) are specific to .gdb_index only, they are not shared with the
.debug_names handling.

Change-Id: I1a3cf3dbf450b62d1a0879d9aedd26397abdfd13
Approved-By: Tom Tromey <tom@tromey.com>
21 months agogdb: cast return value of std::unique_ptr::release to void
Simon Marchi [Mon, 13 Feb 2023 19:55:13 +0000 (14:55 -0500)]
gdb: cast return value of std::unique_ptr::release to void

My editor shows warnings like:

     value.c:2784: warning: The value returned by this function should be used
     value.c:2784: note: cast the expression to void to silence this warning [bugprone-unused-return-value]

These warnings come from clangd, so ultimately from one of the clang
static analyzers (probably clang-tidy).

Silence these warnings by casting to void.  Add a comment to explain
why this unusual thing is done.

Change-Id: I58323959c0baf9f1b20a8d596e4c58dc77c6809a
Approved-By: Tom Tromey <tom@tromey.com>
21 months agogdb: remove unnecessary tui directory check in configure
Simon Marchi [Tue, 14 Feb 2023 16:37:16 +0000 (11:37 -0500)]
gdb: remove unnecessary tui directory check in configure

I suppose this was possible in the CVS days for the tui directory to be
missing, but it's not really possible nowaday.  Well, a user could
delete the directory from their source tree but... it doesn't make
sense.  Remove the check for that directory in configure.

Change-Id: Iea1412f5e5482ed003015030132ec22150c7d0b3
Approved-By: Tom Tromey <tom@tromey.com>
21 months agoDo not cast away const in agent_run_command
Tom Tromey [Tue, 14 Feb 2023 14:03:11 +0000 (07:03 -0700)]
Do not cast away const in agent_run_command

While investigating something else, I noticed some weird code in
agent_run_command (use of memcpy rather than strcpy).  Then I noticed
that 'cmd' is used as both an in and out parameter, despite being
const.

Casting away const like this is bad.  This patch removes the const and
fixes the memcpy.  I also added a static assert to assure myself that
the code in gdbserver is correct -- gdbserver is passing its own
buffer directly to agent_run_command.

Reviewed-By: Andrew Burgess <aburgess@redhat.com>
21 months ago[gdb/testsuite] Add xfail in gdb.python/py-record-btrace.exp
Tom de Vries [Tue, 14 Feb 2023 12:15:49 +0000 (13:15 +0100)]
[gdb/testsuite] Add xfail in gdb.python/py-record-btrace.exp

There's a HW bug affecting Processor Trace on some Intel processors
(Ice Lake to Raptor Lake microarchitectures).

The bug was exposed by linux kernel commit 670638477aed
("perf/x86/intel/pt: Opportunistically use single range output mode"),
added in version v5.5.0, and was worked around by commit ce0d998be927
("perf/x86/intel/pt: Fix sampling using single range output") in version
6.1.0.

The bug manifests (on a Performance-core of an i7-1250U, an Alder Lake cpu) in
a single test-case:
...
(gdb) python insn = r.instruction_history^M
warning: Decode error (-20) at instruction 33 (offset = 0x3d6a, \
  pc = 0x400501): compressed return without call.^M
(gdb) FAIL: gdb.python/py-record-btrace.exp: prepare record: \
  python insn = r.instruction_history
...

Add a corresponding XFAIL.

Note that the i7-1250U has both Performance-cores and Efficient-cores, and on
an Efficient-Core the test-case runs without any problems, so if the testsuite
run is not pinned to a specific cpu, the test may either PASS or XFAIL.

Tested on x86_64-linux:
- openSUSE Leap 15.4 with linux kernel version 5.14.21
- openSUSE Tumbleweed with linux kernel version 6.1.8

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

21 months ago Mention that the -plugin command line option is used to load plugins.
Nick Clifton [Tue, 14 Feb 2023 12:01:06 +0000 (12:01 +0000)]
 Mention that the -plugin command line option is used to load plugins.

21 months ago[gdb/testsuite] Factor out proc linux_kernel_version
Tom de Vries [Tue, 14 Feb 2023 10:53:54 +0000 (11:53 +0100)]
[gdb/testsuite] Factor out proc linux_kernel_version

Factor out new proc linux_kernel_version from test-case
gdb.arch/i386-pkru.exp.

Tested on x86_64-linux.

21 months agoASCIZ Command for output section
Ulf Samuelsson [Tue, 14 Feb 2023 10:13:28 +0000 (10:13 +0000)]
ASCIZ Command for output section

Adds a new directive to the linker script syntax: ASCIZ.
This inserts a zero-terminated string into the output at the place where it is used.

21 months agogas: correct symbol name comparison in .startof./.sizeof. handling
Jan Beulich [Tue, 14 Feb 2023 07:35:02 +0000 (08:35 +0100)]
gas: correct symbol name comparison in .startof./.sizeof. handling

In 162c6aef1f3a ("gas: fold symbol table entries generated for
.startof.() / .sizeof.()") I screwed up quite badly, inverting the case
sensitive and case insensitive comparison functions.

21 months agox86: {LD,ST}TILECFG use an extension opcode
Jan Beulich [Tue, 14 Feb 2023 07:34:42 +0000 (08:34 +0100)]
x86: {LD,ST}TILECFG use an extension opcode

It being zero and happening to work right now doesn't mean the insns
shouldn't be spelled out properly.

21 months agogas: improve interaction between read_a_source_file() and s_linefile()
Jan Beulich [Tue, 14 Feb 2023 07:34:03 +0000 (08:34 +0100)]
gas: improve interaction between read_a_source_file() and s_linefile()

read_a_source_file() would bump line numbers only when seeing a newline,
whereas is_end_of_line[] indicates further end-of-line characters, in
particular the nul character. s_linefile() attempts to compensate for
the bump, but was too aggressive with this so far: It should only adjust
when a newline ends the line. To facilitate such a check, the check for
nothing else on the line needs to move ahead, which luckily is easily
possible: The relevant two conditions match, and the function can
simply return from the body of that earlier instance of the conditional.

The more strict treatment in s_linefile() then requires an adjustment
to buffer_and_nest()'s invocation of the function: The line terminator
now needs to be a newline, not nul.

21 months agoFix build bug in ppc-linux-nat.c
Tom Tromey [Tue, 14 Feb 2023 07:28:47 +0000 (00:28 -0700)]
Fix build bug in ppc-linux-nat.c

The buildbot pointed out that my value refactoring series introduced a
bug in ppc-linux-nat.c:

../../binutils-gdb/gdb/ppc-linux-nat.c: In member function β€˜int ppc_linux_nat_target::num_memory_accesses(const std::vector<gdb::ref_ptr<value, value_ref_policy> >&)’:
../../binutils-gdb/gdb/ppc-linux-nat.c:2458:44: error: expected unqualified-id before β€˜->’ token
 2458 |       if (VALUE_LVAL (v) == not_lval || v->->deprecated_modifiable () == 0)

I don't know how that happened, but I am checking in this patch which
I think should fix it.  It just removes the second "->".

I can't readily test this, so perhaps there's another bug lurking
after this one.

21 months agoAutomatic date update in version.in
GDB Administrator [Tue, 14 Feb 2023 00:00:22 +0000 (00:00 +0000)]
Automatic date update in version.in

21 months agoRely on value_ref_ptr::operator->
Tom Tromey [Fri, 10 Feb 2023 17:48:50 +0000 (10:48 -0700)]
Rely on value_ref_ptr::operator->

Simon pointed out some spots were doing val.get()->mumble, where val
is a value_ref_ptr.  These were introduced by the function-to-method
script, replacing older code that passed the result of .get() to a
function.

Now that value.h is using methods, we can instead rely on operator->.
This patch replaces all the newly-introduced instances of this.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoRemove deprecated_lval_hack
Tom Tromey [Thu, 9 Feb 2023 13:55:48 +0000 (06:55 -0700)]
Remove deprecated_lval_hack

This removes deprecated_lval_hack and the VALUE_LVAL macro, replacing
all uses with a call to value::lval.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoIntroduce set_lval method on value
Tom Tromey [Thu, 9 Feb 2023 13:35:33 +0000 (06:35 -0700)]
Introduce set_lval method on value

This introduces the set_lval method on value, one step toward removing
deprecated_lval_hack.  Ultimately I think the goal should be for some
of these set_* methods to be replaced with constructors; but I haven't
done this, as the series is already too long.  Other 'deprecated'
methods can probably be handled the same way.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoMake ~value private
Tom Tromey [Wed, 1 Feb 2023 15:34:58 +0000 (08:34 -0700)]
Make ~value private

At the end of this series, I belatedly realized that values should
only be destroyed by value_decref.  This patch marks the the
destructor private to enforce this.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoMake struct value data members private
Tom Tromey [Wed, 1 Feb 2023 15:25:40 +0000 (08:25 -0700)]
Make struct value data members private

This hoists the 'private' in struct value to also encompass the data
members.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn record_latest_value into a method
Tom Tromey [Sun, 12 Feb 2023 15:04:07 +0000 (08:04 -0700)]
Turn record_latest_value into a method

record_latest_value now access some internals of struct value, so turn
it into a method.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoAdd value::set_modifiable
Tom Tromey [Wed, 1 Feb 2023 15:25:21 +0000 (08:25 -0700)]
Add value::set_modifiable

This introduces a value::set_modifiable and changes a couple of spots
to use it.

I'm not completely sure the comments by deprecated_modifiable are
correct any more.  Perhaps they should be removed and the method
renamed.  Like so many before me, though, I've deferred investigation
of the issue.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn various value copying-related functions into methods
Tom Tromey [Wed, 1 Feb 2023 14:27:50 +0000 (07:27 -0700)]
Turn various value copying-related functions into methods

This patch turns a grab bag of value functions to methods of value.
These are done together because their implementations are
interrelated.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn preserve_one_value into method
Tom Tromey [Wed, 1 Feb 2023 04:11:38 +0000 (21:11 -0700)]
Turn preserve_one_value into method

This changes preserve_one_value to be a method of value.  Much of this
patch was written by script.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn some xmethod functions into methods
Tom Tromey [Wed, 1 Feb 2023 03:59:39 +0000 (20:59 -0700)]
Turn some xmethod functions into methods

This turns value_from_xmethod, result_type_of_xmethod, and
call_xmethod to be methods of value.  value_from_xmethod is a static
"constructor" now.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoChange some code to use value methods
Tom Tromey [Wed, 1 Feb 2023 03:54:26 +0000 (20:54 -0700)]
Change some code to use value methods

A few functions in value.c were accessing the internal fields of
struct value.  However, in these cases it seemed simpler to change
them to use the public API rather than convert them to be methods.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn set_value_component_location into method
Tom Tromey [Tue, 31 Jan 2023 23:26:38 +0000 (16:26 -0700)]
Turn set_value_component_location into method

This turns set_value_component_location into a method of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_non_lval and value_force_lval into methods
Tom Tromey [Tue, 31 Jan 2023 23:23:22 +0000 (16:23 -0700)]
Turn value_non_lval and value_force_lval into methods

This changes value_non_lval and value_force_lval to be methods of
value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn many optimized-out value functions into methods
Tom Tromey [Tue, 31 Jan 2023 23:13:08 +0000 (16:13 -0700)]
Turn many optimized-out value functions into methods

This turns many functions that are related to optimized-out or
availability-checking to be methods of value.  The static function
value_entirely_covered_by_range_vector is also converted to be a
private method.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_copy into a method
Tom Tromey [Tue, 31 Jan 2023 21:43:22 +0000 (14:43 -0700)]
Turn value_copy into a method

This turns value_copy into a method of value.  Much of this was
written by script.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoFully qualify calls to copy in value.c
Tom Tromey [Tue, 31 Jan 2023 21:51:24 +0000 (14:51 -0700)]
Fully qualify calls to copy in value.c

A coming patch will add value::copy, so this namespace-qualifies
existing calls to 'copy' in value.c, to ensure it will still compile
after that change is done.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn remaining value_contents functions into methods
Tom Tromey [Tue, 31 Jan 2023 21:38:30 +0000 (14:38 -0700)]
Turn remaining value_contents functions into methods

This turns the remaining value_contents functions -- value_contents,
value_contents_all, value_contents_for_printing, and
value_contents_for_printing_const -- into methods of value.  It also
converts the static functions require_not_optimized_out and
require_available to be private methods.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_incref and value_decref into methods
Tom Tromey [Tue, 31 Jan 2023 21:25:29 +0000 (14:25 -0700)]
Turn value_incref and value_decref into methods

This changes value_incref and value_decref to be methods of value.
Much of this patch was written by script.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoMove value_ref_policy methods out-of-line
Tom Tromey [Tue, 31 Jan 2023 21:22:13 +0000 (14:22 -0700)]
Move value_ref_policy methods out-of-line

This moves the value_ref_policy methods to be defined out-of-line.
This is a necessary step to change value_incref and value_decref to be
methods of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_bits_synthetic_pointer into a method
Tom Tromey [Tue, 31 Jan 2023 21:17:50 +0000 (14:17 -0700)]
Turn value_bits_synthetic_pointer into a method

This changes value_bits_synthetic_pointer to be a method of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_contents_eq into a method
Tom Tromey [Tue, 31 Jan 2023 21:11:48 +0000 (14:11 -0700)]
Turn value_contents_eq into a method

This changes value_contents_eq to be a method of value.  It also
converts the static function value_contents_bits_eq into a private
method.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn allocate_value_contents into a method
Tom Tromey [Tue, 31 Jan 2023 20:59:56 +0000 (13:59 -0700)]
Turn allocate_value_contents into a method

This turns the static function allocate_value_contents into a method
on value.  It is temporarily public, until some users are converted.
set_limited_array_length is converted as well.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_fetch_lazy into a method
Tom Tromey [Tue, 31 Jan 2023 20:53:55 +0000 (13:53 -0700)]
Turn value_fetch_lazy into a method

This changes value_fetch_lazy to be a method of value.  A few helper
functions are converted as well, to avoid problems in later patches
when the data members are all made private.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn some value_contents functions into methods
Tom Tromey [Tue, 31 Jan 2023 20:45:40 +0000 (13:45 -0700)]
Turn some value_contents functions into methods

This turns value_contents_raw, value_contents_writeable, and
value_contents_all_raw into methods on value.  The remaining functions
will be changed later in the series; they were a bit trickier and so I
didn't include them in this patch.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_zero into static "constructor"
Tom Tromey [Tue, 31 Jan 2023 20:41:35 +0000 (13:41 -0700)]
Turn value_zero into static "constructor"

This turns value_zero into a static "constructor" of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn allocate_optimized_out_value into static "constructor"
Tom Tromey [Tue, 31 Jan 2023 20:30:54 +0000 (13:30 -0700)]
Turn allocate_optimized_out_value into static "constructor"

This turns allocate_optimized_out_value into a static "constructor" of
value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn allocate_computed_value into static "constructor"
Tom Tromey [Tue, 31 Jan 2023 20:29:49 +0000 (13:29 -0700)]
Turn allocate_computed_value into static "constructor"

This turns allocate_computed_value into a static "constructor" of
value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn allocate_value into a static "constructor"
Tom Tromey [Tue, 31 Jan 2023 20:25:17 +0000 (13:25 -0700)]
Turn allocate_value into a static "constructor"

This changes allocate_value to be a static "constructor" of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn allocate_value_lazy into a static "constructor"
Tom Tromey [Tue, 31 Jan 2023 20:24:00 +0000 (13:24 -0700)]
Turn allocate_value_lazy into a static "constructor"

This changes allocate_value_lazy to be a static "constructor" of
struct value.

I considered trying to change value to use ordinary new/delete, but it
seems to me that due to reference counting, we may someday want to
change these static constructors to return value_ref_ptr instead.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn more deprecated_* functions into methods
Tom Tromey [Tue, 31 Jan 2023 19:46:20 +0000 (12:46 -0700)]
Turn more deprecated_* functions into methods

This changes deprecated_value_internalvar_hack,
deprecated_value_internalvar_hack, and deprecated_value_regnum_hack
into methods on value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_address and set_value_address functions into methods
Tom Tromey [Tue, 31 Jan 2023 19:27:30 +0000 (12:27 -0700)]
Turn value_address and set_value_address functions into methods

This changes the value_address and set_value_address functions to be
methods of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_initialized and set_value_initialized functions into methods
Tom Tromey [Tue, 31 Jan 2023 19:22:01 +0000 (12:22 -0700)]
Turn value_initialized and set_value_initialized functions into methods

This changes the value_initialized and set_value_initialized functions
to be methods of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoConvert value_lval_const and deprecated_lval_hack to methods
Tom Tromey [Tue, 31 Jan 2023 19:16:29 +0000 (12:16 -0700)]
Convert value_lval_const and deprecated_lval_hack to methods

This converts the value_lval_const and deprecated_lval_hack functions
to be methods on value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_computed_closure and value_computed_funcs functions into methods
Tom Tromey [Tue, 31 Jan 2023 19:12:39 +0000 (12:12 -0700)]
Turn value_computed_closure and value_computed_funcs functions into methods

This changes the value_computed_funcs and value_computed_closure
functions to be methods of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
21 months agoTurn value_stack and set_value_stack functions into methods
Tom Tromey [Tue, 31 Jan 2023 18:11:17 +0000 (11:11 -0700)]
Turn value_stack and set_value_stack functions into methods

This changes the value_stack and set_value_stack functions to be
methods of value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>