106344 Commits

Author SHA1 Message Date
6d1a09b77a [gdb/breakpoint] Fix assert in jit_event_handler
Consider a minimal test-case test.c:
...
int main (void) { return 0; }
...
which we can compile into llvm byte code using clang:
...
$ clang -g -S -emit-llvm --target=x86_64-unknown-unknown-elf test.c
...
and then run using lli, which uses the llvm jit:
...
$ lli test.ll
...

If we run this under gdb, we run into an assert:
...
$ gdb -q -batch -ex run --args /usr/bin/lli test.ll
Dwarf Error: Cannot not find DIE at 0x18a936e7 \
  [from module libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug]

[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
src/gdb/jit.c:1178: internal-error: \
  void jit_event_handler(gdbarch*, objfile*): \
  Assertion `jiter->jiter_data != nullptr' failed.
...

This is caused by the following.

When running jit_breakpoint_re_set_internal, we first handle
libLLVM.so.10.debug, and set a jit breakpoint.

Next we handle libLLVM.so.10:
...
(gdb) p the_objfile.original_name
$42 = 0x2494170 "libLLVM.so.10"
...
but the minimal symbols we find are from libLLVM.so.10.debug:
...
(gdb) p reg_symbol.objfile.original_name
$43 = 0x38e7c50 "libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug"
(gdb) p desc_symbol.objfile.original_name
$44 = 0x38e7c50 "libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug"
...
and consequently, the objf_data is the one from libLLVM.so.10.debug:
...
      jiter_objfile_data *objf_data
        = get_jiter_objfile_data (reg_symbol.objfile);
...
and so we hit this:
...
      if (objf_data->cached_code_address == addr)
        continue;
...
and no second jit breakpoint is inserted.

Subsequently, the jit breakpoint is triggered and handled, but when finding
the symbol for the breakpoint address we get:
...
(gdb) p jit_bp_sym.objfile.original_name
$52 = 0x2494170 "libLLVM.so.10"
...

The assert 'jiter->jiter_data != nullptr' triggers because it checks
libLLVM.so.10 while the one with jiter_data setup is libLLVM.so.10.debug.

This fixes the assert:
...
       jiter_objfile_data *objf_data
-        = get_jiter_objfile_data (reg_symbol.objfile);
-        = get_jiter_objfile_data (the_objfile);
...
but consequently we'll have two jit breakpoints, so we also make sure we don't
set a jit breakpoint on separate debug objects like libLLVM.so.10.debug.

Tested on x86_64-linux.

gdb/ChangeLog:

2021-05-21  Tom de Vries  <tdevries@suse.de>

	PR breakpoint/27889
	* jit.c (jit_breakpoint_re_set_internal): Skip separate debug
	objects.  Call get_jiter_objfile_data with the_objfile.
2021-05-21 15:09:14 +02:00
3b2bef8bbd [Binutils] Update NT_ARM note types for readelf
binutils * readelf.c (get_note_type): Add missing NT_ARM_* entries.
2021-05-21 10:43:52 +01:00
894982bfcc [AArch64] MTE corefile support
bfd	* elf.c (elfcore_make_memtag_note_section): New function.
	(elfcore_grok_note): Handle NT_MEMTAG note types.

binutils* readelf.c (get_note_type): Handle NT_MEMTAG note types.

include	* elf/common.h (NT_MEMTAG): New constant.
	(NT_MEMTAG_TYPE_AARCH_MTE): New constant.
2021-05-21 10:40:32 +01:00
75b969ccb1 Automatic date update in version.in 2021-05-21 00:00:54 +00:00
1487a14ec2 gdb: remove linespec_p typedef
I guess this was used with the old VEC implementation, but there is no
reason to have this typedef anymore.

gdb/ChangeLog:

	* linespec.c (linespec_p): Remove.  Replace all uses with
	"linespec *".

Change-Id: I4cea59ae1cd46985da9c08d3a69686846b1ad028
2021-05-20 15:57:37 -04:00
bb6203bf1d cli-script: use unique_ptr to not leak next struct
In cli/cli-script.c, process_next_line() allocates memory
which will eventually end up being assigned to the 'next'
field in struct command_line.  However, in a case
recurse_read_control_structure returns 'invalid_control'
this memory is leaked. This commit uses std::unique_ptr
as appropriate to prevent this leakage.

This issue was found by coverity scanning.

gdb/ChangeLog:

        * cli/cli-script.h (command_line_up): New unique_ptr typedef.
	* cli/cli-script.c (multi_line_command_p): Use unique_ptr
        command_line_up instead of struct command_line.
	(build_command_line): Likewise.
	(get_command_line): Update the cmd function call parameter.
	(process_next_line):  Use unique_ptr command_line_up instead
        of struct command_line.
	(recurse_read_control_structure): Change the the type of
        next to command_line_up.
	(read_command_lines_1): Change type of `next' to be
        command_line_up and update all references of `next'
        accordingly.
2021-05-20 21:03:47 +02:00
9a01ec4c03 Fix overflow detection in the Z80 assembler.
* config/tc-z80.c (emit_data_val): Warn on constant overflow.
 (signed_overflow): New function.
 (unsigned_overflow): New function.
 (is_overflow): Use new functions.
 (md_apply_fix): Use signed_overflow.
 * testsuite/gas/z80/ez80_adl_suf.d: Fix test.
 * testsuite/gas/z80/ez80_isuf.s: Likewise.
 * testsuite/gas/z80/ez80_z80_suf.d: Likewise.
2021-05-20 16:14:10 +01:00
ed3130b740 Add myself to gdb/MAINTAINERS
gdb/ChangeLog:

        * MAINTAINERS (Write After Approval): Add myself.
2021-05-20 15:32:51 +02:00
a5523cc3c4 Clean up my ChangeLog entry 2021-05-20 15:18:26 +02:00
427e4066af gdb/bfd: avoid crash when architecture is forced to csky or riscv
I built GDB with `--enable-targets=all`, then started GDB passing it
an x86-64 executable, finally I ran 'maint selftest', and observed GDB
crash like this:

  BFD: BFD (GNU Binutils) 2.36.50.20210519 assertion fail ../../src/bfd/hash.c:438
  Aborted (core dumped)

The problem originates from two locations, for example in csky-dis.c
(csky_get_disassembler) where we do this:

  const char *sec_name = NULL;
  ...
  sec_name = get_elf_backend_data (abfd)->obj_attrs_section;
  if (bfd_get_section_by_name (abfd, sec_name) != NULL)
    ...

We end up in here because during the selftests GDB forces the
architecture to be csky, but the BFD being accessed is still of type
x86-64.  As a result obj_attrs_section returns NULL, which means we
end up passing NULL to bfd_get_section_by_name.  If we follow the
function calls from bfd_get_section_by_name we eventually end up in
bfd_hash_hash, which asserts that the string (i.e. the name) is not
NULL.

The same crash can be reproduced in GDB without using the selftests,
for example:

  (gdb) file x86_64.elf
  (gdb) start
  (gdb) set architecture csky
  (gdb) disassemble main
  Dump of assembler code for function main:
  BFD: BFD (GNU Binutils) 2.36.50.20210519 assertion fail ../../src/bfd/hash.c:438
  Aborted (core dumped)

The fix I propose here is to have bfd_get_section_by_name return NULL
if name is ever NULL.  For consistency I updated
bfd_get_section_by_name_if in the same way, even though I'm not
hitting any problems along that code path right now.

I looked through the source tree and removed two NULL checks in
bfd/dwarf2.c which are no longer needed, its possible that there are
additional NULL checks that could be removed, I just didn't find them.

bfd/ChangeLog:

	* section.c (bfd_get_section_by_name): Return NULL if name is
	NULL.
	(bfd_get_section_by_name_if): Likewise.
	* dwarf2.c (read_section): Remove unneeded NULL check.
	(find_debug_info): Likewise.
2021-05-20 13:35:54 +01:00
8baee38bfe sim: ppc: fix Wpointer-sign warning
When compiling with --enable-werror and CFLAGS="-O0 -g -Wall", we run into:
...
src/sim/ppc/hw_memory.c: In function 'hw_memory_init_address':
src/sim/ppc/hw_memory.c:194:75: error: pointer targets in passing \
  argument 4 of 'device_find_integer_array_property' differ in signedness \
  [-Werror=pointer-sign]
     int nr_cells
       = device_find_integer_array_property(me, "available", 0, &dummy);
                                                                ^
...

Fix this by changing the type of dummy.
2021-05-20 13:58:35 +02:00
7f2b87189b [PATCH]rs6000,testsuite Add a powerpc64-prologue testcase.
Add a powerpc64-prologue testcase, this is based on the existing
powerpc-prologue test, but updated for the powerpc64 (le) target.

YYYY-MM-DD  Will Schmidt  <will_schmidt@vnet.ibm.com>

gcc/testsuite/ChangeLog
	* gdb.arch/powerpc64-prologue.c: New test to exercise prologues
	for the powerpc64 LE target.
	* gdb.arch/powerpc-prologue.exp: Test Harness.
2021-05-19 20:11:57 -05:00
d556135f02 PR27888, fix link of gas with zlib by libtool 2.4.6
PR 27888
	* Makefile.am (ZLIB): Define.
	(as_new_LDADD): Add it.
	* Makefile.in: Regenerate.
2021-05-20 10:03:33 +09:30
93b196f931 Automatic date update in version.in 2021-05-20 00:00:44 +00:00
5433e20ec1 Mark tu_abbrev_offset::operator<() const.
clang 11 with libc++'s <algorithm> fails to match the existing
operator<() for std::less<> since the method is not marked const.

gdb/ChangeLog:

	* dwarf2/read.c (tu_abbrev_offset::operator<): Mark const.
2021-05-19 13:31:19 -07:00
17bb1d80f5 sim: ppc: fix some Wenum-compare warnings
When compiling with --enable-werror and CFLAGS="-O0 -g -Wall", we run into:
...
src/sim/ppc/hw_phb.c: In function 'hw_phb_attach_address':
src/sim/ppc/hw_phb.c:315:12: error: comparison between \
  'attach_type {aka enum _attach_type}' and \
  'enum <anonymous>' [-Werror=enum-compare]
   if (type != hw_phb_normal_decode
            ^~
...

Fix this by casting type to hw_phb_decode.
2021-05-19 19:08:53 +02:00
bfff0efb3d sim: ppc: fix Wnonnull warning
When compiling with --enable-werror and CFLAGS="-O0 -g -Wall", we run into:
...
src/sim/ppc/emul_netbsd.c: In function 'do_gettimeofday':
src/sim/ppc/emul_netbsd.c:770:16: error: null argument where non-null \
  required (argument 1) [-Werror=nonnull]
   int status = gettimeofday((t_addr != 0 ? &t : NULL),
                ^~~~~~~~~~~~
...

Fix this by unconditionally passing &t as first argument.
2021-05-19 18:42:59 +02:00
0d7e3cd15f gdb: Move definitions of std::string overloads in ui_out to the header
These methods are just trivial wrappers around the versions accepting
a char pointer.  By moving them to the header the compiler can inline
them.

gdb/ChangeLog:

	* ui-out.c (ui_out::field_string): Move to ui-out.h.
	(ui_out::text): Ditto.
	* ui-out.h (class ui_out): Add definitions of
	ui_out::field_string and ui_out::text which were previously
	defined in ui-out.c.
2021-05-19 16:48:05 +01:00
4156e38676 sim: ppc: fix some more Wunused-function warnings
When compiling with --enable-werror and CFLAGS="-O0 -g -Wall", we run into:
...
In file included from src/sim/ppc/cpu.h:26:0,
                 from src/sim/ppc/mon.c:25,
                 from src/sim/ppc/inline.c:64,
                 from idecode.c:26:
src/sim/ppc/device.h:788:8: error: 'device_event_queue_deschedule' \
  declared 'static' but never defined [-Werror=unused-function]
 (void) device_event_queue_deschedule
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...

This seems to be caused by the fact that the function is declared using
INLINE_EVENT instead of INLINE_DEVICE.

Fix this and a similar error in the same file.
2021-05-19 17:46:24 +02:00
8f09aa5ba8 sim: ppc: fix some Wunused-function warnings
When compiling with --enable-werror and CFLAGS="-O0 -g -Wall", we run into:
...
In file included from src/sim/ppc/cpu.h:251:0,
                 from src/sim/ppc/emul_generic.h:24,
                 from src/sim/ppc/emul_generic.c:24:
src/sim/ppc/cpu.c:76:1: error: 'cpu_create' defined but not used \
  [-Werror=unused-function]
 cpu_create(psim *system,
 ^~~~~~~~~~
...

The function is defined as:
...
INLINE_CPU\
(cpu *)
cpu_create(psim *system,
...
which expands to:
...
static cpu * __attribute__((__unused__))
cpu_create(psim *system,
...

The problem is that gcc does not associate the attribute to the function.
I've filed a PR about this ( PR gcc/100670 ), which may or may not be valid.

Work around/fix this by modifying the INLINE_* definitions in inline.h to move
UNUSED to the start such that we have:
...
__attribute__((__unused__)) static cpu *
cpu_create(psim *system,
...
2021-05-19 17:46:24 +02:00
ee22a1a31d Fix offset for ia64 PCREL60B relocation on HP-UX
gas/ChangeLog:
2021-05-19  John Buddery  <jvb@cyberscience.com>
	PR 25599
	* config/tc-ia64.c (emit_one_bundle): Increment fixup offset
	by one for PCREL60B relocation on HP-UX.
2021-05-19 15:27:28 +00:00
8dd8c8d4ab gdb: Pass std::strings to ui_out::field_string () where convenient
While adding a ui_out::text () overload accepting a std::string, I
noticed that several callers of ui_out::field_string () were converting
std::string instances to char pointers even if not necessary.

gdb/ChangeLog:

	* ui-out.c (ui_out::field_string): Add missing style_argument
	to the overload accepting a std::string, to make it equivalent
	to the char pointer version.
	* ui-out.h (class ui_out): Ditto.
	* break-catch-sig.c (signal_catchpoint_print_one): Do not
	convert std::strings to char pointers before passing them to
	ui_out::field_string ().
	* break-catch-throw.c (print_one_detail_exception_catchpoint):
	Ditto.
	* cli/cli-setshow.c (do_show_command): Ditto.
	* disasm.c (gdb_pretty_print_disassembler::pretty_print_insn):
	Ditto.
	* infcmd.c (print_return_value_1): Ditto.
	* inferior.c (print_inferior): Ditto.
	* linux-thread-db.c (info_auto_load_libthread_db): Ditto.
	* mi/mi-cmd-var.c (print_varobj): Ditto.
	(mi_cmd_var_set_format): Ditto.
	(mi_cmd_var_info_type): Ditto.
	(mi_cmd_var_info_expression): Ditto.
	(mi_cmd_var_evaluate_expression): Ditto.
	(mi_cmd_var_assign): Ditto.
	(varobj_update_one): Ditto.
	* mi/mi-main.c (list_available_thread_groups): Ditto.
	(mi_cmd_data_read_memory_bytes): Ditto.
	(mi_cmd_trace_frame_collected): Ditto.
	* osdata.c (info_osdata): Ditto.
	* probe.c (info_probes_for_spops): Ditto.
	* target-connection.c (print_connection): Ditto.
	* thread.c (print_thread_info_1): Ditto.
	* tracepoint.c (print_one_static_tracepoint_marker): Ditto.
2021-05-19 13:58:41 +01:00
4915bfdcfb gdb: Add an overloaded ui_out::text accepting a const std::string &
gdb/ChangeLog:

	* ui-out.h (class ui_out): Add ui_out::text accepting a constant
	reference to a std::string.  Fix all callers using
	std::string::c_str.
	* ui-out.c (ui_out::text): Ditto.
2021-05-19 13:58:40 +01:00
d9211df246 gdb/testsuite: resolve duplicate test names in gdb.guile/*.exp
This commit:

  commit ecf25064e87a3d2d59871b3ea7126fa0dee0001d
  Date:   Thu May 13 15:42:20 2021 +0100

      gdb: fix pretty printing max depth behaviour

Introduced a couple of duplicate tests, this commit resolves them by
providing unique test names.

gdb/testsuite/ChangeLog:

	* gdb.guile/scm-pretty-print.exp: Add test names to resolve
	duplicate test names.
2021-05-19 13:41:00 +01:00
2129a94255 [gdb/testsuite] Fix read1 timeout in gdb.base/info-types-c++.exp
When running test-case gdb.base/info-types-c++.exp with check-read1 I run
into:
...
425:    typedef const void * std::allocator_traits<std::allocator<std::\
  _Sp_counted_ptr_inplace<std::filesystem::__cxx11::\
  recursive_directory_iterator::_Dir_stack, std::allocator<std::filesystem::\
  __cxx11::recursive_directory_iterator::_Dir_stack>, \
  FAIL: gdb.base/info-types-c++.exp: info types (timeout)
...

The corresponding gdb_test_multiple does contain an exp_continue which
resets the timeout counter every time info for another file is printed, but
this doesn't help for this timeout because it times out during printing info
for a single file.

Fix this by processing line-by-line.

Tested on x86_64-linux, both with gcc-7.5.0 and gcc-4.8.5 (the latter is
different because the "unsigned int" type is missing).

gdb/testsuite/ChangeLog:

2021-05-19  Tom de Vries  <tdevries@suse.de>

	* gdb.base/info-types.exp.tcl: Scan info types output line-by-line.
2021-05-19 14:02:08 +02:00
c485e47599 Fix a build problem if ENABLE_CHECKING is not defined.
* dwarf.c (ENABLE_CHECKING): Define to 0 if not previously set.
2021-05-19 12:08:30 +01:00
83b0a6865c Warn when the plugin interface runs out of file descriptors.
* plugin.c (bfd_plugin_open_input): Inform the user if the limit
	on the number of open files is reached.  If possible, try to
	increase this limit before failing.
2021-05-19 11:53:23 +01:00
b534617fd5 inflow.c: Do not leak tty.
In a case open() returns 0 tty might be leaked. While 0 should be
stdin (and therefore is an unlikely return value from open()), it's
still the case that the test should be for non-negative return values
from open().

gdb/ChangeLog:

2021-05-11 Alexandra Hájková <ahajkova@redhat.com>

	* inflow.c (new_tty): Do not leak tty.
2021-05-19 10:05:19 +02:00
1b3892bedc PR27884, skip_attr_bytes: Assertion (data) <= (end) failed
PR 27884
	* dwarf.c (get_type_abbrev_from_form): Replace cu_offset_return
	param with map_return, and return map for DW_FORM_ref_addr.
	(get_type_signedness): Adjust calls to get_type_abbrev_from_form.
	Pass returned cu map start and end to recursive call.
	(read_and_display_attr_value): Similarly.
2021-05-19 11:07:41 +09:30
9d9e2a340b PR27879, stack-buffer-overflow on sysdump
PR 27879
	* sysdump.c (getBARRAY): Sanity check size against max.
	(getINT): Avoid UB shift left.
2021-05-19 11:07:17 +09:30
75933ce3d9 Automatic date update in version.in 2021-05-19 00:00:39 +00:00
9cc11ab5bf sim: depend on gnulib
We're going to start using gnulib in the sim, so make sure it exists.

ChangeLog:

	* Makefile.def: Add configure-sim dependency on all-gnulib.
	* Makefile.in: Regenerated.
2021-05-18 17:47:27 -04:00
19fa7881a9 config: delete unused sim macros
Nothing in gcc or binutils or gdb or anything anywhere uses these.

config/

	* acinclude.m4 (CYG_AC_PATH_SIM, CYG_AC_PATH_DEVO): Delete.
2021-05-18 17:46:55 -04:00
113bb7618a RISC-V: PR27814, Objdump crashes when disassembling a non-ELF RISC-V binary.
2021-05-18  Job Noorman  <mtvec@pm.me>

opcodes/
    PR 27814
    * riscv-dis.c (riscv_get_disassembler): Get elf attributes only for
    the elf objects.
2021-05-18 09:26:39 +08:00
549f123c68 Automatic date update in version.in 2021-05-18 00:00:36 +00:00
cd53fa40d4 Rename dwarf2/comp-unit.h
Simon pointed out that dwarf2/cu.h and dwarf2/comp-unit.h seemingly
mean the same thing.  He suggested renaming the latter to
comp-unit-head.h, which is what this patch does.

gdb/ChangeLog
2021-05-17  Tom Tromey  <tom@tromey.com>

	* dwarf2/read.h: Update include.
	* dwarf2/read.c: Update include.
	* dwarf2/line-header.c: Update include.
	* dwarf2/cu.h: Update include.
	* dwarf2/comp-unit-head.h: Rename from comp-unit.h.
	* dwarf2/comp-unit-head.c: Rename from comp-unit.c.
	* Makefile.in (COMMON_SFILES): Update.
2021-05-17 14:16:07 -06:00
347212b819 Change dwarf2_cu marking to use methods
This changes the dwarf2_cu marking functions to be methods on
dwarf2_cu.

gdb/ChangeLog
2021-05-17  Tom Tromey  <tom@tromey.com>

	* dwarf2/read.c (maybe_queue_comp_unit)
	(dwarf2_per_objfile::age_comp_units): Update.
	(dwarf2_add_dependence, dwarf2_mark_helper, dwarf2_mark): Move to
	dwarf2_cu methods.
	* dwarf2/cu.h (struct dwarf2_cu) <mark, clear_mark, is_marked,
	add_dependence>: New methods.
	<m_dependencies>: Add "m_" prefix.  Now private.
	<m_mark>: Add "m_" prefix.
	* dwarf2/cu.c (dwarf2_cu::dwarf2_cu): Update.
	(dwarf2_mark_helper): New function.
	(dwarf2_cu::mark, dwarf2_cu::add_dependence): New methods.
2021-05-17 14:16:06 -06:00
839118f920 Move some dwarf2_cu methods to new file
This moves some of the dwarf2_cu methods to a new file, dwarf2/cu.c.

gdb/ChangeLog
2021-05-17  Tom Tromey  <tom@tromey.com>

	* dwarf2/read.c (dwarf2_cu::addr_sized_int_type)
	(dwarf2_cu::start_symtab, dwarf2_cu::addr_type)
	(dwarf2_cu::dwarf2_cu): Move to cu.c.
	* dwarf2/cu.c: New file.
	* Makefile.in (COMMON_SFILES): Add dwarf2/cu.c.
2021-05-17 14:16:06 -06:00
8ae78a440e Move dwarf2_cu to new header file
This moves dwarf2_cu and one supporting data structure to a new header
file.  The main goal, as always with this kind of change, is to make
the DWARF reader a bit more understandable.

gdb/ChangeLog
2021-05-17  Tom Tromey  <tom@tromey.com>

	* Makefile.in (HFILES_NO_SRCDIR): Add dwarf2/cu.h.
	* dwarf2/read.c (struct delayed_method_info, struct dwarf2_cu):
	Move to cu.h.
	* dwarf2/cu.h: New file.
2021-05-17 14:16:06 -06:00
c1c0a7e1f3 gdb: additional settings for emacs in .dir-locals.el
Two additional settings for developers who use emacs:

  1. Set brace-list-open to 0 for C and C++ modes, this ensures we
  format things like:

  enum blah
  {
    ....
  };

  Instead of the default for the emacs GNU style:

  enum blah
    {
      ...
    };

  The former seems to be the GDB style.

  2. Set sentence-end-double-space to t.  This is actually the default
  value for this setting, but if anyone has customised this to nil in
  general, then forcing this back to t for GDB files will give a
  better behaviour for the paragraph filling.

gdb/ChangeLog:

	* .dir-locals.el: Set sentence-end-double-space for all modes, and
	set brace-list-open to 0 for C and C++ modes.

gdbserver/ChangeLog:

	* .dir-locals.el: Set sentence-end-double-space for all modes, and
	set brace-list-open to 0 for C and C++ modes.

gdbsupport/ChangeLog:

	* .dir-locals.el: Set sentence-end-double-space for all modes, and
	set brace-list-open to 0 for C and C++ modes.
2021-05-17 20:47:46 +01:00
9e541c7918 Avoid crash with GCC trunk
With GCC trunk, gdb.ada/access_to_packed_array.exp causes a GDB crash.
The problem is that ptype tries to resolve a dynamic type.  However,
the inferior is not running, so there are no frames.

This patch updates dwarf2_evaluate_loc_desc::get_frame_base to handle
this situation.

gdb/ChangeLog
2021-05-17  Tom Tromey  <tromey@adacore.com>

	* dwarf2/loc.c (dwarf2_evaluate_loc_desc::get_frame_base): Throw
	if frame is null.
2021-05-17 13:07:25 -06:00
5917321695 Fix ubsan build
I tried a build using the undefined behavior sanitizer, and gcc gave
this error:

In file included from /usr/include/string.h:495,
                 from ../gnulib/import/string.h:41,
                 from ../../binutils-gdb/gdb/../gdbsupport/common-defs.h:95,
                 from ../../binutils-gdb/gdb/nat/linux-osdata.c:20:
In function 'char* strncpy(char*, const char*, size_t)',
    inlined from 'void time_from_time_t(char*, int, TIME_T)' at ../../binutils-gdb/gdb/nat/linux-osdata.c:923:15,
    inlined from 'void time_from_time_t(char*, int, TIME_T)' at ../../binutils-gdb/gdb/nat/linux-osdata.c:911:1,
    inlined from 'void linux_xfer_osdata_sem(buffer*)' at ../../binutils-gdb/gdb/nat/linux-osdata.c:1082:22:
/usr/include/bits/string_fortified.h:106:34: error: 'char* __builtin_strncpy(char*, const char*, long unsigned int)' specified bound 32 equals destination size [-Werror=stringop-truncation]

This patch fixes the problem by subtracting one from the length
parameter to strncpy.

I changed a couple of other similar functions -- gcc does not warn
about these, but I didn't see any substantial difference between the
different cases, and I think these are just latent warnings, to be
triggered in the future by a change to inlining heuristics.

gdb/ChangeLog
2021-05-17  Tom Tromey  <tromey@adacore.com>

	* nat/linux-osdata.c (user_from_uid, time_from_time_t)
	(group_from_gid): Subtract one from strncpy length.
2021-05-17 13:06:05 -06:00
baea2f9d52 Fix buffer underflow in add_path
Address sanitizer pointed out a buglet in source.c:add_path.
In this test, from gdb.base/source-dir.exp:

    (gdb) set directories :/foo:/bar

... 'p[-1]' will result in a buffer underflow.
This patch fixes the bug by introducing a new check.

2021-05-17  Tom Tromey  <tromey@adacore.com>

	* source.c (add_path): Check 'p' before using 'p[-1]'.
2021-05-17 13:01:42 -06:00
473ab96443 Change how dwarf2_per_cu_data is deleted
Address sanitizer pointed out that the patch to use 'delete' for
dwarf2_per_cu_data introduced a bug -- now it is possible to delete a
signatured_type using a pointer to its base class.

This patch fixes the problem by introducing a deleter and a unique_ptr
specialization.  A virtual destructor would be more ordinary here, but
it seemed wasteful to add a vtable just for this purpose.  If virtual
methods are ever needed here, we can revisit this.

2021-05-17  Tom Tromey  <tromey@adacore.com>

	* dwarf2/read.h (struct dwarf2_per_cu_data_deleter: New.
	(dwarf2_per_cu_data_up): New typedef.
	(struct dwarf2_per_bfd) <allocate_per_cu>: Change return type.
	<all_comp_units>: Use dwarf2_per_cu_data_up.
	* dwarf2/read.c (dwarf2_per_cu_data::operator()): New function.
	(dwarf2_per_bfd::allocate_per_cu): Return dwarf2_per_cu_data_up.
	(create_cu_from_index_list): Likewise.
	(create_signatured_type_table_from_index)
	(create_cus_from_debug_names_list, add_type_unit)
	(read_comp_units_from_section): Update.
	(dwarf2_find_containing_comp_unit): Change type of all_comp_units.
	(run_test): Update.
2021-05-17 13:01:42 -06:00
16e0020bfc Replace sort_tu_by_abbrev_offset with operator<
I noticed that sort_tu_by_abbrev_offset only has a single caller.  It
seemed simpler to replace it with an implementation of operator<
instead.

2021-05-17  Tom Tromey  <tom@tromey.com>

	* dwarf2/read.c (tu_abbrev_offset::operator<): New method.
	(sort_tu_by_abbrev_offset): Remove.
	(build_type_psymtabs): Update.
2021-05-17 12:59:40 -06:00
5277208d32 gdb/testsuite: rename .py.in files to .py
I noticed these files because they weren't considered by black for
reformatting, prior to adding pyproject.toml, because their extension is
not .py.  I don't think they specifically need to be named .py.in, so I
suggest renaming them to .py.  This will make it nicer to edit them, as
editors will recognize them more easily as Python files.

Perhaps this was needed before, when the testsuite didn't always put
output files in the output directory.  Then, a different name for the
source and destination file might have been desirable to avoid
overwriting a file with itself (perhaps that wasn't well handled).  But
in any case, it doesn't see to cause any problem now.

gdb/testsuite/ChangeLog:

	* gdb.python/py-framefilter-gdb.py.in: Rename to:
	* gdb.python/py-framefilter-gdb.py: ... this.
	* gdb.python/py-framefilter-invalidarg-gdb.py.in: Rename to:
	* gdb.python/py-framefilter-invalidarg-gdb.py: ... this.

Change-Id: I63bb94010bbbc33434ee1c91a386c91fc1ff80bc
2021-05-17 14:58:26 -04:00
91e159e93b gdb: add pyproject.toml
When running black to format Python files, files with extension .py.in
are ignored, because they don't end in .py.  Add a pyproject.toml file
to instruct black to pick up these files too.

gdb/ChangeLog:

	* py-project.toml: New.
	* gdb-gdb.py.in: Re-format.

gdb/testsuite/ChangeLog:

	* gdb.python/py-framefilter-gdb.py.in: Re-format.
	* gdb.python/py-framefilter-invalidarg-gdb.py.in: Re-format.

Change-Id: I9b88faec3360ea24788f44c8b89fe0b2a5f4eb97
2021-05-17 14:31:00 -04:00
034dce7a47 gdb: add cmd_list_element::is_command_class_help
Same idea as the previous patches, but for whether a command is a
"command class help" command.  I think this one is particularly useful,
because it's not obvious when reading code what "c->func == NULL" means.

Remove the cmd_func_p function, which does kind of the same thing as
cmd_list_element::is_command_class_help (except it doesn't give a clue
about the semantic of a NULL func value).

gdb/ChangeLog:

	* cli/cli-decode.h (cmd_list_element) <is_command_class_help>:
	New, use it.
	* command.h (cmd_func_p): Remove.
	* cli/cli-decode.c (cmd_func_p): Remove.

Change-Id: I521a3e1896dc93a5babe1493d18f5eb071e1b3b7
2021-05-17 14:01:32 -04:00
3d0b356410 gdb: add cmd_list_element::is_prefix
Same idea as the previous patch, but for prefix instead of alias.

gdb/ChangeLog:

	* cli/cli-decode.h (cmd_list_element) <is_prefix>: New, use it.

Change-Id: I76a9d2e82fc8d7429904424674d99ce6f9880e2b
2021-05-17 14:01:26 -04:00
1be99b11f8 gdb: add cmd_list_element::is_alias
Add the cmd_list_element::is_alias helper to check whether a command is
an alias.  I find it easier to understand the intention in:

  if (c->is_alias ())

than

  if (c->alias_target != nullptr)

Change all the spots that are reading alias_target just to compare it to
NULL/nullptr to use is_alias instead.

gdb/ChangeLog:

	* cli/cli-decode.h (cmd_list_element) <is_alias>: New, use it.

Change-Id: I26ed56f99ee47fe884fdfedf87016501631693ce
2021-05-17 14:01:20 -04:00