Commit Graph

107292 Commits

Author SHA1 Message Date
Lancelot SIX
5a1e128cd7 gdb: Setting setter return a bool to tell if the value changed
GDB can notify observers when a parameter is changed.

To do that, do_set_command (in gdb/cli/cli-setshow.c) compares the new
value against the old one before updating it, and based on that notifies
observers.  This looks like something like:

    int valuechanged = 0;
    switch (cmd->var.type ())
    {
    case var_integer:
      {
        LONGEST new_val = parse_and_eval_long (arg)
        if (new_val != cmd->var.get<int> ())
        {
          cmd->var.get<int> (new_val);
          value_changes = 1;
        }
      }
      break;
    case var_string:
      {
        std::string val = std::string (arg);
        if (new_val != cmd->var.get<std::string> ())
        {
          cmd->var.get<std::string> (new_val);
          value_changes = 1;
        }
      }
      break;
    case...
      /* And so on for all possible var_types.  */
    }

This comparison is done for each possible var_type, which leads to
unnecessary code duplication.

In this patch I propose to move all those checks in one place within the
setting setter method.  This limits the code duplication and simplifies
the do_set_command implementation.

This patch also changes slightly the way a value change is detected.
Instead of comparing the user provided value against the current value
of the setting, we compare the value of the setting before and after the
set operation.  This is meant to handle edge cases where trying to set
an unrecognized value would be equivalent to a noop (the actual value
remains unchanged).

There should be no user visible change introduced by this commit.

Tested on x86_64 GNU/Linux.

[1] https://review.lttng.org/c/binutils-gdb/+/5831/41

Change-Id: If064b9cede3eb56275aacd2b286f74eceb1aed11
2021-08-19 18:07:39 -04:00
Lancelot SIX
01c85b6e9b gdb: Have setter and getter callbacks for settings
The main motivation behind this improvement is to help the
implementation of a patch Simon Marchi is preparing to fix a bug when
MI or Python try to access parameters that are inferior dependent (see
PR/28085).

This commit extends the previous ones, which introduces the setting
object to represent a static variable whose value can be set or gotten
with the appropriate commands.  This patch proposes that a setting can
either contain a pointer to a static variable holding a setting, or
pointers to a pair of setter and getter callback functions.

The callbacks functions can be used to generate values on the fly when
the setting is accessed (or set the value in a context dependent way).
This is useful when the source of truth is not contained in the
variable pointed to by the setting instance.

Given that the callback function call is hidden within the setting
abstraction introduced earlier, none of the sites accessing the setting
needs to be updated.  The registered getter or setter is used whatever
the way to access it is (through MI, Python, Guile, the "with" command
and the $_gdb_setting / $_gdb_setting_str convenience functions).

All the add_setshow_*_cmd are given a new overload that will accept the
pair of function pointers (set / get functions) instead of the pointer
to a global variable.

Tested on GNU/Linux x86_64 with no regression observed.

Change-Id: Ieb81fef57550632ff66e6aa85f637372a226be8c
2021-08-19 18:07:36 -04:00
Simon Marchi
fc1987599f gdb: make string-like set show commands use std::string variable
String-like settings (var_string, var_filename, var_optional_filename,
var_string_noescape) currently take a pointer to a `char *` storage
variable (typically global) that holds the setting's value.  I'd like to
"mordernize" this by changing them to use an std::string for storage.

An obvious reason is that string operations on std::string are often
easier to write than with C strings.  And they avoid having to do any
manual memory management.

Another interesting reason is that, with `char *`, nullptr and an empty
string often both have the same meaning of "no value".  String settings
are initially nullptr (unless initialized otherwise).  But when doing
"set foo" (where `foo` is a string setting), the setting now points to
an empty string.  For example, solib_search_path is nullptr at startup,
but points to an empty string after doing "set solib-search-path".  This
leads to some code that needs to check for both to check for "no value".
Or some code that converts back and forth between NULL and "" when
getting or setting the value.  I find this very error-prone, because it
is very easy to forget one or the other.  With std::string, we at least
know that the variable is not "NULL".  There is only one way of
representing an empty string setting, that is with an empty string.

I was wondering whether the distinction between NULL and "" would be
important for some setting, but it doesn't seem so.  If that ever
happens, it would be more C++-y and self-descriptive to use
optional<string> anyway.

Actually, there's one spot where this distinction mattered, it's in
init_history, for the test gdb.base/gdbinit-history.exp.  init_history
sets the history filename to the default ".gdb_history" if it sees that
the setting was never set - if history_filename is nullptr.  If
history_filename is an empty string, it means the setting was explicitly
cleared, so it leaves it as-is.  With the change to std::string, this
distinction doesn't exist anymore.  This can be fixed by moving the code
that chooses a good default value for history_filename to
_initialize_top.  This is ran before -ex commands are processed, so an
-ex command can then clear that value if needed (what
gdb.base/gdbinit-history.exp tests).

Another small improvement, in my opinion is that we can now easily
give string parameters initial values, by simply initializing the global
variables, instead of xstrdup-ing it in the _initialize function.

In Python and Guile, when registering a string-like parameter, we
allocate (with new) an std::string that is owned by the param_smob (in
Guile) and the parmpy_object (in Python) objects.

This patch started by changing all relevant add_setshow_* commands to
take an `std::string *` instead of a `char **` and fixing everything
that failed to build.  That includes of course all string setting
variable and their uses.

string_option_def now uses an std::string also, because there's a
connection between options and settings (see
add_setshow_cmds_for_options).

The add_path function in source.c is really complex and twisted, I'd
rather not try to change it to work on an std::string right now.
Instead, I added an overload that copies the std:string to a `char *`
and back.  This means more copying, but this is not used in a hot path
at all, so I think it is acceptable.

Change-Id: I92c50a1bdd8307141cdbacb388248e4e4fc08c93
Co-authored-by: Lancelot SIX <lsix@lancelotsix.com>
2021-08-19 17:19:12 -04:00
Lancelot SIX
5be5fa3ffd gdb: Add typesafe getter/setter for cmd_list_element.var
cmd_list_element can contain a pointer to data that can be set and / or
shown.  This is achieved with a void* that points to the data that can
be accessed, while var_type (of type enum var_types) tells how to
interpret the data pointed to.

With this pattern, the user of the cmd_list_element needs to know what
the storage type associated with a given VAR_TYPES tag, and needs to do
the proper casting.  No automatic check at compile or run time enforces
that the adequate cast is done.

This looks something like:

	if (c->var_type == var_zuinteger)
	  unsigned int v = *(unsigned int*)v->var_type;

With this approach, it is easy to make an error.

This patch aims at addressing the same problem as
https://sourceware.org/pipermail/gdb-patches/2021-July/180920.html but
uses a different approach.

This patch proposes to add an abstraction around the var_types and void*
pointer pair.  The abstraction is meant to prevent the user from having
to handle the cast and verify that the data is read or written as a type
that is coherent with the setting's var_type.  This is achieved by
introducing the setting struct, and a set of templated get / set member
functions.  The template parameter is the type of the variable that
holds the referred variable.

For example, instantiating the member functions with bool will yield
something similar to:

	bool get<bool> () const
	{
	  gdb_assert (this->m_var_type == var_boolean);
	  gdb_assert (this->m_var != nullptr);
	  return *static_cast<bool *> (this->m_var);
	}
	void set<bool> (bool var)
	{
	  gdb_assert (this->m_var_type == var_boolean);
	  gdb_assert (this->m_var != nullptr);
	  *static_cast<bool *> (this->m_var) = var;
	}

With such abstractions available, the var_type and var members of
cmd_list_element are replaced with a setting instance.

No user visible change is expected after this patch.

Tested on GNU/Linux x86_64, with no regression noticed.

Change-Id: Ie1d08c3ceb8b30b3d7bf1efe036eb8acffcd2f34
2021-08-19 17:19:09 -04:00
Simon Marchi
9413ea1609 gdb: use bool in notify_command_param_changed_p and do_set_command
Trivial patch to use bool instead of int.

Change-Id: I9e5f8ee4305272a6671cbaaaf2f0484eff0d1ea5
2021-08-19 14:29:30 -04:00
H.J. Lu
ca22cf5ed5 x86: Put back 3 aborts in OP_E_memory
Put back 3 aborts where invalid lengths should have been filtered out.

gas/

	PR binutils/28247
	* testsuite/gas/i386/bad-bcast.s: Add a comment.

opcodes/

	PR binutils/28247
	* * i386-dis.c (OP_E_memory): Put back 3 aborts.
2021-08-19 07:39:10 -07:00
H.J. Lu
7e40d574be x86: Avoid abort on invalid broadcast
Print "{bad}" on invalid broadcast instead of abort.

gas/

	PR binutils/28247
	* testsuite/gas/i386/bad-bcast.d: New file.
	* testsuite/gas/i386/bad-bcast.s: Likewise.
	* testsuite/gas/i386/i386.exp: Run bad-bcast.

opcodes/

	PR binutils/28247
	* i386-dis.c (OP_E_memory): Print "{bad}" on invalid broadcast
	instead of abort.
2021-08-19 07:01:20 -07:00
Aaron Merey
8ddf46454a gdb/solib: Refactor scan_dyntag
scan_dyntag is unnecessarily duplicated in solib-svr4.c and solib-dsbt.c.

Move this function to solib.c and rename it to gdb_bfd_scan_elf_dyntag.
Also add it to solib.h so it is included in both solib-svr4 and solib-dsbt.
2021-08-18 22:24:18 -04:00
GDB Administrator
76bed1fdbd Automatic date update in version.in 2021-08-19 00:00:35 +00:00
Will Schmidt
533f04079c [gdb] [rs6000] Add ppc64_linux_gcc_target_options method.
Add a method to set the gcc target options for the ppc64 targets.
This change sets an empty value, which allows the gcc
default values (-mcmodel=medium) be used, instead of -mcmodel=large
which is set by the default_gcc_target_options hook.
2021-08-18 11:45:49 -05:00
Will Schmidt
bc0df0fa47 [gdb] [rs6000] Add ppc64*_gnu_triplet_regexp methods.
Add methods to set the target triplet so we can
find the proper gcc when our gcc is named of
the form powerpc64{le}-<foo>-gcc or ppc64{le}-<foo>-gcc.
2021-08-18 11:43:45 -05:00
Alan Modra
a86733d63d Re: as: Replace the removed symbol with the versioned symbol
Some targets, typically embedded without shared libraries, replace the
relocation symbol with a section symbol (see tc_fix_adjustable).
Allow the test to pass for such targets.  Fixes the following.

avr-elf  +FAIL: symver symver16
d10v-elf  +FAIL: symver symver16
dlx-elf  +FAIL: symver symver16
ip2k-elf  +FAIL: symver symver16
m68k-elf  +FAIL: symver symver16
mcore-elf  +FAIL: symver symver16
pj-elf  +FAIL: symver symver16
s12z-elf  +FAIL: symver symver16
visium-elf  +FAIL: symver symver16
z80-elf  +FAIL: symver symver16

	PR gas/28157
	* testsuite/gas/symver/symver16.d: Relax reloc match.
2021-08-18 13:36:57 +09:30
Alan Modra
89c905a342 [GOLD] PowerPC64 relocation overflow for -Os register save/restore funcs
Fixes a silly mistake in calculating the address of -Os out-of-line
register save/restore function copies.  Copies of these linker defined
functions are added to stub sections when the original (in
target->savres_section) can't be reached.

	* powerpc.cc (Target_powerpc::Relocate::relocate): Correct address
	calculation of out-of-line save/restore function copies.
2021-08-18 13:36:57 +09:30
Alan Modra
a3e8dd2ad3 Another ld script backtrack
* ldgram.y (length_spec): Throw away look-ahead NAME.
2021-08-18 13:36:57 +09:30
Mike Frysinger
9068c4a488 gdb: fix spacing on CCLD silent rules 2021-08-17 21:44:04 -04:00
Mike Frysinger
10d8e25c4d sim: nltvals: localize TARGET_<ERRNO> defines
Code should not be using these directly, instead they should be
resolving these dynamically via cb_host_to_target_errno maps.
Fix the Blackfin code and remove the defines out of the header
so no new code can rely on them.
2021-08-17 21:08:57 -04:00
Mike Frysinger
9335d9f823 sim: rename ChangeLog files to ChangeLog-2021
Now that ChangeLog entries are no longer used for sim patches,
this commit renames all relevant sim ChangeLog to ChangeLog-2021,
similar to what we would do in the context of the "Start of New
Year" procedure.

The purpose of this change is to avoid people merging ChangeLog
entries by mistake when applying existing commits that they are
currently working on.

Also throw in a .gitignore entry to keep people from adding new
ChangeLog files anywhere in the sim tree.
2021-08-17 20:27:36 -04:00
GDB Administrator
8ae5245324 Automatic date update in version.in 2021-08-18 00:00:24 +00:00
Simon Marchi
c316c0b29d gdb: fix thread_step_over_chain_length
If I debug a single-thread program and look at the infrun debug logs, I
see:

    [infrun] start_step_over: stealing global queue of threads to step, length = 2

That makes no sense... turns out there's a buglet in
thread_step_over_chain_length, "num" should be initialized to 0.  I
think this bug is a leftover from an earlier version of the code (not
merged upstream) that manually walked the list, where the first item was
implicitly counted (hence the 1).

Change-Id: I0af03aa93509aed36528be5076894dc156a0b5ce
2021-08-17 15:26:10 -04:00
Shahab Vahedi
5d9cff510e opcodes: Fix the auxiliary register numbers for ARC HS
The numbers for the auxiliary registers "tlbindex" and
"tlbcommand" of ARCv2HS are incorrect.  This patch makes
the following changes to correct that error.

 ,------------.-----------------.---------------.
 | aux. reg.  | old (incorrect) | new (correct) |
 |------------+-----------------+---------------|
 | tlbindex   |      0x463      |     0x464     |
 | tlbcommand |      0x464      |     0x465     |
 `------------^-----------------^---------------'

opcodes/
2021-08-17  Shahab Vahedi <shahab@synopsys.com>

	* arc-regs.h (DEF): Fix the register numbers.
2021-08-17 18:33:05 +02:00
H.J. Lu
c0154a4a21 gdb: Don't assume r_ldsomap when r_version > 1 on Linux
The r_ldsomap field is specific to Solaris (part of librtld_db), and
should never be accessed for Linux.  glibc is planning to add a field
to support multiple namespaces.  But there will be no r_ldsomap when
r_version is bumped to 2.  Add linux_[ilp32|lp64]_fetch_link_map_offsets
to set r_ldsomap_offset to -1 and use them for Linux targets.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28236
2021-08-17 07:05:57 -07:00
H.J. Lu
4eb629d50d gdbserver: Check r_version < 1 for Linux debugger interface
Update gdbserver to check r_version < 1 instead of r_version != 1 so
that r_version can be bumped for a new field in the glibc debugger
interface to support multiple namespaces.  Since so far, the gdbserver
only reads fields defined for r_version == 1, it is compatible with
r_version >= 1.

All future glibc debugger interface changes will be backward compatible.
If there is ever the need for backward incompatible change to the glibc
debugger interface, a new DT_XXX element will be provided to access the
new incompatible interface.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=11839
2021-08-17 06:19:49 -07:00
Andrea Corallo
c9fed6655f PATCH [4/4] arm: Add Tag_PACRET_use build attribute
bfd/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* elf32-arm.c (elf32_arm_merge_eabi_attributes): Add
	'Tag_PACRET_use' case.

binutils/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* readelf.c (arm_attr_tag_PAC_extension): Declare.
	(arm_attr_public_tags): Add 'PAC_extension' lookup.

elfcpp/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* arm.h: Define 'Tag_PACRET_use' enum.

gas/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* config/tc-arm.c (arm_convert_symbolic_attribute): Add
	'Tag_PACRET_use' to the attribute_table.

include/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* elf/arm.h (elf_arm_reloc_type): Add 'Tag_PACRET_use'.
2021-08-17 14:49:42 +02:00
Andrea Corallo
b81ee92f03 PATCH [3/4] arm: Add Tag_BTI_use build attribute
bfd/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* elf32-arm.c (elf32_arm_merge_eabi_attributes): Add
	'Tag_BTI_use' case.

binutils/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* readelf.c (arm_attr_tag_PAC_extension): Declare.
	(arm_attr_public_tags): Add 'PAC_extension' lookup.

elfcpp/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* arm.h: Define 'Tag_BTI_use' enum.

gas/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* config/tc-arm.c (arm_convert_symbolic_attribute): Add
	'Tag_BTI_use' to the attribute_table.

include/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* elf/arm.h (elf_arm_reloc_type): Add 'Tag_BTI_use'.
2021-08-17 14:49:42 +02:00
Andrea Corallo
4b53503018 PATCH [2/4] arm: Add Tag_BTI_extension build attribute
bfd/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* elf32-arm.c (elf32_arm_merge_eabi_attributes): Add
	'Tag_BTI_extension' case.

binutils/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* readelf.c (arm_attr_tag_PAC_extension): Declare.
	(arm_attr_public_tags): Add 'PAC_extension' lookup.

elfcpp/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* arm.h: Define 'Tag_BTI_extension' enum.

gas/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* config/tc-arm.c (arm_convert_symbolic_attribute): Add
	'Tag_BTI_extension' to the attribute_table.

include/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* elf/arm.h (elf_arm_reloc_type): Add 'Tag_BTI_extension'.
2021-08-17 14:49:42 +02:00
Andrea Corallo
99db83d07d PATCH [1/4] arm: Add Tag_PAC_extension build attribute
bfd/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* elf32-arm.c (elf32_arm_merge_eabi_attributes): Add
	'Tag_PAC_extension' case.

binutils/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* readelf.c (arm_attr_tag_PAC_extension): Declare.
	(arm_attr_public_tags): Add 'PAC_extension' lookup.

elfcpp/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* arm.h: Define 'Tag_PAC_extension' enum.

gas/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* config/tc-arm.c (arm_convert_symbolic_attribute): Add
	'Tag_PAC_extension' to the attribute_table.

include/
2021-07-06  Andrea Corallo  <andrea.corallo@arm.com>

	* elf/arm.h (elf_arm_reloc_type): Add 'Tag_PAC_extension'.
2021-08-17 14:49:42 +02:00
H.J. Lu
faca1a42d3 x86: Always run fp tests
Always run fp tests since the size of .tfloat, .ds.x, .dc.x and .dcb.x
directive outputs is always 10 bytes.  There is no need for fp-elf32 nor
fp-elf64.

	PR gas/28230
	* testsuite/gas/i386/fp-elf32.d: Removed.
	* testsuite/gas/i386/fp-elf64.d: Likewise.
	* testsuite/gas/i386/fp.s: Remove NO_TFLOAT_PADDING codes.
	* testsuite/gas/i386/i386.exp: Don't run fp-elf32 nor fp-elf64.
	Always run fp.
2021-08-17 05:28:30 -07:00
GDB Administrator
c6b8e53281 Automatic date update in version.in 2021-08-17 00:00:27 +00:00
H.J. Lu
ff01bb6c23 x86: Don't pad .tfloat directive output
.tfloat output should always be 10 bytes without padding, independent
of psABIs.  In glibc, x86 assembly codes expect 10-byte .tfloat output.
This also reduces .ds.x output and .tfloat output with hex input from
12 bytes to 10 bytes to match .tfloat output.

	PR gas/28230
	* NEWS: Mention changes of .ds.x output and .tfloat output with
	hex input.
	* config/tc-i386.c (x86_tfloat_pad): Removed.
	* config/tc-i386.h (X_PRECISION_PAD): Changed to 0.
	(x86_tfloat_pad): Removed.
	* testsuite/gas/i386/fp.s: If NO_TFLOAT_PADDING isn't defined,
	add explicit paddings after .tfloat, .ds.x, .dc.x and .dcb.x
	directives.
	* testsuite/gas/i386/i386.exp (ASFLAGS): Append
	"--defsym NO_TFLOAT_PADDING=1" when running the fp test.
2021-08-16 14:40:30 -07:00
Tom Tromey
892a1e5303 Fix register regression in DWARF evaluator
On an internal test case, using an arm-elf target, commit ba5bc3e5a9
("Make DWARF evaluator return a single struct value") causes a
regression.  (It doesn't happen for any of the other cross targets
that I test when importing upstream gdb.)

I don't know if there's an upstream gdb test case showing the same
problem... I can only really run native tests with dejagnu AFAIK.

The failure manifests like this:

    Breakpoint 1, file_1.export_1 (param_1=<error reading variable: Unable to access DWARF register number 64>, str=...) at [...]/file_1.adb:5

Whereas when it works it looks like:

    Breakpoint 1, file_1.export_1 (param_1=99.0, str=...) at [...]/file_1.adb:5

The difference is that the new code uses the passed-in gdbarch,
whereas the old code used the frame's gdbarch, when handling
DWARF_VALUE_REGISTER.

This patch restores the use of the frame's arch.
2021-08-16 09:38:15 -06:00
Tom Tromey
1dd34eff4b Fix Ada regression due to DWARF expression series
Commit 0579205aec ("Simplify dwarf_expr_context class interface")
caused a regression in the internal AdaCore test suite.  I didn't try
to reproduce this with the GDB test suite, but the test is identical
to gdb.dwarf2/dynarr-ptr.exp.

The problem is that this change:

 	case DW_OP_push_object_address:
 	  /* Return the address of the object we are currently observing.  */
-	  if (this->data_view.data () == nullptr
-	      && this->obj_address == 0)
+	  if (this->m_addr_info == nullptr)

... slightly changes the logic here.  In particular, it's possible for
the caller to pass in a non-NULL m_addr_info, but one that looks like:

    (top) p *this.m_addr_info
    $15 = {
      type = 0x29b7a70,
      valaddr = {
	m_array = 0x0,
	m_size = 0
      },
      addr = 0,
      next = 0x0
    }

In this case, an additional check is needed.  With the current code,
what happens instead is that the computation computes an incorrect
address -- but one that does not fail in read_memory, due to the
precise memory map of the embedded target in question.

This patch restores the old logic.
2021-08-16 09:38:14 -06:00
Patrick Monnerat
bd7ccaa983 Notify observer of breakpoint auto-disabling
As breakpoint_modified observer is currently notified upon breakpoint stop
before handling auto-disabling when enable count is reached, the observer
is never notified of the disabling.

The problem affects:
- The MI interpreter enabled= value when reporting =breakpoint-modified
- A Python event handler for breakpoint_modified using the "enabled"
  member of its parameter
- insight: breakpoint GUI window is not properly updated upon auto-disable

This patch moves the observer notification after the auto-disabling
code and implements corresponding tests for the MI and Python cases.

Fixes https://sourceware.org/bugzilla/show_bug.cgi?id=23336

Change-Id: I0c50df4789334071e5390cb46b3ca0d4a7f83c61
2021-08-16 11:10:19 -04:00
H.J. Lu
eb09df162b as: Replace the removed symbol with the versioned symbol
When a symbol removed by .symver is used in relocation and there is one
and only one versioned symbol, don't remove the symbol.  Instead, mark
it to be removed and replace the removed symbol used in relocation with
the versioned symbol before generating relocation.

	PR gas/28157
	* symbols.c (symbol_flags): Add removed.
	(symbol_entry_find): Updated.
	(symbol_mark_removed): New function.
	(symbol_removed_p): Likewise.
	* symbols.h (symbol_mark_removed): New prototype.
	(symbol_removed_p): Likewise.
	* write.c (write_relocs): Call obj_fixup_removed_symbol on
	removed fixp->fx_addsy and fixp->fx_subsy if defined.
	(set_symtab): Don't add a symbol if symbol_removed_p returns true.
	* config/obj-elf.c (elf_frob_symbol):  Don't remove the symbol
	if it is used on relocation.  Instead, mark it as to be removed
	and issue an error if the symbol has more than one versioned name.
	(elf_fixup_removed_symbol): New function.
	* config/obj-elf.h (elf_fixup_removed_symbol): New prototype.
	(obj_fixup_removed_symbol): New.
	* testsuite/gas/symver/symver11.d: Updated expected error
	message.
	* testsuite/gas/symver/symver16.d: New file.
	* testsuite/gas/symver/symver16.s: Likewise.
2021-08-16 06:46:44 -07:00
GDB Administrator
70069e7823 Automatic date update in version.in 2021-08-16 00:00:28 +00:00
GDB Administrator
ec1e5afa89 Automatic date update in version.in 2021-08-15 00:00:44 +00:00
Alan Modra
4ffb22ec40 ld script fill pattern expression
It turns out we do need to backtrack when parsing after all.  The
fill_opt component in the section rule swiches to EXPRESSION and back
to SCRIPT, and to find the end of an expression it is necessary to
look ahead one token.

	* ldgram.y (section): Throw away lookahead NAME token.
	(overlay_section): Likewise.
	* testsuite/ld-elf/overlay.t: Add fill pattern on overlays.
	Test fill pattern before stupidly named normal sections too,
	and before /DISCARD/.
2021-08-14 09:54:48 +09:30
GDB Administrator
96ddc891f2 Automatic date update in version.in 2021-08-14 00:00:26 +00:00
Alan Modra
f400c8d27e ld lexer tidy, possibly break the world
This tidies the states in which ld lexer rules are enabled.
This change will quite likely trip over issues similar to those
mentioned in the new ldlex.l comments, so please test it out.

	* ldgram.y (wildcard_name): Remove now unnecessary components.
	* ldlex.l: Restrict many rules' states.  Remove -l expression
	state rule.  Comment on lookahead state madness and need for
	/DISCARD/ in expression state.
2021-08-13 22:46:54 +09:30
Alan Modra
b325429b2f ld script lower-case absolute and sizeof_headers
I think these happened by accident, so let's see what breaks if they
are removed.

	* ldlex.l: Remove lower case "absolute" and "sizeof_headers"
	in non-mri mode.
	* ld.texi: Remove sizeof_headers index.
	* testsuite/ld-mmix/mmohdr1.ld: Use SIZEOF_HEADERS.
2021-08-13 22:44:36 +09:30
Alan Modra
34a7af0fac tidy mri script extern
MRI mode generally doesn't flip lexer states, so let's make MRI mode
"extern" not do so either.

	* ldgram.y (extern_name_list): Don't change lex state here.
	(ifile_p1): Change state here on EXTERN instead.
2021-08-13 22:30:30 +09:30
Alan Modra
3bb17dfb6b Re: PR28217, Syntax error when memory region contains a hyphen
I discovered some more errors when tightening up the lexer rules.
Just because we INCLUDE a file doesn't mean we've switched states.

	PR 28217
	* ldgram.y (statement): Don't switch lexer state on INCLUDE.
	(mri_script_command, ifile_p1, memory_spec, section): Likewise.
2021-08-13 18:23:35 +09:30
Lifang Xia
1374be2327 PR28168: [CSKY] Fix stack overflow in disassembler
PR 28168:
Stack overflow with a large float. %f is not a goot choice for this.
%f should be replaced with %.7g.

gas/
	* testsuite/gas/csky/pr28168.d: New testcase for PR 28168.
	* testsuite/gas/csky/pr28168.s: Likewise.
	* testsuite/gas/csky/v2_float_part2.d: Following the new format.
	* opcodes/csky-dis.c (csky_output_operand): %.7g replaces %f.
2021-08-13 14:13:58 +08:00
Alan Modra
af29a8abcf PR28217, Syntax error when memory region contains a hyphen
The saga of commit 40726f16a8 continues.  This attacks the problem
of switching between SCRIPT and EXPRESSION state lexing by removing
the need to do so for phdrs like ":text".  Instead {WILDCHAR}*
matching, the reason why ":text" lexed as one token, is restricted to
within the braces of a section or overlay statement.  The new WILD
lexer state is switched at the non-optional brace tokens, so
ldlex_backup is no longer needed.  I've also removed the BOTH state,
which doesn't seem to be needed any more.  Besides rules involving
error reporting, there was just one place where SCRIPT appeared
without BOTH, the {WILDCHAR}* rule, three where BOTH appears without
SCRIPT for tokens that only need EXPRESSION state, and two where BOTH
appears alongside INPUT_LIST.  (Since I'm editing the wild and
filename rules, removing BOTH and adding WILD can also be seen as
renaming the old BOTH state to SCRIPT and renaming the old SCRIPT
state to WILD with a reduced scope.)

As a followup, I'll look at removing EXPRESSION state from some lexer
rules that no longer need it due to this cleanup.

	PR 28217
	* ldgram.y (exp <ORIGIN, LENGTH>): Use paren_script_name.
	(section): Parse within braces of section in wild mode, and
	after brace back in script mode.  Remove ldlex_backup call.
	Similarly for OVERLAY.
	(overlay_section): Similarly.
	(script_file): Replace ldlex_both with ldlex_script.
	* ldlex.h (ldlex_wild): Declare.
	(ldlex_both): Delete.
	* ldlex.l (BOTH): Delete.  Remove state from all rules.
	(WILD): New state.  Enable many tokens in this state.
	Enable filename match in SCRIPT mode.  Enable WILDCHAR match
	in WILD state, disable in SCRIPT mode.
	(ldlex_wild): New function.
	* ldfile.c (ldfile_try_open_bfd): Replace ldlex_both call with
	ldlex_script.
2021-08-13 12:32:53 +09:30
Alan Modra
41ee6d14fd ns32k configury
Since ns32k-netbsd is as yet not removed, just marked obsolete,
the target should still be accepted with --enable-obsolete.

I also enabled ns32k-openbsd in ld since there doesn't seem to be a
good reason why that target is not supported there but is elsewhere.

bfd/
	* config.bfd: Allow ns32k-netbsd.
ld/
	* configure.tgt: Allow ns32k-openbsd.
2021-08-13 11:50:05 +09:30
GDB Administrator
c92d9b49ce Automatic date update in version.in 2021-08-13 00:00:31 +00:00
Lancelot SIX
a35606d901 gdb: riscv_scan_prologue: handle LD and LW instructions
While working on the testsuite, I ended up noticing that GDB fails to
produce a full backtrace from a thread waiting in pthread_join.  When
selecting the waiting thread and using the 'bt' command, the following
result can be observed:

	(gdb) bt
	#0  0x0000003ff7fccd20 in __futex_abstimed_wait_common64 () from /lib/riscv64-linux-gnu/libpthread.so.0
	#1  0x0000003ff7fc43da in __pthread_clockjoin_ex () from /lib/riscv64-linux-gnu/libpthread.so.0
	Backtrace stopped: frame did not save the PC

On my platform, I do not have debug symbols for glibc, so I need to rely
on prologue analysis in order to unwind stack.

Here is what the function prologue looks like:

	(gdb) disassemble __pthread_clockjoin_ex
	Dump of assembler code for function __pthread_clockjoin_ex:
	   0x0000003ff7fc42de <+0>:     addi    sp,sp,-144
	   0x0000003ff7fc42e0 <+2>:     sd      s5,88(sp)
	   0x0000003ff7fc42e2 <+4>:     auipc   s5,0xd
	   0x0000003ff7fc42e6 <+8>:     ld      s5,-2(s5) # 0x3ff7fd12e0
	   0x0000003ff7fc42ea <+12>:    ld      a5,0(s5)
	   0x0000003ff7fc42ee <+16>:    sd      ra,136(sp)
	   0x0000003ff7fc42f0 <+18>:    sd      s0,128(sp)
	   0x0000003ff7fc42f2 <+20>:    sd      s1,120(sp)
	   0x0000003ff7fc42f4 <+22>:    sd      s2,112(sp)
	   0x0000003ff7fc42f6 <+24>:    sd      s3,104(sp)
	   0x0000003ff7fc42f8 <+26>:    sd      s4,96(sp)
	   0x0000003ff7fc42fa <+28>:    sd      s6,80(sp)
	   0x0000003ff7fc42fc <+30>:    sd      s7,72(sp)
	   0x0000003ff7fc42fe <+32>:    sd      s8,64(sp)
	   0x0000003ff7fc4300 <+34>:    sd      s9,56(sp)
	   0x0000003ff7fc4302 <+36>:    sd      a5,40(sp)

As far as prologue analysis is concerned, the most interesting part is
done at address 0x0000003ff7fc42ee (<+16>): 'sd ra,136(sp)'. This stores
the RA (return address) register on the stack, which is the information
we are looking for in order to identify the caller.

In the current implementation of the prologue scanner, GDB stops when
hitting 0x0000003ff7fc42e6 (<+8>) because it does not know what to do
with the 'ld' instruction.  GDB thinks it reached the end of the
prologue but have not yet reached the important part, which explain
GDB's inability to unwind past this point.

The section of the prologue starting at <+4> until <+12> is used to load
the stack canary[1], which will then be placed on the stack at <+36> at
the end of the prologue.

In order to have the prologue properly handled, this commit proposes to
add support for the ld instruction in the RISC-V prologue scanner.
I guess riscv32 would use lw in such situation so this patch also adds
support for this instruction.

With this patch applied, gdb is now able to unwind past pthread_join:

	(gdb) bt
	#0  0x0000003ff7fccd20 in __futex_abstimed_wait_common64 () from /lib/riscv64-linux-gnu/libpthread.so.0
	#1  0x0000003ff7fc43da in __pthread_clockjoin_ex () from /lib/riscv64-linux-gnu/libpthread.so.0
	#2  0x0000002aaaaaa88e in bar() ()
	#3  0x0000002aaaaaa8c4 in foo() ()
	#4  0x0000002aaaaaa8da in main ()

I have had a look to see if I could reproduce this easily, but in my
simple testcases using '-fstack-protector-all', the canary is loaded
after the RA register is saved.  I do not have a reliable way of
generating a prologue similar to the problematic one so I forged one
instead.

The testsuite have been run on riscv64 ubuntu 21.01 with no regression
observed.

[1] https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries
2021-08-12 23:13:30 +00:00
Tom Tromey
6a33fa0efe Update documentation to mention Pygments
Philippe Blain pointed out that the gdb documentation does not mention
that Pygments may be used for source highlighting.  This patch updates
the docs to reflect how highlighting is actually done.
2021-08-12 14:06:20 -06:00
Simon Marchi
9b1f59fc95 gdb: make gdbarch_printable_names return a vector
I noticed that gdbarch_selftest::operator() leaked the value returned by
gdbarch_printable_names.  Make gdbarch_printable_names return an
std::vector and update callers.  That makes it easier for everyone
involved, less manual memory management.

Change-Id: Ia8fc028bdb91f787410cca34f10bf3c5a6da1498
2021-08-12 15:20:26 -04:00
Carl Love
65f82b1972 Improve forward progress test in python.exp
The test steps into func2 and than does an up to get back to the previous
frame. The test checks that the line number you are at after the up command
is greater than the line where the function was called from. The
assembly/codegen for the powerpc target includes a NOP after the
branch-link.

func2 (); /* Break at func2 call site. /
10000694: 59 00 00 48 bl 100006ec
10000698: 00 00 00 60 nop
return 0; / Break to end. */
1000069c: 00 00 20 39 li r9,0

The PC at the instruction following the branch-link is 0x10000698 which
GDB.find_pc_line() maps to the same line number as the bl instruction.
GDB did move past the branch-link location thus making forward progress.

The following proposed fix adds an additional PC check to see if forward
progress was made.  The line test is changed from greater than to greater
than or equal.
2021-08-12 13:03:19 -05:00
Jiangshuai Li
b2ee4824b1 gdb:csky rm tdesc_has_registers in csky_register_name
As CSKY arch has not parsed target-description.xml in csky_gdbarch_init,
when a remote server, like csky-qemu or gdbserver, send a target-description.xml
to gdb, tdesc_has_registers will return ture, but tdesc_register_name (gdbarch, 0)
will return NULL, so a cmd "info registers r0" will not work.

Function of parsing target-description.xml will be add later for CSKY arch,
now it is temporarily removed to allow me to do other supported tests.

2021-07-15 Jiangshuai Li  <jiangshuai_li@c-sky.com>

            * csky-tdep.c : not using tdesc funtions in csky_register_name
2021-08-12 09:47:06 +01:00